replicate-do-db配置在MySQL从库的my.cnf文件中,可以指定只复制哪个库的数据。但是这个参数有个问题就是主库如果在其他的schema环境下操作,其binlog不会被从库应用,从而出现异常。可以简单的测试一下 --replicate-do-db参数引起的MySQL复制错误,步骤如下。

从库的my.cnf中有如下配置:

replicate-do-db = maopaodb

首先在主库切换到test这个库并建立maopaodb下的一个表:

mysql> use test;
Database changed

mysql> create table maopaodb.test(id int,name varchar(10));
Query OK, 0 rows affected (0.09 sec)

mysql> use maopaodb;
Database changed
mysql> show tables;

+--------------------------+
| Tables_in_maopaodb |
+--------------------------+
......
| test |
......
+--------------------------+
32 rows in set (0.01 sec)

可见这个表在maopaodb下创建成功,而这时去从库查看,是没有这个表的,因为我们是在test这个库下操作的,而从库的--replicate-do-db指定了maopaodb,因此这些信息不会在从库被应用。

这时主库切换到maopaodb,并写入一条记录:

mysql> use maopaodb;
Database changed
mysql> insert into test values (1,'a');
Query OK, 1 row affected (0.01 sec)

从库这时就会报错了:

mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.0.33
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000010
Read_Master_Log_Pos: 93731745
Relay_Log_File: mysql-relay-bin.000008
Relay_Log_Pos: 5979038
Relay_Master_Log_File: mysql-bin.000010
Slave_IO_Running: Yes
Slave_SQL_Running: No
Replicate_Do_DB: maopaodb
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 1146
Last_Error: Error 'Table 'maopaodb.test' doesn't exist' on query. Default database: 'maopaodb'. Query: 'insert into test values (1,'a')'
Skip_Counter: 0
Exec_Master_Log_Pos: 93709288
Relay_Log_Space: 6001650
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: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 1146
Last_SQL_Error: Error 'Table 'maopaodb.test' doesn't exist' on query. Default database: 'maopaodb'. Query: 'insert into test values (1,'a')'
1 row in set (0.00 sec)

对于这种问题复制同步方面的问题,主要都是要在从库这边手动做一些动作,要么补充一些操作,要么跳过一些操作。我们看看如何跳过这个操作。

首先我们要从上边的报错信息关注到以下三点:

Relay_Master_Log_File: mysql-bin.000010

Skip_Counter: 0

Exec_Master_Log_Pos: 93709288

就是我们要明白是主库的哪个日志文件,和日志文件中报错的具体位置,而Skip_Counter参数就是我们要利用的东西。这里我们看到是mysql-bin.000010这个日志文件的93709288位置报错,那么就到主库看看这个位置到底是在执行什么东西:

mysql> SHOW BINLOG EVENTS in 'mysql-bin.000010' from 93709288;
+------------------+----------+------------+-----------+-------------+---------------------------------------------------------------------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+----------+------------+-----------+-------------+---------------------------------------------------------------------------------------------------------------------+
| mysql-bin.000010 | 93709288 | Query | 1 | 93709360 | BEGIN |
| mysql-bin.000010 | 93709360 | Query | 1 | 93709458 | use `maopaodb`; insert into test values (1,'a') |
| mysql-bin.000010 | 93709458 | Xid | 1 | 93709485 | COMMIT /* xid=28862936 */ |
| mysql-bin.000010 | 93709485 | Query | 1 | 93709557 | BEGIN |
| mysql-bin.000010 | 93709557 | Query | 1 | 93709723 | use `mogilefs`; UPDATE device SET mb_total = '9564', mb_used = '386', mb_asof = UNIX_TIMESTAMP() WHERE devid = '13' |
| mysql-bin.000010 | 93709723 | Xid | 1 | 93709750 | COMMIT /* xid=28863050 */

......

可见正是导致出错的这个insert语句,MySQL的binary log每个SQL执行实际上是由一些event组成的,我们这里要设置的就是要跳过的event的个数。本例中就是BEGIN、具体SQL语句和COMMIT这3个event,因此我们可以在从库上这样跳过这个语句:

mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 3;
Query OK, 0 rows affected (0.00 sec)

然后开启同步,一切正常:

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.0.33
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000010
Read_Master_Log_Pos: 93733865
Relay_Log_File: mysql-relay-bin.000008
Relay_Log_Pos: 6003615
Relay_Master_Log_File: mysql-bin.000010
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: maopaodb
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: 93733865
Relay_Log_Space: 6003770
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:
1 row in set (0.00 sec)

 

