MYSQL主從同步故障一例及解決過程

來源:互聯網
上載者:User

標籤:大量   nbsp   出錯   lock   重啟   報錯   部落格   開啟   過程   

公司裡有兩個mysql伺服器做主從同步,某天Nagios發來警示簡訊,mysqla is down...趕緊聯絡機房,機房的人反饋來的資訊是 HARDWARE ERROR 後面資訊省略,讓機房記下錯誤資訊後讓他們幫忙重啟下看是不是能正常起來,結果竟然正常起來了,趕緊匯出所有資料。
   問題又出現了,nagios 又警示,mysql_AB error,檢查從庫
show slave status \G; 果然 
Slave_IO_Running: Yes
Slave_SQL_Running: No
而且出現了1062錯誤,還提示 
Last_SQL_Error: Error ‘Duplicate entry ‘1001-164761-0‘ for key ‘PRIMARY‘‘ on query. Default database: ‘bug‘. Query: ‘insert into misdata (uid,mid,pid,state,mtime) values (164761,1001,0,-1,1262623560)‘
很顯然,由於主庫重啟導致 從庫資料不同步而且主鍵衝突。查看error 日誌發現error記錄檔變得好大,比以前大了將近好幾倍,
tail -f mysql_error.log 最開始查看到的是這條資訊
發現這條資訊
 [ERROR] Slave SQL: Error ‘Duplicate entry ‘1007-443786-0‘ for key ‘PRIMARY‘‘ on query. Default database: ‘ufo‘. Query: ‘insert into misdata (uid,mid,pid,sta
te,mtime) values (443786,1007,0,-1,1262598003)‘, Error_code: 1062
100104 17:39:05 [Warning] Slave: Duplicate entry ‘1007-443786-0‘ for key ‘PRIMARY‘ Error_code: 1062
100104 17:39:05 [ERROR] Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log ‘ufolog.000058
8‘ position 55793296
報錯和上面的意思差不多,

最先想到的就是首先手動同步一下,從庫上首先 stop slave;停止同步
進入主庫鎖表,
FLUSH TABLES WITH READ LOCK;
mysql> show master status;
+-------------------+-----------+--------------+------------------+
| File              | Position  | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+-----------+--------------+------------------+
| ufo.000063 | 159164526 |              |                  |
+-------------------+-----------+--------------+------------------+
1 row in set (0.00 sec)
進入從庫
mysql>change master to master_host=‘192.168.1.141‘, master_user=‘slave‘, 
master_password=‘xxx‘, 
master_port=3306, 
master_log_file=‘ufo.000063‘, 
master_log_pos=159164526;

完成上面這些後
start slave;
回到主庫
unlock tables; 解鎖

回到從庫 查看
show slave status \G;
發現正常了,長處了一口氣。可是還沒過一分鐘,發現又開始報錯了,還是最開始那個錯誤,這是怎麼回事...
於是又想到了跳過錯誤的辦法,(不過我不太喜歡用這種方法)馬上進入從庫
stop slave; 
set global sql_slave_skip_counter=1; (1是指跳過一個錯誤)
slave start;
再show slave status \G;查看
還是報錯 只不過 原來的 164761 變成了 165881,連續執行了幾次後
除了上面的數值 在變,錯誤依然還在
鬱悶了,看來只能先強制跳過 1062錯誤了,於是修改從庫的/etc/my.cnf檔案
在裡面的[mysqld]下面加入了一行
slave-skip-errors = 1062 (忽略所有的1062錯誤)
重啟下從庫的mysql /etc/init.d/mysqld restart
再 show slave status \G;一下發現正常了,但是我知道這時的資料可能已經不同步了,
再次查看一下日誌,讓我感到意外的是tail -f mysql_error.log 出現大量的
.......
100106 16:54:21 [Warning] Statement may not be safe to log in statement format. Statement: delete from `system_message_1` where `to_uid` = 181464 ORDER BY `id` ASC LIMIT 1
.........
日誌裡面有大量的這種警告,意思應該是statement 格式不安全,用vim 開啟他看了一下,發現好多這類警告,我說為什麼錯誤記錄檔怎麼變這麼大了呢!!
statement format 應該是 binlog的一種格式,進入從庫查看一下
show global variables like ‘binlog_format‘;
果然當前的格式為statement 

我需要把格式改為 mixed格式
修改從庫的 my.cfg
在[mysqld]下面加入下面這行
binlog_format=mixed

然後重啟mysql服務,發現錯誤記錄檔裡的 警告 都停止了。這回清靜多了~~

我突然想起一件事,記得有朋友說過 RBR 模式可以解決很多因為主鍵衝突導致的主從無法同步情況,想到這裡我就想要不要把 slave-skip-errors = 1062 去掉再試試,
於是就進入到my.cnf 裡在注釋掉了 slave-skip-errors = 1062
再次重新啟動 mysql服務
進入從庫
show slave status \G;
.........               
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
........

恢複了!!!有觀察了一段時間沒有出現問題這才放心,

看來導致 mysql 主從複製出錯的原因還真不少修複的辦法也不止一個,binlog的格式也是其中之一。
希望遇到和這次一樣問題的朋友看到這篇文章後會得到 一些啟發和解決問題的方法~~

本文出自 “story的天空” 部落格,請務必保留此出處http://storysky.blog.51cto.com/628458/259280

MYSQL主從同步故障一例及解決過程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.