1. 程式人生 > >MySQL主從復制——主庫已有數據的解決方案

MySQL主從復制——主庫已有數據的解決方案

應對 command 二進制日誌 container www. 會有 操作 唯一性 了解

在上篇文章中我們介紹了基於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主從復制——主庫已有數據的解決方案