Centos8搭建MySQL8.0.21主从
准备工作
- 两台或两台以上Centos8并安装MySQL8.0.21的服务器(参考)
- 主库创建好数据库以及表,然后插入一些用来测试同步的数据
- 服务器都可以访问互联网
环境
下面介绍一下本文搭建主从的环境:
主库:192.168.0.22 主机名:dxm22.host server-id=1
从库:192.168.0.24 主机名:dxm24.host server-id=2
库名:shop
表名:user
配置主库
修改配置文件my.cnf
# 下面是两项关键配置项,如果已经有,则检查是否正确;如果没有则增加如下内容:
log-bin=/data/mysql/mysql-8.0.21-linux-glibc2.12-x86_64/binlog # binlog日志文件名,二进制日志用来供主从复制时使用
server-id=1 # 设置主服务器的ID,可以任意配置,但是多个主从之间不能重复。
另外,因为mysql8中,binlog_format 变量的默认值是row,所以我们不再需要手动声明这个变量的配置。
创建同步账号
这个账号是供从库访问主库的,所以’synch’@'192.168.0.24’这里的ip是从库的ip。
# 创建同步账号synch
create user 'synch'@'192.168.0.24' identified by '123456';
# 授权
grant replication slave on *.* to 'synch'@'192.168.0.24';
# 查看是否创建用户成功
select * from mysql.user where User='synch'\G;
# 检查权限
show grants for 'synch'@'192.168.0.24';
# 刷新MySQL的系统权限相关表
flush privileges;
获取主库当前binary log文件名和位置(position)
SHOW MASTER STATUS;
主库加锁
加锁,避免导数据时有写操作。
FLUSH TABLES WITH READ LOCK;
导出需要同步的数据并上传至从库服务器
# 导出需要同步的数据
/usr/local/mysql/bin/mysqldump --port=3306 -uroot -p --databases shop --lock-tables=false --> /root/shop.sql
# 切换到/root目录并上传shop.sql至从库服务器
scp shop.sql root@192.168.0.24:/root
主库解锁
UNLOCK TABLES;
查看防火墙配置
主要是检查从库的IP是否加入到防火墙,否则无法连接。
firewall-cmd --list-all #查看现有的规则
# 如果上面命令的列表里面没有从库的IP,需要将从库的IP加入防火墙
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.0.24" accept'
# 防火墙规则配置生效
firewall-cmd --reload
配置从库
导入数据
执行前面从主库scp过来的SQL文件导入库、表结构以及数据。
# 如果当前存在同步数据库,先删除数据
drop database shop;
# 导入数据
[root@dxm24 ~]# /usr/local/mysql/bin/mysql --host=127.0.0.1 --port=3306 -uroot -p < /root/shop.sql
Enter password:
修改配置文件
# 修改my.cnf配置文件
vim /etc/my.cnf
# 主要配置以下关键项
server-id=2 # 指定从库的server-id
replicate-do-db=shop # 用来指定要复制的数据库
read_only=1 # 库设置为只读,普通用户(非root)访问时只有只读的权限,不能做写操作
**注意:**修改完配置文件之后记得重启MySQL服务,否则会报错:ERROR 3021 (HY000): This operation cannot be performed with a running slave io thread; run STOP SLAVE IO_THREAD FOR CHANNEL ‘’ first.。
停止同步从库
stop slave;
配置连接到主库的信息
change
master to
master_host='192.168.0.22',
master_port=3306,
master_user='synch',
master_password='123456',
master_log_file='binlog.000017',
master_log_pos=8014;
# master_host是主库的IP地址
# master_user、master_password是前面在主库创建的用于同步数据的账号和密码
# master_log_file、master_log_pos对应的是在主库执行的show master status 的结果里面的file和position。
开启从库同步
start slave;
查看从库同步状态
show slave status\G;
从库同步状态关键项的解释:
key | value | 含义 |
---|---|---|
Slave_IO_State | Waiting for master to send event | relay日志中的sql语句已经全部执行完毕 |
Master_Host | 192.168.0.22 | 主库IP |
Master_User | synch | 同步的用户 |
Master_Port | 3306 | 端口 |
Master_Log_File | binlog.000017 | I/O线程当前正在读取的主服务器二进制日志文件的名称 |
Read_Master_Log_Pos | 8313 | 在当前的主服务器二进制日志中,I/O线程正在读取的位置 |
Relay_Log_File | dxm24-relay-bin.000002 | |
Relay_Log_Pos | 620 | |
Relay_Master_Log_File | binlog.000017 | 由SQL线程执行的同步的主服务器二进制日志文件的名称,如果和Master_Log_File两个文件名相同,则表示读**取和执行的是同一个二进制文件** |
Slave_IO_Running | Yes | 负责读取主库的binlog日志,并写到从库的relay日志中 |
Slave_SQL_Running | Yes | 负责在从库上执行relay日志中的SQL。如果和Slave_IO_Running两个线程的状态都是yes,表示同步正常,否则要看带有Error的信息进行排查 |
Replicate_Do_DB | shop | 同步的数据库的名字 |
Exec_Master_Log_Pos | 8313 | 来自主服务器的二进制日志的由SQL线程执行的上一个时间的位置,如果和Read_Master_Log_Pos两个位置的数字相同则**表示读取和执行的进度完全同步** |
Master_Server_Id | 1 | 主库的server-id |
Master_Info_File | mysql.slave_master_info | |
Slave_SQL_Running_State | Slave has read all relay log; waiting for more updates | |
Master_Retry_Count | 86400 |
查看从库的server-id
show variables like 'server_id';
遇到的问题
1、error connecting to master ‘synch@192.168.0.22:3306’ - retry-time: 60 retries: 4 message: Authentication plugin ‘caching_sha2_password’ reported error: Authentication requires secure connection。
原因:mysql 8.0 默认使用 caching_sha2_password 身份验证机制 —— 从原来的 mysql_native_password 更改为 caching_sha2_password。客户端不支持新的加密方式。所以需要修改用户的密码和加密方式,我们这里在主库登录MySQL输入以下命令:
root@db 13:37: [mysql]> ALTER USER 'synch'@'192.168.0.24' IDENTIFIED WITH mysql_native_password BY '123456';
即可解决。我们去从库验证一下,在从库执行一下命令:
show slave status\G
可以看到Slave_IO_Running 和Slave_SQL_Running两个线程的状态都是yes,表示同步正常。
验证结果
- 先在主库插入一条数据,执行以下语句:
INSERT INTO `shop`.`user` (`id`,`name`,`age`,`address`,`sex`,`remark`,`create_time`,`create_by`,`create_name`,`update_time`,`update_by`,`update_name`,`is_del`)
VALUES (4,'赵六',66,'深圳',0,NULL,'2020-12-08 14:13:08.000000','1','admin','2020-12-08 14:13:16.000000',NULL,NULL,0);
- 再去从库验证是否有这条数据。
至此完成了两台centos服务器相同MySQL版本的一主一从数据库的同步环境搭建!!!!!!