异步复制是数据库复制的常见模式,核心逻辑是主库(Master)将数据变更记录到二进制日志(Binary Log),从库(Slave)通过I/O线程拉取日志并写入中继日志(Relay Log),再由SQL线程重放日志实现数据同步。与同步复制不同,异步复制不要求主库等待从库确认,因此主库性能影响小,但可能存在短暂数据不一致(如主库宕机时未同步到从库的变更)。
异步复制的配置需分别完成主库(Master)和从库(Slave)的设置,以下是详细流程:
编辑主库的my.cnf(或my.ini)文件,在[mysqld] section添加以下参数:
[mysqld]
server-id = 1 # 唯一标识,整个复制拓扑中不可重复(建议用IP后8位)
log-bin = mysql-bin # 启用二进制日志(记录数据变更)
binlog-format = ROW # 推荐使用ROW格式,更安全且兼容性好
sync_binlog = 1 # 每次提交事务同步binlog到磁盘,防止主从不一致
innodb_flush_log_at_trx_commit = 1 # 每次提交事务将redo log写入磁盘,保证崩溃恢复
修改后重启MySQL服务使配置生效:
sudo systemctl restart mysql
登录主库,创建专用于复制的用户并授权:
CREATE USER 'repl'@'%' IDENTIFIED BY 'StrongPassword123!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
注:
%表示允许从任意主机连接,生产环境建议限制为从库IP(如'repl'@'slave_ip')。
执行以下命令查看主库当前的二进制日志文件名和位置(后续从库连接时需要):
SHOW MASTER STATUS;
输出示例:
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
记录File(如mysql-bin.000001)和Position(如154),这是从库连接的起点。
编辑从库的my.cnf文件,在[mysqld] section添加以下参数:
[mysqld]
server-id = 2 # 唯一标识,不能与主库或其他从库重复
relay-log = mysql-relay-bin # 启用中继日志(存储从主库拉取的日志)
log_bin = mysql-bin # 可选:开启从库二进制日志(用于级联复制)
read_only = 1 # 推荐:设置为只读,防止普通用户误修改数据
skip_slave_start = 1 # 推荐:禁止从库启动时自动启动复制(避免不一致时自动恢复)
修改后重启MySQL服务:
sudo systemctl restart mysql
登录从库,执行CHANGE MASTER TO命令指定主库信息(替换为实际值):
CHANGE MASTER TO
MASTER_HOST = 'master_ip', # 主库IP地址
MASTER_USER = 'repl', # 主库创建的复制用户
MASTER_PASSWORD = 'StrongPassword123!', # 复制用户密码
MASTER_LOG_FILE = 'mysql-bin.000001', # 主库的binlog文件名(SHOW MASTER STATUS获取)
MASTER_LOG_POS = 154; # 主库的binlog位置(SHOW MASTER STATUS获取)
启动从库复制进程:
START SLAVE;
查看复制状态(重点关注以下字段):
SHOW SLAVE STATUS\G
关键指标:
Slave_IO_Running:应为Yes(表示I/O线程正常,正在从主库拉取日志);Slave_SQL_Running:应为Yes(表示SQL线程正常,正在执行日志中的变更);Seconds_Behind_Master:应为0(表示从库无延迟;若大于0,表示从库落后于主库的时间,需排查性能问题)。定期执行SHOW SLAVE STATUS\G检查复制健康状况,重点关注:
Slave_IO_Running/Slave_SQL_Running):若为No,需立即排查错误(如网络中断、权限问题);Seconds_Behind_Master):若持续大于0,需优化从库性能(如增加硬件资源、优化查询);Last_Error):若有错误,需根据提示解决(如数据冲突、主库日志已删除)。常见错误及解决方法:
若主库因日志过期(expire_logs_days设置)或手动清理删除了从库所需的binlog文件,从库会报错“Could not find first log file name in binary log index file”。
解决方法:
SHOW MASTER STATUS);STOP SLAVE;;RESET SLAVE ALL;;CHANGE MASTER TO)并启动复制。若从库被误修改(如直接执行INSERT/UPDATE),会导致复制错误(如“Duplicate entry”)。
解决方法:
STOP SLAVE;;RESET SLAVE ALL;;sync_binlog=1保证数据安全,但会增加磁盘IO,可根据业务需求调整为100(每100次事务同步一次);CHANGE MASTER TO MASTER_DELAY=3600,表示从库延迟1小时同步)。mysqldump:导出主库全量数据并导入从库(适合中小数据量);xtrabackup:物理备份工具,速度快,适合大数据量(如TB级数据库)。pt-table-checksum(Percona工具)校验主从数据一致性,发现差异后用pt-table-sync修复。若主库发生故障(如宕机、磁盘损坏),需将从库提升为新的主库,步骤如下:
STOP SLAVE;;STOP SLAVE; RESET MASTER;;CHANGE MASTER TO命令指向新主库(需获取新主库的binlog位置);通过以上步骤,可实现异步复制的正确配置与有效管理,满足业务对数据冗余、读扩展的需求。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。