replicate-do-db参数引起的MySQL复制错误及处理办法的更多相关文章

  1. Atitit.软件GUIbutton与仪表盘--db数据库区--导入mysql sql错误的解决之道

    Atitit.软件GUIbutton与仪表盘--db数据库区--导入mysql sql错误的解决之道 Keyword::截取文本文件后部分 查看提示max_allowed_packet限制 Targe ...

  2. Atitit.软件GUI按钮与仪表盘--db数据库区--导入mysql sql错误的解决之道

    Atitit.软件GUI按钮与仪表盘--db数据库区--导入mysql sql错误的解决之道 Keyword::截取文本文件后部分 查看提示max_allowed_packet限制 Target Se ...

  3. MySQL复制错误1837的相关缺陷一例

    故障现象 主从gtid报错,复制错误1837,这个复制故障可以说是第一次遇到. Last_Errno: 1837 Last_Error: Error 'When @@SESSION.GTID_NEXT ...

  4. MySQL常见错误及其解决办法

    1.连接类 (1).问题:MySQL server has gone away  解决办法:出现该报错常见的原因是服务器超时了并且关闭了连接.缺省地,如果没有事情发生,服务器在 8个小时后关闭连接.如 ...

  5. [MySQL复制] SQL_ERROR 1032解决办法(non-gtid env)

    一.缘由: 在主主同步的测试环境,由于业务侧没有遵循同一时间只写一个点的原则,造成A库上删除了一条数据,B库上在同时更新这条数据. 由于异步和网络延时,B的更新event先到达A端执行,造成A端找不到 ...

  6. MySQL复制错误 The slave I/O thread stopsbecause master and slave have equal MySQL server UUIDs; these UUIDs must bedifferent for replication to work 解析

    在搭建Mysql主从复制时候,在执行完相关操作以后,通过命令查看是否主从复制成功的时候 show slave status\G; 在"Slave_SQL_Running_State" ...

  7. /var/lib/mysql/mysql.sock错误的解决办法

    问题描述: 使用mysql -uroot -p登录出现找不到 /var/lib/mysql/mysql.sock或者被使用的问题. 可以用如下命令登录:mysql -p --socket=/tmp/m ...

  8. [MySQL复制异常]'Cannot execute statement: impossible to write to binary log since statement is in row format and BINLOG_FORMAT = STATEMENT.'

    MySQL复制错误]Last_Errno: 1666 Last_Error: Error executing row event: 'Cannot execute statement: imposs ...

  9. 【转】[MySQL复制异常]Cannot execute statement: impossible to write to binary log since statement is in row for

    MySQL复制错误]Last_Errno: 1666 Last_Error: Error executing row event: 'Cannot execute statement: imposs ...

随机推荐

  1. javascript中onclick事件能调用多个方法吗

    Q: javascript中onclick事件能调用多个方法吗? A: 可以的,方法如下onclick="aa();bb();cc();"每个方法用“;”分号隔开就行了

  2. Visual Studio 项目中添加include, lib, dll库文件(*.h,*.lib,*.dll)

    应用程序使用外部库时需要进行加载,两种库的加载本质上都是一样:提供功能和功能的定义.vs2005 c++ 项目设置外部库方法如下: 1. 添加编译所需要(依赖)的 lib 文件     在“项目-&g ...

  3. 二叉查找树的查找、插入和删除 - Java实现

    http://www.cnblogs.com/yangecnu/p/Introduce-Binary-Search-Tree.html 作者: yangecnu(yangecnu's Blog on ...

  4. MongoDB驱动特性检查列表

    http://docs.mongodb.org/meta-driver/latest/legacy/feature-checklist-for-mongodb-drivers/ 1. 基本(Essen ...

  5. MainWndProc运行观察

    MainWndProc运行观察 把MainWndProc改写成如下代码,便于观察:procedure TWinControl.MainWndProc(var Message: TMessage);be ...

  6. Java:IO流之字符流Reader、Writer详解

    java.io包中:字符流   字符流的两个抽象基类:   Reader         Writer   文件的读取:Reader抽象类(java.io包中) 直接子类的构造方法: FileRead ...

  7. 实际操作中命令 su 与 sudo 的区别(转)

    ------------------------------------------------------------------------------------------------ 首先我 ...

  8. MyEclipse配置Tomcat 并编写第一个JSP程序

    安装myeclipse之后配置tomcat服务器,在window里选择servers 选择tomcat的文件夹路径(我的是从别人那里考过来的文件夹) 选中上enable即可 出现了这个界面 在这里可以 ...

  9. 事务回滚后,自增ID仍然增加

    回滚后,自增ID仍然增加. 比如当前ID是7,插入一条数据后,又回滚了.然后你再插入一条数据,此时插入成功,这时候你的ID不是8,而是9.因为虽然你之前插入回滚,但是ID还是自增了. 如果你认为自增I ...

  10. MongoDB操作(.net)

    一.查询 var doc = new Document(); 1.模糊查询var reg = new MongoRegex(".*" + qry.名称 + ".*&quo ...