阿里雲ECS,公網IP 121.40.110.2
使用docker安裝mysql8,創建三個容器:
實例A:A數據庫 A表
實例B:B數據庫 B表
實例C:C數據庫C表
兩種情形:
第一種
A庫和B庫同步到實例C;
第二種
A庫A表和B庫B表同步到C庫
一、使用docker創建mysql8容器
1、安裝docker
yum install docker -y systemctl start docker systemctl enable docker
2、拉取mysql鏡像
docker pull mysql
docker images
3、啟動三個mysql容器mysql8-1、mysql8-2、mysql8-3
docker run --name mysql8-1 -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest docker run --name mysql8-2 -p 3311:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest docker run --name mysql8-3 -p 3312:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest
4、進入mysql8-1容器(先不要建自己的datingcenter等后面測試的庫)
docker exec -it mysql8-1 /bin/bash
連接數據庫,查看數據庫版本
5、設置數據庫遠程連接
設置遠程登錄數據庫的root賬戶
mysql8和mysql5的版本不一樣,具體操作
GRANT ALL ON *.* TO 'root'@'%';
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '你的密碼';
FLUSH PRIVILEGES;
6、創建用戶slave用於從庫同步復制,授予復制、同步訪問
mysql8和mysql5的版本不一樣,具體操作
mysql> use mysql;
mysql> CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
mysql>ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
mysql> GRANT replication slave ON *.* TO 'slave'@'%';
mysql>FLUSH PRIVILEGES;
其他兩個容器同樣操作
容器安裝編輯器vim
https://www.cnblogs.com/xiaoyou2018/p/10912117.html
二、配置數據庫多源一從
和mysql一主一從復制相比,多源復制加入了一個叫做Channel的概念, 每一個Channel都是一個獨立的Slave,都有一個IO_THREAD和SQL_THREAD。原理和普通復制一樣。我們只需要對每一個Master執行Change Master 語句,只需要在每個語句最后使用For Channel來進行區分。多源復制和正常主從其他的配置都一樣,基本上主庫開下binlog、server-id不一樣就可以了,只有下列額外限制:
- master-info-repository必須為TABLE
- relay-log-info-repository必須為TABLE
- 以FOR CHANNEL 'CHANNEL_NAME'區分不同的master。
第一種情形:
主庫同步到從庫的情況如下配置:
- 主庫mysql8-1:IP=121.40.110.2; PORT=3310; server-id=1; database=datingcenter; table=aa、dd
- 主庫mysql8-2:IP=121.40.110.2; PORT=3311; server-id=2; database=usercenter ;table=cc、bb
- 從庫mysql8-3:IP=121.40.110.2; PORT=3312; server-id=3; database=datingcenter、usercenter、matchcenter ;table=aa、dd、cc、bb
配置約束
- 主從庫必須保證網絡暢通可訪問
- 主庫必須開啟binlog日志
- 主從庫的server-id必須不同
【主庫mysql8-1】操作及配置
配置my.cnf(/etc/mysql/my.cnf)
添加如下的內容
client] port = 3306 default-character-set = utf8mb4 [mysql] port = 3306 default-character-set = utf8mb4 [mysqld] ########################## # summary ########################## #bind-address = 0.0.0.0 #port = 3306 #datadir=/datavol/mysql/data #數據存儲目錄 ########################## # log bin ########################## server-id = 1 #必須唯一 log_bin = mysql-bin #開啟及設置二進制日志文件名稱 binlog_format = MIXED sync_binlog = 1 expire_logs_days =7 #二進制日志自動刪除/過期的天數。默認值為0,表示不自動刪除。 #binlog_cache_size = 128m #max_binlog_cache_size = 512m #max_binlog_size = 256M
#要同步的數據庫
binlog-do-db = datingcenter
#不需要同步的數據庫
binlog-ignore-db = mysql
binlog_ignore_db = information_schema
binlog_ignore_db = performance_schema
binlog_ignore_db = sys
########################## # character set ##########################
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
log_bin是否開啟
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
1 row in set
查看master狀態
mysql> show master status \G;
*************************** 1. row ***************************
File: mysql-bin.000001
Position: 155
Binlog_Do_DB: datingcenter
Binlog_Ignore_DB: mysql,information_schema,performation_schema,sys
記住file、position這兩個值,后面需要用到
【主庫mysql8-2】配置及操作
配置my.cnf
添加如下的內容
client] port = 3306 default-character-set = utf8mb4 [mysql] port = 3306 default-character-set = utf8mb4 [mysqld] ########################## # summary ########################## #bind-address = 0.0.0.0 #port = 3306 #datadir=/datavol/mysql/data #數據存儲目錄 ########################## # log bin ########################## server-id = 2 #必須唯一 log_bin = mysql-bin #開啟及設置二進制日志文件名稱 binlog_format = MIXED sync_binlog = 1 expire_logs_days =7 #二進制日志自動刪除/過期的天數。默認值為0,表示不自動刪除。 #binlog_cache_size = 128m #max_binlog_cache_size = 512m #max_binlog_size = 256M #要同步的數據庫 binlog-do-db = usercenter #不需要同步的數據庫 binlog-ignore-db = mysql binlog_ignore_db = information_schema binlog_ignore_db = performance_schema binlog_ignore_db = sys ########################## # character set ########################## character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci
log_bin是否開啟
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
1 row in set
查看master狀態
mysql> show master status \G;
*************************** 1. row ***************************
File: mysql-bin.000002
Position: 155
Binlog_Do_DB: usercenter
Binlog_Ignore_DB: mysql,information_schema,performation_schema,sys
【從庫mysql8-3】配置及操作
配置my.cnf
[client] port = 3306 default-character-set = utf8mb4 [mysql] port = 3306 default-character-set = utf8mb4 [mysqld] ########################## # summary ########################## #bind-address = 0.0.0.0 #port = 3306 #datadir=/datavol/mysql/data #數據存儲目錄 ########################## # log bin ########################## server-id = 3 master_info_repository = table relay_log_info_repository = table ########################## # character set ########################## character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci
設置【主庫】信息
登錄【從庫mysql8-3】,進入mysql命令行。
mysql> stop slave; Query OK, 0 rows affected mysql> CHANGE MASTER TO MASTER_HOST='121.40.110.2', MASTER_PORT=3310, MASTER_USER='slave', MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=155 for channel '1'; Query OK, 0 rows affected mysql> CHANGE MASTER TO MASTER_HOST='121.40.110.2', MASTER_PORT=3311, MASTER_USER='slave', MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=155 for channel '2'; Query OK, 0 rows affected mysql> start slave; Query OK, 0 rows affected
stop slave; //停止同步
start slave; //開始同步
//必須和【主庫】的信息匹配。
CHANGE MASTER TO
MASTER_HOST='121.40.110.2 //主庫IP
MASTER_PORT=3310, //主庫端口
MASTER_USER='slave', //訪問主庫且有同步復制權限的用戶
MASTER_PASSWORD='123456', //登錄密碼
//【關鍵處】從主庫的該log_bin文件開始讀取同步信息,主庫show master status返回結果
MASTER_LOG_FILE='mysql-bin.000001',
//【關鍵處】從文件中指定位置開始讀取,主庫show master status返回結果
MASTER_LOG_POS=155
for channel '1'; //定義通道名稱
查看同步狀態
mysql> show slave status \G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 47.111.132.49 Master_User: slave Master_Port: 3310 Connect_Retry: 60 Master_Log_File: mysql-bin.000006 Read_Master_Log_Pos: 169442 Relay_Log_File: efe0882a2350-relay-bin-1.000017 Relay_Log_Pos: 169656 Relay_Master_Log_File: mysql-bin.000006 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: 169442 Relay_Log_Space: 170040 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: 399257c7-a933-11e9-8d35-0242ac110002 Master_Info_File: mysql.slave_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: (datingCenter_0,matchCenter_0),(userCenter_0,matchCenter_0) Channel_Name: 1 Master_TLS_Version: Master_public_key_path: Get_master_public_key: 0 Network_Namespace: *************************** 2. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 47.111.132.49 Master_User: slave Master_Port: 3311 Connect_Retry: 60 Master_Log_File: mysql-bin.000006 Read_Master_Log_Pos: 155 Relay_Log_File: efe0882a2350-relay-bin-2.000019 Relay_Log_Pos: 369 Relay_Master_Log_File: mysql-bin.000006 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: 155 Relay_Log_Space: 753 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: 2 Master_UUID: 39a3fc71-a933-11e9-ac19-0242ac110003 Master_Info_File: mysql.slave_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: (datingCenter_0,matchCenter_0),(userCenter_0,matchCenter_0) Channel_Name: 2 Master_TLS_Version: Master_public_key_path: Get_master_public_key: 0 Network_Namespace: 2 rows in set (0.01 sec) ERROR: No query specified
可以看見設置兩個個的主從同步通道的所有狀態信息。
只有【Slave_IO_Running】和【Slave_SQL_Running】都是Yes,同步才是正常的。
如果是No或者Connecting都不行,可查看mysql-error.log,
可以重啟容器試試或者等待一會
若需要單獨啟動或停止某個同步通道,可使用如下命令:
start slave for channel '300'; //啟動名稱為300的同步通道
stop slave for channel '300'; //停止名稱為300的同步通道
驗證數據同步
新建庫和表等,會發現同步到了mysql8-3上

