主 - 从复制设置

考虑 2 个 MySQL 服务器进行复制设置,一个是 Master,另一个是 Slave。

我们将配置 Master,它应该记录对其执行的每个操作的日志。我们将配置 Slave 服务器,它应该查看 Master 上的日志,并且每当主服务器上的日志发生更改时,它应该执行相同的操作。

主配置

首先,我们需要在 Master 上创建一个用户。Slave 将使用此用户与 Master 建立连接。

CREATE USER 'user_name'@'%' IDENTIFIED BY 'user_password';
GRANT REPLICATION SLAVE ON *.* TO 'user_name'@'%';
FLUSH PRIVILEGES;

根据你的用户名和密码更改 user_nameuser_password

现在应该编辑 my.inf(Linux 中的 my.cnf)文件。在[mysqld]部分中包含以下行。

server-id = 1
log-bin = mysql-bin.log
binlog-do-db = your_database

第一行用于为此 MySQL 服务器分配 ID。

第二行告诉 MySQL 开始在指定的日志文件中写入日志。在 Linux 中,这可以配置为 log-bin = /home/mysql/logs/mysql-bin.log。如果要在已使用复制的 MySQL 服务器中启动复制,请确保此目录中没有所有复制日志。

第三行用于配置我们要写入日志的数据库。你应该将 your_database 替换为你的数据库名称。

确保未启用 skip-networking 并重启 MySQL 服务器(Master)

从属配置

my.inf 文件也应该在 Slave 中编辑。在[mysqld]部分中包含以下行。

server-id = 2
master-host = master_ip_address
master-connect-retry = 60

master-user = user_name
master-password = user_password
replicate-do-db = your_database

relay-log = slave-relay.log
relay-log-index = slave-relay-log.index

第一行用于为此 MySQL 服务器分配 ID。此 ID 应该是唯一的。

第二行是主服务器的 IP 地址。根据你的主系统 IP 更改此设置

第三行用于设置重试限制,以秒为单位。

接下来的两行告诉 Slave 的用户名和密码,通过使用它来连接 Master。

下一行设置需要复制的数据库。

最后两行用于分配 relay-logrelay-log-index 文件名。

确保未启用 skip-networking 并重启 MySQL 服务器(Slave)

将数据复制到从属

如果数据不断添加到 Master 中,我们将不得不阻止 Master 上的所有数据库访问,因此无法添加任何内容。这可以通过在 Master 中运行以下语句来实现。

FLUSH TABLES WITH READ LOCK;

如果没有数据添加到服务器,则可以跳过上述步骤。

我们将使用 mysqldump 来获取 Master 的数据备份

mysqldump your_database -u root -p > D://Backup/backup.sql;

根据你的设置更改 your_database 和备份目录。你现在将在给定的位置有一个名为 backup.sql 的文件。

如果你的数据库中不存在你的数据库,请通过执行以下操作来创建该数据库

CREATE DATABASE `your_database`;

现在我们必须将备份导入 Slave MySQL 服务器。

mysql -u root -p your_database  <D://Backup/backup.sql
--->Change `your_database` and backup directory according to your setup

开始复制

要开始复制,我们需要在 Master 中找到日志文件名和日志位置。因此,在 Master 中运行以下命令

SHOW MASTER STATUS;

这将为你提供如下输出

+---------------------+----------+-------------------------------+------------------+
| `File`                | Position | Binlog_Do_DB                  | Binlog_Ignore_DB |
+---------------------+----------+-------------------------------+------------------+
| mysql-bin.000001    | 130      | your_database                 |                  |
+---------------------+----------+-------------------------------+------------------+

然后在 Slave 中运行以下命令

SLAVE STOP;
CHANGE MASTER TO MASTER_HOST='master_ip_address', MASTER_USER='user_name', 
   MASTER_PASSWORD='user_password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=130;
SLAVE START;

首先我们阻止 slave。然后我们告诉它在 Master 日志文件中的确切位置。对于 MASTER_LOG_FILE name 和 MASTER_LOG_POS,使用我们在 Master 上运行 SHOW MASTER STATUS 命令得到的值。

你应该在 MASTER_HOST 中更改 Master 的 IP,并相应地更改用户和密码。

slave 现在正在等待。可以通过运行以下命令查看从站的状态

SHOW SLAVE STATUS;

如果你之前在 Master 中执行了 FLUSH TABLES WITH READ LOCK,请通过运行以下命令从锁定中释放表

UNLOCK TABLES;

现在,Master 会为其上执行的每个操作保留一个日志,而 Slave 服务器会查看 Master 上的日志。每当登录 Master 时发生更改,Slave 就会复制它。