数据增量同步

第一阶段:环境初始化 (在两台机器上都执行)

目的:确保网络互通,关闭干扰服务。

  1. 配置主机名与解析

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    
    # 在 101 上执行
    hostnamectl set-hostname mysql-server && bash
    # 在 102 上执行
    hostnamectl set-hostname backup-server && bash
    
    # 在两台机器都执行
    cat >> /etc/hosts <<EOF
    192.168.200.101 mysql-server
    192.168.200.102 backup-server
    EOF
    
  2. [cite_start]关闭防火墙与 SELinux [cite: 11]

    1
    2
    3
    4
    
    # 两台机器都执行
    systemctl stop firewalld && systemctl disable firewalld
    setenforce 0
    sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
    

第二阶段:MySQL 主服务器部署 (操作节点:192.168.200.101)

目的:安装数据库,开启二进制日志(Binlog),配置 Rsync 服务端。

[cite_start]1. 安装与配置 MySQL [cite: 28-36]

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 创建软件目录
mkdir -p /data/software
cd /data/software

# 安装 MySQL (确保源已配置,或使用本地 rpm)
yum -y install mysql-community-server

# 创建关键目录 (修复 chroot failed 的核心步骤)
mkdir -p /data/mysql/logs/mysql_binlog
chown -R mysql:mysql /data/mysql/logs/
chmod 755 /data/mysql/logs/mysql_binlog

[cite_start]2. 修改配置文件 (开启 Binlog) [cite: 41-42]

这是之前导致你同步失败的关键点,必须配置vim /etc/my.cnf

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
[mysqld]
# 基础配置
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

# === 新增以下配置 ===
# 开启 Binlog,路径必须与上面创建的目录一致
server_id=1
log-bin=/data/mysql/logs/mysql_binlog/mysql-bin
# ==================

3. 启动并初始化数据库

1
2
3
4
5
6
systemctl start mysqld
systemctl enable mysqld

# 获取临时密码并登录修改 (假设改为 123123)
grep "password" /var/log/mysqld.log
mysql -uroot -p'临时密码'

在 MySQL 中执行:

1
2
3
4
5
set global validate_password_policy=0;
set global validate_password_length=1;
alter user 'root'@'localhost' identified by '123123';
flush privileges;
exit;

[cite_start]4. 导入业务数据 [cite: 93-113]

1
mysql -uroot -p123123

在 MySQL 中执行:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
CREATE DATABASE bdqn_db CHARACTER SET utf8;
USE bdqn_db;
CREATE TABLE order_master(
    order_id INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '订单ID',
    order_sn BIGINT UNSIGNED NOT NULL COMMENT '订单编号',
    customer_id INT UNSIGNED NOT NULL COMMENT '下单人ID',
    payment_method TINYINT NOT NULL COMMENT '支付方式',
    product_id INT UNSIGNED NOT NULL COMMENT '商品id',
    product_name VARCHAR(50) NOT NULL COMMENT '商品名称',
    product_cnt INT NOT NULL DEFAULT 1 COMMENT '数量',
    product_price DECIMAL(12,2) NOT NULL COMMENT '单价',
    order_money DECIMAL(12,2) NOT NULL COMMENT '金额',
    create_time DATETIME COMMENT '下单时间',
    pay_time DATETIME COMMENT '支付时间',
    order_status TINYINT NOT NULL DEFAULT 0 COMMENT '状态',
    modified_time DATETIME COMMENT '修改时间',
    PRIMARY KEY pk_orderid(order_id)
) ENGINE=innodb COMMENT '订单主表';
INSERT INTO order_master VALUES('1', '202303150001', '001', '1', '00001', 'Galaxy PHONE', '1', '5000', '5000', NOW(), null, '0', NOW());
exit;

[cite_start]5. 编写本地逻辑备份脚本 (修复语法错误版) [cite: 202-230]

mkdir -p /data/tools/backup_mysql_tools mkdir -p /data/backup/mysql vim /data/tools/backup_mysql_tools/backup_mysql.sh

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/bash
BACKUP_USER="root"
BACKUP_PASS="123123"
TIME=$(date +%F-%H-%M)
BACKUP_TIME="180" # 修复了原文档的乱码
DB_NAME="bdqn_db"
BACKUP_PATH="/data/backup/mysql"
BACKUP_SQL_NAME="backup-database-${DB_NAME}-${TIME}.sql"
BACKUP_FILE_NAME="backup-database-${DB_NAME}-${TIME}.tar.bz2"

