MySQL主從同步配置

天葬發表於2021-08-05

Mysql主從同步配置

配置準備

  • 需要兩個資料庫
  • mysql 視覺化工具,當然使用用命令列也可以
  • 我這裡演示使用 docker 啟動兩個 mysql 容器, 你也可以安裝兩個 mysql 前提版本一致

第一步

安裝兩個 mysql

建立 msyql 掛載目錄

[root@localhost /]# mkdir -p /opt/docker/mysql1/conf/
[root@localhost /]# mkdir -p /opt/docker/mysql1/logs/
[root@localhost /]# mkdir -p /opt/docker/mysql1/data/

啟動第一個 mysql 掛載對應的檔案目錄 port: 6894

[root@localhost /]# docker run -d -p 6894:3306 --name mysql1 \
                    -v /opt/docker/mysql1/conf:/etc/mysql/ \
                    -v /opt/docker/mysql1/logs:/logs \
                    -v /opt/docker/mysql1/data:/var/lib/mysql \
                    --privileged=true \
                    -e MYSQL_ROOT_PASSWORD=qtykGhC29eP4Smp mysql:5.7 

通過拷貝第二個 mysql

需要注意復的 mysql /opt/docker/mysql2/data/auto.cnf 目錄下有一個 auth.cnf 需要刪除

[root@localhost docker]# cp -r /opt/docker/mysql1/ /opt/docker/mysql2/

刪除 auth.cnf 檔案

[root@localhost docker]# rm -f /opt/docker/mysql2/data/auto.cnf 

啟動第二個 mysql

[root@localhost docker]#  docker run -d -p 6895:3306 --name mysql2 \
                    -v /opt/docker/mysql2/conf:/etc/mysql/ \
                    -v /opt/docker/mysql2/logs:/logs \
                    -v /opt/docker/mysql2/data:/var/lib/mysql \
                    --privileged=true \
                    -e MYSQL_ROOT_PASSWORD=qtykGhC29eP4Smp mysql:5.7 

第二步

編寫mysql配置檔案

主庫 my.cnf 檔案

[root@localhost docker]# vim /opt/docker/mysql1/conf/my.cnf

my.cnf 檔案內容

[mysqld]
# 主庫配置
server-id=1 # 服務 id 唯一性
log-bin=mysql1-log # 開啟二進位制日誌 
binlog-format=ROW # 日誌記錄模式
replicate-do-db=db_docker # 要複製的資料名稱
# replicate-ignore-db=db_docker # 不需要複製的資料名稱

從庫 my.cnf 檔案

[root@localhost docker]# vim /opt/docker/mysql2/conf/my.cnf

my.cnf 檔案內容

[mysqld]
# 從庫配置
server-id=2   # 服務 id 唯一性
log-bin=mysql2-log  # 開啟二進位制日誌 
binlog-format=ROW # 日誌記錄模式 
binlog-do-db=db_docker # 要複製的資料名稱
# binlog-ignore-db=db_docker # 不需要複製的資料名稱

重啟 docker mysql 容器

[root@localhost docker]# docker restart mysql1
[root@localhost docker]# docker restart mysql2

第三步

初始化資料

兩個 mysql 分別執行以下 sql 語句建立資料庫建立表

-- 建立資料庫
CREATE DATABASE `db_docker`;
USE db_docker;
-- 建立表
CREATE TABLE `t_docker` (
    `id` INT ( 11 ) NOT NULL AUTO_INCREMENT,
    `name` VARCHAR ( 255 ) DEFAULT NULL,
     PRIMARY KEY ( `id` )
) ENGINE = INNODB AUTO_INCREMENT =0 DEFAULT CHARSET = utf8;

檢視主庫二進位制日誌

主庫執行以下命令輸出二進位制日誌檔案的狀態資訊

mysql> SHOW MASTER STATUS ;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |     2223 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+

配置從庫二進位制日誌

從庫更改用於連線到複製主庫、讀取主庫的二進位制日誌和讀取從庫的中繼日誌的引數

CHANGE MASTER TO
MASTER_HOST="192.168.101.59", # 主機地址 你的主伺服器 ip
Master_Port=6894, # 埠
MASTER_USER="root", # 賬號
MASTER_PASSWORD="qtykGhC29eP4Smp", # 密碼
MASTER_LOG_FILE="mysql-bin.000001", # 主庫二進位制檔名 根據實際情況填寫
MASTER_LOG_POS=377; # 主庫二進位制檔案位置 根據實際情況填寫