第二種情形:
多個主庫上的表同步到從庫的的一個庫里面
- 主庫mysql8-1:IP=121.40.110.2; PORT=3310; server-id=1; database=datingcenter; table=aa、dd
- 主庫mysql8-2:IP=121.40.110.2; PORT=3311; server-id=2; database=usercenter ;table=cc、bb
- 從庫mysql8-3:IP=121.40.110.2; PORT=3312; server-id=3; database=matchcenter ;table=aa、dd、cc、bb
配置文件
【主庫mysql8-1】操作及配置
配置my.cnf(/etc/mysql/my.cnf)
取消掉
binlog-do-db = datingcenter
【主庫mysql8-2】操作及配置
配置my.cnf(/etc/mysql/my.cnf)
取消掉
binlog-do-db = usercenter
【從庫mysql8-3】操作及配置
配置my.cnf(/etc/mysql/my.cnf)
[client] port = 3306 default-character-set = utf8mb4 [mysql] port = 3306 default-character-set = utf8mb4 [mysqld] ########################## # summary ########################## #bind-address = 0.0.0.0 #port = 3306 #datadir=/datavol/mysql/data #數據存儲目錄 ########################## # log bin ########################## server-id = 3 master_info_repository = table relay_log_info_repository = table replicate-rewrite-db=datingCenter->matchCenter_0 replicate-rewrite-db=userCenter->matchCenter_0 ########################## # character set ########################## character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci
設置【從庫】信息
登錄【從庫mysql8-3】,進入mysql命令行。
mysql> stop slave; Query OK, 0 rows affected mysql> CHANGE MASTER TO MASTER_HOST='121.40.110.2', MASTER_PORT=3310, MASTER_USER='slave', MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=155 for channel '1'; Query OK, 0 rows affected mysql> CHANGE MASTER TO MASTER_HOST='121.40.110.2', MASTER_PORT=3311, MASTER_USER='slave', MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=155 for channel '2'; Query OK, 0 rows affected mysql> start slave; Query OK, 0 rows affected
stop slave; //停止同步
start slave; //開始同步
//必須和【主庫】的信息匹配。
CHANGE MASTER TO
MASTER_HOST='121.40.110.2 //主庫IP
MASTER_PORT=3310, //主庫端口
MASTER_USER='slave', //訪問主庫且有同步復制權限的用戶
MASTER_PASSWORD='123456', //登錄密碼
//【關鍵處】從主庫的該log_bin文件開始讀取同步信息,主庫show master status返回結果
MASTER_LOG_FILE='mysql-bin.000001',
//【關鍵處】從文件中指定位置開始讀取,主庫show master status返回結果
MASTER_LOG_POS=155
for channel '1'; //定義通道名稱
查看同步狀態
mysql> show slave status \G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 47.111.132.49 Master_User: slave Master_Port: 3310 Connect_Retry: 60 Master_Log_File: mysql-bin.000006 Read_Master_Log_Pos: 169442 Relay_Log_File: efe0882a2350-relay-bin-1.000017 Relay_Log_Pos: 169656 Relay_Master_Log_File: mysql-bin.000006 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: 169442 Relay_Log_Space: 170040 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: 399257c7-a933-11e9-8d35-0242ac110002 Master_Info_File: mysql.slave_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: (datingCenter_0,matchCenter_0),(userCenter_0,matchCenter_0) Channel_Name: 1 Master_TLS_Version: Master_public_key_path: Get_master_public_key: 0 Network_Namespace: *************************** 2. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 47.111.132.49 Master_User: slave Master_Port: 3311 Connect_Retry: 60 Master_Log_File: mysql-bin.000006 Read_Master_Log_Pos: 155 Relay_Log_File: efe0882a2350-relay-bin-2.000019 Relay_Log_Pos: 369 Relay_Master_Log_File: mysql-bin.000006 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: 155 Relay_Log_Space: 753 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: 2 Master_UUID: 39a3fc71-a933-11e9-ac19-0242ac110003 Master_Info_File: mysql.slave_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: (datingCenter_0,matchCenter_0),(userCenter_0,matchCenter_0) Channel_Name: 2 Master_TLS_Version: Master_public_key_path: Get_master_public_key: 0 Network_Namespace: 2 rows in set (0.01 sec) ERROR: No query specified
在datingcenter建立表aa dd usercenter建立表 bb cc
查看同步結果

參考:
https://juejin.im/entry/5bf7731351882518805ac985
https://www.cnblogs.com/zhjh256/p/9260554.html
https://blog.csdn.net/u014520745/article/details/76056170
https://blog.csdn.net/h996666/article/details/80921913
https://blog.csdn.net/sgrrmswtvt/article/details/82344183