MySQL1-2018年11月11日

MySQL物理文件组成:日志文件

错误日志 error log

错误日志记录MySQL Server启动信息、运行中较为严重的警告和错误信息、关闭信息。默认情况下该功能是关闭的,仅仅输出到标准错误输出stderr。如果开启该功能,则需要在启动时开启-log-error 选项。日志默认存放位置是在数据目录下以hostname.err 命名。但可以使用--log-error[=file_name]来修改其存放目录和文件名。

为了方便维护,可以利用MySQL 的FLUSH LOGS 命令来备份旧日志文件并生成新的日志文件。备份文件名以“.old”结尾。

二进制日志 binary log & binary log index

二进制日志也就是我们常说的binlog,默认关闭的。

当我们通过“--log-bin[=file_name]”开启记录功能后,MySQL 会将所有修改数据库数据的SQL以二进制形式记录到日志文件中。并且还包括每一条SQL所执行的时间、所消耗的资源、相关的事务信息,所以binlog是事务安全的。如果未指定file_name,MySQL则会在数据目录下记录为mysql-bin.******(*代表0~9 之间的某一个数字来表示该日志的序号)。

“--max_binlog_size”设置binlog 最大存储上限,当日志达到该上限时MySQL会重新创建一个日志开始继续记录。不过也有超出该设置的binlog 产生,一般都是因为在即将达到上限时产生了一个较大的事务,为了保证事务安全MySQL不会将同一个事务分开记录到两个binlog中。

“--binlog-do-db=db_name”设置对某个具体数据库(db_name)记录binlog,其他数据库binlog则不被记录。

“--binlog-ignore-db=db_name”与“--binlog-do-db=db_name”完全相反,指定忽略某个数据库(db_name)的binlog 记录,其他数据库会记录其binlog。

注意:“--binlog-ignore-db=db_name”与“--binlog-do-db=db_name”两个参数有一个共同的概念需要大家理解清楚,参数中的db_name 不是指query 语句更新的数据所在的数据库,而是执行query 的时候当前所处的数据库。不论更新哪个数据库的数据,MySQL仅仅比较当前连接所处的数据库(通过use db_name切换后所在的数据库)与参数设置的数据库名,而不会分析query语句所更新数据所在的数据库。

mysql-bin.index文件功能是记录所有Binary Log的绝对路径,保证MySQL各种线程能够顺利的根据它找到所有需要的Binary Log文件。

更新日志 update log

更新日志是MySQL在较老的版本上使用的,其功能和binlog 基本类似,只不过是以简单的文本格式记录内容。自从增加binlog功能之后就很少使用了。从版本5.0开始不支持该日志。

查询日志 query log

查询日志记录MySQL中所有的SQL,包括所有的select。通过“--log[=fina_name]”来开启。由于记录了所有的SQL,开启后对性能有较大的影响,慎用该功能。默认的查询日志文件名为hostname.log。

慢查询日志 slow query log

慢查询日志中记录的是执行时间较长的SQL。通过设--log-slow-queries[=file_name]来打开该功能并设置记录位置和文件名,默认文件名为hostname-slow.log,默认目录也是数据目录。

慢查询日志采用的是简单的文本格式,可以通过各种文本编辑器查看其中的内容。MySQL 还提供了专门用来分析满查询日志的工具程序mysqlslowdump来解决可能存在的性能问题。

Innodb 的在线redo 日志 innodb redo log

Innodb 是一个事务安全的存储引擎,其事务安全性主要就是通过在线redo 日志和记录在表空间中的undo 信息来保证的。redo 日志中记录了Innodb 所做的所有物理变更和事务信息,通过redo 日志和undo 信息,Innodb 保证了在任何情况下的事务安全性。Innodb 的redo日志同样默认存放在数据目录下,可以通过innodb_log_group_home_dir来更改设置日志的存放位置,通过innodb_log_files_in_group 设置日志的数量。

MySQL物理文件组成:数据文件

在MySQL 中每一个数据库都会在定义好(或者默认)的数据目录下存在一个以数据库名字命名的文件夹,用来存放该数据库中各种表数据文件。不同的MySQL 存储引擎有各自不同的数据文件,存放位置也有区别。多数存储引擎的数据文件都存放在和MyISAM 数据文件位置相同的目录下。

