Ubuntu 24.04 下 MySQL 8.0.39 主从复制搭建记录

2026.03.22
苦温集 · 部署教程 Linux · MySQL · 主从复制

注意:本笔记基于 Ubuntu 24.04 系统和 MySQL 8.0.39 版本编写,其他版本可能存在差异。

0. 下载

从 MySQL 官网下载 bundle.tar 压缩包并解压。

1. 设置时区

确保服务器时区一致。

timedatectl set-timezone Asia/Shanghai
systemctl restart systemd-timesyncd

2. 安装

2.1 解压安装包

tar xvf mysql-server_8.0.39-1ubuntu24.04_amd64.deb-bundle.tar

2.2 安装依赖与 MySQL 组件

使用 apt install 配合 ./ 前缀安装,系统会自动处理依赖关系:

apt install ./mysql-common_8.0.39-1ubuntu24.04_amd64.deb \
./mysql-community-client-core_8.0.39-1ubuntu24.04_amd64.deb \
./mysql-community-client-plugins_8.0.39-1ubuntu24.04_amd64.deb \
./mysql-community-client_8.0.39-1ubuntu24.04_amd64.deb \
./mysql-client_8.0.39-1ubuntu24.04_amd64.deb \
./mysql-community-server-core_8.0.39-1ubuntu24.04_amd64.deb \
./mysql-community-server_8.0.39-1ubuntu24.04_amd64.deb \
./mysql-server_8.0.39-1ubuntu24.04_amd64.deb

3. 迁移 MySQL 数据目录至专用数据分区

注意:Ubuntu 默认开启 AppArmor,仅修改 MySQL 配置文件更改数据路径会导致服务启动失败,必须同步修改 AppArmor 配置。

3.1 复制数据目录

停止服务并迁移数据:

systemctl stop mysql
cp -ar /var/lib/mysql /data/mysql
chown -R mysql:mysql /data/mysql

3.2 修改 MySQL 配置文件

编辑 /etc/mysql/mysql.conf.d/mysqld.cnf,修改 datadir 路径:

[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /data/mysql
log-error       = /var/log/mysql/error.log

3.3 修改 AppArmor 安全配置

编辑 /etc/apparmor.d/usr.sbin.mysqld,将原路径注释或修改为新路径:

# /var/lib/mysql/ r,
# /var/lib/mysql/** rwk,
/data/mysql/ r,
/data/mysql/** rwk,

3.4 修改 AppArmor 访问控制文件

编辑 /etc/apparmor.d/abstractions/mysql

# /var/lib/mysql{,d}/mysql{,d}.sock rw
/data/mysql{,d}/mysql{,d}.sock rw

3.5 重启服务

systemctl restart apparmor.service
systemctl start mysql
systemctl status mysql

4. 主节点操作内容

4.1 修改配置文件

编辑 /etc/mysql/mysql.conf.d/mysqld.cnf,开启 Binlog 并配置 Server ID:

server_id       = 45
log_bin         = mysql-bin
binlog_format   = ROW
sql_mode        = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
default_authentication_plugin   = mysql_native_password

4.2 重启服务

systemctl restart mysql
systemctl status mysql

4.3 创建复制用户

登录 MySQL 并创建用于复制的账号:

注意:原文档中创建用户名为 repl,但后续步骤连接使用了 repo,请保持一致(建议统一使用 reporepl)。

mysql -uroot -p
-- 创建用户 (建议统一用户名,例如 'repo')
mysql> CREATE USER 'repo'@'%' IDENTIFIED BY 'password';
mysql> GRANT all ON *.* TO 'repo'@'%' with grant option;
mysql> flush privileges;

4.4 查看 Master 状态

记录下 File 和 Position,用于从节点配置:

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      157 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+

5. 从节点操作

5.0 创建用户 (可选)

从节点通常不需要创建复制用户,除非它同时作为其他节点的从库。如果是标准从库,此步骤可跳过,或仅用于管理方便。

mysql -uroot -p
mysql> CREATE USER 'repo'@'%' IDENTIFIED BY 'password';
mysql> GRANT all ON *.* TO 'repo'@'%' with grant option;
mysql> flush privileges;

5.1 修改配置文件

编辑 /etc/mysql/mysql.conf.d/mysqld.cnf,配置唯一的 Server ID 并开启只读模式:

server_id           = 46  # 必须与主节点不同
log_bin             = mysql-bin
binlog_format       = ROW
log_slave_updates    = ON
read_only            = ON  # 开启只读,防止误写
super_read_only      = ON
sql_mode        = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
default_authentication_plugin   = mysql_native_password

5.2 重启服务

systemctl restart mysql
systemctl status mysql

5.3 配置主从连接

登录 MySQL,设置主节点信息并启动复制:

mysql -uroot -p
mysql> change master to 
    master_host='172.16.14.45', 
    master_port=3306, 
    master_user='repo',        -- 对应主节点创建的用户
    master_password='password', 
    master_log_file='mysql-bin.000001', -- 对应主节点 show master status 的 File
    master_log_pos=157;        -- 对应主节点 show master status 的 Position
mysql> start slave;
mysql> show slave status; -- 查看 Slave_IO_Running 和 Slave_SQL_Running 是否为 Yes
mysql> select * from performance_schema.replication_applier_status_by_worker;

6. 备份主库,导入从库,重启主从

此步骤适用于主库已有数据的情况,通过备份恢复来保证主从数据一致性。

6.1 备份主库

在主节点执行:

mysqldump -urepo -p --single-transaction --source-data=2 --triggers --routines --all-databases > master_dump.sql

6.2 导入从库

将备份文件传输到从节点并导入:

mysql -h172.16.14.84 -urepo -p < master_dump.sql

6.3 重启主从复制

如果备份文件中没有包含 CHANGE MASTER TO 语句(或者使用了 --source-data=2 注释掉了该语句),需手动重新配置并启动:

mysql -urepo -p
mysql> change master to 
    master_host='172.16.14.45', 
    master_port=3306, 
    master_user='repo', 
    master_password='password', 
    master_log_file='mysql-bin.000001',  -- 根据备份时的 metadata 或主库当前状态填写
    master_log_pos=157;
mysql> start slave;