MySQL复制:使用replicate-rewrite-db更改数据库名称时遇到困难

3

我有一个主数据库,里面只有一个表格叫作"产品"(以后会有更多,现在只是开发阶段)。

操作系统:CentOS 6.4

我已经按照以下步骤将其设置为复制的主数据库:

在 /etc/my.cnf 中:

server-id = 1
binlog-do-db=product_database
relay-log = /var/lib/mysql/mysql-relay-bin
relay-log-index = /var/lib/mysql/mysql-relay-bin.index
log-error = /var/lib/mysql/mysql.err
master-info-file = /var/lib/mysql/mysql-master.info
relay-log-info-file = /var/lib/mysql/mysql-relay-log.info
log-bin = /var/lib/mysql/mysql-bin

在主节点上,我使用以下命令创建了用户:

GRANT REPLICATION SLAVE ON *.* TO 'hcp_slave'@'%' IDENTIFIED BY 'password_here';

然后在从节点上执行以下操作:

server-id = 2
master-host=HOST_IP_ADDRESS
master-connect-retry=60
master-user=hcp_slave
master-password=PASSWORD
replicate-do-db=product_database
#The below line is what causes issues
replicate-rewrite-db=product_database->product_database2
relay-log = /var/lib/mysql/mysql-relay-bin
relay-log-index = /var/lib/mysql/mysql-relay-bin.index
log-error = /var/lib/mysql/mysql.err
master-info-file = /var/lib/mysql/mysql-master.info
relay-log-info-file = /var/lib/mysql/mysql-relay-log.info
log-bin = /var/lib/mysql/mysql-bin

在我添加“replicate-rewrite-db”行之前(和去掉它后),这两个具有相同数据库名称的服务器之间的复制工作完美。然而,出于测试目的,我需要将其输入到一个具有不同名称的数据库中,“product_database2”。
根据我在mysql手册和一些随机论坛(以及stackoverflow)中阅读的所有内容,我认为我正在正确使用复制命令,但显然我没有,所以我非常希望能在解决我的问题或者是否我正在完全错误的方式下获得一点帮助!
对于那些好奇的人,我实际上想做的是:
我试图创建一个主数据库来���几个网站提供产品,而不是手动更新它们。我认为最好的方法是创建1个主数据库,并将所有站点配置为从中自动提取产品。
编辑:
我尝试在从属配置文件中注释掉“replicate-do-db”行,至少现在它表明知道product_database2的存在,但是以错误的形式呈现:
Last_Error: Error 'Error on rename of './product_database/asdf.frm' to     './product_database2/asdf.frm' (Errcode: 2)' on query. Default database: 'product_database2'. Query: 'RENAME TABLE `product_database`.`asdf`

你的日志告诉了你什么? - symcbean
我的 /var/log/mysqld 目录下没有任何新的日志记录。我的 /var/lib/mysql 目录下也没有像我期望的那样创建错误日志,如果有什么问题,我应该能够在这里看到它。 - Nathan
我在配置文件中更改了一行(如上所述),并成功引发了一个实际的错误:Last_Error: Error 'Error on rename of './product_database/asdf.frm' to './product_database2/asdf.frm' (Errcode: 2)' on query。默认数据库:'product_database2'。查询语句:'RENAME TABLE product_database.asdf - Nathan
由于错误2表示文件不存在,因此猜测只需要修改从属配置replicate-do-db=product_database2 - symcbean
3个回答

2
在从属端,您需要设置:
replicate-do-db=product_database2

因为您已经将数据库名称重写为 product_database->product_database2

0

来自refman

只有涉及表的语句会受到影响(不包括CREATE DATABASE、DROP DATABASE和ALTER DATABASE等语句),而且仅当from_name是主数据库上的默认数据库时才会受到影响。

所以试试这个。使用您上面的配置,但在在主服务器上运行查询之前尝试添加一个USE。

USE product_database;
INSERT INTO product_database (c1,c2) VALUES (1,2);

0
我遇到了关于数据库命名的相同问题。我的解决方案是:
在my.cnf文件中:
replicate-rewrite-db="product_database->product_database2"
replicate-do-db="product_database2"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接