mysql 主从复制 replicate-rewrite-db 无效

主库配置:

log-bin=mysql-bin
server-id = 66

从库配置:

server-id = 67
replicate-do-db = liuxm_test
replicate-rewrite-db = liuxm_test->liuxm

同步无效,但是把replicate-rewrite-db去掉,在从库上建一个liuxm_test库就可以同步
求大神指点

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.60.110.66
                  Master_User: sync
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000007
          Read_Master_Log_Pos: 4241753
               Relay_Log_File: web2-relay-bin.000032
                Relay_Log_Pos: 66331
        Relay_Master_Log_File: mysql-bin.000007
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: liuxm_test
          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: 4241753
              Relay_Log_Space: 67263
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 66
                  Master_UUID: 2c653815-1117-11e6-ab2c-44a842479353
             Master_Info_File: /usr/local/mysql/data/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set:
            Executed_Gtid_Set:
                Auto_Position: 0
         Replicate_Rewrite_DB: (liuxm_test,liuxm)
                 Channel_Name:
           Master_TLS_Version:
1 row in set (0.00 sec)
阅读 6.7k
2 个回答

从库配置应该改为:

replicate-do-db = liuxm
replicate-rewrite-db = liuxm_test->liuxm

要注意一点:ddl、dml语句不能带上 dbname(dbname.tablename)。特别是binlog记录的是statement的时候使用 navicat 等图形界面创建、插入、更新等操作都会带上 dbname。如:

# 问题一:使用navicat图形操作插入数据,relay-log记录sql如下。此时从库重放会失败,因为 dbname.tablename 的 dbname不会重写。
use `liuxm_test`;insert into liuxm_test.table1 (id) values (1); 
# 解决办法:主库 binlog_format 改为 row (bin_log不记录执行sql了)
# 或者不用 navicat 图形操作插入数据,手写sql插入(目的:去掉dbname) 如下
insert into table1 (id) values (1); 
# 手写sql插入,relay-log记录sql如下。此时能同步成功。
use `liuxm_test`;insert into table1 (id) values (1); 
# 问题二:即使 binlog_format 改为 row,也不能使用 navicat 去做一些 ddl操作,如"创建表"。因为 navicat 创建表的 ddl 会带上 dbname `liuxm_test`。
use `liuxm_test`; CREATE TABLE `liuxm_test`.`table2`  (
  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
)
# 解决办法:不要用第三方图形客户端(如navicat)的"创建表"等ddl操作,手写sql创建。
# 终极方案是保持主库和从库的库名一致。

可以看下mysql官方文档有关replicate-rewrite-db的部分,有详细说明。以下是文档部分内容的中文翻译:
为确保重写产生预期的结果,尤其是与其他复制筛选选项结合使用时,请在使用选项--replicate-rewrite-db时遵循以下建议:

  1. 在源和具有不同名称的副本上手动创建 from_name 和 to_name 数据库。
  2. 如果您使用基于语句的或混合的二进制日志记录格式,请不要使用跨数据库查询,也不要在查询中指定数据库名称。对于 DDL 和 DML语句,都依赖use语句指定的当前数据库,并且在查询中仅使用table名
  3. 如果仅对 DDL 语句使用基于row格式的binlog,依靠use语句指定当前数据库,并且在查询中使用table名,对于DML语句,可以根据需要使用完全限定的table名(db.table)。

如果遵循这些 建议,则可以安全的将 --replicate-rewrite-db 选项与 table 级复制过滤选项(例如 --replicate-do-table)结合使用。

宣传栏