首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >replicate-rewrite-db有什么实际应用吗?

replicate-rewrite-db有什么实际应用吗?
EN

Stack Overflow用户
提问于 2012-03-24 00:53:47
回答 4查看 2.6K关注 0票数 1

我一直在试验两个MySQL服务器之间的主-主复制,但是使用了不同的数据库名称,我遇到了一些障碍。看起来,尽管更新可以像预期的那样正常工作,但插入却不能。

虽然我会说这是一个bug,或者至少是我的设置有问题,但似乎MySQL说这是一个特性(herehere)。

如果像MySQL所说的那样,它只在默认数据库上工作,那么这个设置怎么可能有实际的实际用途呢?

我是不是漏掉了什么?

参考my.cnf中的相关部分。我一直在通过在phpMyAdmin中执行插入和更新来测试这一点,如果这样做会有什么不同的话。

主控

代码语言:javascript
运行
复制
log-bin=mysql-bin
binlog_do_db=db1

从站

代码语言:javascript
运行
复制
replicate-rewrite-db=db1->db2
replicate-wild-do-table=db2.table1
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-08-22 20:04:31

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()应用程序接口调用记录了‘Init DB’)。

例如:

代码语言:javascript
运行
复制
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来正确地执行复制。

票数 4
EN

Stack Overflow用户

发布于 2012-08-15 23:14:26

我相信他们在文档中所指的是,它不会为您翻译特定的数据库名称,只会为您翻译由使用设置的数据库。他们的意思是,如果你要执行一些东西,比如:

代码语言:javascript
运行
复制
USE db1;
INSERT INTO table_name (x,y,z) VALUES (1,2,3);

它应该如您所期望的那样工作。

但是,如果您在查询中显式命名数据库,它将不会自动为您转换该名称。例如:

代码语言:javascript
运行
复制
INSERT INTO db1.table_name (x,y,z) VALUES (1,2,3); 

phpMyAdmin很可能正在转换您的查询,以指定数据库名称和表名。

编辑:如果您完全控制了整个系统中的查询编写,那么这确实有实际意义,但在运行查询之前,您需要非常小心地了解查询是什么。某些类型的ORM系统或中介体将重写您的查询,以使您更明确。我不建议在生产中使用它,特别是当几个团队正在编写与您的MySQL服务器接口的代码时。

票数 1
EN

Stack Overflow用户

发布于 2012-08-22 05:07:55

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

要启用灾难恢复,PROD服务器将使用复制复制到DR,但如果不重命名,这将导致同一服务器上有两个名称相同的数据库。所以我有的是生产中的:

代码语言:javascript
运行
复制
db_application

在开发方面,我有两个

代码语言:javascript
运行
复制
db_application (which is used for development)
slave_application (which is used for DR)

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9843260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档