MySql 主从复制搭建
创建主容器实例3306
docker run -it --name mysql-master -p 3306:3306 --privileged=true -v /home/admin/docker/mysql/master/conf:/etc/mysql -v /home/admin/docker/mysql/master/data:/var/lib/mysql -v /home/admin/docker/mysql/master/log:/log -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.38
创建主容器实例3306的配置文件my.cnf
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=101
## 开启二进制日志功能
log-bin=mysql-master-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## 指定不需要写入binlog的数据库名称
binlog-ignore-db=mysql
binlog-ignore-db=sys
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
## 指定的库名,其内部表数据修改都会写入binlog。
## binlog-do-db=db_name
## 忽略某些库的binlog 日志应用
## replicate-ignore-db=db_name
## 忽略某些表的binlog 日志应用
## replicate-ignore-table=db_name.tbl_name
## 应用某些库的binlog 日志
## replicate-do-db=db_name
## 应用某些表的binlog 日志
## replicate-do-table=db_name.tbl_name
## 使用通配符来匹配那些应用binlog日志的表
## replicate-wild-do-table=db_name.tbl_name
## 使用通配符来匹配那些不能应用binlog日志的表
## replicate-wild-ignore-table=db_name.tbl_name
## 能够实现主库与从库数据库名称不同的复制,比如主库数据库名为A,从库数据库名为B,实现主库A到从库B的复制
## replicate-rewrite-db=from_name->to_name
访问主数据库3306
docker exec -it mysql-master bash
mysql -uroot -p123456
show master status;
//给从库创建主从复制账号并赋权
GRANT REPLICATION SLAVE ON . TO 'slave'@'%' IDENTIFIED BY '123456';
创建重容器实例3307
docker run -it -p 3307:3306 --name mysql-slave
--privileged=true
-v /home/admin/docker/mysql/slave/log:/log
-v /home/admin/docker/mysql/slave/data:/var/lib/mysql
-v /home/admin/docker/mysql/slave/conf:/etc/mysql
-e MYSQL_ROOT_PASSWORD=123456
-d mysql:5.7.38
创建重容器实例3307的配置文件my.cnf
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=102
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mysql-slave-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave设置为只读(具有super权限的用户除外)
read_only=1
## 指定不需要写入binlog的数据库名称
binlog-ignore-db=mysql
binlog-ignore-db=sys
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
访问主数据库3307
docker exec -it mysql-slave bash
mysql -uroot -p123456
change master to master_host='192.168.247.128',master_user='slave',master_password='123456',master_port=3306,master_log_file='mysql-master-bin.000001',master_connect_retry=30;
show slave status;
start slave;
show slave status;
搭建过程中遇到的问题
- my.cnf中的配置无效 原因:运行mysql时配置错误,
-v /home/admin/docker/mysql/master/conf:/etc/mysql
中冒号(:)后面是/etc/mysql,而不是/etc/mysql/conf - 编辑my.cnf时粘贴内容是每行前都自动添加一个# 解决方案:
:set paste
- show slave status;时 Slave_IO_Running显示连接中 原因:
change master to master_host='192.168.247.128',master_user='slave',master_password='123456',master_port=3306,master_log_file='mysql-master-bin.000001',master_connect_retry=30;
中设置错误,检查里面的master_host,master_user,master_password,master_port,master_log_file,或者主数据库中不存在master_user设置的用户,或该用户的设置不对,在主数据库中查看用户信息,如下
其他
主库操作, 给从库创建主从复制账号并赋权
GRANT FILE ON . TO 'slaver'@'192.168.247.128' IDENTIFIED BY '123456';
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
设置从库同步
reset slave;
stop slave;
admin用户使用vim编辑文档时,在退出时会提示“E212: Can't open file for writing”,解决办法有两个。
- 直接退出
su成具有权限的超级用户之后,在所操作文件的目录下会出现一个swap的隐藏文件,读入缓存后可删掉。
- 提权:
:w !sudo tee %