MySQL 使用量越來越大時, 就會遇到不少莫名奇妙的事, 不管是 Replication 還是 Data Import 等等.
最常見的就是這個: MySQL Replication 出現 Duplicate Key
註: 此狀況只會發生在 MySQL Replication 的 Slave, 所以下述程式也是給 Slave 用, Master 不需要.
MySQL Slave 已經快跟不上, 又常常出現這個錯誤時, 就會想用程式解決, 眼不見為淨.... 於是就有不該出現的程式產生: (ignore-mysql-error.php)
#!/usr/bin/php
<?php
/*
Last_Error:
stop slave; SET GLOBAL SQL_SLAVE_SKIP_COUNTER =1; start slave;
show slave status;
*/
$dbh = mysql_connect('localhost', 'root', 'password');
$r = mysql_query('SHOW SLAVE STATUS', $dbh);
while ($t = mysql_fetch_assoc($r)) {
if ($t['Last_Errno'] != 0) {
//echo $t['Last_Error'] . "\n";
mysql_query('STOP SLAVE', $dbh);
mysql_query('SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1', $dbh);
mysql_query('START SLAVE', $dbh);
$r = mysql_query('SHOW SLAVE STATUS', $dbh);
}
}
?>
再將此程式設進 Crontab 即可.
- chmod 755 ignore-mysql-error.php
- crontab -e # 寫入下述
*/1 * * * * /FILE_PATH/ignore-mysql-error.php
註: 此篇 MySQL Replication Slave 忽略所有錯誤訊息
並不適用處理 Duplicate Key.
你好...我常常從你這邊學到不少
今天終於換我給點貢獻了...(羞~)
我有查到一個看似更完善的做法..
(原文在這裡)http://phorum.study-area.org/index.php?topic=41986.0
我只摘錄了重點
這類的錯誤, google 找到了一些資料, 說可以用
auto_increment_increment
auto_increment_offset
這兩個 mysql 的系統變數讓三台產生的 key 不會重複..
可是很不幸的, 這兩個變數要 5.0.2 版以後才有支援
==================
PS:
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1
SLAVE START SQL_THREAD
可以避開錯誤, 但是資料會流失, 三台也就無法同步了
但還沒實驗...過二天才會實際測試
先提供給您參考看看
嗯嗯, 非常感謝您提供的資訊~
我這篇的做法並不是要處理三台的問題(這是 MySQL 的其它 Bug 造成的問題).
至於您說的這個, 要多台主要是用在 MySQL MMM 的架構.
(可參考: http://ronnywang.pixnet.net/blog/post/25223266)
解決方法就是利用 MySQL 的 auto_increment_increment 和 auto_increment_offset 兩個設定
auto_increment_increment = 2 讓兩台機器的 auto incenment 不是每次加一,而是每次加二
然後兩台主機一台的 auto_increment_offset 設 0 ,一台設 1 。這樣子就會讓兩台主機的 auto increment id 一台是奇數、一台是偶數,兩台主機絕對不會遇到撞到的情況。
參考看看, 一起學習囉~ 🙂
slave-skip-errors = 1032,1062,126,1114,1146,1048,1396
感恩, 這招簡單~ 😀