作者信息:https://home.cnblogs.com/u/huangjiabobk

运维工作中,MySQL复制的方法是什么?

MySQL复制是一种将数据从一个数据库服务器(主服务器)复制到一个或多个数据库服务器(从服务器)的技术,它在数据备份、高可用性、负载均衡等方面具有重要作用。以下是几种常见的MySQL复制方法:

1. 基于二进制日志的复制(异步复制)

这是MySQL最常用的复制方式,其工作原理如下:

  1. 主服务器配置

    • 在主服务器上开启二进制日志(binary log)。二进制日志记录了所有对数据库的更改操作(如INSERT、UPDATE、DELETE语句等),但不包括SELECT和SHOW这类不会修改数据的语句。可以通过在MySQL配置文件(通常是my.cnfmy.ini)中设置log-bin参数来开启二进制日志。例如:

      [mysqld]
      log-bin = /path/to/mysql-bin
      
    • 配置主服务器的复制过滤(可选)。如果只需要复制部分数据库或表,可以使用binlog-do-db(包含要复制的数据库)和binlog-ignore-db(排除不复制的数据库)参数。例如:

      binlog-do-db = my_database
      binlog-ignore-db = another_database
      
    • 设置主服务器的唯一服务器ID(server-id),在配置文件中添加:

      server-id = 1
      
  2. 从服务器配置

    • 从服务器也需要设置唯一的服务器ID,其值不能与主服务器以及其他从服务器重复。例如:

      server-id = 2
      
    • 配置从服务器连接主服务器的参数,包括主服务器的IP地址、用户名、密码和二进制日志文件的名称及位置。可以通过以下命令设置:

      CHANGE MASTER TO
      MASTER_HOST='master_ip_address',
      MASTER_USER='replication_user',
      MASTER_PASSWORD='replication_password',
      MASTER_LOG_FILE='recorded_log_file_name',
      MASTER_LOG_POS=recorded_log_position;
      
    • 其中MASTER_LOG_FILEMASTER_LOG_POS可以通过在主服务器上执行SHOW MASTER STATUS;命令获取。这个命令会返回当前二进制日志文件的名称和位置。

  3. 启动复制

    • 在从服务器上执行以下命令启动复制:

      START SLAVE;
      
    • 可以通过执行SHOW SLAVE STATUS\G;命令来查看复制的状态。其中Slave_IO_RunningSlave_SQL_Running两个状态都应该为Yes,表示复制正常运行。如果其中一个或两个状态为No,需要根据Last_IO_ErrorLast_SQL_Error中显示的错误信息进行排查和解决。例如,可能是网络问题、权限不足或二进制日志文件丢失等问题。

2. 基于语句的复制(SBR)

它是基于二进制日志的复制的一种形式,复制的是SQL语句本身。在主服务器执行的SQL语句会被记录在二进制日志中,然后从服务器解析这些SQL语句并执行。这种方式的优点是二进制日志文件较小,因为记录的是SQL语句而不是数据行的变更。但它的缺点是可能会出现一些问题,比如当SQL语句依赖于某些特定的服务器环境(如使用了UUID()函数)时,可能会导致主从服务器数据不一致。

3. 基于行的复制(RBR)

同样是基于二进制日志的复制形式,但它复制的是数据行的变更。当数据行被插入、更新或删除时,主服务器会将这些行的变更记录在二进制日志中,从服务器会应用这些行的变更。这种方式的优点是能够更准确地复制数据变更,避免了基于语句复制可能遇到的某些问题。但它的缺点是二进制日志文件可能会比较大,尤其是当数据表中数据量较大时。可以通过在MySQL配置文件中设置binlog_format参数来选择复制的格式:

binlog_format = ROW
4. 混合复制(MBR)

它是基于语句复制和基于行复制的结合。MySQL会根据一定的规则自动选择使用基于语句复制还是基于行复制。例如,对于一些简单的SQL语句,可能会使用基于语句复制;而对于一些可能导致主从数据不一致的SQL语句,会使用基于行复制。这种方式试图结合两者的优点,但配置和管理相对复杂一些。

5. 半同步复制

半同步复制是在异步复制的基础上进行改进的一种复制方式。在传统的异步复制中,主服务器在执行完一个事务后,会立即将结果返回给客户端,而不需要等待从服务器确认已经接收到并应用了这个事务。这可能会导致在主服务器发生故障时,从服务器上丢失一些数据。

而在半同步复制中,主服务器在执行完一个事务后,会等待至少一个从服务器确认已经接收到并写入了这个事务的日志,然后才会将结果返回给客户端。这样可以提高数据的安全性,但可能会对性能有一定的影响,因为主服务器需要等待从服务器的确认。

要使用半同步复制,需要在主服务器和从服务器上都安装半同步复制插件(如semisync_mastersemisync_slave插件),并进行相应的配置。例如,在主服务器上可以设置:

plugin-load = "rpl_semi_sync_master=semisync_master.so"
rpl_semi_sync_master_enabled = 1

在从服务器上设置:

plugin-load = "rpl_semi_sync_slave=semisync_slave.so"
rpl_semi_sync_slave_enabled = 1
6. 多源复制

多源复制允许一个从服务器同时从多个主服务器复制数据。这对于一些复杂的数据库架构,如数据整合场景很有用。例如,一个公司有多个部门,每个部门有自己的数据库服务器(主服务器),而公司总部的服务器(从服务器)需要从这些部门的服务器获取数据进行汇总分析。

在配置多源复制时,需要为每个主服务器配置一个唯一的通道(channel)。在从服务器上可以通过CHANGE MASTER TO命令为每个主服务器指定不同的通道名。例如:

CHANGE MASTER TO
MASTER_HOST='master1_ip_address',
MASTER_USER='replication_user',
MASTER_PASSWORD='replication_password',
MASTER_LOG_FILE='recorded_log_file_name',
MASTER_LOG_POS=recorded_log_position
FOR CHANNEL 'master1_channel';

CHANGE MASTER TO
MASTER_HOST='master2_ip_address',
MASTER_USER='replication_user',
MASTER_PASSWORD='replication_password',
MASTER_LOG_FILE='recorded_log_file_name',
MASTER_LOG_POS=recorded_log_position
FOR CHANNEL 'master2_channel';

然后分别启动每个通道的复制:

START SLAVE FOR CHANNEL 'master1_channel';
START SLAVE FOR CHANNEL 'master2_channel';

综上所述,在实际的MySQL运维工作中,选择哪种复制方法需要根据具体的业务需求、数据量大小、对数据一致性的要求以及系统的性能等因素综合考虑。同时,还需要定期监控复制的状态,确保复制的正常运行,并做好备份和故障恢复的预案。

posted @ 2025-03-28 23:47  黄嘉波  阅读(55)  评论(0)    收藏  举报
版权声明:原创作品,谢绝转载!否则将追究法律责任。--作者 黄嘉波