MySQL MASTER TO MASTER使用Spring / Hibernate在数据库级别而不是应用程序级别进行复制

时间:2015-07-07 14:04:02

标签: mysql database database-replication

我们正在使用MySQL与MASTER TO MASTER复制。

当我们使用MySQL监视器直接输入SQL语句(即表上的INSERT或DELETE)时,它可以工作(即复制到其他DB)。这已经过两种方式的测试,即在每个数据库上进行测试,看看它们是否都复制到另一个数据库(并且它们确实存在)。

但是,当我们使用我们的使用Spring / Hibernate的Web应用程序来保存数据时,它会正确保存到当前连接的数据库,但它不会复制到另一个数据库!我不会想到这是可能的!

我查了一下我能找到的日志文件: /var/log/mysqld.log 但看不出任何错误。

我如何进一步调查?
我可以将日志记录改进为更详细吗? 这有可能以某种方式实际绕过复制吗?我不这么认为,但我刚刚进行了一系列测试来证明这一点。

2 个答案:

答案 0 :(得分:0)

事实证明,通过在Liberty.xml Appserver的server.xml中的数据源TAG中指定数据库名称 - 它停止了复制!?

删除了databaseName属性,一切正常!

<dataSource id="athlete" jndiName="jdbc/myJNDIName">
    <jdbcDriver libraryRef="MySqlLib"/>
    **<properties databaseName="mydb"** 
    user="myuser" password="password" serverName="myserver" portNumber="3306"/>
</dataSource>

真正的原因是与STATEMENT和基于ROW的二进制日志记录有关 - 我们使用基于语句的日志记录 - 已切换到基于ROW的日志记录,现在它可以正常工作。

如果使用基于STATEMENT的复制(默认为5.1.71),则如果为会话分配的数据库与要复制的数据库不同,则不会复制到其他数据库。

https://dev.mysql.com/doc/refman/5.1/en/replication-options-slave.html#option_mysqld_replicate-do-db

&LT;&LT; 基于语句的复制。告诉从属SQL线程将复制限制为默认数据库(即USE选择的数据库)为db_name的语句。

  

&GT;

答案 1 :(得分:0)

答案是我们有基于STATEMENT的复制而不是基于ROW的复制!

下面的链接解释了基于STATEMENT的复制(默认和我们正在使用的)和基于ROW的复制 https://dev.mysql.com/doc/refman/5.1/en/replication-options-slave.html#option_mysqld_replicate-do-db

mysql> show variables like 'binlog_format';
+---------------+-----------+
| Variable_name | Value     |
+---------------+-----------+
| binlog_format | STATEMENT |
+---------------+-----------+

mysql> SET GLOBAL binlog_format = 'ROW';

/etc/my.cnf

#Setup binary logging
log_bin=/var/log/mysql/mysql-bin.log
binlog_do_db=MY_DATABASE
binlog-format=ROW