日志錯誤:
大多數replication錯誤都是因為日志錯誤引起的。
主日志和中繼日志都可能出錯。
評判日志錯誤的辨識方法:
<code>mysqlbinlog master_binlog_file > /dev/</code><code>null</code>
螢幕有輸出則表示這個binlog有錯誤,如果沒有則表示binlog正常、
<code>mysqlbinlog slave_binlog_file >/dev/</code><code>null</code>
跳過日志錯誤1:
可以使用手動跳過日志錯誤,可能會造成資料不一緻
如果主日志出錯,可以再slave上執行(如果有多個錯誤可能需要多次操作)
<code>mysql>stop slave;</code>
<code>mysql></code><code>set</code> <code>global</code> <code>sql_slave_skip_counter=1;</code>
<code>mysql>start slave;</code>
這個方法不适用于DTID模式的replication,GTIDs模式不允許sql_slave_skip_counter
跳過錯誤日志2: 不支援GTID
如果是中舉日志出錯,可以再slave上檢視replication狀态,根據日志資訊跳過出錯的日志:
<code>mysql>change master </code><code>to</code>
<code>master_log_file=</code><code>'relay_master_log_file'</code><code>;</code>
<code>master_log_pos=<exec_master_log_pos>;</code>
跳過錯誤日志3 : GDIT的好處是,計算機自行處理,無需像以前的那樣繁瑣。
如果master上的binlog除了問題,導緻slave無法繼續,
如果replication工作在GTID模式下,則需要以下操作:
<code>mysql></code><code>set</code> <code>GTID_NEXT=</code><code>'uuid.next_id'</code><code>; </code>
<code>mysql></code><code>begin</code><code>;</code>
<code>mysql></code><code>commit</code><code>;</code>
<code>mysql></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>use viewdb</code>
<code> </code>
<code>mysql> </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>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> </code><code>set</code> <code>sql_log_bin=</code><code>OFF</code><code>;</code>
表示不記錄目前的操作到二進制日志中。接下來的操作會不會同步到slave,這樣就會錯誤
<code>mysql> </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> </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> </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>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>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></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> stop slave;</code>
<code>Query OK, 0 </code><code>rows</code> <code>affected (0.01 sec)</code>
<code>mysql> </code><code>set</code> <code>gtid_next=</code><code>'61816754-9d68-11e4-8a9f-000c29c1d1ea:18'</code><code>;</code>
<code>mysql> </code><code>begin</code><code>;</code>
<code>mysql> </code><code>commit</code><code>;</code>
<code>mysql> </code><code>set</code> <code>gtid_next=</code><code>'automatic'</code><code>;</code>
<code>mysql> start slave;</code>
<code>mysql>show slave status\G;</code>
<code>mysql></code><code>select</code> <code>* </code><code>from</code> <code>t1; 發現資料已經保持一緻。</code>
gtid的好處是,如果有兩台slave,隻修複一台slave。另一台會自動更新到正常狀态。
本文轉自crazy_charles 51CTO部落格,原文連結:http://blog.51cto.com/douya/1606480,如需轉載請自行聯系原作者