Debian 上 MariaDB 复制功能使用指南
一 环境准备与基础配置
- 准备两台或以上服务器,安装 MariaDB(Debian 常见路径为:/etc/mysql/mariadb.conf.d/50-server.cnf 或 /etc/mysql/my.cnf)。确保网络与防火墙放行 3306 端口,时间同步(如 NTP)。为提升可靠性,建议主从版本尽量一致。主库需开启二进制日志,从库启用中继日志,并为每个实例设置唯一的 server-id。
二 一主一从复制步骤
-
主库配置
- 编辑配置文件 [mysqld] 段,开启二进制日志并设定唯一 server-id:
- server-id=1
- log-bin=mysql-bin
- 如仅复制指定库,可加:binlog_do_db=your_db;不建议复制 mysql 系统库。保存后重启 MariaDB。
- 创建复制专用账号并授权:
- CREATE USER ‘repl’@‘从库IP或%’ IDENTIFIED BY ‘强密码’;
- GRANT REPLICATION SLAVE ON . TO ‘repl’@‘从库IP或%’;
- FLUSH PRIVILEGES;
- 锁定全库快照并获取起点:
- FLUSH TABLES WITH READ LOCK;
- SHOW MASTER STATUS; 记录 File 与 Position;
- UNLOCK TABLES;
- 如已有存量数据,先导出并在从库导入(见第四部分)。
-
从库配置
- 编辑配置文件 [mysqld] 段,设定唯一 server-id 并启用中继日志:
- server-id=2
- relay-log=mysql-relay-bin
- 重启 MariaDB,配置主库连接信息(使用上一步记录的 File/Position):
- CHANGE MASTER TO
- MASTER_HOST=‘主库IP’,
- MASTER_USER=‘repl’,
- MASTER_PASSWORD=‘强密码’,
- MASTER_LOG_FILE=‘记录的File’,
- MASTER_LOG_POS=记录的Position;
- 启动复制并校验:
- START SLAVE;
- SHOW SLAVE STATUS\G
- 确认 Slave_IO_Running=Yes、Slave_SQL_Running=Yes,Seconds_Behind_Master 接近 0。
三 进阶用法
-
GTID 复制(推荐,便于故障切换与一致性)
- 主从 my.cnf 启用:gtid_domain_id=唯一值;主库建议 sync_binlog=1。
- 从库执行(无需手动指定 File/Position):
- CHANGE MASTER TO … , MASTER_USE_GTID=slave_pos;
- START SLAVE;
- 校验:Slave_IO_Running/Slave_SQL_Running 均为 Yes。
-
双主复制(互为主从,写双向)
- 两台服务器均开启:log-bin、server-id 不同,并开启 log_slave_updates(让从库上的变更也写入其二进制日志,以便对方继续复制)。
- 为避免自增冲突,设置:
- auto_increment_increment=2
- auto_increment_offset=1(服务器A)/ 2(服务器B)
- 各自创建复制账号,互为主从指向对方;注意应用侧避免同一行在多主上并发写入导致冲突。
-
多主一从(一个从库汇聚多个主库)
- MariaDB 支持多通道复制,使用命名通道配置多个主库:
- CHANGE MASTER ‘chan1’ TO … ;
- CHANGE MASTER ‘chan2’ TO … ;
- START SLAVE ‘chan1’; START SLAVE ‘chan2’;
- 复制信息会分别保存在 master-chan1.info、relay-log-chan1.info 等文件中。
四 常见检查与故障排查
- 状态与延迟
- SHOW SLAVE STATUS\G 关注:Slave_IO_Running、Slave_SQL_Running、Last_Error、Seconds_Behind_Master(0 表示无延迟)。
- 常见原因
- server-id 冲突、复制账号权限或来源 IP 限制不当、主从数据不一致、未正确记录或填写 File/Position(非 GTID 场景)、网络/防火墙阻断 3306、主库 binlog 被清理导致位点失效。
- 存量数据初始化
- 主库导出:mysqldump -uroot -p --opt --single-transaction --master-data=2 --databases 需要的库 > dump.sql
- 从库导入:mysql -uroot -p < dump.sql
- 非 GTID:导入后直接用 SHOW MASTER STATUS 的位点配置从库;GTID:导入后直接用 MASTER_USE_GTID=slave_pos。