MySQL在线更改binlog格式

Posted hch的随笔 成功的秘诀在于恒心—迪斯雷利

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL在线更改binlog格式相关的知识,希望对你有一定的参考价值。

  今天变更jboss报错如下:

SQLWarning ignored: SQL state HY000, error code 1592, message [Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statements writing to a table with an auto-increment column after selecting from another table are unsafe because the order in which rows are retrieved determines what (if any) rows will be written. This order cannot be predicted and may differ on master and the slave.]

提示:警告,从另一个表中选择一个具有自动增量列的表的语句是不安全的,因为检索行的顺序决定了将写入哪些行(如果有的话)。这个命令是无法预测的,会使主从的数据不一致。

于是修改主库和从库的binglog格式由statement改为ROW格式。

方法:

1、先修改从库

mysql> show global variables like "binlog%";
+-----------------------------------------+--------------+
| Variable_name                           | Value        |
+-----------------------------------------+--------------+
| binlog_cache_size                       | 32768        |
| binlog_checksum                         | CRC32        |
| binlog_direct_non_transactional_updates | OFF          |
| binlog_error_action                     | IGNORE_ERROR |
| binlog_format                           | MIXED        |
| binlog_gtid_simple_recovery             | OFF          |
| binlog_max_flush_queue_time             | 0            |
| binlog_order_commits                    | ON           |
| binlog_row_image                        | FULL         |
| binlog_rows_query_log_events            | OFF          |
| binlog_stmt_cache_size                  | 32768        |
| binlogging_impossible_mode              | IGNORE_ERROR |
+-----------------------------------------+--------------+
12 rows in set (0.00 sec)
mysql> set global binlog_format=ROW;
Query OK, 0 rows affected (0.00 sec)

mysql> show global variables like "binlog_format";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW   |
+---------------+-------+
1 row in set (0.00 sec)

2、在修改主库的

mysql> set global binlog_format=ROW;
Query OK, 0 rows affected (0.00 sec)

mysql> show global variables like "binlog_format";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW   |
+---------------+-------+
1 row in set (0.00 sec)

3、修改配置文件my.cnf

binlog_format=ROW

 

如果先修改主库,可能会有以下报错。

slave报错信息如下:
Last_SQL_Errno: 1666
               Last_SQL_Error: Error executing row event: Cannot execute statement: impossible to write to binary log since statement is in row format and BINLOG_FORMAT = STATEMENT.

 

欢迎转载,请注明出处!

 

以上是关于MySQL在线更改binlog格式的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 在线更改 Schema 工具

openfire ping的smack解决方案(维持在线状态)

python教程判断一下一个 IP 在不在线?ping IP教程

如何在片段中填充列表视图?

在线获取原始格式的 JSON URL

github在线更改mysql表结构工具gh-ost