“.frm”文件

与表相关的元数据(meta)信息都存放在“.frm”文件中,包括表结构的定义信息等。不论是什么存储引擎,每一个表都会有一个以表名命名的“.frm”文件。所有的“.frm”文件都存放在所属数据库的文件夹下面。

“.MYD”文件

“.MYD”文件是MyISAM 存储引擎专用,存放MyISAM 表的数据。每一个MyISAM 表都会有一个“.MYD”文件与之对应,同样存放于所属数据库的文件夹下,和“.frm”文件在一起。

“.MYI”文件

“.MYI”文件也是专属于MyISAM 存储引擎的,主要存放MyISAM 表的索引相关信息。对于MyISAM 存储来说,可以被cache 的内容主要就是来源于“.MYI”文件中。每一个MyISAM表对应一个“.MYI”文件,存放于位置和“.frm”以及“.MYD”一样。

“.ibd”文件和ibdata 文件

这两种文件都是存放Innodb 数据的文件,存放Innodb 数据和索引,独享表空间存储方式使用“.ibd”文件来存放数据,每个表一个“.ibd”文件,文件存放在和MyISAM 数据相同的位置。共享存储表空间使用ibdata 文件来存放。ibdata 文件可以通过innodb_data_home_dir 和innodb_data_file_path两个参数共同配置组成, innodb_data_home_dir 配置数据存放的总目录, 而innodb_data_file_path 配置每一个文件的名称。也可以不配置innodb_data_home_dir而直接在innodb_data_file_path参数配置的时候使用绝对路径来完成配置。innodb_data_file_path 中可以一次配置多个ibdata 文件。文件可以是指定大小,也可以是自动扩展的,但是Innodb 限制了仅仅只有最后一个ibdata 文件能够配置成自动扩展类型。当我们需要添加新的ibdata 文件的时候,只能添加在innodb_data_file_path配置的最后,而且必须重启MySQL 才能完成ibdata 的添加工作。如果我们使用独享表空间存储方式的话,就不会有这样的问题,但是如果要使用裸设备的话,每个表一个裸设备,可能造成裸设备数量非常大,而且不太容易控制大小,实现比较困难,而共享表空间却不会有这个问题,容易控制裸设备数量。

MySQL物理文件组成:其他文件

system config file

MySQL 的系统配置文件一般都是“my.cnf”,Unix/Linux 下默认存放在"/etc"目录下,Windows 环境一般存放在“c:/windows”目录下面。“my.cnf”文件中包含多种参数选项组(group),每一种参数组都通过中括号给定了固定的组名,如“[mysqld]”组中包括了mysqld服务启动时候的初始化参数,也可以自定义一个参数组名,将相关参数配置在里面,然后调用mysql 客户端api 程序中的参数读取api读取相关参数。

pid file

pid file 是mysqld 应用程序在Unix/Linux 环境下的一个进程文件,和许多其他Unix/Linux 服务端程序一样,存放着自己的进程id。

socket file

socket 文件也是在Unix/Linux 环境下才有的,用户在Unix/Linux 环境下客户端连接可以不通过TCP/IP 网络而直接使用Unix Socket 来连接MySQL。

MySQL Server系统架构:逻辑模块组成

MySQL 可以看成是二层架构,第一层我们通常叫做SQL Layer,在MySQL 数据库系统处理底层数据之前的所有工作都是在这一层完成的,包括权限判断,sql 解析,执行计划优化,query cache 的处理等等;第二层就是存储引擎层,我们通常叫做Storage Engine Layer,也就是底层数据存取操作实现部分,由多种存储引擎共同组成。

MySQL自带工具

mysql

mysql 的功能为用户提供一个命令行接口来操作管理MySQL 服务器。

mysqladmin

提供的功能都是与MySQL 管理相关的各种功能,虽然大部分都可以通过mysql 连接登录上MySQL Server 之后来完成,但是大部分通过mysqladmin 来完成操作会更简单更方便。

