2016-04-01 4 views
0

Этот пример работает:READ COMMITTED ОШИБКА 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:

Если вы используете InnoDB таблицы и уровень изоляции транзакций READ COMMITTED или READ UNCOMMITTED, только грести на основе регистрации может быть использован. Можно изменить формат ведения журнала на ЗАЯВЛЕНИЕ, но это во время выполнения очень быстро приводит к ошибкам, поскольку InnoDB больше не может выполнять вставки.

Таким образом, вы должны установить binlog_format в ROW:

SET SESSION binlog_format = 'ROW'; 
+0

Или глобальный формат '' ROW' или MIXED' (что это действительно должно быть, во всяком случае). –

Смежные вопросы