docker部署MySQL主从同步

docker部署MySQL主从同步

一、创建网络

1
docker network create --subnet=172.18.0.0/16 mysql-net

二、主库 my.cnf

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
26
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
# 设置东八区时区
default-time_zone = '+8:00'
# 限制导入和导出的数据目录
# 为空,不限制导入到处的数据目录;
secure_file_priv=
init_connect='SET collation_connection = utf8mb4_general_ci'
init_connect='SET NAMES utf8mb4'
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
skip-character-set-client-handshake
skip-name-resolve
# 开启logbin
log_bin=mysql-bin
# binlog日志格式
binlog_format=ROW
# mysql主从备份serverId
server_id=1
# 配置数据库表名小写
lower_case_table_names=1
# 指定要复制的数据库名称,这里替换为您要复制的具体数据库名。
binlog-do-db = your_database_name

三、启动主数据库

1
2
3
4
5
6
7
8
9
10
docker run -p 43306:3306 \
--name mysql_master \
--restart=always \
--privileged=true \
-v /data/mysqlc/log1:/var/log/mysql \
-v /data/mysqlc/data1:/var/lib/mysql \
-v /data/mysqlc/conf1/:/etc/mysql/ \
-v /etc/localtime:/etc/localtime:ro \
--network mysql-net --ip 172.18.0.2 \
-e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

四、主库用户设置

1
2
3
4
5
6
7
8
9
10
docker exec -it mysql_master /bin/bash
mysql -u root -p
#查看数据库
show databases;
#切换到mysql库
use mysql;
#创建master用户
create USER 'master'@'%' IDENTIFIED BY '123456';
grant all on *.* to 'master'@'%';
FLUSH PRIVILEGES;

五、从库 my.cnf

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
26
27
[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqld]
# 设置东八区时区
default-time_zone = '+8:00'
#设置密码验证规则
# 限制导入和导出的数据目录
# 为空,不限制导入到处的数据目录;
secure_file_priv=
init_connect='SET collation_connection = utf8mb4_general_ci'
init_connect='SET NAMES utf8mb4'
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
skip-character-set-client-handshake
skip-name-resolve

#server_id不要和主库的server_id相同就行
server_id=2
#一般从数据库作为读数据库
default-storage-engine=MyISAM
#配置数据库表名小写
lower_case_table_names=1

六、启动从库

1
2
3
4
5
6
7
8
9
10
docker run -p 53306:3306  \
--name mysql_slave \
--restart=always \
--privileged=true \
-v /data/mysqlc/log2:/var/log/mysql \
-v /data/mysqlc/data2:/var/lib/mysql \
-v /data/mysqlc/conf2/:/etc/mysql/ \
-v /etc/localtime:/etc/localtime:ro \
--network mysql-net --ip 172.18.0.3 \
-e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

七、从库用户设置

1
2
3
4
5
6
7
8
9
10
docker exec -it mysql_slave /bin/bash
mysql -u root -p
#查看数据库
show databases;
#切换到mysql库
use mysql;
#创建slave用户
create USER 'slave'@'%' IDENTIFIED BY '123456';
grant all on *.* to 'slave'@'%';
FLUSH PRIVILEGES;

八、主库查看

1
2
3
4
5
6
show master status;
当在 MySQL 中执行 `SHOW MASTER STATUS;` 命令时,它会返回一行结果,通常包含如下几个字段:
1. File(文件名):这是二进制日志文件的名称。二进制日志文件记录了所有对数据库的更改操作,这些更改用于数据库的备份和复制。
2. Position(位置):这是在二进制日志文件中的位置,标记了数据库正在写入的具体位置。复制从这个位置开始。
3. Binlog_Do_DB(需要操作的数据库):这个字段指定了在主服务器上生成二进制日志文件时应记录的数据库。通常设置了一组数据库,只有这些数据库上的操作才会被记录。
4. Binlog_Ignore_DB(忽略操作的数据库):这个字段指定了在主服务器上生成二进制日志文件时应忽略的数据库。即使启用了全局日志记录,也不会记录这些数据库上的操作。

九、从库配置主服务器信息

1
2
3
4
5
6
7
8
9
10
stop slave;

CHANGE MASTER TO MASTER_HOST = '172.18.0.2', #主库host
MASTER_PORT = 3306,#主库端口
MASTER_USER = 'master',#主库用于binlog同步的账户
MASTER_PASSWORD = '123456',#主库用于binlog同步的账户密码
MASTER_LOG_FILE = 'binlog.000002',#主库binlog文件,show master status;File 字段
MASTER_LOG_POS = 154;#主库binlog文件位置,show master status; Position 字段

start slave;

报错处理

1
2
3
4
5
6
7
8
如果在start slave;时遇到 1872 - Slave failed to initialize relay log info structure from the repository  报错
1、停止从服务器的复制进程
STOP SLAVE;
2、清除现有的中继日志和配置信息
RESET SLAVE ALL;
3、使用 CHANGE MASTER TO 语句重新配置复制,确保你提供了正确的主服务器 IP 地址、端口、用户、密码、二进制日志文件名和位置。
4、启动从服务器的复制进程
start salve;

十、主从状态检查

1
2
3
4
在从服务器上执行 SHOW SLAVE STATUS\G; 命令,查看返回的结果。关注以下字段:
Slave_IO_State:应该是 Waiting for master to send event。
Slave_IO_Running 和 Slave_SQL_Running:应该都是 Yes,表示复制的 IO 和 SQL 线程都在运行。
Last_Error:如果有错误信息,需要根据错误信息来调试问题。

十一、停止容器并删除网络

1
2
3
4
5
6
7
8
9
10
# 关闭容器
docker stop imgid
# 删除容器
docker rm imgid
# 查看所有网络
docker network ls
# 删除指定网络
docker network rm netname
# 强制删除所有网络(需要先关闭容器再删除网络)
docker network prune -f