Mysql跨库主从热备失效问题(转)

转载 2011年01月18日 18:39:00

Mysql跨库主从热备失效问题

在InnoDB引擎下发现,Mysql的主从热备存在数据不一致的问题,一些数据没有成功同步到备机。在use databases后,更新的表必须是当前选择的database才同步。譬如连上Mysql服务后操作:

USE test2;
UPDATE client SET name='test' WHERE uid=1;
数据未能同步到备机,而使用use test后,才可以成功同步,如下方式:
USE test;
UPDATE client SET name='test' WHERE uid=1;

仔细看Mysql手册,发现同步启动选项中还有玄机,只设置replicate-do-db指定同步数据库还不够。是没有设置replicate-wild-do-table导致的跨库同步问题。Mysql默认是同步指定数据库下的更新操作,若要跨库操作更新同步,就必须指定replicate-wild-do-table参数。下面是Mysql手册中对replicate-do-db和replicate-wild-do-table启动选项的说明:

–replicate-do-db=db_name
告诉slave只同步那些缺省数据库是 db_name (也就是用 USE 选中的)的语句。想要指定更多的数据库,只需多次使用该选项,每次指定一个数据库。注意,类似 UPDATE some_db.some_table SET foo='bar' 这样的跨库操作语句以及没有选中数据库的操作都不会被同步。如果必须使用跨库操作,要确保使用MySQL 3.23.28或更高,并且使用 –replicate-wild-do-table=db_name.% 选项。请仔细阅读最后面的注意事项。
下面是一个不能按照预期工作的例子:如果启动slave时使用 –replicate-do-db=sales 选项,并且在master上执行下列语句,那么这个 UPDATE 语句不会被同步:
USE prices;
UPDATE sales.january SET amount=amount+1000;
如果需要同步跨库操作,只需使用 –replicate-wild-do-table=db_name.% 选项。这个"只检查缺省数据库"特性的主要原因是因为想要单从一个语句中判断是否要被同步比较困难(例如,使用多表 DELETE 或者 UPDATE,这就跨库了)。不过想要检查是否是缺省数据库却很快。

–replicate-wild-do-table=db_name.tbl_name
限制slave只同步那些匹配指定模式的数据表。模式中可以包含通配符 `%` 和 `_`,它们的含义和 LIKE 模式一样。想要指定更多的数据表,只需多次使用该选项,每次指定一个数据表。请仔细阅读最后面的注意事项。
例如: –replicate-wild-do-table=foo%.bar% 会同步所有以 foo 开头的数据库下的以 bar 开头的数据表上的更新操作。
如果匹配模式是 %,则匹配所有的表名,且应用到数据库级语句(CREATE DATABASE, DROP DATABASE,和 ALTER DATABASE)。例如,使用 –replicate-wild-do-table=foo%.% 选项的话,所有匹配 foo% 模式的数据库级操作都会被同步。
如果想要在数据库/表模式中包含原义通配符,需要用反斜杠来转义它们。例如,想要同步 my_own%db 数据库下的所有表,但是不想同步 my1ownAABCdb 数据库下的表,就需要转义字符 `_`: –replicate-wild-do-table=my/_own/%db。如果是在命令行中使用这个选项,就可能需要两个反斜杠来转义,这依赖于命令行解释器。例如,在 bash shell下,就需要输入: –replicate-wild-do-table=my//_own//%db。

还存在一些问题
不管有没有replicate-wild-do-table选项,更新操作必须是mysql连接已经有选择的数据库了才进行,譬如新建的mysql(新连接是没有默认选择的database的)连接中执行:
UPDATE test.client SET name='test' WHERE uid=1;
这条更新无法同步到备机,必须在update前use database操作,该database必须是replicate-wild-do-table中指定的database。
保险的解决方式:连接上mysql后,调用mysql_select_db()选择数据库,之后进行的更新操作就可以自动同步了。

SQL模式匹配
SQL的模式匹配允许你使用“_”匹配任何单个字符,而“%”匹配任意数目字符(包括零个字符)。在 MySQL中,SQL的模式缺省是忽略大小写的。下面显示一些例子。注意在你使用SQL模式时,你不能使用=或!=;而使用LIKE或NOT LIKE比较操作符。


转载本站文章请注明,转载自:神秘果

本文链接: http://www.shenmiguo.com/archives/2009/321_mysql-replications.html

相关文章推荐

Mysql跨库主从热备失效问题

Mysql跨库主从热备失效问题 在InnoDB引擎下发现,Mysql的主从热备存在数据不一致的问题,一些数据没有成功同步到备机。在use databases后,更新的表必须是当前选择的dat...

处理MYSQL主从库数据不一致的问题【Slave_SQL_Running: No】

场景:有同事需要把从库中的数据,同步一份到新环境,但发现在主库上执行count语句,和从库上执行count语句得出的结果不同。 解决思路: 在从库上执行 show slave status \G ...

Linux环境下MySQL的主从热备

随着大数据时代的来临,数据显得尤为重要,数据的丢失或者损毁甚至可以摧毁一个公司。 Linux下的主从热备其实很简单 1. 作为主服务器Master,  会把自己的每一次改动都记录到...

搭建mysql主从数据库实现双机热备架构

一、安装MySQL         首先需要准备两台服务器,比如192.168.88.1(主)和192.168.88.2(从)并分别安装mysql,如果没有的话可以自己到网上去自行下载,我这边也给提供...

使用MySQL主从服务器配置实现双机热备

1 mysql数据库没有增量备份的机制,当数据量太大的时候备份是一个很大的问题。还好mysql数据库提供了一种主从备份的机制,其实就是把主数据库的所有的数据同时写到备份数据库中,实现mysql数据库的...

Mysql5.6主从热备配置

数据库是应用系统的核心,为了保证数据库的安全采用主从热备是很常见的方法,也就是主数据库DDL、DML都将被同步到从数据库。 一、      实验环境 操作系统:windowsser...
  • BDCHome
  • BDCHome
  • 2016年10月08日 20:32
  • 215

MySQL数据库之间互为主从热备设置

1.在数据库中创建同步用户互为主从设置 192.168.0.32为主数据库服务器 192.168.0.33为从数据库服务器在32上创建#创建同步账户 create user 'tongbu'@'1...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Mysql跨库主从热备失效问题(转)
举报原因:
原因补充:

(最多只允许输入30个字)