本文基于RockyLinux8.9系统 ,使用传统异步方式 来做MySQL主从同步,本文中所使用的MySQL版本为8.0.35 ,配置过程中不影响主库的正常运行,请确保主从服务器时间一致性,防火墙相应的规则已配置。
MySQL主从为什么不用master、slave了,以及主从复制原理见:https://blog.whsir.com/post-7332.html
MySQL主(SOURCE):10.10.10.161
MySQL从(REPLICA):10.10.10.162
MySQL主(SOURCE)配置
1、添加wlnmp和epel源
dnf install epel-release -y curl -fsSL "https://sh.wlnmp.com/wlnmp.sh" | bash
|-----|--------------------------------------------------------------------------------| | 1 2 | dnf install epel-release -y curl -fsSL "https://sh.wlnmp.com/wlnmp.sh" | bash |
2、安装MySQL
dnf install wmysql8 -y
|---|------------------------| | 1 | dnf install wmysql8 -y |
3、创建数据库whsir以及测试表(作为演示用)
注意wlnmp一键安装包安装的MySQL密码为空
mysql -uroot -p mysql> CREATE DATABASE whsir; mysql> USE whsir; mysql> CREATE TABLE wh_tb(id int,name varchar(30));
|---------|------------------------------------------------------------------------------------------------------------------------| | 1 2 3 4 | mysql -uroot -p mysql> CREATE DATABASE whsir; mysql> USE whsir; mysql> CREATE TABLE wh_tb(id int,name varchar(30)); |
4、创建用户并授权从库可以读取日志文件
mysql> CREATE USER 'zhu'@'10.10.10.162' IDENTIFIED BY '123456'; mysql> GRANT REPLICATION SLAVE ON *.* TO 'zhu'@'10.10.10.162';
|-----|------------------------------------------------------------------------------------------------------------------------------------| | 1 2 | mysql> CREATE USER 'zhu'@'10.10.10.162' IDENTIFIED BY '123456'; mysql> GRANT REPLICATION SLAVE ON *.* TO 'zhu'@'10.10.10.162'; |
5、刷新查看用户权限
mysql> FLUSH PRIVILEGES;
|---|---------------------------| | 1 | mysql> FLUSH PRIVILEGES; |
查看zhu账号是否生效
mysql> SELECT USER,HOST FROM mysql.user;
|---|-------------------------------------------| | 1 | mysql> SELECT USER,HOST FROM mysql.user; |
6、备份库
mysqldump -uroot -p --routines --single_transaction --source-data=2 --databases whsir > whsir.sql
|---|----------------------------------------------------------------------------------------------------| | 1 | mysqldump -uroot -p --routines --single_transaction --source-data=2 --databases whsir > whsir.sql |
--single-transaction:该选项确保在备份时使用事务,这样可以保证备份的一致性,而不会锁定整个数据库。
--source-data=2:这个选项用于在输出文件中包含二进制日志坐标信息,二进制日志坐标信息是主从复制中用于同步的关键信息,这里数字"2"表示包含二进制日志文件名和位置。
7、备份库拷贝至从库上
把备份好的库拷贝到从库,你可以scp传过去,也可下载到本地再传到从库上。
8、查看备份文件whsir.sql的binlog和pos值,记录下来,从库配置时用
head -25 whsir.sql
|---|--------------------| | 1 | head -25 whsir.sql |
MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=1274;
9、连通性验证
为了确保主库的账户配置正确以及主从服务器的连通性,我们在从服务器上连接下主的库,确保可以正常连通,再进行下一步
mysql -uzhu -p123456 -h10.10.10.161
|---|-------------------------------------| | 1 | mysql -uzhu -p123456 -h10.10.10.161 |
至此主库配置完毕。
MySQL从(REPLICA)配置
1、修改my.cnf文件
wlnmp一键安装包安装的MySQL数据库,默认server-id = 100,从库的server-id值一定要大于主库的。
修改从库my.cnf中的server-id
server-id = 101
|---|-----------------| | 1 | server-id = 101 |
指定复制的库和表,此处%表示通配所有
replicate-wild-do-table=whsir.%
|---|---------------------------------| | 1 | replicate-wild-do-table=whsir.% |
增加只读参数
read_only = ON
|---|----------------| | 1 | read_only = ON |
2、重启从库的MySQL
/etc/init.d/mysql restart
|---|---------------------------| | 1 | /etc/init.d/mysql restart |
3、创建whsir库
mysql -uroot -p mysql> CREATE DATABASE whsir;
|-----|------------------------------------------------| | 1 2 | mysql -uroot -p mysql> CREATE DATABASE whsir; |
4、导入whsir.sql
mysql -uroot -p whsir < whsir.sql
|---|------------------------------------| | 1 | mysql -uroot -p whsir < whsir.sql |
5、配置主从同步
mysql -uroot -p mysql> STOP REPLICA; mysql> CHANGE MASTER TO -> MASTER_HOST='10.10.10.161', -> MASTER_USER='zhu', -> MASTER_PASSWORD='123456', -> MASTER_PORT=3306, -> MASTER_LOG_FILE='mysql-bin.000002', -> MASTER_LOG_POS=1274, -> MASTER_CONNECT_RETRY=10; mysql> START REPLICA;
|-------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | 1 2 3 4 5 6 7 8 9 10 11 | mysql -uroot -p mysql> STOP REPLICA; mysql> CHANGE MASTER TO -> MASTER_HOST='10.10.10.161', -> MASTER_USER='zhu', -> MASTER_PASSWORD='123456', -> MASTER_PORT=3306, -> MASTER_LOG_FILE='mysql-bin.000002', -> MASTER_LOG_POS=1274, -> MASTER_CONNECT_RETRY=10; mysql> START REPLICA; |
这里的MASTER_LOG_FILE和MASTER_LOG_POS值,就是前面提到的binlog和pos,MASTER_CONNECT_RETRY是连接失败后等待的秒数。
6、查看同步状态
mysql> SHOW REPLICA STATUS\G
|---|--------------------------------| | 1 | mysql> SHOW REPLICA STATUS\G |
如果看到以下两项都是yes表示主从配置成功
Replica_IO_Running: Yes
Replica_SQL_Running: Yes
如果看到以下等于0表示主从没有延迟
Seconds_Behind_Source: 0
7、最后在从库上创建一个只读权限的帐号
CREATE USER 'wh'@'10.10.10.%' IDENTIFIED BY '123456789'; GRANT SELECT ON whsir.* TO 'wh'@'10.10.10.%'; FLUSH PRIVILEGES;
|-------|---------------------------------------------------------------------------------------------------------------------------| | 1 2 3 | CREATE USER 'wh'@'10.10.10.%' IDENTIFIED BY '123456789'; GRANT SELECT ON whsir.* TO 'wh'@'10.10.10.%'; FLUSH PRIVILEGES; |