MYSQL管理之主從同步管理html
MYSQL主從同步架構是目前使用最多的數據庫架構之一,尤爲是負載比較大的網站,所以對於主從同步的管理也就顯得很是重要,新手每每在出現主從同步錯誤的時候不知道如何入手,這篇文章就是根據本身的經驗來詳細敘述mysql主從的管理。mysql
MYSQL主從同步的做用sql
(1) 數據分佈
(2) 負載平衡(load balancing)
(3) 備份
(4) 高可用性(high availability)和容錯數據庫
MYSQL主從同步的原理服務器
關於MYSQL的主從同步,最主要的是要了解MYSQL的主從同步是如何工做的也即主從同步的原理,經過下圖能很明白的指導其工做的過程:架構
大體描述一下過程:從服務器的IO線程從主服務器獲取二進制日誌,並在本地保存爲中繼日誌,而後經過SQL線程來在從上執行中繼日誌中的內容,從而使從庫和主庫保持一致。主從同步的詳細過程以下:ide
1. 主服務器驗證鏈接。工具
2. 主服務器爲從服務器開啓一個線程。網站
3. 從服務器將主服務器日誌的偏移位告訴主服務器。ui
4. 主服務器檢查該值是否小於當前二進制日誌偏移位。
5. 若是小於,則通知從服務器來取數據。
6. 從服務器持續從主服務器取數據,直至取完,這時,從服務器線程進入睡眠,主服務器線程同時進入睡眠。
7. 當主服務器有更新時,主服務器線程被激活,並將二進制日誌推送給從服務器,並通知從服務器線程進入工做狀態。
8. 從服務器SQL線程執行二進制日誌,隨後進入睡眠狀態。
MYSQL主從同步的搭建實戰
主從同步的搭建是一項比較細的技術活,前期作好了一些事情會讓你在之後的工做中減小不少工做,搭建的時候須要注意一些問題,一會搭建的時候會一邊搭建一邊介紹須要注意的問題,讓初學者能在剛開始的時候就有效的規避掉一些潛在的問題(MYSQL安裝這裏不作介紹):
1. 主從同步環境介紹
操做系統環境:Centos 5.5 64 bit
MYSQL版本:MYSQL 5.1.50
主服務器的IP:10.1.1.75
從服務器的IP:10.1.1.76
2. 在主服務器上創建同步賬號
GRANT REPLICATION SLAVE,FILE ON *.* TO 'replication'@'10.1.1.%' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
注意:你們在設置權限的時候不要將密碼設置過於簡單!
3. 從服務器配置文件的更改
server-id = 2
replicate-wild-ignore-table=mysql.%
log-slave-updates #這個有須要能夠開啓
注意:
server-id這一項須要認真檢查,必定不能和主服務器衝突了,否則到時候會出現莫民其妙的問題,由於同步的時候會會根據server-id作判斷,若是server-id同樣就不進行同步了,否則可能會致使死循環(主主同步或者環狀同步的時候)。
有的人會感受奇怪我這裏爲何要使用replicate-wild-ignore-table參數,而不是用replicate-do-db或者replicate-ignore-db來過濾須要同步的數據庫和不須要同步的數據庫。這裏有幾個緣由:
replicate-wild-ignore-table參數能同步全部跨數據庫的更新,好比replicate-do-db或者replicate-ignore-db不會同步相似
use mysql;
UPDATE test.aaa SET amount=amount+10;
B. replicate-wild-ignore-table=mysql.%在之後須要添加同步數據庫的時候能方便添加而不須要從新啓動從服務器的數據庫。由於之後極可能須要同步其餘的數據庫。
3) auto_increment_increment和auto_increment_offset參數,這 兩個參數通常用在主主同步中,用來錯開自增值, 防止鍵值衝突。
4) --slave-skip-errors參數,不要胡亂使用這些跳過錯誤的參數,除非你很是肯定你在作什麼。當你使用這些參數時候,MYSQL會忽略那些錯誤,這樣會致使你的主從服務器數據不一致。
4. 從主服務器獲得一個快照版本
若是你的是MYISAM或者既有MYISAM又有INNODB的話就在主服務器上使用以下命令導出服務器的一個快照:
mysqldump -uroot -p --lock-tables --events --triggers --routines --flush-logs --master-data=2 --databases test > db.sql
試過只有INNODB的話就是用以下命令:
mysqldump -uroot -p --single-transaction --events --triggers --routines --flush-logs --master-data=2 --databases test > db.sql
這裏須要注意幾個參數的使用:
--single-transaction 這個參數只對innodb適用。
--databases 後面跟除mysql之後的其餘全部數據庫的庫名,我這裏只有一個test庫。
--master-data 參數會記錄導出快照時候的mysql二進制日誌位置,一會會用到。
5. 將快照版本還原到從服務器上
mysqldump -uroot -p -h 10.1.1.76 test < db.sql
將快照版本還原到從服務器上之後,此時從服務器上的數據和主服務器的數據是一致的。
6. 在從服務器上使用change master從主服務器上同步
使用grep命令查找到二進制日誌的名稱以及位置
[root@ns1 ~]# grep -i "change master" db.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000006', MASTER_LOG_POS=106;
生成CHANGE MASTER語句,而後在從上執行
STOP SLAVE;
CHANGE MASTER TO MASTER_HOST='10.1.1.75',MASTER_USER='replication',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000006', MASTER_LOG_POS=106;
START SLAVE;
這樣就完成了主從同步的搭建,最後使用SHOW SLAVE STATUS\G;查看Slave_IO_Running和Slave_SQL_Running的狀態,若是都爲Yes,就大功告成了。
注意:不要將同步的信息寫入配置文件中,不方便管理,尤爲是有變更須要重啓。
MYSQL主從同步的管理
這裏介紹一些管理MYSQL主從同步的命令:
1. 中止MYSQL同步
STOP SLAVE IO_THREAD; #中止IO進程
STOP SLAVE SQL_THREAD; #中止SQL進程
STOP SLAVE; #中止IO和SQL進程
2. 啓動MYSQL同步
START SLAVE IO_THREAD; #啓動IO進程
START SLAVE SQL_THREAD; #啓動SQL進程
START SLAVE; #啓動IO和SQL進程
3. 重置MYSQL同步
RESET SLAVE;
用於讓從屬服務器忘記其在主服務器的二進制日誌中的複製位置, 它會刪除master.info和relay-log.info文件,以及全部的中繼日誌,並啓動一個新的中繼日誌,當你不須要主從的時候能夠在從上執行這個操做。否則之後還會同步,可能會覆蓋掉你的數據庫,我之前就遇到過這樣傻叉的事情。哈哈!
4. 查看MYSQL同步狀態
SHOW SLAVE STATUS;
這個命令主要查看Slave_IO_Running、Slave_SQL_Running、Seconds_Behind_Master、Last_IO_Error、Last_SQL_Error這些值來把握複製的狀態。
5. 臨時跳過MYSQL同步錯誤
常常會朋友mysql主從同步遇到錯誤的時候,好比一個主鍵衝突等,那麼我就須要在確保那一行數據一致的狀況下臨時的跳過這個錯誤,那就須要使用SQL_SLAVE_SKIP_COUNTER = n命令了,n是表示跳事後面的n個事件,好比我跳過一個事件的操做以下:
STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
START SLAVE;
6. 從指定位置從新同步
有的時候主從同步有問題了之後,須要從log位置的下一個位置進行同步,至關於跳過那個錯誤,這時候也可使用CHANGE MASTER命令來處理,只要找到對應的LOG位置就能夠,好比:
CHANGE MASTER TO MASTER_HOST='10.1.1.75',MASTER_USER='replication',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000006', MASTER_LOG_POS=106;
START SLAVE;
MYSQL主從同步的管理經驗介紹
1. 不要亂使用SQL_SLAVE_SKIP_COUNTER命令。
這個命令跳過以後極可能會致使你的主從數據不一致,必定要先將指定的錯誤記錄下來,而後再去檢查數據是否一致,尤爲是核心的業務數據。
2. 結合percona-toolkit工具pt-table-checksum按期查看數據是否一致。
這個是DBA必需要按期作的事情,呵呵,有合適的工具何樂而不爲呢?另外percona-toolkit還提供了對數據庫不一致的解決方案,能夠採用pt-table-sync,這個工具不會更改主的數據。還可使用pt-heartbeat來查看從服務器的複製落後狀況。具體的請查看:http://blog.chinaunix.net/uid-20639775-id-3229211.html。
3. 使用replicate-wild-ignore-table選項而不要使用replicate-do-db或者replicate-ignore-db。
緣由已經在上面作了說明。
4. 將主服務器的日誌模式調整成mixed。
5. 每一個表都加上主鍵,主鍵對數據庫的同步會有影響尤爲是居於ROW複製模式。
原文:http://blog.chinaunix.net/uid-20639775-id-3254611.html