面试题答案
一键面试MySQL
- 日志机制
- 重做日志(Redo Log):
- 作用:记录数据库物理层面的修改操作,用于崩溃恢复(crash - recovery)。当系统崩溃后,MySQL可以通过重做日志将未完成的事务回滚,并将已提交的事务重新应用,从而保证已提交事务的持久性。
- 写入方式:采用循环写的方式,空间使用完后会覆盖旧的日志。
- 二进制日志(Binlog):
- 作用:记录数据库逻辑层面的修改操作,主要用于主从复制(replication)和数据备份恢复。它记录了数据库的所有修改语句,使得从库可以通过重放这些日志来保持与主库的数据一致性,也可以用于基于日志的恢复(Point - in - Time Recovery, PITR)。
- 写入方式:采用追加写的方式,不会覆盖旧日志。
- 重做日志(Redo Log):
- 两阶段提交(2PC):协调Redo Log和Binlog的写入,确保两者的一致性。
- 阶段一(Prepare阶段):事务开始时,InnoDB存储引擎将Redo Log写入磁盘,并将事务状态标记为Prepared。
- 阶段二(Commit阶段):如果所有相关操作都成功,MySQL将Binlog写入磁盘,然后InnoDB存储引擎将事务标记为Committed,完成事务提交。如果在任何阶段出现故障,MySQL可以根据日志状态进行回滚或恢复。
PostgreSQL
- 预写式日志(Write - Ahead Logging, WAL):
- 作用:与MySQL的重做日志类似,记录数据库物理层面的修改操作,用于崩溃恢复。它确保在数据页被实际修改之前,对应的日志记录已经被写入磁盘。这样,当系统崩溃后,PostgreSQL可以通过重放WAL日志将未完成的事务回滚,并将已提交的事务重新应用,保证已提交事务的持久性。
- 写入方式:采用追加写的方式,不会覆盖旧日志。日志文件按照一定的规则进行编号和归档,便于管理和恢复。
- 检查点(Checkpoint):
- 作用:定期将脏数据页(已修改但未写入磁盘的数据页)从内存缓冲区刷新到磁盘。它在日志中标记一个点,在这个点之前的所有日志记录对应的修改都已经被持久化到磁盘。当系统崩溃恢复时,只需要从最近的检查点之后的日志记录开始重放,而不需要重放整个日志,从而加快恢复速度,同时也确保了事务的持久性。
- 操作:PostgreSQL会根据配置的检查点间隔时间或日志文件数量等条件触发检查点操作。