MySQL进阶之MySQL数据库整体架构设计( 二 )


MySQL进阶之MySQL数据库整体架构设计

文章插图
磁盘写入方式对比
可以使用下面的命令查看这些文件的保存目录,如果没有另外指定,一般情况下在/var/lib/mysql目录下
show variables like '%datadir%';数据文件
这里主要介绍比较常用的两种存储引擎InnoDB和MyISAM的数据文件构成 。
InnoDB数据文件包括以下三种格式
  • .frm文件
主要存放与数据表相关的信息,包括表结构的定义信息
  • .ibd文件
使用独享表空间也就是用户表空间存储表数据和索引信息,一张表对应一个.ibd文件
  • ibdata文件
使用共享表空间也即系统表空间存储表数据和索引信息,所有表使用一个或多个ibdata文件,文件名一般加上后缀0...N,比如ibdata0,ibdata1等
MyISAM数据文件包括以下三种格式
  • .frm文件
主要存放与数据表相关的信息,包括表结构的定义信息
  • .myd文件
主要存储表数据信息
  • .myi文件
主要存储表数据文件中任何索引的数据数
日志文件
可以下面的命令查看日志的开启情况,开启或配置了对应的日志文件后,才会生成相应的日志文件 。
show variables like '%log_%';日志文件大概分7类,包括错误日志(error log)、二进制日志(bin log)、通用查询日志(general query log)、慢查询日志(slow query log)、重做日志(redo log)、回滚日志(undo log)、中继日志(relay log) 。
  • 错误日志(error log)
错误日志默认是开启的,从5.5.7版本开始以后无法关闭,错误日志记录了运行过程中遇到的所有严重错误信息,以及MySQL服务器每次启动和关闭的详细信息 。错误日志所记录的信息是可以通过log-error和log-warnings来定义的,其中log-err是定义是否启用错误日志的功能和错误日志的存储位置,log-warnings是定义是否将警告信息也定义至错误日志中 。
-- 可以直接定义为文件路径,也可以为ON|OFF,默认的错误日志名称:hostname.errlog_error=/var/log/mysqld.log-- 只能使用1|0来定义开关启动,默认是启动的log_warings=1
  • 二进制日志(bin log)
二进制日志记录数据在运行过程中的所有变化 。bin log通过存储数据库所有DDL和DML语句,但不包括SELECT语句,语句以事件的形式保存,描述了数据的变更顺序,bin log还包括了每个更新语句的执行时间信息 。如果是DDL语句,则直接记录到bin log日志,而DML语句,必须通过事务提交才能记录到bin log日志中 。默认是不开启的,需要手动开启 。产品环境建议开启 。
log-bin=mysql-bin也可以这样
log-bin=ON|OFFlog_bin_basename=mysql-bin-- 有必要也可以指定索引-- log_bin_index=mysql-bin.index其中mysql-bin是binlog日志文件的basename,binlog日志文件的完整名称:mysql-bin-000001.log
  • 通用查询日志(general query log)
通用查询日志记录运行过程中的所有内容,耗性能,一般产品化境中不开启 。可以通过下面的命令查看开通状态
show global variables like 'general_log';可以通过下面的配置开通日志
-- 启动开关general_log={ON|OFF}-- 日志文件变量,而general_log_file如果没有指定,默认名是host_name.loggeneral_log_file=/PATH/TO/file-- 记录类型log_output={TABLE|FILE|NONE}
  • 慢查询日志(slow query log)
记录执行较慢的select查询语句,用于SQL语句调优时开启,正常情况下不需要开启,默认亦是关闭的 。可以通过设置全局变量的方式开启
-- 开启慢查询日志slow_query_log=ON-- 慢查询的阈值long_query_time=3-- 日志记录文件如果没有给出file_name值,默认为主机名,后缀为-slow.log 。-- 如果给出了文件名,但不是绝对路径名,文件则写入数据目录 。slow_query_log_file=file_name以上的设置,记录执行时间超过long_query_time秒的所有查询语句
  • 重做日志(redo log)
事务相关的日志,ACID持久化,崩溃恢复相关 。
它用于确保事务的持久性,防止在发生故障的时间点,尚有脏页未写入磁盘,在重启mysql服务的时候,根据redo log进行重做,从而达到事务的持久性这一特性 。其记录的是物理数据页面的修改的信息,它是顺序写入redo log file的物理文件中去的 。
事务开始之后就产生redo log,redo log的落盘并不是随着事务的提交才写入的,而是在事务的执行
过程中,便开始写入redo log文件中 。
当对应事务的脏页写入到磁盘之后,redo log的使命也就完成了,重做日志占用的空间就可以重用(被覆盖) 。


推荐阅读