MySQL Replication Slave 使用 PHP 來忽略錯誤語法

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 即可.

  1. chmod 755 ignore-mysql-error.php
  2. crontab -e # 寫入下述

    */1 * * * *  /FILE_PATH/ignore-mysql-error.php

註: 此篇 MySQL Replication Slave 忽略所有錯誤訊息 並不適用處理 Duplicate Key.


關於 Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.
本篇發表於 My_Note-Unix。將永久鏈結加入書籤。

MySQL Replication Slave 使用 PHP 來忽略錯誤語法 有 4 則回應

  1. chiang719 說道:

    你好...我常常從你這邊學到不少
    今天終於換我給點貢獻了...(羞~)
    我有查到一個看似更完善的做法..
    (原文在這裡)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
    可以避開錯誤, 但是資料會流失, 三台也就無法同步了
    但還沒實驗...過二天才會實際測試
    先提供給您參考看看

  2. Tsung 說道:

    嗯嗯, 非常感謝您提供的資訊~
    我這篇的做法並不是要處理三台的問題(這是 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 一台是奇數、一台是偶數,兩台主機絕對不會遇到撞到的情況。
    參考看看, 一起學習囉~ 🙂

  3. Miao 說道:

    slave-skip-errors = 1032,1062,126,1114,1146,1048,1396

  4. Tsung 說道:

    感恩, 這招簡單~ 😀

發表迴響