一:首先你在從庫檢查從庫進程狀態是否正常 如下紅字所示,都爲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