mysql如何在线修改主从复制选项

前言:

mysql最常用的架构就是主从复制了,其实主从复制有很多选项,特别是在从库端,我们可以设置复制过滤,比如说忽略某张表或某个库。这些过滤选项都是可以在线修改而不用重启的。原来对这块了解不多,最近看了下相关资料,个人觉得这个功能还是很方便的,本篇文章会将这块内容分享给大家。

1.复制过滤参数介绍

首先我们要了解设置复制过滤的不同参数。复制过滤是在从库端设置的,可以只复制某些库或某些表,也可以忽略复制某些库或某些表。这些都是由不同参数控制的,下面简单介绍下不同参数的作用。

  • replicate_do_db:指定只同步某个库的数据
  • replicate_ignore_db:忽略某个库的同步
  • replicate_do_table:指定同步某个表
  • replicate_ignore_table:忽略某个表的同步
  • replicate_wild_do_table:指定同步某些表,可以用通配符
  • replicate_wild_ignore_table:忽略某些表的同步,可以用通配符
  • replicate_rewrite_db:从库端替换库名

这些复制过滤参数还是很好理解的,只看名字就能大概了解该参数的作用。默认情况下,这些参数是都没有设置的,开启主从复制后从库端会默认同步全部从主库发来的数据。

2.修改复制过滤选项

当我们想临时调整从库的复制策略时,可以设置上述参数。我们可以将过滤参数写入配置文件然后重启从库即可应用,但这种方法需要重启实例,不做推荐。mysql5.7版本可以进行在线设置复制过滤了。但是还是得停复制,不过不用重启实例了,方便进行临时性的调整。主要用到的是change replication filter语句,下面就简单的测试一下:

# 默认未设置复制过滤
mysql> show slave status\g
*************************** 1. row ***************************
        slave_io_state: waiting for master to send event
         master_host: 10.0.3.16
         master_user: repl
         master_port: 3306
        connect_retry: 60
       master_log_file: binlog.000004
     read_master_log_pos: 35198
        relay_log_file: relay-bin.000002
        relay_log_pos: 910
    relay_master_log_file: binlog.000004
       slave_io_running: yes
      slave_sql_running: yes
       replicate_do_db: 
     replicate_ignore_db: 
      replicate_do_table: 
    replicate_ignore_table: 
   replicate_wild_do_table: 
 replicate_wild_ignore_table: 
          last_errno: 0
          last_error: 
         skip_counter: 0
     exec_master_log_pos: 35198
     
 # 设置忽略db1库的复制
 mysql> stop slave sql_thread;
query ok, 0 rows affected (0.00 sec)
mysql> change replication filter replicate_ignore_db = (db1);
query ok, 0 rows affected (0.00 sec)
mysql> start slave sql_thread;
query ok, 0 rows affected (0.01 sec)
mysql> show slave status\g
*************************** 1. row ***************************
        slave_io_state: waiting for master to send event
         master_host: 10.0.3.16
         master_user: repl
         master_port: 3306
        connect_retry: 60
       master_log_file: binlog.000004
     read_master_log_pos: 35198
        relay_log_file: relay-bin.000002
        relay_log_pos: 910
    relay_master_log_file: binlog.000004
       slave_io_running: yes
      slave_sql_running: yes
       replicate_do_db: 
     replicate_ignore_db: db1
      replicate_do_table: 
    replicate_ignore_table: 
   replicate_wild_do_table: 
 replicate_wild_ignore_table: 
          last_errno: 0
          last_error: 
         skip_counter: 0
     exec_master_log_pos: 35198
 
# 主库创建db1测试从库是否同步
mysql> create database `db1` default character set utf8;
query ok, 1 row affected (0.01 sec)
mysql> show databases;
+--------------------+
| database      |
+--------------------+
| information_schema |
| db1        |
| mysql       |
| performance_schema |
| sys        |
| testdb       |
+--------------------+
6 rows in set (0.00 sec)
# 查看从库状态
mysql> show databases;
+--------------------+
| database      |
+--------------------+
| information_schema |
| mysql       |
| performance_schema |
| sys        |
| testdb       |
+--------------------+
5 rows in set (0.00 sec)
mysql> show slave status\g
*************************** 1. row ***************************
        slave_io_state: waiting for master to send event
         master_host: 10.0.3.16
         master_user: repl
         master_port: 33061
        connect_retry: 60
       master_log_file: binlog.000004
     read_master_log_pos: 35383
        relay_log_file: relay-bin.000002
        relay_log_pos: 1095
    relay_master_log_file: binlog.000004
       slave_io_running: yes
      slave_sql_running: yes
       replicate_do_db: 
     replicate_ignore_db: db1
      replicate_do_table: 
    replicate_ignore_table: 
   replicate_wild_do_table: 
 replicate_wild_ignore_table: 
          last_errno: 0
          last_error: 
         skip_counter: 0
     exec_master_log_pos: 35383
     
# 取消复制过滤参数
mysql> stop slave sql_thread;
query ok, 0 rows affected (0.01 sec)
mysql> change replication filter replicate_ignore_db = ();
query ok, 0 rows affected (0.00 sec)
mysql> start slave sql_thread;
query ok, 0 rows affected (0.01 sec)
mysql> show slave status\g
*************************** 1. row ***************************
        slave_io_state: waiting for master to send event
         master_host: 10.0.3.16
         master_user: repl
         master_port: 3306
        connect_retry: 60
       master_log_file: binlog.000004
     read_master_log_pos: 35383
        relay_log_file: relay-bin.000002
        relay_log_pos: 1095
    relay_master_log_file: binlog.000004
       slave_io_running: yes
      slave_sql_running: yes
       replicate_do_db: 
     replicate_ignore_db: 
      replicate_do_table: 
    replicate_ignore_table: 
   replicate_wild_do_table: 
 replicate_wild_ignore_table: 
          last_errno: 0
          last_error: 
         skip_counter: 0
     exec_master_log_pos: 35383

上面我们简单演示了下使用change replication filter语句在线修改复制过滤选项的方法,列举的那些过滤参数都可以使用该语句修改,不过要注意有些选项是互斥的。应该按照实际需求去设置合适的参数,下面给出官方文档中的示范语法:

change replication filter filter[, filter][, ...]
filter:
  replicate_do_db = (db_list)
 | replicate_ignore_db = (db_list)
 | replicate_do_table = (tbl_list)
 | replicate_ignore_table = (tbl_list)
 | replicate_wild_do_table = (wild_tbl_list)
 | replicate_wild_ignore_table = (wild_tbl_list)
 | replicate_rewrite_db = (db_pair_list)
db_list:
  db_name[, db_name][, ...]
tbl_list:
  db_name.table_name[, db_table_name][, ...]
wild_tbl_list:
  'db_pattern.table_pattern'[, 'db_pattern.table_pattern'][, ...]
db_pair_list:
  (db_pair)[, (db_pair)][, ...]
db_pair:
  from_db, to_db

总结:

本篇文章介绍了如何在线更改复制过滤选项的方法,不同的过滤参数有不同的用途,如果你确实有需求要设置过滤参数,建议一定要进行全面测试,某些参数设置后可能影响到其他库表的复制。如果想永久生效,可以在线修改后再加入配置文件内,这样从库重启后还是生效的。

以上就是mysql如何在线修改主从复制选项的详细内容,更多关于mysql修改主从复制的资料请关注www.887551.com其它相关文章!

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