mysql主從同步故障後恢復

一:首先你在從庫檢查從庫進程狀態是否正常 如下紅字所示,都爲YES是正常。

mysql> show slave status\G

*************************** 1. row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host: 192.168.4.106

Master_User: root

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: log.000466

Read_Master_Log_Pos: 20256923

Relay_Log_File: mysqld-relay-bin.000004

Relay_Log_Pos: 4293096

Relay_Master_Log_File: log.000466

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

Replicate_Do_DB:

Replicate_Ignore_DB:

Replicate_Do_Table:

Replicate_Ignore_Table:

Replicate_Wild_Do_Table:  

 

Replicate_Wild_Ignore_Table:

Last_Errno: 0

Last_Error:

Skip_Counter: 0

Exec_Master_Log_Pos: 20256923

Relay_Log_Space: 4293096

Until_Condition: None

Until_Log_File:

Until_Log_Pos: 0

Master_SSL_Allowed: No

Master_SSL_CA_File:

Master_SSL_CA_Path:

Master_SSL_Cert:

Master_SSL_Cipher:

Master_SSL_Key:

Seconds_Behind_Master: 0

1 row in set (0.00 sec)

如果一個出現問題,可以在從庫執行:

mysql> stop slave;

mysql> start slave;

再檢查是否正常,如果不成功再執行以下語句:

mysql>stop slave #關掉slave服務 也就是關閉主從同步

mysql>change master to master_host='192.168.4.106',

master_user='root',

master_password='~1~#dev',

master_port=3306

,master_log_file='log.000456',

master_log_pos=4939863; #重新設置master庫信息

mysql>start slave #開啓slave服務

紅字部分是在從庫執行 以下紅字部分:

mysql> show slave status\G

*************************** 1. row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host: 192.168.4.106

Master_User: root

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: log.000456

Read_Master_Log_Pos: 20256923

Relay_Log_File: mysqld-relay-bin.000004

Relay_Log_Pos: 4939863

Relay_Master_Log_File: log.000466

二:可能是網絡不通導致不同步,可以檢查是否能互相ping通?如果有問題,應該請求網絡工程師了。

三:必須保證主從數據庫所有表的所有字段屬性一致,否則這個庫就不同步,例如:

master庫中的一個庫中的一個表:Product

mysql> desc Product;

+----------------+---------------+------+-----+---------+----------------+

| Field | Type | Null | Key | Default | Extra |

+----------------+---------------+------+-----+---------+----------------+

| prdId | bigint(20) | NO | | NULL | |

| prdTitle | varchar(1024) | YES | | NULL | |

| 1stCtgId | int(11) | NO | | NULL | |

| 2ndCtgId | int(11) | NO | | NULL | |

| 3rdCtgId | int(11) | YES | | NULL | |

slave庫中的一個庫的這個表:Product

mysql> desc Product;

+----------------+---------------+------+-----+---------+----------------+

| Field | Type | Null | Key | Default | Extra |

+----------------+---------------+------+-----+---------+----------------+

| prdId | bigint(20) | NO | | NULL | |

| prdTitle | varchar(1000) | YES | | NULL | |

| 1stCtgId | int(11) | NO | | NULL | |

| 2ndCtgId | int(11) | NO | | NULL | |

| 3rdCtgId | int(11) | YES | | NULL | |

改成一致即可;

四:如果由於某種原因導致slave庫數據多於master庫,解決辦法使主備數據一致:

方法1:mysqldump

先在master庫:mysqldump -uroot -p密碼 數據庫名 > 導出的文件名

然後把導出的文件傳給slave 然後關掉

然後再在slave上:mysql>source /opt/導出的文件名

方法2:冷備

先把master上要操作的庫給鎖定,直接把主庫的數據文件scp到備庫相應位置,然後再把slave庫的相應的文件給移動到別的目錄或者重命名,

mysql>flush tables with read lock; ##登錄上mysql後直接執行這個語句,就把所有的庫的所有表修鎖定了

mysql>unlock tables; ###解鎖

五:還可以嘗試在master上重新給slave授權。

GRANT replication slave ON *.* TO ‘root’ identified by '123';

flush privileges;

六 有時候需要跳過某個無法執行的命令,需要在slave處於stop狀態下,執行 set global sql_slave_skip_counter=N以跳過命令;

mysql>stop slave

mysql>set global sql_slave_skip_counter=1 ####會連續跳過若干個event,直到當前所在的事務結束

mysql>start slave      #重新開啓主從

 

解釋何爲event :MySQL從庫從主庫上覆制binlog文件內容到本地執行。在binlog上命令以event的形式存在,並非一個命令對應一個event。以一個insert語句爲例(引擎InnoDB、binglog_format=statement), 在binlog中實際上有三個event,分別爲begin\insert\commit 。 命令類型都是Query_log_event.

然後再執行:mysql>stop slave

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章