MySQL 主从同步
主库服务器
启用同步
vim /etc/my.cnf
[mysqld] server-id=1 # 主库ID(唯一,建议1-100) log-bin=mysql-bin # 开启binlog(日志文件前缀) binlog_format=ROW # 行级binlog(同步精度最高) sync_binlog=1 # 确保binlog实时写入磁盘 innodb_flush_log_at_trx_commit=1 # 事务提交时立即刷盘 binlog_do_db = business_db1 # 第一个业务库 只同步指定数据库(可选,没有则同步所有,包括 msyql) binlog_do_db = business_db2 # 第二个业务库 binlog_do_db = business_db3 # 第三个业务库(可继续添加)
systemctl restart mysqld
创建同步帐号
mysql -uroot -p'主库密码'
CREATE USER 'sync'@'从库IP' IDENTIFIED BY '同步密码'; GRANT REPLICATION SLAVE ON *.* TO 'sync'@'从库IP'; FLUSH PRIVILEGES;
导出数据
mysqldump -uroot -p'主库密码' \ --single-transaction \ # InnoDB引擎保证一致性,不锁表 --master-data=2 \ # 记录导出时的binlog位置(在导出的 SQL 文件中添加 CHANGE MASTER TO 语句) --flush-logs \ # 刷新binlog,生成新日志文件 -B business_db1 business_db2 business_db3 > /tmp/dbs4sybc.sql # -B 指定数据库,导出建库语句
scp /tmp/dbs4sybc.sql root@从库IP:/tmp/
开启防火墙
# firewall-cmd --add-port=3306/tcp --permanent firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="从库IP" port protocol="tcp" port="3306" accept' firewall-cmd --reload
从库服务器
导入数据
mysql -uroot -p'从库密码' < /tmp/dbs4sybc.sql
启用同步
vim /etc/my.cnf
[mysqld] server-id = 2 # 从库ID,必须和主库不同 relay-log = mysql-relay-bin # 中继日志 log_slave_updates = 1 # 可选:从库记录自身binlog read_only = 1 # 从库只读(管理员仍可操作)
systemctl restart mysqld
mysql -uroot -p'从库密码'
# 1. 停止现有同步(如果有) STOP SLAVE; # 2. 查看导出的SQL文件,找到同步起始位置 # cat /tmp/dbs4sybc.sql | grep "CHANGE MASTER TO" # 输出:CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000005', MASTER_LOG_POS=156; # 3. 配置主从同步(替换为实际的binlog信息和主库信息) CHANGE MASTER TO MASTER_HOST='主库IP', MASTER_USER='sync', # 之前创建的同步账号 MASTER_PASSWORD='同步密码', MASTER_LOG_FILE='mysql-bin.000005', # 导出文件中的binlog文件名 MASTER_LOG_POS=156; # 导出文件中的binlog位置 # 4. 启动同步 START SLAVE; # 5. 检查同步状态(Slave_IO_Running 和 Slave_SQL_Running 状态两个Yes表示正常) SHOW SLAVE STATUS\G;