MYSQL日志 MySQL InnoDB及MyISAM 行锁,表锁,间隙锁
Bin log 二进制日志 备份 增量备份 DDL DML DCL
Erro Log 错误日志 排错
Relay Log 中继日志 复制 接收relication master
Slow query Log 慢查询日志
Redo Log 重做日志
什么时候产生:
事务开始之后就产生redo log,redo log的落盘并不是随着事务的提交才写入的,而是在事务的执行过程中,便开始写入redo log文件中。
什么时候释放:
当对应事务的脏页写入到磁盘之后,redo log的使命也就完成了,重做日志占用的空间就可以重用(被覆盖)。
事务开始之后就产生redo log,redo log的落盘并不是随着事务的提交才写入的,而是在事务的执行过程中,便开始写入redo log文件中。
即使某个事务还没有提交,Innodb存储引擎仍然每秒会将重做日志缓存刷新到重做日志文件。
Undo Log 回滚日志
保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC)
什么时候产生:
事务开始之前,将当前是的版本生成undo log,undo 也会产生 redo 来保证undo log的可靠性
什么时候释放:
当事务提交之后,undo log并不能立马被删除,
而是放入待清理的链表,由purge线程判断是否由其他事务在使用undo段中表的上一个事务之前的版本信息,决定是否可以清理undo log的日志空间。
两阶段提交
MySQL通过两阶段提交过程来完成事务的一致性的,也即redo log和binlog的一致性的,理论上是先写redo log,再写binlog,两个日志都提交成功(刷入磁盘),事务才算真正的完成。
表锁
偏向MyISAM存储引擎,开销小,加锁快;无死锁;锁定粒度大,并发度低;
show open tables;
手动锁表:
lock table jeuc read(读共享锁:可读自己,不可修改自己,不可读别的表) ;
读锁:读共享锁:当前Session1可读自己,Session1不可修改自己,Session1不可读别的表;Session2 可读取,Session2修改操作在当前Session1解锁期间,处于阻塞状态。
lock table jeuc write(独占锁);
写锁:当前Session1可读自己,Session1可修改自己,Session1不可读别的表;Session2 ,Session2 在当前Session1解锁期间,读写都处于阻塞状态。
手动释放表:
unlock tables;
总之:对MyISAM读锁会阻塞写,不会阻塞读。写锁会把读写都阻塞。
show STATUS LIKE 'table%';
行锁
偏向innodb存储
索引失效行锁变表锁
间隙锁
范围查询,InnoDB会给符合条件的已有数据的索引项加锁,对于在范围条件内但并不存在的记录,叫做间隙锁。即使键值不存在。