MySQL 數據庫主從同步配置

一、概述

    模式:

    主從複製,主庫寫入數據,從庫同步主庫數據,從庫保持與主庫內容一致,達到實施備份的效果。

    優勢:

  • 數據分佈(data distribution)
  • 負載平衡(load balancing),實現讀寫分離,緩解數據庫壓力。
  • 數據備份(backup)
  • 高可用性與容錯行(high availability and failover)

    原理圖如下:

    功能:

  • BinLog:二進制文件,存儲MasterDB(主數據庫)中修改數據的內容,存儲內容的格式有Statement,Row,Mixed。
  • Relay Log:功能作用與Binlog一樣,不同點在於當日志內的內容被讀取完後,會被刪除。
  • Binlog dump:將讀取Binlog後發送數據給IO線程。
  • IO線程:將接收到數據傳給RelayLog日誌。
  • SQL線程:讀取RelayLog數據。

    流程:

  1. 從庫,配置主庫信息,建立連接。
  2. MasterDB數據庫數據發生變化時,會記錄在Binlog日誌中。
  3. Binlog dump線程讀取Binlog中的內容,將數據發送給IO線程。
  4. IO線程再將數據存入RelayLog中。
  5. SQL線程讀取RelayLog中的數據並寫入從庫。

二、安裝和配置

2.1 環境說明

    提示:主從庫的數據庫版本最好保持一致,或者,從庫的版本一定要高於主庫版本,否則在數據同步過程中可能會出現問題,切記。

    這裏使用測試環境來記錄。

    Master(主數據庫)環境:

  • 機器:物理機
  • 網絡:固定IP
  • 系統:Windows 7
  • IP:192.168.2.166
  • 子網掩碼:255.255.255.0
  • 默認網關:192.168.2.1
  • DNS1:202.100.199.8
  • DNS2:202.100.192.68
  • 數據庫版本:MySQL 5.7.19

    Slave(從數據庫)環境:

  • 機器:從宿主機器建立Esxi環境,在Esxi下建立Centos系統。
  • 網絡:1.Esxi 網絡橋接 2.Centos 網絡橋接
  • 系統:虛擬機 Linux Centos 7
  • IP:192.168.2.110
  • 子網掩碼:255.255.255.0
  • 默認網關:192.168.2.1
  • DNS1:202.100.199.8
  • DNS2:202.100.192.68
  • 數據庫版本:MySQL 5.7.30

    環境測試:

    要求:IP互通,端口互通

    Windows:

  • ping 192.168.2.110
  • telnet 192.168.2.110 3306

    Centos:

  • ping 192.168.2.166
  • telnet 192.168.2.166 3306 或 wget 192.168.2.166:3306 或 curl 192.168.2.166 3306

2.2 配置主數據庫(Master)

    1.修改【主數據庫】配置文件,Windows 下默認配置文件(my.ini)路徑可以通過服務裏面查詢。

    2.修改my.ini配置文件,找到以下2行代碼取消註釋並修改。

  • Master(主數據庫)192.168.2.166
[mysqld]

# 啓用二進制日誌,可指定指定路徑和名稱
log-bin=mysql-bin

# 服務唯一ID,默認是1,一般取IP最後一段,如IP:192.168.2.166
server-id=166

    3.重啓數據庫服務。

    4.進入到主數據庫中,創建從數據庫的操作用戶賬號和權限

# 1.登錄
mysql -uroot -p

# 2.創建用戶並授權 REPLICATION SLAVE ,用戶:backup-user,密碼:backup-user,授權IP:192.168.2.110(從數據庫IP)
grant replication slave on *.* to 'backup_user'@'192.168.2.110' identified by 'backup_user';

# 3.刷新權限
flush privileges;

# 4.查詢用戶表
select user,host from mysql.user;

    5.清除日誌索引文件,用於第1次搭建主從環境。

reset master;

    6.查詢 master 狀態。

show master status\G;
  • File:mysql-bin.000001
  • Position:154

2.3 配置從數據庫(Slave)

    1.修改my.ini配置文件(Linux下,執行 vim /etc/my.cnf),添加以下2行代碼。

  • Slave(從數據庫)192.168.2.110
[mysqld]

# 啓用二進制日誌,可指定指定路徑和名稱
log-bin=mysql-bin

# 服務唯一ID,默認是1,一般取IP最後一段,如IP:192.168.2.110
server-id=110

# 複製進程不隨MySQL啓動而啓動,設置後重啓數據庫後需要手動啓動複製進程,即start slave
skip-slave-start=on

# 同步的數據庫名稱
replicate_wild_do_table=test_db.*

    3.重啓數據庫服務。(systemctl restart mysqld.service)

    4.修改從數據庫的master鏈接配置。

  • MASTER_HOST='192.168.2.166' # 連接主機地址
  • MASTER_USER='backup_user' # 連接主機賬號
  • MASTER_PASSWORD='backup_user' # 連接主機賬號密碼
  • MASTER_LOG_FILE='mysql-bin.000001' # 日誌文件-通過查詢主數據庫master狀態取得
  • MASTER_LOG_POS=154 # 日誌文件起始位置-通過查詢主數據庫master狀態取得