mysqldump

功能就是将MySQL Server中的数据以SQL 语句的形式从数据库中dump 成文本文件,包括数据、数据库和表的创建语句。通过“-T”参数可以生成非SQL 形式的指定文本文件,其原理就是MySQL的“select * into OUTFILE from ...”。也可以通过“-d,--no-data”仅仅生成结构创建的语句。在声称SQL 语句时建议每次执行mysqldump 程序的时候都通过尽量做到“--defaultcharacter-set=name”显式指定字符集内容,以防止以错误的字符集生成不可用的内容。

mysqlimport

mysqlimport是特定格式存放的文本数据(如通过“select * into OUTFILE from ...”所生成的数据文件)导入到指定的MySQL Server 中的工具程序,mysqlimport 工具实际上也只是“load data infile”命令的一个包装实现。

mysqlbinlog

mysqlbinlog 程序的主要功能就是分析MySQL Server 所产生的二进制日志(即binlog)。当我们希望通过之前备份的binlog 做一些指定时间之类的恢复的时,mysqlbinlog 就可以找到恢复操作需要做哪些事情。通过mysqlbinlog,我们可以解析出binlog 中指定时间段或者指定日志起始和结束位置的内容解析成SQL 语句,并导出到指定的文件中,在解析过程中,还可以通过指定数据库名称来过滤输出内容。

mysqlcheck

mysqlcheck工具程序可以检查(check),修复(repair),分析(analyze)和优化(optimize)MySQL Server 中的表,但并不是所有的存储引擎都支持这里所有的四个功能。实际上,mysqlcheck 程序的这四个功能都可以通过mysql 连接登录到MySQL Server 之后来执行相应命令完成完全相同的任务。

myisamchk

功能有点类似“mysqlcheck -c/-r”,对检查和修复MyISAM 存储引擎的表,但只能对MyISAM 存储引擎的索引文件有效,而且不用登录连接上MySQL Server 即可完成操作。

myisampack

对MyISAM 表进行压缩处理,以缩减占用存储空间,一般主要用在归档备份的场景下,而且压缩后的MyISAM 表会变成只读,不能进行任何修改操作。当我们希望归档备份某些历史数据表,而又希望该表能够提供较为高效的查询服务的时候,就可以通过myisampack 工具程序来对该MyISAM 表进行压缩,因为压缩后的MyISAM 表仍然可以使用其索引。

mysqlhotcopy

mysqlhotcopy 和其他的客户端工具程序不太一样的是他不是c(或者c++)程序编写的,而是一个perl 脚本程序,仅能在Unix/Linux 环境下使用。他的主要功能就是对MySQL 中的MyISAM 存储引擎的表进行在线备份操作,其备份操作实际上就是通过对数据库中的表进行加锁,然后复制其结构,数据和索引文件来完成备份操作,当然,也可以通过指定“--noindices”告诉mysqlhotcopy 不需要备份索引文件。

其他工具

MySQL还有自带了其他大量的工具程序,如针对离线Innodb文件做checksum的innochecksum,转换mSQL-C-API 函数的msql2mysql,dumpMyISAM全文索引的myisam_ftdump,分析处理slowlog的mysqldumpslow,查询mysql相关开发包位置和include文件位置的mysql_config,向MySQL AB报告bug的mysqlbug,测试套件mysqltest和mysql_client_test,批量修改表存储引擎类型的mysql_convert_table_format,能从更新日志中提取给定匹配规则的query语句的mysql_find_rows,更改MyIsam 存储引擎表后缀名的mysql_fix_extensions,修复系统表的mysql_fix_privilege_tables,查看数据库相关对象结构的mysqlshow,MySQL升级工具mysql_upgrade,通过给定匹配模式来kill客户端连接线程的mysql_zap,查看错误号信息的perror,文本替换工具replace等等一系列工具程序可供我们使用。如果您希望在MySQL源代码的基础上做一些自己的修改,如修改MyISAM 存储引擎的时候,可以利用myisamlog来进行跟踪分析MyISAM 的log。

猜你喜欢

转载自blog.csdn.net/attack_breast/article/details/83958219