mysql主從複製的Slave_IO_Running No的處理方法
master: 192.168.0.4 mysql-5.5.3-m3
slave: 192.168.0.2 mysql-5.5.20
先回答上一篇提出的問題:有一部分是myisam型別的表, 有一部分是innodb型別的表, 該如何對master做“快照”呢?
其實答案有很多:
a) 先鎖表, 記錄binlog檔案和位置資訊。 然後用mysqldump --single-transaction和--master-data=1 這兩個選項, 把所有要同步的庫dump出來就OK
b) 先鎖表, 記錄binlog檔案和位置資訊。 然後用用系統命令拷貝好資料目錄, 另外對於innodb表, 使用mysqldump --single-transaction把這些innodb表單獨dump出來就OK , 到slave上也要做相應的兩步操作, 詳細如下:
這裡假設master/slave上的配置檔案以及相關的授權都已經OK。
STEP 1. 登入master伺服器, 開啟兩個虛擬終端, 一個在系統命令列用來操作拷貝, 一個用來進入mysql命令列進行鎖表操作
mysql命令列: mysql> FLUSH TABLES WITH READ LOCK; # 鎖表
mysql命令列: mysql> show master status; # 檢視當前binlog檔名及binlog的位置資訊, 並記錄下來。 比如 binlog.000049 | 3560393
系統命令列: # cd master的資料檔案目錄
系統命令列: # tar cf /www/master.tar.gz db1 db2 # 把資料檔案打包到/www/master.tar.gz檔案, 這裡為了速度, 並沒有執行壓縮。 在打包的過程中, 在mysql命令列執行show master status; 會發現打印出來的資訊一直沒改變。
系統命令列: # mysqldump -uroot --single-transaction --flush-logs --hex-blob db1 t1 t2 t3 > /www/innodb1.sql # 這裡執行完後, 使用show master status; 會發現新生成了一個新的binlog, 至於為什麼, 我也不知道, 問部門的DBA同事 , 說沒關係
待上面幾步都OK , 再在mysql命令執行解鎖操作:
mysql命令列: mysql> UNLOCK TABLES; # 解鎖
在master伺服器上的最後操作就是把剛剛打包好的/www/master.tar.gz 及/www/innodb1.sql檔案傳送到slave伺服器上。
STEP 2. 登入到slave伺服器
系統命令列: # mysqladmin shutdown # 先把mysql停掉
系統命令列: # tar xf master.tar.gz -C mysql的資料目錄 # 把master上的資料檔案解壓到slave上的資料目錄
系統命令列: # mysqld_safe & # 啟動mysql
mysql命令列:mysql> slave stop; # 停掉同步
系統命令列: # mysql -uroot db1 < ./innodb1.sql
mysql命令列:mysql> CHANGE MASTER TO MASTER_HOST='192.168.0.4', MASTER_PORT=3306, MASTER_USER='slave',
mysql命令列:mysql> slave start; # 開啟同步
mysql命令列:mysql> show slave status\G
發現各項資訊都比較正常
不過過了一段, 又出現錯誤資訊:
Last_Errno: 1690
Last_Error: Error 'BIGINT values is out of range in....'
最後在網上搜了下, 發現原來是因為slave的版本跟master的版本不一直導致, 把slave的版本更換成master一致的版本就OK 。