基于二进制日志位置的复制

基于二进制日志位置的复制

通用设置

  • 源上,开启二进制日志,并配置 server_id

  • 每个副本上,配置 server_id

  • (可选) 为副本创建单独用户,与源进行身份验证期间使用

  • 需要记录源的二进制日志位置

  • 如果源上已有数据,需要先将数据复制到副本

  • 源和副本的连接设置要一致

前提

确保网络通畅

  • 不要使用 skip_networking 选项

源和副本上配置不同的 server_id

  • 默认1,范围是1到2^32-1

    8.0 版本之前,默认0,表示拒绝主/从节点的连接。

  • 动态设置

    SET GLOBAL server_id = 2;
    

开启二进制日志

  • 副本可以不开启二进制日志

规划

架构

    • 172.16.0.20:3306
  • 副本
    • 172.16.0.21:3306

系统变量

  • 二进制日志
    • log_bin
      • 控制开启/禁用二进制日志。默认已开启
    • log_bin_index
      • 二进制日志的索引文件
    • binlog_format
      • 二进制日志的格式
  • 中继日志
    • relay_log
      • 控制开启/禁用中继日志
    • relay_log_index
      • 中继日志的索引文件
    • relay_log_purge
      • 控制自动删除中继日志
    • relay_log_recovery
      • 控制中继日志的崩溃恢复
    • relay_log_info_repository
      • 副本服务器的信息存储库位置。默认 TABLE
    • master_info_repository

      这个系统变量已过时,将来会删除,而且源服务器信息都会存储在表中,不再使用文件存储。

      • 源服务器信息的存储库位置。默认 TABLE
      • 有效值
        • FILE:数据目录中两个文件
          • master.info
          • relay-log.info
        • TABLE:信息保存在 mysql 表中
          • slave_master_info
          • slave_relay_log_info
  • 副本
    • log_slave_updates
      • 控制是否将复制的内容记录到二进制日志。默认已开启
    • slave_load_tmpdir
      • LOAD DATA 的目录
    • slave_net_timeout
      • 通信超时时间
    • slave_parallel_workers
      • 应用线程是否启用并行
    • slave_preserve_commit_order
      • 控制副本事务有序提交 (串行)
    • sql_slave_skip_counter
      • 跳过的事件数
  • 安全
    • innodb_flush_log_at_trx_commit=1
    • sync_binlog=1

配置过程

源上创建一个复制账户

mysql> create user repl@'172.16.0.%' identified by 'repl';
mysql> grant replication slave on *.* to repl@'172.16.0.%';
  • 每个副本使用 MySQL 用户名和密码连接到源,因此源上必须有一个用户帐户,副本可用于连接
  • 8.0 版本,使用 caching_sha2_password 作为身份验证插件,这个插件要求必须使用加密连接
  • 复制账户所需权限
    • REPLICATION SLAVE

获取源服务器的数据快照 (备份)

  • 使用 mysqldump 创建数据快照
    shell> mysqldump -uroot -p -S /tmp/mysql.sock -A --master-data=2 --single-transaction > /tmp/full.sql
    shell> scp /tmp/full.sql root@172.16.0.21:/tmp/full.sql
    
    • –master-data
      • 使输出中包含二进制日志的位置和文件名。便于执行 change master to 语句以启用复制
    • –ignore-table
      • 指定要排除的表
    • –databases
      • 指定要备份的库
  • 使用原始数据文件创建数据快照
    • 源和副本的以下变量要相同

      “`sql
      mysql> show variables like 'ft%';
      +————————–+—————-+
      | Variable_name | Value |
      +————————–+—————-+
      | ft_boolean_syntax | + -> tar -Jcf /tmp/db.tar.xz /mdata/ # -J:使用 xz 压缩格式
      or
      shell> rsync -a mdata 172.16.0.21:/tmp
      “`

      - 重启服务
      
      • 使用克隆插件把数据克隆过去

