# 1.1 配置静态IP(以主节点为例,从节点IP不同)
sudo vi /etc/sysconfig/network-scripts/ifcfg-ens33
修改内容:
BOOTPROTO=static # 改为静态IP
ONBOOT=yes# 开机启动网卡
IPADDR=192.168.1.100# 主节点IP
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=8.8.8.8
重启网络服务:
sudo systemctl restart network
# 1.2 关闭防火墙(测试环境方便,生产环境需配置规则)
sudo systemctl stop firewalld
sudo systemctl disable firewalld
# 1.3 禁用SELinux(避免权限拦截)
sudo setenforce 0
sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
# 2.1 安装Yum仓库
sudo yum install -y https://repo.mysql.com/mysql57-community-release-el7-11.noarch.rpm
# 2.2 安装MySQL服务
sudo yum install -y mysql-community-server
# 2.3 启动服务
sudo systemctl start mysqld
sudo systemctl enable mysqld
# 2.4 获取初始密码(首次安装必做)
sudo grep 'temporary password' /var/log/mysqld.log
# 输出示例:A temporary password is generated for root@localhost: xxxxxx
# 3.1 运行安全脚本
sudo mysql_secure_installation
# 按提示操作:
# 1. 输入临时密码(从步骤2.4获取)
# 2. 重置root密码(需包含大小写字母、数字、符号,如MyRootPass123!)
# 3. 移除匿名用户?Y
# 4. 禁止root远程登录?n(若需远程访问选n)
# 5. 删除测试数据库?Y
# 6. 刷新权限表?Y
sudo vi /etc/my.cnf
在[mysqld]
段落下添加:
server-id = 1# 唯一标识,主从不能重复
log-bin = mysql-bin # 二进制日志文件名(默认路径/var/lib/mysql)
binlog_format = ROW # 推荐格式,保证数据一致性
expire_logs_days = 7# 自动清理7天前的日志
# 可选:指定同步的数据库
# binlog-do-db = mydb # 只同步mydb库
# binlog-ignore-db = mysql # 忽略系统库
sudo systemctl restart mysqld
# 登录MySQL
mysql -u root -p
-- 创建用户(用户名repl,密码ReplPass123!)
CREATEUSER'repl'@'%' IDENTIFIED BY'ReplPass123!';
-- 授予复制权限
GRANT REPLICATION SLAVE ON*.*TO'repl'@'%';
-- 刷新权限
FLUSH PRIVILEGES;
SHOW MASTER STATUS;
记录输出中的 File (如mysql-bin.000002
) 和 Position (如154
),从库配置需要用到。
sudo vi /etc/my.cnf
在[mysqld]
段落下添加:
server-id = 2# 必须与主库不同
relay-log = mysql-relay-bin # 中继日志文件名
read_only = 1# 从库只读(超级用户仍可写)
# 可选:指定同步的数据库
# replicate-do-db = mydb # 与主库binlog-do-db对应
# replicate-ignore-db = mysql
sudo systemctl restart mysqld
# 登录MySQL
mysql -u root -p
-- 停止从库复制(首次可不执行)
STOP SLAVE;
-- 配置主库信息(IP、用户、日志文件、位置)
CHANGE MASTER TO
MASTER_HOST ='192.168.1.100',
MASTER_USER ='repl',
MASTER_PASSWORD ='ReplPass123!',
MASTER_LOG_FILE ='mysql-bin.000002', -- 替换为主库SHOW MASTER STATUS的值
MASTER_LOG_POS =154;
-- 启动复制
START SLAVE;
SHOW SLAVE STATUS\G
关键字段说明:
-- 在主库创建测试数据
CREATE DATABASE sync_test;
USE sync_test;
CREATETABLE users (id INTPRIMARY KEY, name VARCHAR(20));
INSERTINTO users VALUES (1, 'Alice'), (2, 'Bob');
-- 在从库查询数据
SELECT*FROM sync_test.users;
预期输出:
+----+-------+
| id | name |
+----+-------+
| 1 | Alice |
| 2 | Bob |
+----+-------+
•
检查网络连通性:
telnet 192.168.1.100 3306 # 从库执行,测试端口是否开放
•
验证复制用户权限:
-- 在主库执行
SHOW GRANTS FOR'repl'@'%'; -- 确认有REPLICATION SLAVE权限
•
跳过错误(谨慎操作):
STOP SLAVE;
SETGLOBAL SQL_SLAVE_SKIP_COUNTER=1; -- 跳过1个错误事件
START SLAVE;
•
重新同步全量数据:
mysqldump -u root -p --all-databases --master-data=2 > master_full.sql
mysql -u root -p < master_full.sql
•强制从库只读
:
SETGLOBAL read_only =1; -- 普通用户只读
SETGLOBAL super_read_only =1; -- 超级用户只读(MySQL 5.7+)
# 主从库配置文件添加
gtid_mode = ON
enforce_gtid_consistency = ON
从库配置命令改为:
CHANGE MASTER TO MASTER_AUTO_POSITION =1;
-- 主库执行
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
SETGLOBAL rpl_semi_sync_master_enabled =1;
-- 从库执行
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
SETGLOBAL rpl_semi_sync_slave_enabled =1;
# 监控从库状态(保存为 /opt/mysql_monitor.sh)
#!/bin/bash
STATUS=$(mysql -u root -p'密码' -e "SHOW SLAVE STATUS\G")
echo"$(date +"%Y-%m-%d %H:%M:%S")" >> /var/log/mysql_replication.log
echo"$STATUS" | grep "Running\|Behind\|Error" >> /var/log/mysql_replication.log
# 添加定时任务
crontab -e
# 添加:*/5 * * * * /bin/bash /opt/mysql_monitor.sh
主从复制流程:
主库写入数据 → 记录到binlog → 从库IO线程拉取binlog → 写入relay log → 从库SQL线程重放relay log
二进制日志 (binlog) 类型: