MySQL 主从同步配置指南:基于 XtraBackup 的热备与快速搭建

周叙
周叙
发布时间:2026-10-15 | 5人浏览过
原创

本文详细介绍如何利用 XtraBackup 工具实现 MySQL 主库到从库的无缝数据迁移,配合 binlog 日志配置完成主从同步环境的快速搭建。通过修改 my.cnf 参数、创建同步用户及执行增量备份导入,确保生产环境下的数据一致性与服务连续性。

准备条件

在进行 MySQL 主从同步配置前,需确保主机满足以下基础环境:

  • 操作系统:CentOS 5.4(或兼容的 Linux 发行版)。
  • 数据库版本:MySQL 5.1.xx 及以上,建议通过 RPM 直接安装以便管理。
  • 备份工具:XtraBackup 1.2.22(或更高版本的 innobackupex),用于在线热备而不锁表。

第1步:配置 Master 服务器

主库需要开启二进制日志(Binary Log)并分配唯一的服务 ID,这是记录数据变更供从库回放的基础。

修改配置文件

编辑 /etc/my.cnf,在 [mysqld] 段落下添加或确认以下关键参数:

[mysqld]
server-id = 1
log-bin
innodb_flush_log_at_trx_commit=1
sync_binlog=1
datadir=/var/lib/mysql
character-set-server=utf8
init_connect='SET NAMES utf8'

参数说明:

  • server-id = 1:主库的唯一标识,必须为整数且不能与其他从库冲突。
  • log-bin:启用二进制日志文件。
  • innodb_flush_log_at_trx_commit=1 与 sync_binlog=1:保证事务提交时日志刷盘,确保数据不丢失,适合对数据安全性要求高的场景。
  • datadir:数据目录路径,需与实际安装路径一致。

修改完成后重启 MySQL 服务使配置生效。

第2步:配置 Slave 服务器

从库只需配置唯一的 Server ID,无需开启 Binlog(除非需要从库作为其它库的主库)。字符集设置应与主库保持一致。

修改配置文件

同样编辑 /etc/my.cnf:

[mysqld]
server-id=2
datadir=/var/lib/mysql
character-set-server=utf8
init_connect='SET NAMES utf8'

保存后重启从库 MySQL 服务。

第3步:在主库创建同步用户

登录主库 MySQL,创建一个专门用于复制数据的账户,赋予 REPLICATION SLAVE 权限。

GRANT REPLICATION SLAVE ON *.* TO '<slave_username>'@'<slave_ip>' IDENTIFIED BY '<slave_password>';
FLUSH PRIVILEGES;

注意:

  • <slave_username> 和 <slave_password> 请替换为您实际规划的账号和密码。
  • <slave_ip> 建议填写从库的实际 IP,若配置为 % 则允许任何 IP 连接,存在安全风险。

第4步:使用 XtraBackup 进行主库热备

为了保证主从数据一致性且不影响主库运行,推荐使用 XtraBackup 进行在线备份。此步骤会将主库数据导出并通过 SSH 传输至从库指定目录,自动解压。

sudo innobackupex-1.5.1 --stream=tar /tmp/ | ssh <slave_host> "mkdir /tmp/db; tar xfi - -C /tmp/db/"

操作解析:

  1. --stream=tar:将备份数据打包成 tar 流输出到标准输出。
  2. /tmp/:临时备份存放目录(实际流式传输中未落盘本地磁盘,直接管道传输)。
  3. ssh ...:通过 SSH 连接到从库服务器,远程创建 /tmp/db 目录并将接收到的 tar 包解压至此。

第5步:在从库恢复数据

数据传输到从库后,需要对备份数据进行预处理并恢复至 MySQL 数据目录。此过程会短暂占用磁盘空间,请确保从库有足够的剩余空间。

# 1. 准备日志(Preparation Phase)
innobackupex-1.5.1 --apply-log /tmp/db

# 2. 将数据拷贝回 mysql 数据目录
innobackupex-1.5.1 --copy-back /tmp/db

# 3. 修正目录权限,确保 mysql 用户拥有所有权
chown -R mysql.mysql /var/lib/mysql/*

风险提示:

  • --apply-log 是必须执行的步骤,它会将未提交的事务回滚或已提交的事务重做,确保数据库引擎的一致性。
  • --copy-back 会将数据覆盖到 datadir 指向的位置,执行前请确认 datadir 为空或已有数据不重要。
  • 权限修正至关重要,否则 MySQL 启动时将因无权读取数据而失败。

第6步:启动主从同步

登录从库,查看备份生成的 binlog 信息,确定同步起点。

获取 Binlog 位置

打开从库上的备份目录文件 xtrabackup_binlog_info(通常位于 /tmp/db 下或解压后的对应位置):

cat /tmp/db/xtrabackup_binlog_info

记录下输出的文件名和 Position 值(例如:mysql-bin.000001 120)。

配置并启动 Slave

在从库 MySQL 命令行中执行以下命令:

CHANGE MASTER TO
MASTER_HOST='<master_host>',
MASTER_USER='<slave_username>',
MASTER_PASSWORD='<slave_password>',
MASTER_LOG_FILE='<xtrabackup_binlog_info中的文件名>',
MASTER_LOG_POS=<xtrabackup_binlog_info中的Position值>;

START SLAVE;

验证同步状态

执行 SHOW SLAVE STATUS\G; 检查输出:

  • Slave_IO_Running: Yes
  • Slave_SQL_Running: Yes
  • Seconds_Behind_Master: 0(或有波动但非 NULL)

若以上两项均为 Yes 且延迟时间可控,即表示主从同步已成功建立。此时可在主库插入测试数据,观察从库是否即时同步。

常见排错建议

  • 权限问题:如果提示 Access denied,请检查 Step 3 创建的用户名密码是否正确,以及防火墙是否开放了从库访问主库 MySQL 端口(默认 3306)。
  • Binlog 格式:建议在 Master 的 my.cnf 中显式设置 binlog_format=ROW,以避免某些语句模式复制导致的逻辑错误。
  • Server ID 冲突:如果出现同步报错,确认所有节点(Master和多个Slave)的 server-id 必须互不相同。

以上就是 MySQL 主从同步配置的详细内容,更多关于数据库高可用的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表