function BACKUP_MYSQL() {
    cd ${BACKUP_PATH}
    mysqldump -u"${BACKUP_USER}" -p"${BACKUP_PASS}" ${DB_NAME} > ${BACKUP_SQL_NAME}
    tar -jcvf ${BACKUP_FILE_NAME} ${BACKUP_SQL_NAME}
    rm -rf ${BACKUP_SQL_NAME}
}

function CLEAN_OLD_TIME() {
    # 修复了原文档逻辑在花括号外的错误
    find ${BACKUP_PATH} -mtime +${BACKUP_TIME} -type f | xargs -r rm -rf
}

BACKUP_MYSQL
CLEAN_OLD_TIME

添加执行权限并测试:

1
2
3
4
chmod +x /data/tools/backup_mysql_tools/backup_mysql.sh
bash /data/tools/backup_mysql_tools/backup_mysql.sh
# 检查是否生成了 .tar.bz2 文件
ls -lh /data/backup/mysql/

[cite_start]6. 配置 Rsync 服务端 [cite: 329-353]

yum install -y rsync vim /etc/rsyncd.conf

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
uid = root
gid = root
use chroot = yes
address = 192.168.200.101
port = 873
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
hosts allow = 192.168.200.0/24

[mysql-bin]
# 这里必须对应前面创建的真实存在的目录
path = /data/mysql/logs/mysql_binlog
read only = yes
dont compress = *.gz *.bz2 *.tgz *.zip *.rar *.z
auth users = backuper
secrets file = /etc/rsyncd_users.db

[mysqldump]
path = /data/backup/mysql
read only = yes
dont compress = *.gz *.bz2 *.tgz *.zip *.rar *.z
auth users = backuper
secrets file = /etc/rsyncd_users.db

创建密码文件并启动:

1
2
3
4
5
echo "backuper:666666" > /etc/rsyncd_users.db
chmod 600 /etc/rsyncd_users.db
rsync --daemon
# 验证端口
netstat -antp | grep 873

第三阶段:备份服务器配置 (操作节点:192.168.200.102)

目的:拉取逻辑备份和增量日志,并设置定时任务。

[cite_start]1. 基础配置与目录创建 [cite: 371-376]

1
2
3
4
yum install -y rsync
mkdir -p /data/backup/mysql_dump
mkdir -p /data/backup/mysql_binlog
mkdir -p /data/tools/

[cite_start]2. 配置密码文件 [cite: 379-381]

1
2
3
# 客户端只需密码
echo "666666" > /data/tools/server.pass
chmod 600 /data/tools/server.pass

[cite_start]3. 测试同步 (关键验证步骤) [cite: 383-391]

请依次执行,确保无报错:

测试 1:拉取逻辑备份(全量)

1
rsync -avz --password-file=/data/tools/server.pass backuper@192.168.200.101::mysqldump /data/backup/mysql_dump/

(预期结果:成功传输 .tar.bz2 文件)

测试 2:拉取 Binlog(增量)

1
rsync -avz --password-file=/data/tools/server.pass backuper@192.168.200.101::mysql-bin /data/backup/mysql_binlog/

(预期结果:成功传输 mysql-bin.000001 等文件。如果此时还报 chroot failed,请回到主服务器检查目录 /data/mysql/logs/mysql_binlog 是否存在且有权限)

[cite_start]4. 配置 Crontab 计划任务 [cite: 398-401]

使用标准追加命令,避免语法错误。

1
2
3
4
5
6
7
8
# 每天凌晨 2 点拉取 Binlog
echo "0 2 * * * /usr/bin/rsync -avz --password-file=/data/tools/server.pass backuper@192.168.200.101::mysql-bin /data/backup/mysql_binlog/" >> /var/spool/cron/root

# 每天凌晨 2 点拉取 逻辑备份
echo "0 2 * * * /usr/bin/rsync -avz --password-file=/data/tools/server.pass backuper@192.168.200.101::mysqldump /data/backup/mysql_dump/" >> /var/spool/cron/root

# 检查
crontab -l

验证清单

如果做完以上所有步骤,你的系统应满足:

  1. 101 主机/data/mysql/logs/mysql_binlog/ 下有 mysql-bin.000001 文件。
  2. 101 主机/data/backup/mysql/ 下有 .tar.bz2 备份包。
  3. 102 主机:手动执行 rsync 命令时,不再报错,且能看到文件被拉取过来。
  4. 102 主机crontab -l 中有两条定时的 rsync 任务。
本文采用 CC BY-NC-SA 4.0 许可协议
使用 Hugo 构建
主题 StackJimmy 设计