面试题答案
一键面试1. GTID工作原理概述
- GTID(全局事务标识符)是一个在主从复制环境中唯一标识每个事务的编号。每个GTID由两部分组成:源服务器的UUID和事务编号。例如,
55879c9a-3c9c-11e6-8d0d-002590496610:1
,其中55879c9a-3c9c-11e6-8d0d-002590496610
是源服务器的UUID,1
是该服务器上的事务编号。 - 当一个事务在主库执行并提交时,它会被分配一个GTID。这个GTID会被记录在二进制日志(binary log)中,同时也会更新到
mysql.gtid_executed
系统表中。从库在复制主库的日志时,会根据GTID来识别和应用事务,确保从库与主库的数据一致性。
2. 故障恢复过程确保事务一致性和完整性的机制
- 崩溃恢复(Crash Recovery):
- MariaDB使用InnoDB存储引擎,InnoDB有崩溃恢复机制。在系统崩溃后,InnoDB会根据重做日志(redo log)和回滚日志(undo log)来恢复到崩溃前的状态。
- 重做日志:在事务执行过程中,InnoDB会将修改操作记录到重做日志中。这些记录是顺序写入的,效率较高。当系统崩溃后,InnoDB会从重做日志中读取记录,重新执行那些已经提交但未完全持久化到数据文件的事务,从而确保已提交事务的修改被持久化,保证事务的持久性(Durability)。
- 回滚日志:记录了事务执行过程中的反向操作。当系统崩溃时,对于那些未提交的事务,InnoDB会根据回滚日志中的记录撤销这些未完成事务对数据的修改,确保事务的原子性(Atomicity),即未提交的事务不会对数据造成影响。
- GTID与崩溃恢复的结合:
- 在崩溃恢复完成后,MariaDB会利用GTID机制来进一步确保主从复制环境下的数据一致性。
- MariaDB会检查
mysql.gtid_executed
系统表,该表记录了已经执行过的GTID集合。如果在崩溃前有部分事务已经写入二进制日志但未完全应用到从库,在恢复后,主库会根据mysql.gtid_executed
中的记录,向从库重新发送这些未应用的事务对应的二进制日志,从库根据GTID来准确识别并应用这些事务,从而保证主从数据的一致性。
3. 涉及的关键日志和机制
- 二进制日志(Binary Log):记录了数据库的所有修改操作,用于主从复制和数据恢复。在故障恢复后,主库通过二进制日志向从库发送未应用的事务。
- 重做日志(Redo Log):用于崩溃恢复,确保已提交事务的修改在系统崩溃后能够重新应用,保证事务的持久性。
- 回滚日志(Undo Log):用于回滚未提交的事务,在系统崩溃后撤销未完成事务的修改,保证事务的原子性。
- GTID机制:通过唯一标识每个事务的GTID,确保在主从复制环境中事务的准确应用和数据一致性,特别是在故障恢复后,帮助主从库同步未完成的事务。
mysql.gtid_executed
系统表:记录了已经执行过的GTID集合,是MariaDB在故障恢复后进行主从同步的重要依据。