二、文件

196 阅读3分钟

数据库有哪些文件?

  • 参数文件:告诉 MySQL 启动时在哪里可以找到数据库文件,并指定某些初始化参数,定义了某种内存结构的大小等设置。
  • 日志文件:记录 MySQL 实例对某种条件作出响应时写入的文件,如错误日志文件、二进制日志文件、慢查询日志文件、查询日志文件等。
  • socket 文件:当用 UNIX 域套接字方式进行连接时需要的文件。
  • pid 文件:MySQL 实例的进程 ID 文件。
  • MySQL 表结构文件:存放 MySQL 表结构定义文件。
  • 存储引擎文件:用于存储记录和索引等数据。

1. 二进制日志 - binary log

  记录了对数据库执行更改的所有操作,但是不包括 SELECT 和 SHOW 这类操作,因为这类操作对数据本身没有修改。
作用:

  • 恢复(recovery):某些数据的恢复需要二进制日志,例如,在一个数据库全备文件恢复后,可以通过二进制日志进行 point-in-time 的恢复。
  • 复制(replication):通过复制和执行二进制日志使一台远程的 MySQL 数据库(slave) 与一台 MySQL 数据库(Master)进行实时同步。
  • 审计(audit):用户可以通过日志中的信息来进行审计,判断是否有对数据库进行注入的攻击。   默认情况下,二进制日志不是在每次写的时候同步到磁盘,因此在操作系统宕机时,可能有一部分数据没有写入binlog,这会给恢复和赋值带来问题。

binlog的写入格式:STATEMENT、ROW、MIX
STATEMENT
  记录的是逻辑 SQL 语句。
ROW
  记录表的行更改情况(完整的SQL),可以为数据库的恢复和复制带来更好的可靠性,但会使文件大小增加。
MIX
  默认采用 STATEMENT 格式记录,一些情况下使用 ROW 格式:

  • 使用了 UUID()、USER()、CURRENT_USER()、FOUND_ROWS()、ROW_COUNT()等不确定函数。
  • 使用了 INSERT DELAY 语句
  • 使用了用户定义函数(UDF)
  • 使用了临时表

2. 重做日志文件 - redo log

  记录对于 InnDB 存储引擎的事务日志。
  当实例或介质失败时,重做日志可以恢复到失败前的时刻,以此来保证数据的完整性。
  每个重做日志大小一致,以循环写入的方式运行。

binlog 与 redo log 的区别?
  • binlog 会记录所有与数据库有关的日志记录,包括各种存储引擎的日志,而 redo log 只记录 InnoDB 本身的事务日志。
  • 内容不同,binlog 记录的是关于一个事务的具体操作内容(逻辑日志),而 redo log 记录的是关于每个页的更改的物理情况。
  • 写入时间不同, binlog 仅在事务提交前进行提交,即只写入磁盘一次,无论这时该事务多大。 而在事务进行过程中,不断有重做日志条目(redo entry)被写入到redo log 中。

  写入 redo log 的操作不是直接写,而是先写入重做日志缓冲(redo log buffer)中, 然后按照一定条件顺序地写入日志文件。
  从重做日志缓冲往磁盘写入时,是按512个字节即一个扇区(写入最小单位)的大小进行写入,因此可以保证写入必定成功,因此在redo log 的写入过程中不需要有 doublewrite。