MySQL 复制 是一个有趣的功能,允许用户管理一个或多个 MySQL 数据库的多个副本。数据会自动从 源 复制到 副本 数据库。它在许多情况下都非常有用,例如在不损害主数据库的情况下处理数据、数据备份或扩展数据库访问等。
在本指南中,我们将逐步介绍在其中一台服务器上将 MySQL 实例设置为源数据库,然后配置另一台服务器上的 MySQL 实例以作为其副本的步骤.
前提条件
本指南将演示一个非常简单的 MySQL 复制示例。它涉及一个 源 和一个 副本 数据库。源 数据库是数据库的主副本,而 副本 数据库将是 源 数据库的副本。在我们的演示中,两台服务器配置了以下 IP 地址:
- 源服务器:31.171.240.179
- 副本服务器:31.171.250.139
每台服务器都配置了最新的 Ubuntu 20.04 server 配置。首先,按照教程中的步骤操作,该教程展示了 如何设置您的 Ubuntu 服务器。请注意,副本数据库的数量可以更多。本指南假设您已经安装并配置了 MySQL。需要安装 MySQL 的帮助吗?本指南深入演示了 MySQL 安装和基本用法.
简而言之,以下是您需要的软件包:
|
1 |
$ sudo apt install mysql-server mysql-client |
两个系统上的防火墙都应配置为允许来自两个系统的端口 3306 上的流量。这是 MySQL 的默认端口。您可以从我们的博客文章中了解更多关于 UFW 基础知识及演示 的信息。
源数据库配置
-
调整 MySQL 配置
MySQL 使用 my.cnf 作为主配置文件。我们将更新 my.cnf 以将该服务器指定为 源。首先,使用文本编辑器打开配置文件:
|
1 |
$ sudo nano /etc/mysql/my.cnf |
然后,在 mysqld 部分下添加以下行:
|
1 2 3 4 |
bind-address = 31.171.240.179 server-id = 1 log_bin = /var/log/mysql/mysql-bin.log binlog_do_db = newdatabase |
这些行是什么意思?
bind-address:这是定义服务与 IP 地址之间关联的条目。默认情况下,该值可能是127.0.0.1(localhost)。新值将是服务器的 IP 地址。server-id:在 MySQL 复制中,每台服务器必须有一个唯一的服务器 ID。它可以是任何数字。为了简单起见,它被设置为1.log_bin:它存储复制的真实细节。副本数据库将复制日志中注册的所有内容。binlog_do_db:此条目指定将在副本服务器上进行复制的数据库。可以有多个数据库。在这里,示例数据库是newdatabase.
进行更改后,保存配置文件。MySQL 需要重启以将更改加载到 my.cnf:
|
1 |
$ sudo service mysql restart |
-
向副本用户授予权限
下一步是创建副本用户并授予适当的权限。这需要从 MySQL shell 中完成。首先,启动 MySQL shell:
|
1 |
$ sudo mysql -u root -p |
接下来,为副本数据库创建一个专用用户。适当更改用户名和密码:
|
1 |
$ CREATE USER 'cloudsigma_s'@'31.171.240.179' IDENTIFIED BY 'password_123'; |
现在,向该用户授予适当的权限:
|
1 |
$ GRANT REPLICATION SLAVE ON *.* TO 'cloudsigma_s'@'31.171.240.179'; |
您可以从我们的博客文章中了解更多关于 MySQL 用户和权限 的信息。接下来,重新加载授权表以使更改生效:
|
1 |
$ FLUSH PRIVILEGES; |
-
调整数据库
我们需要在副本上保留源数据库的副本。手动构建结构是可行的。然而,在大多数情况下,这非常不方便。这就是为什么直接导出数据库是最优解决方案的原因。在此示例中,源数据库是 newdatabase。更改当前数据库:
|
1 |
$ USE newdatabase; |
以下命令将锁定数据库,防止任何新的更改:
|
1 |
$ FLUSH TABLES WITH READ LOCK; |
然后,检查数据库状态:
|
1 |
$ SHOW MASTER STATUS; |
从该位置开始,副本数据库将从源进行复制。这些数字稍后会很有用,因此请将其记录下来。如果从同一个窗口进行任何更改,MySQL 将自动解锁数据库。因此,建议在不同的终端标签页或窗口中执行以下步骤。数据库仍处于锁定状态。将其导出为便携式 SQL 文件:
|
1 |
$ mysqldump -u root -p --opt newdatabase > newdatabase.sql |
任务现已完成。接下来,解锁数据库:
|
1 |
$ UNLOCK TABLES; |
最后,退出 shell:
|
1 |
$ QUIT; |
副本配置
现在是配置副本数据库的时候了。
-
导入源数据库
我们需要在副本服务器上保留源数据库的副本。我们将使用之前导出的 SQL 文件来执行此操作。启动 MySQL shell:
|
1 |
$ sudo mysql -u root -p |
之后,使用相同的数据库名称创建一个空白数据库:
|
1 |
$ CREATE DATABASE newdatabase; |
接下来,退出 shell:
|
1 |
$ EXIT; |
现在,将 SQL 文件导入到数据库中:
|
1 |
$ sudo mysql -u root -p newdatabase < newdatabase.sql |
-
微调 MySQL 配置
在 MySQL 配置文件中需要声明几项内容。在文本编辑器中打开配置文件:
|
1 |
$ sudo nano /etc/mysql/my.cnf |
以下条目将放在 mysqld 部分下。否则,它将无法工作。首先是服务器 ID。如前所述,它在源-副本复制配置中的所有服务器中必须是唯一的。为了演示,它被设置为 2:
|
1 |
$ server-id = 2 |
接下来,添加以下行:
|
1 2 3 |
$ relay-log = /var/log/mysql/mysql-relay-bin.log $ log_bin = /var/log/mysql/mysql-bin.log $ binlog_do_db = newdatabase |
这里,只有 relay-log 是一个新条目。它是副本服务器在复制期间创建的日志。日志格式与二进制日志相同。保存配置文件,然后重启 MySQL:
|
1 |
$ sudo service mysql restart |
-
启用复制
最后,我们准备在 MySQL 中启用复制。启动 MySQL shell:
|
1 |
$ sudo mysql -u root -p |
运行以下命令。首先,相应地更改 IP 地址、用户名和密码:
|
1 |
$ CHANGE MASTER TO MASTER_HOST='31.171.240.179',MASTER_USER='cloudsigma_master', MASTER_PASSWORD='password_123', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS= 107; |
该命令完成以下操作:
- 当前服务器被标记为源服务器的副本。
- 副本服务器具有正确的登录凭据。
- 副本服务器知道从哪里开始复制。还记得我们在源服务器上检查的数据库状态吗?源日志文件和日志位置就来自那里。
最后,激活副本服务器:
|
1 |
$ START REPLICA; |
-
其他
需要检查副本当前状态的详细信息吗?在 MySQL shell 中运行以下命令。末尾的 \G 是为了重新排列文本,使其更具可读性:
|
1 |
$ SHOW REPLICA STATUS\G |
如果存在连接问题,请尝试启动副本服务器以跳过它:
|
1 |
$ SET GLOBAL SQL_REPLICA_SKIP_COUNTER = 1; REPLICA START; |
结论
MySQL 复制有很多影响。这只是其基本形式的简要演示。然而,它可以轻松扩展到多个源-副本配置。相同的步骤也适用于任何更高级别的复杂配置。在配置完成后进行测试总是一个好主意。尝试在源数据库上执行一些 insert, delete 或 update 命令。如果设置正常工作,那么副本数据库应该能够正确同步所有内容。
此外,您可以查看我们博客中关于如何使用 MySQL 的更多资源:
- SQLite vs MySQL vs. PostgreSQL:关系型数据库管理系统对比
- 如何重置 MariaDB 或 MySQL 的 Root 密码
- 如何在 Ubuntu 20.04 上安装 LEMP 架构(Linux、Nginx、MySQL、PHP)
祝您使用愉快!







评论
暂无评论。发表第一条评论吧。