replicate-rewrite-db是否有任何实际应用程序?

时间:2012-03-23 16:53:47

标签: mysql replication database-replication

我一直在尝试两个MySQL服务器之间的主 - 主复制,但是使用不同的数据库名称,我遇到了一些绊脚石。看起来虽然UPDATE正常工作,但INSERT却没有。

虽然我会说这是一个错误或至少是我的设置问题,但似乎MySQL说这是一个功能(herehere)。

如果那时,正如MySQL所说,它只能在默认数据库上运行,那么这个设置如何具有实际的实际目的呢?

我错过了什么吗?


供my.cnf中的相关部分参考。我一直在测试这个,通过在phpMyAdmin中进行插入和更新,如果这有任何区别。

log-bin=mysql-bin
binlog_do_db=db1

从属

replicate-rewrite-db=db1->db2
replicate-wild-do-table=db2.table1

4 个答案:

答案 0 :(得分:4)

Replication-rewrite-db用法与其他复制选项相同。 Replication-rewrite-db不仅适用于默认数据库,还包括:replicate-do-db, replicate-ignore-db, binlog-do-db and binlog-ignore-db。请参阅thisthis

有真实的目的,否则MySQL不会实现这个选项。它仅适用于默认数据库because -

  

这种“只检查默认数据库”行为的主要原因是   单从声明中就很难知道是否存在   应该被复制(例如,如果您使用多表   DELETE语句或跨表的多表UPDATE语句   多个数据库)。仅检查默认值也更快   如果没有必要,数据库而不是所有数据库。

您还应该了解复制规则。来自here

我通过发出INSERT, DELETE and UPDATE测试了phpmyadmin并注意到(通过启用general_query_log)它发出INIT DB 'db_name'mysql_select_db() API调用记录了'Init DB')。

例如:

Init DB sakila
1 Query INSERT INTO `sakila`.`actor_info` (`actor_id`, `first_name`, `last_name`, `film_info`) VALUES ('1235', 'abc', 'efg', NULL)

因此,最终复制不应该因为phpmyadmin在每次查询之前执行USE db而正确执行。

答案 1 :(得分:1)

我相信他们在文档中提到的是,它不会为您翻译特定的数据库名称,只会翻译由USE设置的数据库。他们的意思是,如果你要执行如下的事情:

USE db1;
INSERT INTO table_name (x,y,z) VALUES (1,2,3);

它应该像你期待的那样。

但是,如果您在查询中明确命名数据库,它将不会自动为您翻译。 e.g。

INSERT INTO db1.table_name (x,y,z) VALUES (1,2,3); 

phpMyAdmin很可能正在翻译您的查询以指定数据库名称以及表名。

编辑: 虽然如果您完全控制整个系统中的查询创作,但这确实具有实际用途,您需要非常小心,以便在运行之前知道查询的内容。某些类型的ORM系统或中介将重写您的查询以使您明确。我不建议在生产中使用它,特别是当几个团队正在编写与MySQL服务器接口的代码时。

答案 2 :(得分:1)

我有一个设置有限数量的MySQL服务器,两个。一个是生产(PROD),仅用于生产,另一个是开发和兼作灾难恢复(DR)和运行渴望查询。

要启用灾难恢复,PROD服务器会使用复制复制到DR,但如果没有重命名,则最终会在同一服务器上使用相同名称的两个数据库。所以我所拥有的是生产:

db_application

在开发方面我有两个

db_application (which is used for development)
slave_application (which is used for DR)

我没有在每个语句中使用USE,而是使用连接字符串来指定哪个数据库是默认值,并且所有语句都不包含数据库名称。 (即 SELECT * FROM TABLE 而不是 SELECT * FROM DB.TABLE

这允许复制工作,并在开发服务器上创建一个与生产服务器同名的数据库。哪个适合我的需要,但我感谢别人可能不会觉得这个设置实用。这更适合完全控制SQL但对连接字符串的控制有限。

答案 3 :(得分:0)

我说这是一个基本的故障,他们把它作为同一问题的特色请求..这发生在二进制日志中...... http://bugs.mysql.com/bug.php?id=65837