2016-04-01 26 views
0

這個例子的工作原理:提交讀錯誤1665無法寫入二進制日誌

MariaDB [test]> SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; 
Query OK, 0 rows affected (0.00 sec) 

MariaDB [test]> INSERT INTO test(id, value) VALUES (1, 'test'), (2, 'test 2'); 
Query OK, 2 rows affected (0.37 sec) 
Records: 2 Duplicates: 0 Warnings: 0 

MariaDB [test]> SELECT * FROM test; 
+------+--------+ 
| id | value | 
+------+--------+ 
| 1 | test | 
| 2 | test 2 | 
+------+--------+ 
2 rows in set (0.00 sec) 

MariaDB [test]> COMMIT; 

,但是當我改變了事務級別:

MariaDB [test]> SET TRANSACTION ISOLATION LEVEL READ COMMITTED; 
Query OK, 0 rows affected (0.00 sec) 

MariaDB [test]> INSERT INTO test(id, value) VALUES (1, 'test'), (2, 'test 2'); 
ERROR 1665 (HY000): Cannot execute statement: impossible to write to binary log 
since BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine lim 
ited to row-based logging. InnoDB is limited to row-logging when transaction iso 
lation level is READ COMMITTED or READ UNCOMMITTED. 
MariaDB [test]> SELECT * FROM test; 
Empty set (0.00 sec) 

MariaDB [test]> COMMIT; 
Query OK, 0 rows affected (0.00 sec) 

如何解決這個問題?

回答

1

在這種情況下,錯誤消息非常詳細。據對binlog_format MySQL文檔:

如果你正使用InnoDB表和事務隔離級別讀取已提交或讀取未提交,只能使用基於行的日誌記錄。可以將日誌記錄格式更改爲STATEMENT,但在運行時會這樣做會非常迅速地導致錯誤,因爲InnoDB不能再執行插入操作。

所以,你必須將binlog_format設置爲ROW

SET SESSION binlog_format = 'ROW'; 
+0

或全局格式'ROW'或'MIXED'(它真的應該,反正)。 –

相關問題