学习研究一下关于mysql的主从复制。
通过docker创建两个mysql实例 。 docker-compose.yml
version: "3.7"
services:
mysql3:
image: mysql:8.0
container_name: mysql81
restart: always
privileged: true
ports:
- 3310:3306
volumes:
- ./mysql81:/var/lib/mysql
environment:
- "MYSQL_ROOT_PASSWORD=root"
command:
--default-time-zone="+8:00"
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--max_connections=1000
--innodb_lock_wait_timeout=500
另一个换下端口和service即可。
先查看下对应的ip地址.
docker exec -it mysql81 /bin/bash
cat /etc/hosts
进入mysql创建 slave帐号
create user repl@'172.30.0.%' identified by 'Password4';
grant replication slave,replication client on *.* to repl@'172.30.0.%';
flush privileges;
两个实例都执行一下。
server ID
(唯一),
在/etc/my.cnf
修改如下:log_bin = mysql-bin
server_id = 10
通过docker-compose.yml
指定 my.cnf
,
docker-compose81.yml
...
volumes:
- ./my81.cnf:/etc/my.cnf
- ./mysql81:/var/lib/mysql
然后重新启动,检查下二进制日志文件是否已经创建
show master status
log_bin = mysql-bin
server_id = 2
relay_log = /var/lib/mysql/mysql-relay-bin
log_slave_updates = 1
read_only = 1
实际上 relay_log
log_slave_updates
read_only并不是必须的,根据实际情况来进行选择。
read_only`如果需要在备库上建表的话,这个就不需要了。
change master to master_host = '172.30.0.2',master_user = 'repl',master_password='Password4',master_log_file='mysql-bin.000001',master_log_pos=0;
检查是否正确执行,执行show slave status\G
.
start slave;
检查状态如下:
... 悲催的是,做测试的时候发现是失败的,查看了slave 状态,竟然无法连接...
Error connecting to source 'repl@172.30.0.2:3306'. This was attempt 4/86400, with a delay of 60 seconds between attempts. Message: Can't connect to MySQL server on '172.30.0.2:3306' (110)
原来是docker网络的问题.. 重启后IP会发生变化.. 这就尴尬了,重新设置下固定IP,然后重做配置,再测试。
docker network create --subnet=172.30.0.0/16 repl
version: "3.7"
services:
mysql3:
image: mysql:8.0
container_name: mysql81
restart: always
privileged: true
ports:
- 3310:3306
volumes:
- ./my81.cnf:/etc/my.cnf
- ./mysql81:/var/lib/mysql
environment:
- "MYSQL_ROOT_PASSWORD=root"
command:
--default-time-zone="+8:00"
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--max_connections=1000
--innodb_lock_wait_timeout=500
networks:
repl2:
ipv4_address: 172.30.0.2
networks:
repl2:
external:
name: repl2
两个都指定后,重启查看IP没有变化。
Error connecting to source 'repl@172.30.0.2:3306'. This was attempt 1/86400, with a delay of 60 seconds between attempts. Message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection
参考 https://blog.csdn.net/u010953609/article/details/130237868
最后还需要注意的问题是,表及数据要一致,
Coordinator stopped because there were error(s) in the worker(s). The most recent failure being: Worker 1 failed executing transaction 'ANONYMOUS' at source log mysql-bin.000002, end_log_pos 418. See error log and/or performance_schema.replication_applier_status_by_worker table for more details about this failure or others, if an
这个是更改了master_log_pos
后,与 master 的一致。
show master status
查看。
成功后多次测试增加数据就会有如下,pos会发生变更,并且数据一致。
实际上有很多都是已经有正在运行的服务器了,因为业务或性能需要做备库。
方法1
冷备份,关闭主库,将数据复制到备课。重启主库后,会有一个新的二进制日志文件,然后执行备库的change master to
指向文件的位置。
缺点很明显:需要关闭主库。
方法2
如果仅仅使用了MyISAM
表,可以在主库运行时使用mysqlhotcopy
rsync
来进行复制。
方法3
如果只包含 InnoDB
,可以使用mysqldump
来进行转储并加载到备库。
等我研究下哈
mysqldump --single-transaction --all-databases --master-data=1--host=server1 | mysql --host=server2
转载请注明出处: https://chrunlee.cn/article/mysql-replication-single.html