Ubuntu 24.04 下 MySQL 8.0.39 主从复制搭建记录
注意:本笔记基于 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,请保持一致(建议统一使用repo或repl)。
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;