镜像 # 搜索镜像: https://hub.docker.com/ # 拉去镜像: docker pull mysql:8.0.30
主节点 创建数据目录 [root@localhost ~]# mkdir -p /usr/mysql/master/data
创建配置文件目录 [root@localhost ~]# mkdir -p /usr/mysql/master/conf
创建配置文件 [root@localhost ~]# vi /usr/mysql/master/conf/my.cnf
my.cnf文件内容如下:
[client] # 设置mysql客户端默认字符集 default-character-set=utf8 [mysqld] # 设置mysql服务端默认字符集 character-set-server=utf8 # 同一局域网内的server-id必须具有唯一性 server-id=1 # 指定复制哪些数据库 binlog-do-db=venus # 指定不复制哪些数据库 binlog-ignore-db=mysql binlog-ignore-db=information_schema binlog-ignore-db=performance_schema binlog-ignore-db=sys # 开启二进制日志功能,并设置日志文件名,文件名可以随便取名(关键) log-bin=mysql-bin # 设置binlog日志格式,其值可为row(默认)、statement和mixed binlog_format=statement # 设置每隔多少次事务提交操作才会将这些操作写入二进制日志文件 sync_binlog=1 # 默认使用“mysql_native_password”插件认证 default_authentication_plugin=mysql_native_password
创建并运行容器 [root@localhost ~]# docker run -d --name master -p 3339:3306 -e MYSQL_ROOT_PASSWORD=123456 -v /usr/mysql/master/conf/my.cnf:/etc/mysql/my.cnf -v /usr/mysql/master/data:/var/lib/mysql mysql:8.0.30
连接主节点:使用mysql客户端,连接主数据库 创建从节点同步主节点数据账号 并授予予replication slave权限和replication client权限。 create user 'master'@'%' identified by '123456'; # replication [ˌreplɪ'keɪʃ(ə)n] n. (绘画等的)复制; grant replication slave, replication client on *.* to 'master'@'%';
查看主节点状态 从节点 创建数据目录 [root@localhost ~]# mkdir -p /usr/mysql/slave_01/data
创建配置文件目录 [root@localhost ~]# mkdir -p /usr/mysql/slave_01/conf
创建配置文件 [root@localhost ~]# vi /usr/mysql/slave_01/conf/my.cnf
my.cnf文件内容如下
[client] # 设置mysql客户端默认字符集 default-character-set=utf8 [mysqld] # 设置mysql服务端默认字符集 character-set-server=utf8 # 同一局域网内的server-id必须具有唯一性 server-id=2 # 开启二进制日志功能,以备Slave作为其它Slave的Master时使用 # log-bin=mysql-slave-bin # 指定中继日志 relay-log=slave1-relay-bin # 默认使用“mysql_native_password”插件认证 default_authentication_plugin=mysql_native_password
创建并运行容器 [root@localhost ~]# docker run -d --name slave_01 -p 3340:3306 -e MYSQL_ROOT_PASSWORD=123456 -v /usr/mysql/slave_01/conf/my.cnf:/etc/mysql/my.cnf - v /usr/mysql/slave_01/data:/var/lib/mysql mysql:8.0.30
连接从节点:使用MySQL客户端(SQLyog、Navicat Premium等)连接从数据库 设置同步信息 -- 关闭同步 stop slave; -- 设置同步信息 change master to master_host='192.168.1.100', master_port=3339, master_user='master', master_password='123456', master_log_file='mysql.bin.000004', master_log_pos= 157, master_connect_retry=30; -- 或 change master to master_host='172.17.0.2', master_port=3306, master_user='master', master_password='123456', master_log_file='mysql.bin.000004', master_log_pos= 157, master_connect_retry=30; -- 开启同步 start slave;
参数说明:
master_ host:Master地址,如果为虚拟机IP,则master_ port应该为3339,如果为所在容器的IP,则 master_ port应该为容器内部MySQL的端口号,容器IP可以通过“docker inspect -- format='{{.NetworkSettings.IPAddress}}' 容器名称|容器id”查询; master_ port:Master端口号,指的是容器的端口号 master_ user:用于数据同步的账户 master_ password:用于同步的账户的密码 master_ log_ file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值 master_ log_ pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值 master_ connect_ retry:如果连接失败,重试的时间间隔(单位:秒),默认是60秒
检查同步状态 说明:若Slave_IO_Running 和 Slave_SQL_Running 均为Yes,则表明主从复制已经开启。此时可以测试数据同步是否成功。
容器启动状态 [root@localhost ~]# docker ps
开放lnuix端口 # 添加端口 [root@localhost ~]# firewall-cmd --zone=public --add-port=3339/tcp --permanent - -add-port=3340/tcp --permanent # 重新加载 [root@localhost ~]# firewall-cmd --reload
重置同步信息 主服务器
# 在主服务器上停止二进制日志的写入: RESET MASTER; # 在主服务器上清除复制信息: RESET SLAVE; # 这将清除主服务器上的复制信息。如果需要,可以删除主服务器上的数据,以确保主服务器的数据与从服务器同步。在从服务器上重新配置复制信息,按照之前的步骤设置主服务器的信息。 # 启动从服务器的复制进程: START SLAVE; SHOW SLAVE STATUS\G; # 命令,确保复制进程已经启动,并观察复制状态。通过以上步骤,你可以重置MySQL主服务器的同步信息。请注意,在执行重置操作之前,确保备份了主服务器上的重要数据,以免造成数据丢失
从服务器
STOP SLAVE; RESET SLAVE; # 从新配置主从关系 START SLAVE; # 查看状态 SHOW SLAVE STATUS\G;
问题 Fatal error:The slave I/O thread stops because master and slave have equal MySQL server UUIDs; 说明:此错误为主从数据库设置了相同的serverid,或者因为配置文件权限过大,导致不 生效
方案
# 1、进入容器内部 docker exec -it 容器ID /bin/bash # 2、登录MySQL mysql -uroot -p # 3、修改配置 alter user 'root'@'%' identified with mysql_native_password by '123456';