在副本服务器上还原备份

  • 还原 mysqldump 备份
    shell> mysql -uroot -p -S /tmp/mysql.sock  set sql_log_bin=0;
    mysql> source /tmp/full.sql;
    mysql> set sql_log_bin=1;
    
  • 还原原始数据文件
    shell> tar -xvf db.tar.xz
    

获取源的二进制日志坐标

  • 获取当前二进制日志坐标
    mysql> show master status;
    +---------------+----------+--------------+------------------+-------------------+
    | File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +---------------+----------+--------------+------------------+-------------------+
    | binlog.000009 |      760 |              |                  |                   |
    +---------------+----------+--------------+------------------+-------------------+
    
  • 查询 mysqldump 备份文件
    shell> more /tmp/full.sql
    ...
    -- CHANGE MASTER TO MASTER_LOG_FILE='binlog.000009', MASTER_LOG_POS=760;
    

在副本上设置源服务器信息

  • CHANGE REPLICATION SOURCE TO
    CHANGE REPLICATION SOURCE TO
    SOURCE_HOST='172.16.0.20',
    SOURCE_USER='repl',
    SOURCE_PASSWORD='repl',
    SOURCE_PORT=3306,
    SOURCE_LOG_FILE='binlog.000009',
    SOURCE_LOG_POS=760
    SOURCE_PUBLIC_KEY_PATH='public_key.pem',
    GET_SOURCE_PUBLIC_KEY=1;
    
    • 选项

      如果不使用安全连接,并且使用 SOURCE_USER 选项通过 caching_sha2_password 插件进行身份验证,则必须启用基于 RSA 密钥对的密码交换。

      • SOURCE_PUBLIC_KEY_PATH
      • GET_SOURCE_PUBLIC_KEY
    • 通过帮助查看所有选项
      mysql> ? change master to
      
  • CHANGE MASTER TO
    CHANGE MASTER TO
    MASTER_HOST='172.16.0.20',
    MASTER_USER='repl',
    MASTER_PASSWORD='repl',
    MASTER_PORT=3306,
    MASTER_LOG_FILE='binlog.000009',
    MASTER_LOG_POS=760,
    MASTER_PUBLIC_KEY_PATH='public_key.pem',
    GET_MASTER_PUBLIC_KEY=1;
    
    • 选项

      如果不使用安全连接,并且使用 SOURCE_USER | MASTER_USER 选项通过 caching_sha2_password 插件进行身份验证,则必须启用基于 RSA 密钥对的密码交换。

      • MASTER_PUBLIC_KEY_PATH
      • GET_MASTER_PUBLIC_KEY
  • 注意事项
    • 8.0 版本必须开启自动提交 autocommit,否则副本会话上的中继日志应用时不会自动提交,这是与 5.7 版本的差异

开启副本

mysql> start slave | replica;

查看复制状态

mysql> show slave | replica status\G
...
           Replica_IO_Running: Yes
          Replica_SQL_Running: Yes

如果副本配置错误,还可以重置

mysql> stop slave; reset slave;
or
mysql> stop replica; reset replica;
  • reset replica
    • 主要是清除中继日志
  • reset replica all
    • 会清除 change replication source to 的选项

将新副本添加到复制环境

可以复制现有副本的目录,修改 server_id 来实现,或者通过克隆插件克隆数据。

停止现有副本,并记录状态

记录二进制日志文件和中继日志的位置。

mysql> stop slave | replica;
mysql> show slave | replica status\G

复制现有副本的目录

  • 关闭副本服务
    shell> mysqladmin shutdown
    
  • 将数据目录从现有副本复制到新副本,包括日志文件和中继日志文件 (tar、cp、rsync、scp)

  • 修改新副本的 server_id

  • 复制后,在新副本上的数据目录副本中删除 auto.cnf 文件,以便使用其他生成的服务器 UUID 启动新副本

重启现有副本

mysql> start slave | replica;

启动新的副本服务器

开启新副本

mysql> start slave | replica;

查看复制状态

mysql> show slave | replica status\G

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注