1.实现背景
两个mysql安装在docker当中,一个端口是3306,一个端口是3308,两个mysql不在一个network下。
tips:在docker中安装mysql时,最好将配置文件挂载到宿主机中,方便修改,我的docker安装命令如下
docker run --name mysql8 --restart=always -v /data/mysql/conf/my.cnf:/etc/mysql/my.cnf -v /data/mysql/data:/var/lib/mysql -v /etc/localtime:/etc/localtime:ro -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:8
2.主数据库配置
1:修改配置文件
server-id=1
log-bin=mysql-bin
binlog_format=STATEMENT
-
server-id=1
:- 这是 MySQL 服务器的唯一标识符,用于区分主服务器和从服务器。在主从复制环境中,每个服务器都必须有一个唯一的
server-id
。确保从服务器的server-id
不同于主服务器。
- 这是 MySQL 服务器的唯一标识符,用于区分主服务器和从服务器。在主从复制环境中,每个服务器都必须有一个唯一的
-
log-bin=mysql-bin
:- 这指示 MySQL 启用二进制日志功能,并将日志文件命名为
mysql-bin
。二进制日志用于记录所有更改数据库的操作,它是主从复制的基础。
- 这指示 MySQL 启用二进制日志功能,并将日志文件命名为
-
binlog_format=STATEMENT
:- 这设置了二进制日志的格式为 "STATEMENT"。在这种格式下,记录的是执行的 SQL 语句,而不是实际的数据更改。这种格式在某些情况下可能会导致问题,特别是当涉及到非确定性函数或复杂事务时。您可以考虑使用
ROW
或MIXED
格式,具体取决于您的需求。、 - 如果您在使用
STATEMENT
格式时遇到问题,可以考虑将其更改为ROW
格式。ROW
格式记录的是具体的数据更改,而不是 SQL 语句,这在某些情况下更可靠。
- 这设置了二进制日志的格式为 "STATEMENT"。在这种格式下,记录的是执行的 SQL 语句,而不是实际的数据更改。这种格式在某些情况下可能会导致问题,特别是当涉及到非确定性函数或复杂事务时。您可以考虑使用
2: 重启容器
docker restart mysql8
3.创建slave用户并记录状态
进入主mysql容器(我的容器名称为mysql8),并创建一个用户提供给从服务连接到主服务。
docker exec -it mysql8 mysql -uroot -proot
CREATE USER 'slaveuser'@'%' IDENTIFIED BY 'slavepassword';
GRANT REPLICATION SLAVE ON *.* TO 'slaveuser'@'%';
FLUSH PRIVILEGES;
SHOW MASTER STATUS;
3:从服务器配置
1.mysql从数据库配置
server-id=2
2.从服务器同步配置
执行下面得命令时把注释去掉
CHANGE MASTER TO
MASTER_HOST='172.18.0.2', #zaidoucker中 如果两个mysql在同一个网络中,可以使用docker名称,如果不在,使用它的ip,擦汗寻ip得命令:docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql8
MASTER_USER='slaveuser',
master_port=3306,
MASTER_PASSWORD='slavepassword',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=1,
MASTER_SSL=1;
4:检验主从同步配置
SHOW SLAVE STATUS\G;
启动从机服务器的复制功能,执行SQL,查看状态时,需要保证进程 Slave_IO_Running
和进程 Slave_SQL_Running
的状态值均为Yes,此时主从数据配置成功。
关闭同步:STOP REPLICA IO_THREAD;