MySQL主從復制——主庫已有數據的解決方案
在上篇文章中我們介紹了基於Docker的Mysql主從搭建,一主多從的搭建過程就是重復了一主一從的從庫配置過程,需要註意的是,要保證主從庫my.cnf中server-id的唯一性。搭建完成後,可以在主庫show slave hosts
查看有哪些從庫節點。
我們來簡單了解一下Mysql主從復制的過程:
(1) master將改變記錄到二進制日誌(binary log)中(這些記錄叫做二進制日誌事件,binary log events);
(2) slave將master的binary log events拷貝到它的中繼日誌(relay log);
(3) slave重放中繼日誌中的事件,將改變反映它自己的數據。
MySQL主從復制——主庫已有數據的解決方案
由單機架構切換到一主一從或一主多從,在增加從庫節點前,主庫可能已經運行過一段時間,這種情況在實際業務中很常見。那麽如何應對開啟主從復制前主庫有數據的場景呢?
第一種方案是選擇忽略主庫之前的數據,不做處理。這種方案只適用於不重要的可有可無的數據,並且業務上能夠容忍主從庫數據不一致的場景。
第二種方案是對主庫的數據進行備份,然後將主數據庫中導出的數據導入到從數據庫,然後再開啟主從復制,以此來保證主從數據庫數據一致。
我們來詳細看一下第二種方案的處理:
查看主數據庫已有的數據庫
我們在主數據庫準備了一個TEST1庫,並且在其中準備一張數據表TEST和幾條測試數據。
使用Docker創建從數據庫
docker run -p 3346:3306 --name mysql-slave4 -e MYSQL_ROOT_PA SSWORD=123456 -d mysql:5.7
鎖定主數據庫
鎖定主數據庫,只允許讀取不允許寫入,這樣做的目的是防止備份過程中或備份完成之後有新數據插入,導致備份數據和主數據數據不一致。
mysql> flush tables with read lock;
查詢主數據庫狀態,並記下FILE及Position的值
mysql>show master status;
備份主數據庫
退出mysql終端,執行docker mysql備份命令
docker exec [CONTAINER] /usr/bin/mysqldump -u username --password=xxx [DATABASE] > backup.sql
我們這裏只需要備份TEST1數據庫,若要備份全部數據庫,[DATABASE]處使用--all-databases
。
此時報出Warning: Using a password on the command line interface can be insecure.
,這是因為我們在命令行輸入了密碼,所以會有安全警告信息。解決方案是在/etc/mysql/my.cnf中加入如下配置:
[mysqldump]
user = root
password = rootpassword
修改完配置文件後,再次執行備份命令不需要涉及用戶名密碼相關信息。
主數據庫備份數據導入從數據庫
cat backup.sql | docker exec -i [CONTAINER] /usr/bin/mysql -u username --password=xxx [DATABASE]
和上一步一樣,我們也需要在從數據庫配置用於備份的用戶名和密碼信息。
需要先在從數據庫建立一個同名數據庫,才能導入主數據庫備份數據。切換到從數據庫執行CREATE DATABASE TEST1;
,然後再次導入主數據備份數據。
此時備份數據導入已完成,可以在從數據庫進行數據驗證。
配置從數據庫
docker exec -it mysql-slave4 /bin/bash
cd /etc/mysql
vi my.cnf
,加入以下配置,註意server-id要保證唯一:
service mysql restart
重啟mysql服務,這會使得mysql服務所在的docker容器停止
docker start mysql-slave4
啟動docker容器
配置主從鏈接
切換到從數據庫,執行change master to master_host=‘172.17.0.2‘, master_user=‘slave‘, master_password=‘123456‘, master_port=3306, master_log_file=‘mysql-bin.000001‘, master_log_pos= 4952, master_connect_retry=30;
,關於這個命令在上一篇博客中有詳細介紹。
啟動主從復制start slave;
,此時查看從庫狀態show slave status \G;
,若是SlaveIORunning 和 SlaveSQLRunning 都是Yes,說明開啟主從復制過程成功。
解鎖主數據庫
切換回主數據庫的終端,進行表解鎖操作。
unlock tables;
測試主從復制
在主數據庫插入一條測試數據
切換到從數據庫,查詢測試數據,說明主從復制成功。
總結
應該盡可能優化流程,減少鎖表時間。
盡可能減少鎖表範圍,只鎖定相關的數據庫。
作者:擼碼那些事
微信公眾號:
來源:http://songwenjie.cnblogs.com/
聲明:本文為博主學習感悟總結,水平有限,如果不當,歡迎指正。如果您認為還不錯,不妨點擊一下下方的【推薦】按鈕,謝謝支持。轉載與引用請註明出處。
MySQL主從復制——主庫已有數據的解決方案