我一直在尝试两个MySQL服务器之间的主 - 主复制,但是使用不同的数据库名称,我遇到了一些绊脚石。看起来虽然UPDATE正常工作,但INSERT却没有。
虽然我会说这是一个错误或至少是我的设置问题,但似乎MySQL说这是一个功能(here和here)。
如果那时,正如MySQL所说,它只能在默认数据库上运行,那么这个设置如何具有实际的实际目的呢?
我错过了什么吗?
供my.cnf中的相关部分参考。我一直在测试这个,通过在phpMyAdmin中进行插入和更新,如果这有任何区别。
主
log-bin=mysql-bin
binlog_do_db=db1
从属
replicate-rewrite-db=db1->db2
replicate-wild-do-table=db2.table1
答案 0 :(得分:4)
Replication-rewrite-db
用法与其他复制选项相同。 Replication-rewrite-db
不仅适用于默认数据库,还包括:replicate-do-db, replicate-ignore-db, binlog-do-db and binlog-ignore-db
。请参阅this和this。
有真实的目的,否则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