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????
【解决方法】
不重启mysql实例的解决方法:
1 |
|
重新建立的会话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: 在事务进行的过程中不断写入