Mysql主从复制
MySQL 复制是一个允许数据同时从一台服务器复制到另一台服务器的过程。 主要是为了增加数据的可用性。 选择 MySQL 主从复制的主要原因之一是数据恢复。 在发生任何灾难或硬件故障的情况下,MySQL 复制可确保始终存在准确的备份。
本文主要针对一主一从进行配置,我们利用docker-compose快捷进行生成mysql5.7实例。
配置mysql容器
version: "3.9"
services:
m1:
image: mysql:5.7.38
container_name: m1
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: dev
volumes:
- /home/Cheng/docker/mysql/m1/conf:/etc/mysql/conf.d
ports:
- 3306:3306
s1:
image: mysql:5.7.38
container_name: s1
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: dev
volumes:
- /home/Cheng/docker/mysql/s1/conf:/etc/mysql/conf.d
ports:
- 3307:3306
~
~
master
在*/home/Cheng/docker/mysql/m1/conf创建文件mysql.cnf*内容为:
[mysqld]
#Server ID,一般设置成IP地址的最后一位
server_id=20
#开启log bin,名字最好有意义用来区分
log-bin=dev-bin
#需要进行复制的数据库,可以指定数据库,这里我注释掉不用
binlog-do-db=dev
#不需要备份的数据库,可以设置多个数据库,一般不会同步mysql这个库
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
#为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1m
#二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days=7
# 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
# 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
备注:请根据你的实际情况替换目录
slave
在*/home/Cheng/docker/mysql/s1/conf创建文件mysql.cnf*内容为:
server_id=10
binlog_cache_size=1M
binlog_format=mixed
expire_logs_days=7
slave_skip_errors=1062
relay_log=dev-relay-bin
read_only=1
备注:请根据你的实际情况替换目录
启动容器
使用下面命令启动两个容器;
sudo docker-compose -f mysql.yaml up -d
查看启动是否正常
配置账户
master
首先我们进入主服务器创建专门用于主从复制的账号;
-
进入容器
sudo docker exec -it m1 bash
-
进入mysql cansole
mysql -uroot -proot
-
创建账号
grant replication slave, replication client on *.* to 'repl'@'%' identified by 'repl'; flush privileges;
-
查看主服务运行状态
show master status \G
slave
-
进入容器
sudo docker exec -it s1 bash
-
进入mysql cansole
mysql -uroot -proot
-
配置复制信息并开启服务
change master to master_host='192.168.1.117',master_user='repl',master_password='repl',master_port=3306,master_log_file='dev-bin.000003',master_log_pos=1435,master_connect_retry=30; # 开启服务 start slave
-
查看运行状态
show slave status;
备注:注意图中红色部分
如果有错误可以在下面查看错误信息。
准备数据库和表
在主从服务起中,请创建dev数据库,store表,注意两个库中的表结构要一致。
接下来便可以在主服务中插入数据,在从服务器中进行查看是否完成了复制。