Docker 创建MySQL 9 主从复制集群
目录
Docker创建MySQL 9 主从复制集群
主节点:192.168.0.2,数据挂载目录:/data/mysql,数据库版本:MySQL 9.5.0,编号A
从节点:192.168.0.3,数据挂载目录:/data/mysql,数据库版本:MySQL 9.5.0,编号B
一、主节点A创建MySQL主容器,并开启GTID
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
docker run -d \ --restart=always \ --name=mysql-master \ -p 3306:3306 \ -p 33060:33060 \ -v /data/mysql/:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=cppla2025 \ mysql:latest \ --character-set-server=utf8mb4 \ --collation-server=utf8mb4_unicode_ci \ --gtid-mode=ON \ --enforce-gtid-consistency=ON \ --server-id=100 |
创建测试库测试表,并插入5条数据
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# docker exec -ti mysql-master mysql -u root -pcppla2025 CREATE DATABASE IF NOT EXISTS test_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE test_db; CREATE TABLE IF NOT EXISTS test_table ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL, age INT NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); INSERT INTO test_table (name, age) VALUES ('Alice', 25), ('Bob', 30), ('Charlie', 22), ('David', 28), ('Eve', 35); SELECT * FROM test_table; |
二、MySQL主节点A创建专用于主从复制的账号和密码
|
1 2 3 4 5 6 7 8 9 10 11 12 |
# MySQL Commands docker exec -ti mysql-master mysql -u root -pcppla2025 # 创建复制账号replicator/replicator_2025 create user 'replicator'@'%' identified by 'replicator_2025'; # 授权复制账号拥有所有数据库复制的权限 GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%'; # 刷新权限并查看 FLUSH PRIVILEGES; SHOW GRANTS for 'replicator'@'%'; |
三、从节点B创建MySQL 从容器,并开启GTID
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
docker run -d \ --restart=always \ --name=mysql-slave \ -p 3306:3306 \ -p 33060:33060 \ -v /data/mysql/:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=cppla2025 \ mysql:latest \ --character-set-server=utf8mb4 \ --collation-server=utf8mb4_unicode_ci \ --gtid-mode=ON \ --enforce-gtid-consistency=ON \ --server-id=101 |
四、导出一次全量历史数据并恢复至从库,避免binlog保留日期短导致的数据不全
|
1 2 3 4 5 |
# 进MySQL A主库容器导出一次全量数据 docker exec mysql-master mysqldump --all-databases -u root -pcppla2025 2>/dev/null > /tmp/all_databases.sql # 进MySQL B从库容器恢复数据 docker exec -i mysql-slave mysql -h 127.0.0.1 -u root -pcppla2025 < /tmp/all_databases.sql |
从节点B查看历史数据是否已经恢复完毕
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# docker exec -ti mysql-slave mysql -u root -pcppla2025 mysql> SELECT * FROM test_db.test_table; +----+---------+-----+---------------------+ | id | name | age | created_at | +----+---------+-----+---------------------+ | 1 | Alice | 25 | 2025-12-29 08:18:44 | | 2 | Bob | 30 | 2025-12-29 08:18:44 | | 3 | Charlie | 22 | 2025-12-29 08:18:44 | | 4 | David | 28 | 2025-12-29 08:18:44 | | 5 | Eve | 35 | 2025-12-29 08:18:44 | +----+---------+-----+---------------------+ 5 rows in set (0.001 sec) |
五、从节点B MySQL 从容器,创建主从复制
|
1 2 3 4 5 6 7 8 9 10 11 12 |
# 创建主从复制 CHANGE REPLICATION SOURCE TO SOURCE_HOST='192.168.0.2', SOURCE_USER='replicator', SOURCE_PASSWORD='replicator_2025', SOURCE_AUTO_POSITION=1; # 开始复制 START REPLICA; # 查看复制状态 SHOW REPLICA STATUS\G |
六、A主库更新数据,B从库查看是否同步
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
# 主库A插入数据 docker exec -ti mysql-master mysql -u root -pcppla2025 mysql> INSERT INTO test_db.test_table (name, age) VALUES ('CPPLA', 30); # 从库B查看同步正常 docker exec -ti mysql-slave mysql -u root -pcppla2025 mysql> select * from test_db.test_table; +----+---------+-----+---------------------+ | id | name | age | created_at | +----+---------+-----+---------------------+ | 1 | Alice | 25 | 2025-12-29 08:18:44 | | 2 | Bob | 30 | 2025-12-29 08:18:44 | | 3 | Charlie | 22 | 2025-12-29 08:18:44 | | 4 | David | 28 | 2025-12-29 08:18:44 | | 5 | Eve | 35 | 2025-12-29 08:18:44 | | 6 | CPPLA | 30 | 2025-12-29 08:34:58 | +----+---------+-----+---------------------+ 6 rows in set (0.000 sec) # 从库B的复制用户也要授权,方便后续做主从切换。 mysql> GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%'; mysql> FLUSH PRIVILEGES; mysql> SHOW GRANTS FOR 'replicator'@'%'; |
七、MySQL主从复制其他命令
|
1 2 3 4 5 6 7 8 |
# 停止复制 stop REPLICA; # 停止主从关系和复制: reset REPLICA all; # 查看复制状态 SHOW REPLICA STATUS\G |