mysql配置主从同步
vim /etc/my.cnf
[mysqld]
server-id = 1 # 主库唯一ID(从库需不同)
log_bin = /var/lib/mysql/mysql-bin # binlog日志路径(自定义,确保磁盘空间充足)
binlog_format = ROW # 推荐ROW格式(避免SQL_MODE不一致、函数依赖等问题,数据一致性最高)
expire_logs_days = 7 # binlog保留7天(根据磁盘空间调整,避免占满)
innodb_flush_log_at_trx_commit = 1 # 事务安全性(可选,牺牲少量性能换一致性)
sync_binlog = 1 # 同步binlog到磁盘(可选,防止宕机丢失binlog)# 3. GTID配置(MySQL 5.7+,推荐开启)
gtid_mode=ON
enforce_gtid_consistency=ON
log_bin_use_v1_row_events=1 # 兼容低版本从库(可选)
CREATE USER 'repl'@'从库IP' IDENTIFIED BY '你的强密码';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'从库IP';
FLUSH PRIVILEGES; -- 刷新权限
CREATE USER 'repl'@'192.168.159.131' IDENTIFIED BY 'Root123.com@';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.159.131';
FLUSH PRIVILEGES;
– 验证账号(可选,从库执行)
mysql -h 主库IP -u repl -p’你的强密码’ – 能登录则说明权限正常
mysql -h 192.168.159.133 -P 3307 -u repl -p'Root123.com@' --skip-ssl
验证主库配置生效
show variables like 'log_bin'; # 结果为ON
show variables like 'server_id'; # 结果为1
show variables like 'gtid_mode'; # 结果为ON
show master status; # 查看binlog文件名和位置(后续用到)
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
从库配置
[mysqld]
# 2. 从库核心配置
server-id=101 # 唯一ID(≠主库100)
relay_log=mysql-relay-bin # 开启中继日志(从库同步依赖)
relay_log_recovery=1 # 中继日志损坏时自动恢复(提高稳定性)
read_only=ON # 从库设为只读(避免误写,超级用户仍可写)
super_read_only=ON # 禁止超级用户写(MySQL 5.7+,强化只读)
log_slave_updates=1 # 从库同步的操作记录到自身binlog(可选,若从库需作为其他从库的主库则开启)# 3. GTID配置(与主库一致)
gtid_mode=ON
enforce_gtid_consistency=ON
备份主库数据
# 锁定主库,防止数据写入
mysql -u root -p -e "FLUSH TABLES WITH READ LOCK;"
mysql -u root -p -e "SHOW MASTER STATUS;" > master_status.txt# 备份数据
mysqldump -u root -p --all-databases --master-data=2 > master_backup.sql# 解锁主库
mysql -u root -p -e "UNLOCK TABLES;"
从库恢复全量备份(核心:与主库数据一致)
systemctl stop mysqld.service
mysql -u root -p < master_backup.sql
重启从库后执行
CHANGE MASTER TO
MASTER_HOST='192.168.159.133',
MASTER_USER='repl',
MASTER_PASSWORD='Root123.com@',
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=154;START SLAVE;
SHOW SLAVE STATUS\G
如果主库不是3306,那么
重新配置主从复制,指定正确端口
STOP SLAVE;CHANGE MASTER TO
MASTER_HOST='192.168.159.133',
MASTER_PORT=3307,
MASTER_USER='repl',
MASTER_PASSWORD='Root123.com@',
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=154;START SLAVE;
主库配置:
[root@node2 ~]# cat /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/var/lib/mysql/mysql.socksymbolic-links=0log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
port=3307server-id = 1 # 主库唯一ID(从库需不同)
log_bin = /var/lib/mysql/mysql-bin # binlog日志路径(自定义,确保磁盘空间充足)
binlog_format = ROW # 推荐ROW格式(避免SQL_MODE不一致、函数依赖等问题,数据一致性最高)
expire_logs_days = 7 # binlog保留7天(根据磁盘空间调整,避免占满)
innodb_flush_log_at_trx_commit = 1 # 事务安全性(可选,牺牲少量性能换一致性)
sync_binlog = 1 # 同步binlog到磁盘(可选,防止宕机丢失binlog)# 3. GTID配置(MySQL 5.7+,推荐开启)
gtid_mode=ON
enforce_gtid_consistency=ON
log_bin_use_v1_row_events=1 # 兼容低版本从库(可选)
从库配置:
[root@node2 etc]# cat /etc/my.cnf
[mysqld]
basedir = /u01/mysql
datadir = /u01/mysql/data
port = 3306
socket = /u01/mysql/tmp/mysql.sock
user = mysql
symbolic-links = 0# 2. 从库核心配置
server-id=2 # 唯一ID(≠主库100)
relay_log=mysql-relay-bin # 开启中继日志(从库同步依赖)
relay_log_recovery=1 # 中继日志损坏时自动恢复(提高稳定性)
read_only=ON # 从库设为只读(避免误写,超级用户仍可写)
super_read_only=ON # 禁止超级用户写(MySQL 5.7+,强化只读)
log_slave_updates=1 # 从库同步的操作记录到自身binlog(可选,若从库需作为其他从库的主库则开启)# 3. GTID配置(与主库一致)
gtid_mode=ON
enforce_gtid_consistency=ON[mysqld_safe]
log-error = /u01/mysql/data/mysql.err
pid-file = /u01/mysql/data/mysql.pid[client]
port = 3306
socket = /u01/mysql/tmp/mysql.sock
