搬砖小抄

mysql8 主从复制

字数统计: 999阅读时长: 4 min
2020/09/03 Share

原理

  1. master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);

  2. slave将master的binary log events拷贝到它的中继日志(relay log);

  3. slave重做中继日志中的事件,将改变反映它自己的数据。

环境

版本 8.0.21

主库: 10.11.12.121
从库: 10.11.12.122

通用配置

/etc/my.cnf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[mysqld]
# 测试环境关闭了密码验证规则

validate_password.check_user_name=OFF
validate_password.policy=LOW
validate_password.length=4
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci

[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

主库

新增配置/etc/my.cnf.d/rep-master.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[mysqld]
# 主从复制配置
# server-id 服务器唯一标识。
# log_bin 启动MySQL二进制日志,即数据同步语句,从数据库会一条一条的执行这些语句。
# binlog_do_db 指定记录二进制日志的数据库,即需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可。
# binlog_ignore_db 指定不记录二进制日志的数据库,即不需要复制的数据库名,如果有多个数据库,重复设置这个选项即可。
# 其中需要注意的是,binlog_do_db和binlog_ignore_db为互斥选项,一般只需要一个即可。

server-id=1
log_bin=master-bin
log_bin_index=master-bin.index
binlog_ignore_db=test
binlog_ignore_db=mysql
binlog_ignore_db=information_schema
binlog_ignore_db=sys
binlog_ignore_db=performance_schema

创建同步用户

1
2
3
CREATE USER 'rep'@'%' IDENTIFIED BY '123456';
grant replication slave on *.* to 'rep'@'%';
flush privileges;

重启服务

1
sudo service mysqld restart

检查

1
2
mysql -uroot -proot
mysql> show master status;

从库1

新增配置/etc/my.cnf.d/rep-slave.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
[mysqld]
# 主从复制配置
# 备注:
# server-id 服务器唯一标识,如果有多个从服务器,每个服务器的server-id不能重复,跟IP一样是唯一标识,如果你没设置server-id或者设置为0,则从服务器不会连接到主服务器。
# relay-log 启动MySQL二进制日志,可以用来做数据备份和崩溃恢复,或主服务器挂掉了,将此从服务器作为其他从服务器的主服务器。
# replicate-do-db 指定同步的数据库,如果复制多个数据库,重复设置这个选项即可。若在master端不指定binlog-do-db,则在slave端可用replication-do-db来过滤。
# replicate-ignore-db 不需要同步的数据库,如果有多个数据库,重复设置这个选项即可。
# 其中需要注意的是,replicate-do-db和replicate-ignore-db为互斥选项,一般只需要一个即可。
server-id=2
relay-log=slave-relay-bin
relay-log-index=slave-relay-bin.index
read-only=1
super_read_only=1

配置主库

1
2
mysql> change master to master_host='10.11.12.121',master_port=3306,master_user='rep',master_password='123456',master_log_file='master-bin.000006',master_log_pos=156,get_master_public_key=1;

备注:

  • master_host 对应主服务器的IP地址。
  • master_port 对应主服务器的端口。
  • master_log_file 对应show master status显示的File列:master-bin.000006
  • master_log_pos 对应show master status显示的Position列:156

启动同步

1
2
3
4
5
#启动slave数据同步
mysql> start slave;

#停止slave数据同步(若有需要)
mysql> stop slave;

查看slave信息

1
2
3
4
5
6
7
mysql> show slave status\G;

# 如果发现失败,先重置参数,然后重新配置
mysql> stop slave;
mysql> reset slave;
mysql> change master to ....
mysql> start slave;

常见错误

Authentication plugin ‘caching_sha2_password’ reported error: Authentication requires secure connection.

设置master的时候加参数get_master_public_key=1

Slave failed to initialize relay log info structure from the repository

从库进行了多次配置,应该先停止,重置复制状态

1
2
3
4
5
6

# 如果发现失败,先重置参数,然后重新配置
mysql> stop slave;
mysql> reset slave;
mysql> change master to ....
mysql> start slave;

Got fatal error 1236 from master when reading data from binary log: ‘Could not find first log file name in binary log index file’

master_log_filemaster_log_pos 与主库不一致,重新检查主库的show master status输出。

其他

查看新安装默认密码

1
sudo grep 'temporary password' /var/log/mysqld.log

后续问题

  • 主从切换
  • 数据一致性检查
  • 扩容从库

参考资料

CATALOG
  1. 1. 原理
  2. 2. 环境
  3. 3. 通用配置
  4. 4. 主库
  5. 5. 从库1
    1. 5.1. 常见错误
    2. 5.2. Got fatal error 1236 from master when reading data from binary log: ‘Could not find first log file name in binary log index file’
  6. 6. 其他
    1. 6.1. 查看新安装默认密码
  7. 7. 后续问题
  8. 8. 参考资料