Docker——搭建mysql8主备,亲测版,后带踩过的坑

1、离线centos7环境

2、docker18.09.5

3、mysql8.0.21

 

用docker新建两个mysql数据库,这里不赘述了。

 

max_connetions在配置文件中不起作用,进到容器里面把最大文件打开数调大

echo 'mysql hard nofile 65535' >> /etc/security/limits.conf

echo 'mysql soft nofile 65535' >> /etc/security/limits.conf

主库的配置文件

[mysqld]
## 设置server_id,一般设置为IP,注意要唯一
server_id = 48221
#default-character-set=utf8

## 忽略的库表
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema

## mysql的最大连接数
max_connections = 60000

## 开启二进制日志功能,可以随便取,最好有含义(关键就是这里了)
log_bin =mysql-bin
relay_log=mysql-relay-bin
log-slave-updates=on

## 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format = mixed

## 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days = 180

## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
# slave_skip_errors = 1062

## 控制binlog的写入频率。每执行多少次事务写入一次
## 经过1日志写操作就把文件写入硬盘1次,这个参数性能消耗很大,但可减小MySQL崩溃造成的损失,为0表示不控制
# sync_binlog = 1
# innodb_flush_log_at_trx_commit = 1

# auto_increment_increment=n有多少台服务器,n就设置为多少,
# auto_increment_increment = 2

# auto_increment,控制自增列AUTO_INCREMENT的行为
# 用于MASTER-MASTER之间的复制,防止出现重复值,
# auto_increment_offset=1设置步长,这里设置为1,这样Master的auto_increment字段产生的数值是:1, 3, 5, 7, …等奇数ID
# auto_increment_offset = 1

从库的配置文件

[mysqld]
## 设置server_id,一般设置为IP,注意要唯一
server_id = 48201
#default-character-set=utf8

## 忽略的库表
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema

## mysql的最大连接数
max_connections = 60000

## 开启二进制日志功能,可以随便取,最好有含义(关键就是这里了)
log_bin =mysql-bin
#relay_log=mysql-relay-bin
#log-slave-updates=on

## 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format = mixed

## 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days = 180

## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
# slave_skip_errors = 1062

## 控制binlog的写入频率。每执行多少次事务写入一次
## 经过1日志写操作就把文件写入硬盘1次,这个参数性能消耗很大,但可减小MySQL崩溃造成的损失,为0表示不控制
# sync_binlog = 1
# innodb_flush_log_at_trx_commit = 1

# auto_increment_increment=n有多少台服务器,n就设置为多少,
# auto_increment_increment = 2

# auto_increment,控制自增列AUTO_INCREMENT的行为
# 用于MASTER-MASTER之间的复制,防止出现重复值,
# auto_increment_offset=1设置步长,这里设置为1,这样Master的auto_increment字段产生的数值是:1, 3, 5, 7, …等奇数ID
# auto_increment_offset = 2

创建从库账号

mysql -uroot -p'密码';    // 登录mysql
CREATE USER 'slaveuser'@'%' IDENTIFIED BY '密码';    // 添加账号
GRANT replication slave,replication client ON *.* TO 'slaveuser'@'%';  // 配置权限
flush privileges;  // 刷新权限

 

查看主库的binlog日志开始点

show master status;

Docker——搭建mysql8主备,亲测版,后带踩过的坑_第1张图片

 

 

关闭slave服务  stop slave;

重置主节点配置 reset master;
 

CHANGE MASTER TO \
MASTER_HOST = '192.168.223.128',  \
MASTER_USER = 'slaveuser',  \
MASTER_PASSWORD = '密码',  \
MASTER_LOG_FILE = 'mysql-bin.000005',  \
MASTER_PORT = 53306,  \
MASTER_LOG_POS = 1085, \
get_master_public_key = 1;    # mysql8注意加这个参数

start slave;

show slave status\G;

最后在主库新建一个数据库,create database xxx;

然后去从库里面确认。

 

常见问题:

问题1:

Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.

解决1:

添加参数get_master_public_key = 1

 

问题2:

The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.

解决2:

停止从库的mysqld服务,删除他的auto.cnf文件,再启动数据库服务即可:

 mv /var/lib/mysql/auto.cnf /var/lib/mysql/auto.cnf.bak

问题3:

都配好了,但是同步不起作用。

要用命令才有用的,用navicat不行。

问题4:

ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository
解决4:

reset slave;

 

问题5:

 Error 'Operation CREATE USER failed for 'slave'@'%'' on query. Default database: ''. Query: 'CREATE

解决5:

这个报错的原因可能是由于:(1)已创建过该用户 (2)已有该用户的授权信息

解决方法:删除此用户,刷新,并重启slave

#删除该用户
mysql> drop user 'zhangsan'@'%';
mysql> FLUSH PRIVILEGES;
 
# 重启同步
mysql> stop slave;
mysql> start slave;
 
# 最后查看是否同步正常
mysql> show slave status\G

问题6:如果从库的Slave_IO_Running为NO。
The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it).
 
解决方法6:
show variables like 'server_id';
set global server_id=不重复id;
slave start;

你可能感兴趣的:(docker,mysql)