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