1.下载mysql:5.7镜像
docker pull mysql:5.7
2.创建挂载目录
vi mk.sh mkdir -p install /root/mysqlms/data mkdir -p install /root/mysqlms/conf.d mkdir -p install /root/mysqlms/mysql-files mkdir -p install /root/mysqlsl/data mkdir -p install /root/mysqlsl/conf.d mkdir -p install /root/mysqlsl/mysql-files ./mk.sh
3.创建主服务器
创建主容器
docker run --name sqlms -p 3306:3306 -d -v /root/mysqlms/data:/var/lib/mysql/ -v /root/mysqlms/mysql-files:/var/lib/mysql-files/ -v /root/mysqlms/conf.d:/etc/mysql/conf.d/ -e MYSQL_ROOT_PASSWORD=root mysql:5.7
进入主容器并将my.cnf删除
docker exec -it sqlms bin/bash rm -rf my.cnf exit 退出容器
主机内配置主服务器
进入挂载目录 cd /root/sqlms/conf.d 创建一个mysql配置文件 vi my.cnf #开启bin-log日志并给与一个id [mysqld] server-id=1 log-bin=mysql-bin !includedir /etc/mysql/conf.d/ !includedir /etc/mysql/mysql.conf.d/ 之后挂载目录的文件可直接生效 进主容器内将my.cnf移动到原来的目录 mv /etc/mysql/conf.d/my.cnf /etc/mysql/ service mysql restart
创建从服务容器
创建从服务器
docker run --name sqlsl -p 3307:3306 -d -v /root/mysqlsl/data:/var/lib/mysql/ -v /root/mysqlsl/mysql-files:/var/lib/mysql-files/ -v /root/mysqlsl/conf.d:/etc/mysql/conf.d/ -e MYSQL_ROOT_PASSWORD=root mysql:5.7
重复主服务容器的操作直到mysql配置文件
修改从mysql配置文件
进入挂载目录 cd /root/sqlms/conf.d 生成配置文件 vi my.cnf [mysqld] server-id=2 log-bin=mysql-slave-bin relay_log=edu-mysql-relay-bin !includedir /etc/mysql/conf.d/ !includedir /etc/mysql/mysql.conf.d/ 之后挂载目录的文件可直接生效 进从容器内将my.cnf移动到原来的目录 mv /etc/mysql/conf.d/my.cnf /etc/mysql/ 重启服务 service mysql restart准备环节结束开始正式操作
主服务容器操作
进入主容器启动mysql
docker exec -it sqlms bin/bash mysql -uroot -proot
在命令行输入
CREATE USER 'slave'@'%' IDENTIFIED BY '123456'; GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%'; 创建一个slave用户并授权读写任何文件权限,用于主从备份数据 show master status;
需要使用到file和pos数据
从服务容器操作
mysql命令行输入
change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos= 154, master_connect_retry=60; master_log_pos=154 ,就是值记录最大位置 master_host :Master的地址,指的是容器的独立ip master_port:Master的端口号,指的是容器的端口号 master_user:用于数据同步的用户 master_password:用于同步的用户的密码 master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值 master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值 master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒 start slave; 开启主从备份 show slave status G 查看状态 Slave_IO_Running: Yes Slave_SQL_Running: Yes 上两项值都是yes则开启成功,如果其中有no或者connection就代表开启失败。
错误解决
Slave_IO_Running: Connecting Slave_SQL_Running: Yes
当mysql5.7或更高版本重启后会自动执行一次flush logs命令,主服务会刷新出一个新的log-bin文件,这时候跟原来的配置冲突了导致一直在寻找,需要重新配置主从命令。
先去主服务机查询当前的bin日志;
show master status;
可以看到明显的文件和值都变了
然后去从服务器上
停掉主从服务 stop slave; 重新配置 change master to master_host='172.17.0.3', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000002', master_log_pos=588, master_connect_retry=60; 注意每次重启后IP也可能不是原来的IP,需要自己重新查看一下 start slave; show slave status G;
下方也无报错,成功启动主从备份。
其实主从备份的错误无非就是网络错误和log-bin日志的问题。



