在 Ubuntu 22.04 上配置 MySQL 数据库同步(主从复制)

这篇教程我将带领大家在 Ubuntu 22.04 上配置 MySQL 数据库的同步,实现 MySQL 数据库一主一从复制,我们将采用 GTID 模式进行配置。

GTID(Global Transaction Identifier,全球事务标识符)模式是 MySQL 5.6 引入的一个重要特性,相比传统的基于日志位置的复制方式,GTID 模式具有以下优点:

简化复制配置:GTID 模式不需要手动记录二进制日志的文件名和位置,复制配置更加简洁。

事务一致性:每个事务都有唯一的 GTID,能够确保主从服务器之间的事务一致性。

自动故障转移:当主服务器发生故障时,可以更容易地选择新的主服务器并自动恢复复制。

避免数据丢失:GTID 模式避免了传统复制中可能出现的数据丢失问题,确保主从之间的同步更为可靠。

1. 在主从服务器上分别安装 MySQL

首先,更新系统并安装 MySQL 服务:

sudo apt update
sudo apt upgrade -y
sudo apt install mysql-server mysql-client

安装完毕后,你可以通过以下命令查看 MySQL 的版本:

mysql -V

2. 主服务器配置

主服务器是所有数据写入的地方,以下是配置主服务器的步骤。

2.1 编辑 MySQL 配置文件

打开 MySQL 配置文件进行修改:

sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

[mysqld] 部分添加或修改以下设置:

[mysqld]
server-id=1                         # 主服务器唯一 ID
log-bin=mysql-bin                   # 启用二进制日志
gtid_mode=ON                        # 启用 GTID 模式
enforce-gtid-consistency=ON         # 强制 GTID 一致性
log-slave-updates=ON                # 允许从库更新记录到 binlog
binlog-format=ROW                   # 使用行格式的 binlog(推荐)
binlog_expire_logs_seconds=604800   # 设置 binlog 的过期时间为 7 天
innodb_buffer_pool_size=6G          # 设置 InnoDB 存储引擎的缓冲池大小,建议设置为服务器总内存的 50%-70%
binlog-do-db=mydatabase             # 仅记录指定数据库的操作到 binlog
bind-address=0.0.0.0                # 允许外部连接

2.2 重启 MySQL 服务

配置完成后,重启 MySQL 服务以使设置生效:

sudo systemctl restart mysql

2.3 创建复制用户

登录 MySQL,并创建用于复制的用户:

mysql -u root -p

在 MySQL 中执行以下命令:

CREATE USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
FLUSH PRIVILEGES;

3. 从服务器配置

从服务器将从主服务器接收数据并进行同步,以下是配置从服务器的步骤。

3.1 编辑 MySQL 配置文件

打开从服务器的 MySQL 配置文件并进行修改:

sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

[mysqld] 部分添加或修改以下设置:

[mysqld]
server-id=2                              # 从服务器唯一 ID
log-bin=mysql-bin                        # 启用二进制日志
gtid_mode=ON                             # 启用 GTID 模式
enforce-gtid-consistency=ON              # 强制 GTID 一致性
log-slave-updates=ON                     # 允许从库更新记录到 binlog
binlog-format=ROW                        # 使用行格式的 binlog
binlog_expire_logs_seconds=604800        # 设置 binlog 的过期时间为 7 天
relay_log=relay-bin                      # 设置中继日志
relay_log_recovery=ON                    # 启用中继日志恢复
binlog-do-db=mydatabase                  # 仅记录指定数据库的操作到 binlog

3.2 重启 MySQL 服务

配置完成后,重启 MySQL 服务以使设置生效:

sudo systemctl restart mysql

3.3 配置复制

登录 MySQL,并配置从服务器的复制:

mysql -u root -p

停止当前的复制任务(如果有):

STOP SLAVE;

配置从服务器复制任务,使用主服务器的 IP、复制用户和密码,并启用 GTID 自动定位:

CHANGE MASTER TO
    MASTER_HOST='master_server_ip',
    MASTER_USER='slave',
    MASTER_PASSWORD='your_password',
    MASTER_AUTO_POSITION=1;  # 启用 GTID 自动定位

3.4 启动复制

启动复制任务:

START SLAVE;

3.5 检查复制状态

使用以下命令检查复制状态,确保以下两项为 Yes

SHOW SLAVE STATUS\G;
.....
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
.....

4. 数据同步验证

在主服务器上创建需要同步的数据库:

mysql -uroot -p
CREATE DATABASE mydatabase;

在从服务器上验证数据库是否同步:

mysql -uroot -p
SHOW DATABASES;

5. 防火墙配置(以 UFW 为例)

配置主服务器的防火墙仅允许从服务器通过 3306 端口连接到主服务器。修改主服务器的防火墙配置:

sudo ufw allow from <slave_ip> to any port 3306 proto tcp

UFW 的详细使用方法请参考:https://hicairo.com/post/80.html

6. 备份与恢复

6.1 在主服务器上备份数据库

使用 mysqldump 备份数据库:

mysqldump -uroot -p --set-gtid-purged=ON mydatabase > mydatabase.sql

6.2 在从服务器上恢复数据库

使用 scp 将备份的数据库下载到从服务器:

scp root@master_server_ip:/root/mydatabase.sql ./

在从服务器上恢复数据库:

mysql -uroot -p mydatabase < mydatabase.sql

本文出处:HiFeng's Blog
本文链接:https://hicairo.com/post/81.html
版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA许可协议。转载请注明出处!