This is a read-only copy of the MariaDB Knowledgebase generated on 2024-12-25. For the latest, interactive version please visit https://mariadb.com/kb/.

设置复制

The terms master and slave have historically been used in replication, and MariaDB has begun the process of adding primary and replica synonyms. The old terms will continue to be used to maintain backward compatibility - see MDEV-18777 to follow progress on this effort.

使 replication 工作需要在主服务器和从服务器上都进行一些步骤。

MariaDB 10.0 引入了带有 全局事务 ID 的复制功能。这些功能有许多好处,通常建议从 MariaDB 10.0 开始使用此功能。

使用 Mariabackup 设置复制从服务器

如果您想使用 Mariabackup 设置复制从服务器,则可能会发现 使用 Mariabackup 设置复制从服务器 中的信息很有用。

版本

通常,当在不同版本的 MariaDB 之间进行复制时,最好将主服务器设置为较旧版本,而从服务器设置为较新版本。MariaDB 版本通常是向后兼容的,而较旧版本则不总是向前兼容。另请参阅 从 MySQL 主服务器复制到 MariaDB 从服务器

配置主服务器

  • 如果尚未启用二进制日志记录,请启用它。有关详细信息,请参见 激活二进制日志二进制日志格式
  • 为主服务器分配一个唯一的 server_id。所有从服务器也必须分配 server_id。这可以是从 1 到 232-1 的数字,并且每个复制组中的每个服务器必须是唯一的。
  • 使用 --log-basename 指定您的复制日志的唯一名称。如果未指定此名称,则将使用主机名,并且如果主机名发生更改,则会出现问题。
  • 从服务器需要连接并开始复制服务器的权限。通常,这是通过创建专用的从服务器用户并仅授予该用户复制权限(REPLICATION SLAVE 权限)来完成的。

为 MariaDB 启用复制的示例

将以下内容添加到您的 my.cnf 文件中,并重新启动数据库。

[mariadb]
log-bin
server_id=1
log-basename=master1
binlog-format=mixed

服务器 ID 是网络中每个 MariaDB/MySQL 服务器的唯一编号。binlog-format 指定如何记录语句。这主要影响在主服务器和从服务器之间发送的 二进制日志 的大小。

然后使用 mysql 命令行客户端执行以下 SQL:

CREATE USER 'replication_user'@'%' IDENTIFIED BY 'bigs3cret';
GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%';

为 MySQL 启用复制的示例

如果您想要从 MySQL 启用复制到 MariaDB,则可以使用与 MariaDB 服务器之间几乎相同的方式进行操作。主要区别在于 MySQL 不支持 log-basename

[mysqld]
log-bin
server_id=1

需要检查的设置

有一些选项可能会影响或破坏复制。请检查以下设置以避免问题。

  • skip-networking。如果 skip-networking=1,服务器将仅限制连接到 localhost,并阻止所有远程从服务器连接。
  • bind-address。类似地,如果服务器侦听 TCP/IP 连接的地址是 127.0.0.1(localhost),则远程从服务器连接将失败。

配置从服务器

  • 为从服务器提供唯一的server_id。所有服务器,无论是主服务器还是从服务器,都会被分配一个 server_id。这可以是从 1 到 232-1 的数字,并且在复制组中每个服务器必须是唯一的。需要重新启动服务器才能使此选项的更改生效。

获取主服务器的二进制日志坐标

现在,您需要在查看二进制日志位置时防止对数据进行任何更改。您将使用此位置告诉从服务器应从哪个点开始复制。

  • 在主服务器上,通过运行 FLUSH TABLES WITH READ LOCK 刷新并锁定所有表。保持此会话运行 - 退出将释放锁定。
  • 运行 SHOW MASTER STATUS 获取二进制日志中的当前位置:
SHOW MASTER STATUS;
+--------------------+----------+--------------+------------------+
| File               | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------------+----------+--------------+------------------+
| master1-bin.000096 |      568 |              |                  |
+--------------------+----------+--------------+------------------+
  • 记录 FilePosition 详细信息。如果刚启用二进制日志,则这些内容将为空。
  • 现在,在锁定的情况下,将数据从主服务器复制到从服务器。有关如何执行此操作的详细信息,请参见备份、恢复和导入
  • 对于实时数据库的注意事项:您只需要制作数据的本地副本,无需保持主服务器锁定,直到从服务器导入数据。
  • 复制数据后,您可以通过运行UNLOCK TABLES来释放主服务器上的锁定。
UNLOCK TABLES;

启动从服务器

  • 导入数据后,您可以开始进行复制。首先运行CHANGE MASTER TO,确保 MASTER_LOG_FILE 匹配早期 SHOW MASTER STATUS 返回的文件,MASTER_LOG_POS 匹配位置。例如:
CHANGE MASTER TO
  MASTER_HOST='master.domain.com',
  MASTER_USER='replication_user',
  MASTER_PASSWORD='bigs3cret',
  MASTER_PORT=3306,
  MASTER_LOG_FILE='master1-bin.000096',
  MASTER_LOG_POS=568,
  MASTER_CONNECT_RETRY=10;

如果您要针对从一开始就配置为复制的新主服务器启动从服务器,则无需指定 MASTER_LOG_FILEMASTER_LOG_POS

使用全局事务 ID (GTID)

MariaDB starting with 10.0

MariaDB 10.0 引入了用于复制的全局事务 ID(GTID)。通常建议使用 MariaDB 10.0 的 GTID,因为这有许多好处。只需要将 MASTER_USE_GTID 选项添加到 CHANGE MASTER 语句中,例如:

CHANGE MASTER TO MASTER_USE_GTID = slave_pos

有关完整说明,请参见全局事务 ID

START SLAVE;
SHOW SLAVE STATUS \G
  • 如果复制正常工作,则 Slave_IO_RunningSlave_SQL_Running 的值都应为 Yes
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

从 MySQL 主服务器复制到 MariaDB 从服务器

  • 从 MySQL 5.5 复制到 MariaDB 5.5+ 应该可以正常工作。当使用 MariaDB 10.2+ 作为从服务器时,可能需要将 binlog_checksum 设置为 NONE。
  • 从没有 GTID 的 MySQL 5.6 复制到 MariaDB 10+ 应该可以正常工作。
  • 从带有 GTID、binlog_rows_query_log_events 和可忽略事件的 MySQL 5.6 复制起始于 MariaDB 10.0.22MariaDB 10.1.8。在这种情况下,MariaDB 将删除 MySQL GTID 和其他不需要的事件,而是添加自己的 GTID。

参见

Content reproduced on this site is the property of its respective owners, and this content is not reviewed in advance by MariaDB. The views, information and opinions expressed by this content do not necessarily represent those of MariaDB or any other party.