MySQL数据库主主同步
快速部署8.0和8.4数据库
- 初始化8.0数据库
# 两台服务器安装MySQL8.0数据库(非docker安装)
tar -xf mysql-8.0.39-1.el9.x86_64.rpm-bundle.tar
yum -y install mysql-community*.rpm
systemctl restart mysqld.service
- 初始化8.4数据库
# 两台服务器安装MySQL8.4数据库
tar -xf mysql-8.4.2-1.el9.x86_64.rpm-bundle.tar
yum -y install mysql-community*.rpm
systemctl restart mysqld.service
更改root初始密码
- 进入数据库
mysql -uroot -p$(grep password /var/log/mysqld.log | awk '{print $NF}')
- 修改root初始密码
alter user root@'localhost' identified by 'you_password';
exit;
配置数据库主主同步
创建同步的库和用户
-- 创建同步的库
CREATE DATABASE new_database
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;-- 新建同步的用户
CREATE USER 'replicator'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%';
FLUSH PRIVILEGES;
配置主节点 1
- 修改 /etc/my.cnf 文件,添加下面内容
server-id = 1
log_bin = mysql-bin
binlog_do_db = new_database
# 设置自增列的增量值,建议将其设置为大于 1 的值,以避免两个主节点在插入时产生相同的自增值
auto_increment_increment = 2
# 设置自增列的起始值
auto_increment_offset = 1
- 重启主节点 1
systemctl restart mysqld.service
配置主节点 2
- 修改数据库配置文件 /etc/my.cnf
server-id = 2
log_bin = mysql-bin
binlog_do_db = new_database
auto_increment_increment = 2
auto_increment_offset = 2
- 重启主节点 2
systemctl restart mysqld.service
8.0 版本配置主主同步
- 主节点1登录主节点2数据库,将密钥发送到主节点2
mysql -ureplicator -h主节点2的IP -p'password' --get-server-public-key
- 主节点2登录主节点1数据库,将密钥发送到主节点1
mysql -ureplicator -h主节点1的IP -p'password' --get-server-public-key
- 获取当前的二进制日志文件和位置
-- 主节点1和2都需要查看
SHOW MASTER STATUS;/*
主节点1测试环境的结果(仅作参考)
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 157 | new_test | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)主节点2测试环境结果
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 157 | new_test | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
*/
- 配置主节点 1 连接主节点 2
CHANGE MASTER TOMASTER_HOST='主节点2的IP',MASTER_USER='replicator',MASTER_PASSWORD='password',MASTER_LOG_FILE='记录的File',MASTER_LOG_POS=记录的Position;-- 启动复制
START SLAVE;
- 配置主节点 2 连接主节点 1
CHANGE MASTER TOMASTER_HOST='主节点1的IP',MASTER_USER='replicator',MASTER_PASSWORD='password',MASTER_LOG_FILE='记录的File',MASTER_LOG_POS=记录的Position;-- 启动复制
START SLAVE;
- 检查复制状态
SHOW SLAVE STATUS\G;
-- 确保 Slave_IO_Running 和 Slave_SQL_Running 都为 Yes。
8.4 版本配置主主同步
- 同理,需要先将密钥发送到对方服务器
mysql -ureplicator -hIP -p'password' --get-server-public-key
- 获取当前的二进制日志文件和位置
-- 8.4 部分查询有改变
SHOW BINARY LOG STATUS;/*
mysql> SHOW BINARY LOG STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 158 | new_test | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
*/
- 配置主节点 1 连接主节点 2
-- 此处也会有变化
CHANGE REPLICATION SOURCE TOSOURCE_HOST='主节点2的IP',SOURCE_USER='replicator',SOURCE_PASSWORD='password',SOURCE_LOG_FILE='记录的File',SOURCE_LOG_POS=记录的Position;-- 启动复制
START REPLICA;
- 配置主节点 2 连接主节点 1
CHANGE REPLICATION SOURCE TOSOURCE_HOST='主节点1的IP',SOURCE_USER='replicator',SOURCE_PASSWORD='password',SOURCE_LOG_FILE='记录的File',SOURCE_LOG_POS=记录的Position;-- 启动复制
START REPLICA;
- 检查复制状态
SHOW REPLICA STATUS\G-- -- 确保 Slave_IO_Running 和 Slave_SQL_Running 都为 Yes。
总结和答疑
8.4 是MySQL数据库的一个分水岭,部分操作会有小小的变化。
- 具体变化请参考文档: https://dev.mysql.com/doc/refman/8.4/en/mysql-nutshell.html
新的同步方式会验证用户名密钥,没有同步密钥会导致同步不成功