# 1.修改master信息
CHANGE MASTER TO MASTER_HOST='192.168.2.166',MASTER_USER='backup_user',MASTER_PASSWORD='backup_user',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=154;

# 2.開啓
start slave;

# 3.查詢狀態
show slave status\G;

    以下兩行代碼都顯示yes代表已經配置成功。

  • Slave_IO_Running:Yes
  • Slave_SQL_Running:Yes

2.4 同步數據庫

    1.如沒有舊的數據庫需要同步,則可以直接使用。如主數據庫上,有舊的數據庫需要同步,則要進行鎖表操作,防止對數據庫進行讀寫改變日誌索引文件的位置值,將數據庫上的數據庫導入數據庫後再進行解鎖。

flush tables with read lock;

    2.將需要同步的數據庫導出(可使用mysql命令或其他工具均可,如:Navicat等)。

    3.導入從數據庫後,在主數據庫上,進行解鎖操作。

unlock tables;

    4.這裏直接使用Navicat將表同步過去。

三、測試

    注意:啓動從數據庫同步命令以前建立的數據庫是不會同步的,如需要同步舊的數據庫,看2.4步驟,這裏直接使用新增表操作來演示。

  1. 在主數據庫上(192.168.2.166),新建 Article 表,新增1條數據。
  2. 刷新從數據庫(192.168.2.110),可以看到從數據庫已經同步了。

四、要點說明和場景應用(其它)

4.1 從庫解除主從關係

    場景:從庫解除主從關係,提升從庫爲主庫進行使用或重置主從關係和日誌文件。

    1.在從庫數據庫命令行中,先停止主從關係進程。

stop slave

    2.再使用以下命令,清除主從複製關係的位置信息。該語句將被用於乾淨的啓動,它刪除 master.info 文件和 relay-log.info 文件以及所有的 relay log 文件並重新啓用一個新的 relaylog 文件。

reset slave

    3.查詢狀態

show slave status\G;

    4.修改 my.cnf 刪除主從相關配置參數。

4.2 skip-slave-start 使從數據庫複製進程不隨從數據庫啓動而啓動

    場景:從數據庫重啓時,確保手動啓動從數據庫複製進程是正常的,我們一般在從數據庫配置文件中加入 skip-slave-start=on 參數配置,查詢相關配置是否正確(主數據庫 show master status\G; 的 File 和 Position 值正確爲前提),從數據庫重啓完成後,先檢查主數據庫值,再手動去啓動複製進程 start slave。

4.3 指定同步數據庫

    第1種,在主數據庫中進行 grant 用戶授權時,限定用戶可操作的數據庫。

# 統一格式
grant 權限1,權限2,... on 數據庫名稱.表名稱 to '用戶名'@'授權地址' identified by '用戶密碼';

# 栗子:創建並授權本地 root用戶 全部數據庫 全部權限
grant all privileges on *.* to 'root'@'localhost' identified by 'root';

# 栗子:創建並授權192.168.2.110地址 test_user用戶 test_db數據庫 select,insert權限
grant select,insert on test_db.* to 'test_user'@'192.168.2.110' identified by 'test_user';

# 栗子:創建並授權192.168.2.110地址 test_user用戶 test_db數據庫 user數據表 select,insert權限
grant select,insert on test_db.user to 'test_user'@'192.168.2.110' identified by 'test_user';

# 栗子:創建並授權192.168.2.110地址 backup_user用戶 test_db數據庫 replication slave權限
grant replication slave on test_db.* to 'backup_user'@'192.168.2.110' identified by 'backup_user';

    第2種,在數據庫配置文件中(my.ini、my.cnf),設置以下規則參數,數據庫中不做限制。

  • 不建議使用:binlog_do_db=DB_NAME(需要同步的數據庫,1.如需同步全部數據庫,則不需要設置;2.多個數據庫,用逗號分開)
  • 不建議使用:binlog_ignore_db=DB_NAME(需要忽略的數據庫,搭配使用)

    第3種,在數據庫配置文件中(my.ini、my.cnf),設置以下規則參數,數據庫中不做限制。

  • 不建議使用:replicate_do_db=DB_NAME(需要同步的數據庫,1.如需同步全部數據庫,則不需要設置;2.多個數據庫,用逗號分開)
  • 不建議使用:replicate_ignore_db=DB_NAME(需要忽略的數據庫,搭配使用)
  • 不建議使用:replicate_do_table=DB_NAME.TABLE_NAME(需要同步的數據表,1.如需同步全部數據表,則不需要設置;2.多個數據表,用逗號分開)
  • 不建議使用:replicate_igore_table=DB_NAME.TABLE_NAME(需要忽略的數據表,搭配使用)
  • 建議使用:replicate_wild_do_table=DB_NAME.TABLE_NAME(可解決跨庫和過濾問題,需要同步的數據表,全部表:DB_NAME.%)
  • 建議使用:replicate_wild_ignore_table=DB_NAME.TABLE_NAME(可解決跨庫和過濾問題,需要忽略的數據表,全部表:DB_NAME.%)

五、參考文章

  • https://blog.csdn.net/Yoga0301/article/details/80545914?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.compare&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.compare
  • https://blog.csdn.net/kjsayn/article/details/51350691?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-7.compare&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-7.compare
  • https://blog.csdn.net/donghaixiaolongwang/article/details/78591012

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章