我们正在使用MySQL与MASTER TO MASTER复制。
当我们使用MySQL监视器直接输入SQL语句(即表上的INSERT或DELETE)时,它可以工作(即复制到其他DB)。这已经过两种方式的测试,即在每个数据库上进行测试,看看它们是否都复制到另一个数据库(并且它们确实存在)。
但是,当我们使用我们的使用Spring / Hibernate的Web应用程序来保存数据时,它会正确保存到当前连接的数据库,但它不会复制到另一个数据库!我不会想到这是可能的!
我查了一下我能找到的日志文件: /var/log/mysqld.log 但看不出任何错误。
我如何进一步调查?
我可以将日志记录改进为更详细吗?
这有可能以某种方式实际绕过复制吗?我不这么认为,但我刚刚进行了一系列测试来证明这一点。
答案 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