ERROR 1665 (HY000) /binlog简介

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jing_flower/article/details/79967384

1. 报错 ERROR 1665 (HY000)

MariaDB [test]> create table jing as select * from st;

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 limited to row-based logging.

MariaDB [test]> show variables like '%binlog_format%';
+----------------------------+-----------+
| Variable_name              | Value     |
+----------------------------+-----------+
| binlog_format              | STATEMENT |
| wsrep_forced_binlog_format | NONE      |
+----------------------------+-----------+

2 rows in set (0.00 sec)

【报错原因】

innodb的事务隔离级别是read commited或者read uncommited模式时,binlog不可以使用statement模式。

会导致主从不一致,rc是record lock????

扫描二维码关注公众号,回复: 5328989 查看本文章

【解决方法】

不重启mysql实例的解决方法:

?

1

set global binlog_format=mixed

重新建立的会话session中binlog format会变为mixed模式。

2. binlog相关参数:

log-bin=/opt/lampp/var/data/mysql-bin

binlog_format = row
expire_logs_days = 7
max_binlog_size = 100m
binlog_cache_size = 4m

max_binlog_cache_size = 512m

3. sync_binlog / innodb_flush_log_at_trx_commit

innodb_flush_log_at_trx_commit

innodb_flush_log_at_trx_commit = 0,log buffer 将每秒一次地写入log-file中,并将log file刷入到磁盘中,操作同时进行。该模式下事务提交不会触发写入磁盘操作。

innodb_flush_log_at_trx_commit = 1,每次事务提交时,mysql都会把log-buffer的数据写入到log file,并且刷到磁盘中去

innodb_flush_log_at_trx_commit = 2,每次事务提交时,mysql都会将log-buffer的数据写入到log file中,但flush(刷磁盘的操作不会同时进行)。该模式下,mysql会每秒执行一次flush(刷磁盘)操作

sync_binlog

sync_binlog= 0,默认 ,每次写入内容后不会立刻持久化到磁盘上,不主动刷新binlog到磁盘上,交给操作系统 

sync_binlog > 0,当binlog写入N条SQL或N个事务后,立刻执行fsync操作将binlog文件的修改同步到磁盘上。

1,1:适合数据安全性要求非常高,而且磁盘IO写能力足够支持业务,比如充值消费系统

1,0:适合数据安全性要求高,磁盘写能力支持业务不充足,允许备库落后或者无复制

2,0:

root权限用户可以set sql_bin_log命令来禁用会话(连接)的binlog功能。

binlog_do_db

binlog_ignore_db 

4. binlog format格式之间的不同:

statement: 数据库执行的原生SQL, statement 产生的binlog文件比row格式的binlog文件小

row: binlog记录的是数据表的行是如何被修改的

        1) 执行DDL和flush系列语句仍然以文本形式记录下来,事件类型为query_event.

        2) 如果一条update语句匹配的行数很多,binlog会写入大量语句。

mixed:在特定情况下,自动从statement 格式切换到row格式,例如user、uuid、sysdate等不确定性函数语句,引用了系统变量的语句。

binlog事件:common-header/post-header/body  

format_description_event / query_event / rows_event / table_map_event / xid_event / binlog_checkpoint_event / rotate_event / stop_event

index 文件记录了所有的binlog信息,在运行时不要手动修改

[root@localhost data]# ls -lrt mysql-bin*
-rw-rw----. 1 mysql mysql 332 Apr 16 17:46 mysql-bin.000001
-rw-rw----. 1 mysql mysql 313 Apr 16 17:46 mysql-bin.000002
-rw-rw----. 1 mysql mysql 313 Apr 16 21:50 mysql-bin.000003

-rw-rw----. 1 mysql mysql 111 Apr 16 21:50 mysql-bin.index

[root@localhost data]# more mysql-bin.index
/opt/lampp/var/data/mysql-bin.000001
/opt/lampp/var/data/mysql-bin.000002

/opt/lampp/var/data/mysql-bin.000003

查看主的log

MariaDB [(none)]> show master logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       332 |
| mysql-bin.000002 |       313 |
| mysql-bin.000003 |       313 |
+------------------+-----------+
3 rows in set (0.00 sec)


MariaDB [(none)]> show binlog events in 'mysql-bin.000003';
+------------------+-----+-------------------+-----------+-------------+--------------------------------------------+
| Log_name         | Pos | Event_type        | Server_id | End_log_pos | Info                                       |
+------------------+-----+-------------------+-----------+-------------+--------------------------------------------+
| mysql-bin.000003 |   4 | Format_desc       |         1 |         249 | Server ver: 10.1.25-MariaDB, Binlog ver: 4 |
| mysql-bin.000003 | 249 | Gtid_list         |         1 |         274 | []                                         |
| mysql-bin.000003 | 274 | Binlog_checkpoint |         1 |         313 | mysql-bin.000003                           |
+------------------+-----+-------------------+-----------+-------------+--------------------------------------------+

3 rows in set (0.00 sec)

MariaDB [test]> show create table  st1\G;
*************************** 1. row ***************************
       Table: st1
Create Table: CREATE TABLE `st1` (
  `id` int(11) NOT NULL,
  `val` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

1 row in set (0.00 sec)

MariaDB [test]> set tx_isolation='repeatable-read';
Query OK, 0 rows affected (0.00 sec)

当binlog是statement时,sql语句都记录在query event中
MariaDB [test]> insert into st1 values(1,'jing');

Query OK, 1 row affected, 1 warning (0.01 sec)

MariaDB [test]> show binlog events in 'mysql-bin.000003';
+------------------+-----+-------------------+-----------+-------------+----------------------------------------------+
| Log_name         | Pos | Event_type        | Server_id | End_log_pos | Info                                         |
+------------------+-----+-------------------+-----------+-------------+----------------------------------------------+
| mysql-bin.000003 |   4 | Format_desc       |         1 |         249 | Server ver: 10.1.25-MariaDB, Binlog ver: 4   |
| mysql-bin.000003 | 249 | Gtid_list         |         1 |         274 | []                                           |
| mysql-bin.000003 | 274 | Binlog_checkpoint |         1 |         313 | mysql-bin.000003                             |
| mysql-bin.000003 | 313 | Gtid              |         1 |         351 | BEGIN GTID 0-1-1                             |
| mysql-bin.000003 | 351 | Query             |         1 |         446 | use `test`; insert into st1 values(1,'jing') |
| mysql-bin.000003 | 446 | Xid               |         1 |         473 | COMMIT /* xid=41 */                          |
+------------------+-----+-------------------+-----------+-------------+----------------------------------------------+

6 rows in set (0.00 sec)

5. 清理binlog

purge {binlog | master} logs to 'binlog-file-name';

purge {binlog | master} logs before "data-expr";

6. binlog / redo log的区别

1)作用域不同

binlog:记录所有与mysql数据库相关的日志记录,包括innodb和myisam,heap等其他的存储引擎的日志。

redolog: 记录innodb存储引擎本身的事务日志

2)记录内容不同

binlog: 记录的是一个事务的具体操作内容,即该日志是逻辑日志

redo log: 记录的是关于每个页(Page)更改的物理情况

3)写入的时间不同

binlog: 事务提交后进行写入,不论事务多大,只写磁盘一次

redo log: 在事务进行的过程中不断写入

猜你喜欢

转载自blog.csdn.net/jing_flower/article/details/79967384