天天看點

GTID模式下的replication,跳過錯誤日志的解決方法

日志錯誤:

大多數replication錯誤都是因為日志錯誤引起的。

主日志和中繼日志都可能出錯。

評判日志錯誤的辨識方法:

<code>mysqlbinlog  master_binlog_file &gt; /dev/</code><code>null</code>

螢幕有輸出則表示這個binlog有錯誤,如果沒有則表示binlog正常、

<code>mysqlbinlog  slave_binlog_file  &gt;/dev/</code><code>null</code>

跳過日志錯誤1:

可以使用手動跳過日志錯誤,可能會造成資料不一緻

如果主日志出錯,可以再slave上執行(如果有多個錯誤可能需要多次操作)

<code>mysql&gt;stop slave;</code>

<code>mysql&gt;</code><code>set</code> <code>global</code> <code>sql_slave_skip_counter=1;</code>

<code>mysql&gt;start slave;</code>

這個方法不适用于DTID模式的replication,GTIDs模式不允許sql_slave_skip_counter

跳過錯誤日志2:  不支援GTID

如果是中舉日志出錯,可以再slave上檢視replication狀态,根據日志資訊跳過出錯的日志:

<code>mysql&gt;change master </code><code>to</code> 

<code>master_log_file=</code><code>'relay_master_log_file'</code><code>;</code>

<code>master_log_pos=&lt;exec_master_log_pos&gt;;</code>

跳過錯誤日志3 : GDIT的好處是,計算機自行處理,無需像以前的那樣繁瑣。

如果master上的binlog除了問題,導緻slave無法繼續,

如果replication工作在GTID模式下,則需要以下操作:

<code>mysql&gt;</code><code>set</code> <code>GTID_NEXT=</code><code>'uuid.next_id'</code><code>;  </code>

<code>mysql&gt;</code><code>begin</code><code>;</code>

<code>mysql&gt;</code><code>commit</code><code>;</code>

<code>mysql&gt;</code><code>set</code> <code>GTID_NEXT=</code><code>'AUTOCOMMIT'</code><code>;</code>

<code>uuid:nextid 例如:8a1f84c4-9d67-11e4-8a9a-3085a9eb338b:12</code>

<code>into</code>

模拟故障:基于DTID模式

<code>in</code> <code>master:</code>

<code>mysql&gt;use viewdb</code>

<code> </code> 

<code>mysql&gt; </code><code>select</code> <code>* </code><code>from</code> <code>t1;</code>

<code>+</code><code>------+</code>

<code>| id   |</code>

<code>|  112 |</code>

<code>|  113 |</code>

<code>|  114 |</code>

<code>|  115 |</code>

<code>|  116 |</code>

<code>|  117 |</code>

<code>|  118 |</code>

<code>|  119 |</code>

<code>|  120 |</code>

<code>| 1000 |</code>

<code>|  110 |</code>

<code>|  109 |</code>

<code>mysql&gt;show vaiiables </code><code>like</code> <code>"%bin%"</code> <code>找到 sql_bin_log</code>

<code>sql_log_bin  | </code><code>ON</code>       <code>全局參數,目前所發生的操作會記錄到二進制日中、</code>

<code>mysql&gt; </code><code>set</code> <code>sql_log_bin=</code><code>OFF</code><code>;</code>

表示不記錄目前的操作到二進制日志中。接下來的操作會不會同步到slave,這樣就會錯誤

<code>mysql&gt; </code><code>insert</code> <code>into</code> <code>t1 </code><code>values</code> <code>(200);</code>

<code>Query OK, 1 row affected (0.00 sec)</code>

<code>| |</code>

<code>|  200 |</code>

<code>13 </code><code>rows</code> <code>in</code> <code>set</code> <code>(0.00 sec</code>

<code>mysql&gt; </code><code>set</code> <code>sql_log_bin=</code><code>ON</code><code>; 再次打開,</code>

<code>Query OK, 0 </code><code>rows</code> <code>affected (0.00 sec)</code>

<code>mysql&gt; </code><code>insert</code> <code>into</code> <code>t1 </code><code>values</code> <code>(201); 這是201會被同步到salve,200确不會同步到slave</code>

<code>Query OK, 1 row affected (0.03 sec)</code>

<code>in</code>   <code>master</code>

<code>|  |</code>

<code>   </code><code>200 </code>

<code>|  201 |</code>

<code>in</code> <code>SLAVE</code>

 切回到master

<code>mysql&gt;delect </code><code>from</code> <code>t1 </code><code>where</code> <code>id=200;</code>

此步驟完了後,此操作記錄到binlog,而且會同步到slave,此時slave報錯,并指出master的那個binlog  end_log_pos出錯。

IN slave;

<code>mysql&gt;show salve status\G;</code>

<code>Last_SQL_Error: Could </code><code>not</code> <code>execute</code> <code>Delete_rows event </code><code>on</code> <code>table</code> <code>viewdb.t1; Can</code><code>'t find record in '</code><code>t1', Error_code: 1032;</code>

handler error HA_ERR_END_OF_FILE; the event's master log localhost-bin.000006, end_log_pos 1360

并且:

 Retrieved_Gtid_Set: 61816754-9d68-11e4-8a9f-000c29c1d1ea:1-18

 Executed_Gtid_Set: 61816754-9d68-11e4-8a9f-000c29c1d1ea:1-17

不一緻

切回到master

<code>mysql&gt;</code><code>insert</code> <code>into</code> <code>t1 valuses(202);</code>

in slave

這時由于slave故障,是以slave不再會有任何新的資料同步過來。

Retrieved_Gtid_Set: 61816754-9d68-11e4-8a9f-000c29c1d1ea:1-19

Executed_Gtid_Set: 61816754-9d68-11e4-8a9f-000c29c1d1ea:1-17

這是我們跳過這個error,

<code>mysql&gt; stop slave;</code>

<code>Query OK, 0 </code><code>rows</code> <code>affected (0.01 sec)</code>

<code>mysql&gt; </code><code>set</code> <code>gtid_next=</code><code>'61816754-9d68-11e4-8a9f-000c29c1d1ea:18'</code><code>;</code>

<code>mysql&gt; </code><code>begin</code><code>;</code>

<code>mysql&gt; </code><code>commit</code><code>;</code>

<code>mysql&gt; </code><code>set</code> <code>gtid_next=</code><code>'automatic'</code><code>;</code>

<code>mysql&gt; start slave;</code>

<code>mysql&gt;show slave status\G;</code>

<code>mysql&gt;</code><code>select</code> <code>* </code><code>from</code> <code>t1;  發現資料已經保持一緻。</code>

gtid的好處是,如果有兩台slave,隻修複一台slave。另一台會自動更新到正常狀态。

      本文轉自crazy_charles 51CTO部落格,原文連結:http://blog.51cto.com/douya/1606480,如需轉載請自行聯系原作者

繼續閱讀