從庫執行,啟動複製

mysql> START SLAVE;

從庫執行緒的基本引數的狀態資訊。從 MySQL 8.0.22 開始,使用 SHOW REPLICA STATUS代替 SHOW SLAVE STATUS,該版本已棄用。在 MySQL 8.0.22 之前的版本中,使用SHOW SLAVE STATUS. 該語句需要REPLICATION CLIENT特權(或已棄用的 SUPER特權)。

以下兩引數為 yes 表示配置成功,否則配置有問題。 Slave_IO_Running: Yes Slave_SQL_Running: Yes

如果以上兩個引數有一個未 No 說明有錯誤,請檢視這個兩個欄位 Last_Errno Last_Error

錯誤內容會記錄在 Last_Error 這個欄位中,根據錯誤內容修改。

mysql>  SHOW SLAVE STATUS \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.101.59
                  Master_User: root
                  Master_Port: 6894
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 2223
               Relay_Log_File: 98394ee2fb48-relay-bin.000004
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 2223
              Relay_Log_Space: 534
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
                  Master_UUID: aa58ab20-f500-11eb-aa65-0242ac110002
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 

其他

mysql 相關命令

停止主庫的資料更新操作

mysql>flush tables with read lock;

主庫解鎖

mysql>unlock tables;

從庫執行,停止複製; 當從庫配置二進位制日誌出錯時,需要停止複製或重置,再重新配置,讓後啟動複製

mysql> STOP SLAVE;

從庫執行,重置複製

mysql> RESET SLAVE;

mysql 注意事項

  • 版本不同對應的命令和配置檔案可能存在差異
  • 演示使用的是 mysql 5.7
  • 如果命令或配置不起作用 詳情官網
  • 在實際應用中儘量不要使用預設埠 3306 容易被攻擊

mysql 容器

進入容器

docker exec -it mysql2 /bin/sh
# mysql2 容器名稱 這裡也可以是容器 id

登入 mysql

mysql -u root -pqtykGhC29eP4Smp
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 5.7.35-log MySQL Community Server (GPL)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

my.cnf 配置解釋

[mysqld]
# 主庫配置
# 指定一個唯一的伺服器 ID,可以為0但是伺服器會拒絕,所以有效值 1~4294967295 之間。預設值1
# 官網 https://dev.mysql.com/doc/refman/5.7/en/replication-options.html
server-id=1
# 開啟二進位制日誌,二進位制檔名稱,可以是路徑 例如: /logs/mysql/log 但是需要注意給目錄檔案提權,否則mysql可以無權寫入,導致報錯。
log-bin=mysql1-log
# 日誌記錄模式 有三種 
# STATEMENT 導致日誌記錄基於語句。
# ROW 導致日誌記錄基於行。這是預設設定。
# MIXED 導致日誌記錄使用混合格式。介於 前兩種模式之間
# 官網 https://dev.mysql.com/doc/refman/5.7/en/binary-log-setting.html
binlog-format=ROW 
# 要複製的資料名稱,要指定多個資料庫,您必須使用此選項的多個例項。
# 由於資料庫名稱可以包含逗號,如果您提供逗號分隔列表,則該列表將被視為單個資料庫的名稱。
# 多個例項:
# replicate-do-db=db_docker1 
# replicate-do-db=db_docker2 
replicate-do-db=db_docker 
# 不需要複製的資料名稱,配置同上
# replicate-ignore-db=db_docker # 不需要複製的資料名稱
[mysqld]
# 從庫配置同上 舉一反三
server-id=2   # 服務 id 唯一性
log-bin=mysql2-log  # 開啟二進位制日誌 
binlog-format=ROW # 日誌記錄模式 
binlog-do-db=db_docker # 要複製的資料名稱
# binlog-ignore-db=db_docker # 不需要複製的資料名稱

auth.cnf 檔案

檔案內容 server-uuid

這裡 UUID 也是必須唯一,啟動的時候會自動生成。如果您也是通過複製 mysql data 目錄建立的資料庫需要刪除該檔案

[auto]
server-uuid=aa58ab20-f500-11eb-aa65-0242ac110002

UUID相同會報以下錯誤

Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.

官網二進位制日誌配置:https://dev.mysql.com/doc/refman/5.7/en/replication-options-binary-log.html

相關文章