1.基于mysql 8.0的docker
2.配置mysql的配置
- 1.创建master文件夹,并创建my.cnf文件:
[mysqld] ## 设置server_id,注意要在同一局域网内唯一 server-id=1 ## 开启binlog log-bin=mysql-bin ## binlog格式(mixed、statement、row,默认格式是statement) binlog_format=mixed
- 2.创建slaver文件夹,并创建my.cnf文件
[mysqld] ## 设置server_id,注意要唯一 server-id=2 ## 可以开启binlog,以备Slave作为其它Slave的Master时使用 #log-bin=mysql-bin ## relay_log配置中继日志 relay_log=relay-bin ## 如果需要同步函数或者存储过程 log_bin_trust_function_creators=true ## binlog格式(mixed、statement、row,默认格式是statement) binlog_format=mixed ## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断 ## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致 slave_skip_errors=1062 ## 跳过主从复制中遇到的错误,可配可不配 read-only=1 #1只读,0读写
- 3.同级可以创建sh文件
#!/bin/sh # $0获取执行命令的文件;realpath获取真实的路径;dirname获取该文件的绝对路径 script_dir=$(dirname "$(realpath "$0")") docker run -itd --name doyen$1 -p ${2}:3306 -e MYSQL_ROOT_PASSWORD=123456 \ -v ${script_dir}/${1}/my.cnf:/etc/my.cnf \ -v ${script_dir}/${1}/data:/var/lib/mysql \ -v ${script_dir}/${1}/log:/var/log --restart always mysql:8.0
- 4.分别执行sh:
#启用master容器,master文件名,3306端口 sh mysql.sh master 3306 #启用slaver容器,slaver文件名,3307端口 sh mysql.sh master 3307
- 5.登录master容器
#进入容器,如果失败使用 sh docker exec -it master bash #登录mysql mysql -uroot -p123456 use mysql; #可以移除root的所有地区登录,只保留能本机登录 drop user 'root'@'%'; #创建slaver用户,使用明文密码连接 create user 'slaver'@'%' identified with mysql_native_password by '123456'; grant replication SLAVE ON *.* TO 'slaver'@'%'; flush privileges; #查看binlog的数据,用于slaver的偏移量迁移 show master status;
- 6.登录slaver服容器
#master_log_file和master_log_pos 为master中show展示的数据 change master to master_host='master-ip', master_port=3306, master_user='slaver', master_password='123456', master_log_file='mysql-bin.000002', master_log_pos=157; start SLAVE; show slave status\G;
主从mysql完成,Slave_IO_Running
和 Slave_SQL_Running
都为 Yes。
二 遇到问题
- 一些博客提示mysql的配置位置不对,导致路径映射不对,使用默认的配置,引发serverId都是1,会主从冲突,位置为 /etc/my.cnf,修改配置后需要docker restart。
查询文件:docker exec -it container find / -name "my.cnf" - 如果slave的change连接master写错了,可以执行stop slave;reset slave;再重新绑定。
- 这是重头开始复制,如果master已经运行了一段时间
#master容器:全量dump,--source-data=2表示生成的备份文件中包含 CHANGE MASTER TO 语句 #--single-transaction: 保证备份在一致性点上完成 #--flush-logs: 在备份开始时刷新 MySQL 的二进制日志 #--hex-blob: 处理二进制字段时使用十六进制表示 mysqldump -u root -p --all-databases --source-data=2 --single-transaction --flush-logs --hex-blob > /var/lib/mysql/full-backup.sql #将master的该文件mv到slaver的映射路径中,进入slaver容器 mysql -u root -p < full-backup.sql #执行完后再配置binlog同步点,从sql文件中找出偏移量 CHANGE MASTER TO 。。。 #-------------------------------二。数据太多,只dump表结构------- mysqldump -u root -p123456 --no-data --databases your_database > schema-only.sql mysql -u root -p123456 < schema-only.sql start slave;