MySQL 不停機不鎖表主從搭建
MySQL主從搭建分幾種場景
- 無業(yè)務(wù)數(shù)據(jù),初始化搭建
- 有業(yè)務(wù)數(shù)據(jù),臨時擴(kuò)展
初始化的搭建很簡單,不涉及數(shù)據(jù)業(yè)務(wù),所以鎖表、停機等都不影響,但是更多時候是業(yè)務(wù)到一定階段,才會涉及到橫向擴(kuò)展,需要做主從,讀寫分離等來提升服務(wù)性能
這個時候,數(shù)據(jù)業(yè)務(wù)不能中斷,又需要快速進(jìn)行擴(kuò)展提升性能,只能在不停機、不停服務(wù)的情況下擴(kuò)展,就需要用到下面介紹的這種方法來做數(shù)據(jù)庫主從
當(dāng)然還是有前提條件,如果你原本MySQL連binlog及server_id都這種基礎(chǔ)配置都沒做,那也談不上不停機配置主從
原理
不停機實現(xiàn)主從搭建的關(guān)鍵點就是以下兩個參數(shù):
- --single-transaction
- --master-data
master-data參數(shù)主要用來記錄主庫的binlog_file和pos,它有兩個值,分別是:
1:在mysqldump過程中,將binlogfile和pos信息記錄在sql中,并且不是以注釋信息的方式記錄,這樣在執(zhí)行導(dǎo)入的時候自動執(zhí)行這部分信息
2:在mysqldump過程中,將binlogfile和pos信息以注釋的方式記錄在sql中
single-transaction參數(shù)則是通過提交單一事務(wù)來確保數(shù)據(jù)一致性,通過在FLUSH TABLES WITH READ LOCK 后添加START TRANSACTION 語句,開啟單一事務(wù),此時加鎖,僅僅是為了獲取準(zhǔn)確的master-data中的binlogfile和pos信息,在開啟事務(wù)后,鎖已經(jīng)釋放了,所以對業(yè)務(wù)影響很小
通過以上兩個參數(shù),可以在不長時間鎖表的情況下獲取準(zhǔn)確的binlogfile和pos信息,從而完成主從配置
實戰(zhàn)
導(dǎo)出數(shù)據(jù)
從主庫通過mysqldump導(dǎo)出數(shù)據(jù)
- mysqldump -uroot -ppassword --single-transaction --master-data=2 --databases db1 db2 xxx > databases.sql
打包壓縮
- tar -zcvf databases.sql.tar.gz databases.sql
復(fù)制到從庫
- scp databases.sql.tar.gz root@slave_ip:/data/sql/
后面的操作在從庫進(jìn)行
解壓
- tar -zxvf databases.sql.tar.gz
導(dǎo)入數(shù)據(jù)
- source /path_to/databases.sql.tar.gz
配置主從同步參數(shù)
- change master to master_host='ip',master_user='slave',master_port=port,master_password='password',master_log_file='mysql-bin.file',master_log_pos=POS;
其中master_log_file和master_log_pos就是上面通過master-data=2參數(shù)導(dǎo)出的,在sql文件里面開頭部分
啟動slave同步
- start slave;
查看同步狀態(tài)
- show slave status\G;
通過這種方法,可以在不停止業(yè)務(wù)的情況下,保證數(shù)據(jù)一致性的同時,快速擴(kuò)展從庫