1. 程式人生 > >mysql主從不同步,不復制的解決辦法

mysql主從不同步,不復制的解決辦法

mysql的從庫,檢查一個表的最新的記錄,發現主從不同步了 。主庫的資料比從庫的資料要多很多。
通過show slave STATUS;命令檢查,發下如下的錯誤:

Error 'Cannot add or update a child row:
 a foreign key constraint fails (`mls`.`t_feedback`, CONSTRAINT `Reft_user121` FOREIGN KEY (`fk_user_id`)
 REFERENCES `t_user` (`pk_id`))' ON QUERY . 
DEFAULT DATABASE : 'mls'.
 QUERY : '
INSERT INTO mls.t_feedback SET fk_user_id= 93213,fk_parent_id=1, f_context=' XXXXXX? ' , f_create_time=20180508,f_creater=' XXXXXX ', f_title=' APP問題 ', f_reply=0'

最終的解決方案可選:
1、檢視Master最新的position,將其最為slave複製的起點。
這種思路體現的是過去的不一致既往不咎,現在保持同步即可。看起來,這個思路和恢復主從庫資料的一致性的初衷有所違背,但這種方法,簡單,高效,在測試環境,對歷史資料要求不高的場景中可使用。
2、必須嚴格恢復主從資料一致的做法。
2.1備份主庫資料,並在從庫上恢復,在歷史資料一致性的基礎上開啟同步,但這種方法比較麻煩,必須在主庫上執行鎖表操作,阻止客戶端對於表資料的更新操作,而且在資料量大的情況下,備份也是個耗時的工程。其實,這種方法在實際生產環境中也很少用。
2.2 skip掉相關事務
把產生錯誤的那一步,直接跳過去。

如何操作:
1、停止slave服務
命令:stop slave;
2、設定跳過多少個事務
命令:SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
3、開啟slave服務
命令:start slave;

Error 'CREATE TABLE ... SELECT is forbidden when @@GLOBAL.ENFORCE_GTID_CONSISTENCY = 1.' ON QUERY . DEFAULT DATABASE : 'mls'. QUERY : 'create table cmpt_main_20180518 as select
pk_id as cmpt_id,f_name as cmpt_name,'' as cmpt_en_name,str_to_date(f_protocol_date,' % Y % m % d ') as cmpt_start_time,str_to_date(f_protocol_date,' % Y % m % d ') as cmpt_end_time,'' as cmpt_province,f_address as cmpt_city,'' as cmpt_address,1 as cmpt_from_platform,1 as is_publish,0 as is_delete,now() as update_time,now() as create_time from t_competition'

這個錯誤主從同步已經報錯,但是沒有預警,結果在主庫上建立臨時遷移資料庫的表,然後又刪除了,從庫對比沒有這個表,所以產生了錯誤。GLOBAL.ENFORCE_GTID_CONSISTENCY = 1:檢查錯誤日誌,直到沒有錯誤出現,才能進行下一步

解決的辦法:
如何操作:
1、停止slave服務
命令:stop slave;
2、設定跳過多少個事務
命令:SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
3、開啟slave服務
命令:start slave;