- 一个事物10000行,两阶段提交是等innodb提交完才写入吗?
1 |
|
- binlog写入时间点.
若干个大事物同时写不同表,mysql内存使用过大
只有commit的时候才会写binlog
LOCK BINLOG FOR BACKUP
锁住binlog(Percona server支持,原生不支持),防止新的事物提交。
事物1 | 事物2 |
---|---|
begin;insert …. | |
LOCK BINLOG FOR BACKUP | |
commit(Waiting for binlog lock ) | |
UNLOCK BINLOG | |
执行成功 |
事物1会处于: Waiting for binlog lock 状态,直到释放binlog锁才会释放成功
binlog日志中的时间戳
单个事物
1 | flush logs;begin;select now();select sleep(10);select now();insert into test_binlog_cache(msg) SELECT REPEAT("xxxxxxxx", 128);select sleep(10);select now();insert into test_binlog_cache(msg) SELECT REPEAT("xxxxxxxx", 128);select sleep(10);select now();commit; |
mysqlbinlog –base64-output=decode-rows -v mysql-bin.000032
1 | BEGIN |
可以看到binlog中的时间戳是生成event日志时的时间戳
.并不是commit时的时间戳
多个事物
事物1:
1 | flush logs;begin;select now();select sleep(10);select now();insert into test_binlog_cache(msg) SELECT REPEAT("xxxxxxxx", 128);select sleep(10);select now();insert into test_binlog_cache(msg) SELECT REPEAT("xxxxxxxx", 128);select sleep(10);select now();commit; |
事物2:
1 | select sleep(5);begin;select now();select sleep(10);select now();insert into test_binlog_cache(msg) SELECT REPEAT("xxxxxxxx", 128);select sleep(10);select now();insert into test_binlog_cache(msg) SELECT REPEAT("xxxxxxxx", 128);select sleep(10);select now();commit; |
mysqlbinlog –base64-output=decode-rows -v mysql-bin.000033
1 | BEGIN |
可以看到
- binlog的写入是顺序写入的,第一个事物先commit所以先写binlog,但是binlog中的时间戳是和每次插入时间有关,所以能看到前面的binlog时间戳大于后面的binlog时间戳
- GTID和xid类型的event是在事务执行commit语句时产生的
- Query、Rows_query、Table_map、Update_rows 类型的event是在事务执行update 语句时产生的
- 执行begin;语句时未产生任何event
主从复制,relay log中的时间戳和从库binlog中的时间戳
relay log中的时间戳是主库写入的时间戳,这个很好理解,但是从库binlog中的时间戳
却还是主库
写入的时间戳
mysqlbinlog –base64-output=decode-rows -v mysql-bin.000001
1 | use `test7`/*!*/; |
遇到问题:
- mysqlbinlog5.5解析mysql5.7 binlog文件出现
- 现象
ERROR: Error in Log_event::read_log_event(): ‘Sanity check failed’, data_len: 31, event_type: 35ERROR: Could not read entry at offset 123: Error in log format or read error.
- 原因分析
mysql5.6等高版本binlog文件增加了新的binlog event,如gtid event等。
mysql5.5版本的mysqlbinlog是识别不了这样的binlog event的。 - 解决办法:
使用对应的mysqlbinlog