主 - 从复制设置
考虑 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_name
和 user_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-log
和 relay-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 就会复制它。