前提条件:
(1).先确保已经安装好了两个mysql容器. 我系统是用了ubuntu20.4,容器是用dnmp集成安装环境创建的.
如果你和我一样用的是dnmp,你应该知道怎么修改docker-compose.yml文件才能创建两个mysql的容器,下面是我修改的,其实就是照着原有的mysql节点写的,改容器名字,volumes
(2)mysql配置文件修改. 我把mysql容器作为主,mysql_2容器作为从
主配置文件mysql.cnf添加了
#主从配置相关
log_bin=/var/lib/mysql/mysql-bin.log
server-id=1
#如果复制多个数据库,重复设置这个选项即可,从机设置replicate_do_db
binlog_do_db=abc
#忽略同步的数据库也可用,从机设置replicate_ignore_db
binlog-ignore-db=mysql
从配置文件mysql_2.cnf
#从机设置
log_bin=/var/lib/mysql/mysql-bin.log
server-id=2
replicate-do-db=abc #待同步的数据库
replicate-ignore-db=mysql #不同步的数据
如图:
(3).手动同步一次数据库. 我的两个容器都有一个新建的数据库abc,都是没有任何表的就不同步了.同步也很简单,借助navicat的数据传输很容易就做到
(4).记录主机的ip ,我用sudo docker inspect mysql|grep IPAddress查看了作为主机的mysql容器的ip
172.18.0.2就是我要的
第一部分:主机器的设置
(1).登录主机的mysql新建同步用的账户,查看master信息
用root登陆主机,依次执行下面的sql
create user 'repl'@'%' identified with mysql_native_password by 'repl123456';
grant replication slave on *.* to 'repl'@'%';
flush privileges;
这里的%是主机的ip,这里我完全可以换成 172.18.0.2
(2)测试刚生成的同步账户
可以看出同步用的账户是没问题的,顺便罗嗦一下每做一步关键的操作要核实是否生效了,不然到了最后一大堆的问题缠绕你,需要一步步的排查是很痛苦的.
第二部分:从机器的设置
(1).测试同步用的账户
进入从机器的mysql 容器mysql_2
说明在从机器上使用同步用的账户是没问题的,要注意的是这里的ip是主机器的ip,这一步没通过的话会有问题 Last_IO_Error: error connecting to master 'replication@…
(2).实现主从同步
用从机mysql_2的root登录,执行
change master to
master_host='172.18.0.2',
master_user='repl',
master_password='repl123456',
master_log_file='mysql-bin.000007',
master_log_pos=811;
#这里的master_user,master_password是之前创建的同步用的账户和密码
#master_host是主机器的ip
#master_log_file和master_log_pos是第一部分(1) 里记录的File和Position
执行start slave; #开启从库 (stop slave:关闭从库)
执行show slave status; #检查服务器状态
看到Slave_IO_State为Waiting for master to send event
Slave_IO_Running为Yes
Slave_SQL_Running为Yes基本可以断定设置成功了
(3)验证主从同步是否生效
在主库建个表试试
create table `abc`.`tb` (
`id` int(10) not null,
`content` varchar(255) null,
primary key (`id`)
);
右边显示的从机的,刚开始执行show tables是空的,主机上建表后,从机上也就有表了,说明同步是成功的!