MySQL数据库物理文件架构组成各种工具详解

MySQL物理文件组成——日志文件——错误日志(Error Log)

错误日志记录了MyQL服务器运行过程中所有较为严重的警告和错误信息,以及每次启动和关闭的详细信息。
错误日志记录功能默认是关闭的,错误信息默认被输出到标准错误输出(stderr);
可以在启动时加上--log-error参数,开启系统记录错误日志的功能。

错误日志默认存放在数据目录下,以hostname.err命名。
--log-error[=file_name]可以修改存放目录和文件名。

MySQL的FLUSH LOGS命令会将错误日志做备份并重新开始记录,MySQL会备份旧日志文件并生成新的日志文件。备份文件名以“.old”结尾。

MySQL物理文件组成——日志文件——二进制日志:Binary Log & Binary Log Index

--log-bin[=file_name]开启二进制日志记录功能,MySQL会将所有修改数据库数据的Query以二进制形式记录到日志文件中,还包括每一条Query所执行的时间,所消耗的资源,以及相关的事务信息,binlog是事务安全的。

binlog记录功能默认是关闭的:

  • --log-bin:在数据目录下生成为mysql-bin.******(*代表0~9之间的某一个数字,表示该日志的序号)文件;
  • --log-bin[=file_name]

--max_binlog_size:设置binlog的最大存储上限,当日志达到该上限时,MySQL会重新创建一个日志开始继续记录。
产生超出该设置的binlog的原因:在即将达到上限时,产生一个较大的事务,为了保证事务安全,MySQL不会将同一个事务分开记录到两个binlog中。
--binlog-do-db=db_name:须要对某个(db_name)数据库记录binlog,MySQL会忽略针对其他数据库,而仅仅记录指定数据库执行的Query。
--binlog-ignore-db=db_name:与--binlog-do-db=db_name完全相反,它显式指定忽略某个(db_name)数据库的binlog记录,在指定了这个参数之后,MySQL会记录指定数据库以外所有数据库的binlog。

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

--binlog-ignore-db=db_name--binlog-do-db=db_name注意事项

参数中的db_name不是指Query语句更新的数据所在的数据库,而是执行Query时所处的数据库。
不论更新哪个数据库的数据,MySQL仅仅比较当前连接所处的数据库(通过use db_name切换后所在的数据库)与参数设置的数据库名,而不会分析Query语句更新数据所在的数据库。

MySQL物理文件组成——日志文件——更新日志(update log)

更新日志在较老版本上使用的,类似binlog,不过不是以二进制格式来记录,而是以简单的文本格式记录内容。
自从增加了binlog功能之后,就很少使用更新日志了。
从版本5.0开始,MySQL已经不再支持更新日志。

MySQL物理文件组成——日志文件——查询日志(query log)

记录所有的Query。
加上--log[=fina_name]参数开启该功能。
记录了所有的Query(包括所有的select),体积较大,开启后对性能有较大影响,慎用该功能。
只在跟踪某些特殊的Query性能问题时才会短暂打开该功能。
默认的查询日志文件名为hostname.log

MySQL物理文件组成——日志文件——慢查询日志(slow query log)

记录执行时间较长的Query(Slow Query)
--log-slow-queries[=file_name]开启该功能,默认文件名为hostname-slow.log,默认目录是数据目录。

慢查询日志采用简单的文本格式,可以通过文本编辑器查看内容。
慢查询日志还记录了语句执行的时刻,执行所消耗的时间,执行用户,连接主机等信息。

MySQL提供了专门用来分析慢查询日志的工具mysqlslowdump。

MySQL物理文件组成——日志文件—— 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物理文件组成——日志文件——数据文件

每一个数据库都会在定义好(或默认)的数据目录下存在一个以数据库名字命名的文件夹,用来存放该数据库中的各种表数据文件。
不同的存储引擎有各自不同的数据文件,存放位置也有区别。
多数存储引擎的数据文件都存放在和MyISAM数据文件位置相同的目录下,但是每个数据文件的扩展名却各不一样:MyISAM用“.MYD”作为扩展名,InnoDB用“.ibd”,Archive用“.arc”,CSV用“.CSV”。

MySQL物理文件组成——数据文件——“.frm”文件

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

MySQL物理文件组成——数据文件——“.MYD”文件(MyISAM存储引擎)

“.MYD”文件存放MyISAM表的数据。
每一个MyISAM表都会有一个“.MYD”文件与之对应,它存放于所属数据库的文件夹下,和“.frm”文件在一起。

MySQL物理文件组成——数据文件——“.MYI”文件(MyISAM存储引擎)

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

MySQL物理文件组成——数据文件——“.ibd”文件和ibdata文件

存放InnoDB的数据(包括索引)。
InnoDB可以通过配置决定是使用共享表空间存放存储数据,还是用独享表空间存放存储数据。
独享表空间存储方式使用“.ibd”文件来存放数据,且每个表一个“.ibd”文件,文件存放在和MyISAM数据相同的位置。
共享存储表空间会使用ibdata文件,所有表共同使用一个(或者多个,可自行配置)ibdata文件。
ibdata文件可以通过innodb_data_home_dirinnodb_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文件能够配置成自动扩展类型。
修改共享表空间配置须重启MySQL。

修改独享表空间配置,无需重启MySQL。

个人更倾向于使用独享表空间存储方式。

MySQL物理文件组成——Replication相关文件——master.info文件

master.info文件存在于Slave端的数据目录下,里面存放了该Slave的Master端的相关信息,包括Master的主机地址、连接用户、连接密码、连接端口、当前日志位置、已经读取到的日志位置等。

MySQL物理文件组成——Replication相关文件——relay log和relay log index

mysql-relay-bin.xxxxxn文件用于存放Slave端的I/O线程从Master端所读取的Binary Log信息,然后由Slave端的QL线程从该relay log中读取并解析相应的日志信息,转化成Master所执行的Query语句,接着在Slave端应用。
mysql-relay-bin.index类似mysql-bin.index,记录日志存放位置的绝对路径,它所记录Relay Log。

MySQL物理文件组成——Replication相关文件——relay-log.info文件

relay-log.info文件存放通过Slave的I/O线程写入本地的relay log相关信息,以便Slave端的SQL线程及某些管理操作随时能够获取当前复制的相关信息。

MySQL物理文件组成——其他文件——system config file

MySQL系统配置文件是“my.cnf”,Unix/Linux下存放于“/etc”,Windows下存放于“c:/windows”。
“my.cnf”文件中包含多种参数选项组(group),每一种参数组都通过中括号给了固定的组名,如“[mysqld]”组中包括了mysqld服务启动时候的初始化参数,“[client]”组中包含着客户端工具程序可以读取的参数,此外还有其他针对各个客户端软件的特定参数组,如mysql程序使用的“[mysql]”,mysqlchk使用的“[mysqlchk]”。
如果编写了某个客户端程序,也可以设定一个参数组名,将相关参数配置在里面,然后调用mysql客户端api程序中的参数读取api相关参数。

MySQL物理文件组成——其他文件——pid文件

pid文件是mysqld在Unix/Linux下的一个进程文件,存放着自己的进程id。

MySQL物理文件组成——其他文件——Socket文件

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

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

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

MySQL Server系统架构——SQL Layer子模块——初始化模块

初始化模块在MySQL Server启动的时候,对整个系统做各种各样的初始化操作,比如各种buffer、cache结构的初始化和内存空间的申请,各种系统变量的初始化设定,各种存储引擎的初始化设置。

MySQL Server系统架构——SQL Layer子模块——核心API

核心API模块提供一些需要非常高效的底层操作功能的优化实现,包括各种底层数据结构的实现,特殊算法的实现,字符串处理,数字处理,小文件I/O,格式化输出,以及最重要的内存管理部分。
核心API模块的源代码都在mysys和strings文件夹下。

MySQL Server系统架构——SQL Layer子模块——网络交互模块

底层网络交互模块抽象出底层网络交互所使用的接口api,实现底层网络数据的接收与发送,以方便其他各个模块调用,以及对这一部分的维护。
所有源码都在vio文件夹下。

MySQL Server系统架构——SQL Layer子模块——Client & Server交互协议模块

任何C/S结构的软件系统,都会有自己独有的信息交互协议。
MySQL的Client & Server交互协议模块,实现了客户端与MySQL交互过程中的所有协议。
这些协议都是建立在现有的OS和网络协议之上的,如TCP/IP及Unix Socket。

MySQL Server系统架构——SQL Layer子模块——用户模块

用户的登录连接权限控制、用户的授权管理。

MySQL Server系统架构——SQL Layer子模块——访问控制模块

访问控制模块实时监控客户端的每一个操作,给不同的客户端不同的权限。
访问控制模块:根据用户模块中各用户的授权信息,以及数据库自身特有的各种约束,来控制用户对数据的访问。
用户模块和访问控制模块两者结合起来,组成了MySQL整个数据库系统的权限安全管理功能。

MySQL Server系统架构——SQL Layer子模块——连接管理、连接线程和线程管理

连接管理模块负责监听对MySQL Server的各种请求,接收连接请求,转发所有连接请求到线程管理模块。
每一个连接上MySQL Server的客户端请求都会被分配(或创建)一个连接线程为其单独服务。
连接线程负责MySQL Server与客户端的通信,接受客户端的命令请求,传递Server端的结果信息等。
线程管理模块负责管理维护这些连接线程,包括线程的创建,线程的缓存(cache)等。

MySQL Server系统架构——SQL Layer子模块——Query解析和转发模块

Client端发送给Server端的命令都称为Query。
连接线程接收到客户端的一个Query后,会直接将该Query传递给专门负责将各种Query进行分类(Query解析),然后转发给各个对应的处理模块(转发模块)。
将Query语句进行语义和语法的分析,然后按照不同的操作类型进行分类,接着做出针对性的转发。

MySQL Server系统架构——SQL Layer子模块——Query Cache模块

Query Cache模块是一个非常重要的模块,将客户端提交给MySQL的Select类Query请求的返回结果集缓存(cache)到内存中,与该Query的一个hash值做一个对应。
在该Query所取数据的基表发生任何数据的变化之后,MySQL会自动使该Query的缓存失效。
在读写比例非常高的应用系统中,Query Cache对性能的提高是非常显著的。
它对内存的消耗也是非常大的。

MySQL Server系统架构——SQL Layer子模块——Query优化器模块

Query优化器:优化客户端请求的Query,根据客户端请求的Query语句和数据库中的一些统计信息,在一系列算法的基础上进行分析,得出一个最优的策略,告诉后面的程序如何取得这个Query语句的结果。

MySQL Server系统架构——SQL Layer子模块——表变更管理模块

表变更管理模块主要是负责完成一些DML和DDL的Query,如:update、delte、insert、create table、alter table等语句的处理。

MySQL Server系统架构——SQL Layer子模块——表维护模块

表的状态检查,错误修复,以及优化和分析等工作都是表维护模块须要做的事情。

MySQL Server系统架构——SQL Layer子模块——系统状态管理模块

系统状态管理模块负责在客户端请求系统状态的时候,将各种状态数据返回给用户,像show status、show variables等。

MySQL Server系统架构——SQL Layer子模块——表管理器

这个模块从名字上很容易和表变更和表维护模块相混淆,但是其功能与变更及维护模块完全不同。
每一个MySQL的表都有一个表的定义文件(*.frm文件)。
表管理器的工作主要就是维护这些文件,以及一个cache,该cache中的主要内容是各个表的结构信息。此外它还维护table级别的锁管理。

MySQL Server系统架构——SQL Layer子模块——日志记录模块

日志记录模块主要负责整个系统级别的逻辑层的日志的记录,包括error log、binary log、slow query log。

MySQL Server系统架构——SQL Layer子模块——复制模块

复制模块分为Master模块和Slave模块两部分,Master模块主要负责在Replication环境中读取Master端的binary日志,以及与Slave端的I/O线程交互等工作。
Slave模块有两个线程。一个是负责从Master请求和接受binary日志,并写入本地relay log中的I/O线程。另外一个是负责从relay log中读取相关日志事件,然后将其解析成可以在Slave端正确执行并得到和Master端完全相同结果的命令,再交给Slave执行的SQL线程。

MySQL Server系统架构——SQL Layer子模块——存储引擎接口模块

目前各种数据库产品中,只有MySQL实现了底层数据存储引擎的插件式管理。
这个模块实际上只是一个抽象类,但正是它成功地将各种数据处理高度抽象化,成就了MySQL可插拔存储引擎的特色。

各模块工作配合

在启动MySQL命令之后,MySQL的初始化模块从系统配置文件中读取系统参数和命令行参数,并按照参数来初始化整个系统,如申请并分配buffer,初始化全局变量,以及各种结构等。同时各个存储引擎也被启动,并进行各自的初始化工作。在整个系统初始化结束后,会由连接管理模块接手。连接管理模块会启动处理客户端连接请求的监听程序,包括TCP/IP的网络监听,还有Unix的Socket。这时候,MySQL Server就基本完成启动,准备好接受客户端请求了。

当连接管理模块监听到客户端的连接请求(借助网络交互模块的相关功能)时,双方通过Client & Server交互协议模块所定义的协议“寒暄”几句之后,连接管理模块就会将连接请求转发给线程管理模块,去请求一个连接线程。
线程管理模块马上又会将控制交给连接线程模块,告诉连接线程模块:现在有连接请求过来了,须要建立连接。连接线程模块在接到连接请求后,首先会检查当前连接线程池中是否有被缓存(cache)的空闲连接线程,如果有,就取出一个和客户端请求连接上,如果没有空闲的连接线程,则建立一个新的连接线程向客户端请求连接。
连接线程模块并不是在收到连接请求后马上就会取出一个连接线程和客户端连接,而是首先通过调用用户模块进行授权检查,只有客户端请求通过了授权检查后,它才会将客户端请求和负责请求的连接线程连上。
在MySQL中,将客户端请求分为了两种类型:一种是Query,须要调用Parser也就是Query解析和转发模块的解析才能够执行的请求;一种是command,不须要调用Parser就可以直接执行的请求。
如果初始化配置中打开了Full Query Logging的功能,那么Query解析与转发模块会调用日志记录模块将请求记入日志,不管是一个Query类型的请求还是一个command类型的请求,都会被记入日志,出于性能考虑,很少打开Full Query Logging的功能。
在客户端请求和连接线程“互换暗号(互通协议)”接上头之后,连接线程就开始处理客户端请求发送过来的各种命令(或者Query),并接受相关请求。它将收到的Query语句转给Query解析器和转发模块,Query解析器先对Query进行基本的语义和语法解析,然后根据命令类型的不同,有些会直接处理,有些会分发给其他模块处理。
如果是一个Query类型的请求,它将控制权交给Query解析器。Query解析器首先分析是不是一个select类型的Query,如果是,则调用查询缓存模块,让它检查该Query在Query cache中是否已经存在。如果有,则直接将cache中的数据返回给连接线程模块,然后通过与客户端的连接线程将数据传输给客户端。如果是一个不能被缓存(cache)的Query类型,或者cache中没有该Query的数据,那么Query将被继续传回Query解析器,让Query解析器进行相应处理,再通过Query分发器分发给相关处理模块。
如果解析器的解析结果是一条未被缓存(cache)的SELECT语句,则它会将控制权交给Optimizer(Query优化器模块),如果是DML或是DDL语句,则会交给表变更管理模块,如果是一些更新统计信息、检测、修复和整理类的Query,则会交给表维护模块去处理,若是与复制相关的Query则转交给复制模块去进行相应的处理,请求状态的Query则转交给了状态收集报告模块。实际上表变更管理模块根据所对应的处理请求的不同,分别由insert处理器、delete处理器、update处理器、create处理器,以及alter处理器这些小模块来负责不同的DML和DDL。
在各个模块收到Query解析与分发模块分发过来的请求后,首先会通过访问控制模块检查连接用户是否有访问目标表及目标字段的权限。如果有,就会调用表管理模块请求相应的表,并获取对应的锁。表管理模块首先会查看该表是否已经存在于table cache中,如果已经打开则直接进行锁相关的处理,如果没有在cache中,则须要再打开表文件获取锁,然后将打开的表交给表变更管理模块。
在表变更管理模块“获取”打开的表之后,就会根据该表的相关meta信息,判断表的存储引擎类型和其他相关信息。根据表的存储引擎类型,提交请求给存储引擎接口模块,调用对应的存储引擎实现模块,进行相应处理。
不过,对于表变更管理模块来说,可见的仅是存储引擎接口模块所提供的一系列“标准”接口,底层存储引擎实现模块的具体实现,对于表变更管理模块来说是透明的。他只须要调用对应的接口,并指明表类型,接口模块就会根据表类型调用正确的存储引擎来进行相应的处理。
在一条Query或一个command处理完成(成功或者失败)之后,控制权都会交还给连接线程模块。如果处理成功,则将处理结果(可能是一个Result set,也可能是成功或失败的标识)通过连接线程反馈给客户端。如果处理过程中发生错误,也会将相应的错误信息发送给客户端,然后连接线程模块会进行相应的清理工作,并继续等待后面的请求,重复上面的过程,或者完成客户端断开连接的请求。
如果在上面的过程中,相关模块使数据库中的数据发生了变化,而且MySQL打开了bin-log功能,则对应的处理模块还会调用日志处理模块,将相应的变更语句以更新事件的形式记录到相关参数指定的二进制日志文件中。
在上面各个模块的处理过程中,各模块的核心运算处理功能部分都会高度依赖整个MySQL的核心API模块,比如内存管理、文件I/O、数字和字符串处理等。

MySQL自带工具——mysql

mysql类似Oracle的sqlplus,为用户提供一个命令行接口来操作管理MySQL服务器。

mysql --help

MySQL自带工具——mysql——-e, --execute=name

只要执行“-e”后面的某个命令,而不是要通过mysql连接登录到MySQL Server上面。
此参数在写一些基本的MySQL检查和监控的脚本中非常有用。

MySQL自带工具——mysql——-E, --vertical

登入之后的所有查询结果都将以纵列显示,效果和在一条query之后以“\G”结尾一样。

MySQL自带工具——mysql——-H, --html-X, --xml

在启用这两个参数之后,select出来的所有结果都会按照“Html”与“Xml”格式输出。

MySQL自带工具——mysql——--prompt=name

定制mysql提示符。
在默认情况下,通过mysql登入数据库之后,mysql的提示符——“mysql>”,没有其他任何附加信息。
可以通过配置显示登入的主机地址、登录用户名、当前时间、当前数据库schema、MySQL Server等信息。
--prompt='\\u@\\h : \\d \\r:\\m:\\s>':

“sky@localhost : test 04:25:45>”

MySQL自带工具——mysql——--tee=name

将所有输入和输出内容都记录到文件里。

MySQL自带工具——mysql——-U, --safe-updates--select_limit=#--max_join_size=#

与性能相关的参数。
-U, --safe-updates:将禁止所有不能使用索引UPDATE和DELETE操作的请求,
--select_limit=#:使用前提是有“-U, --safe-updates”参数,限制查询记录的条数,
--max_join_size=#:与“-U, --safe-updates一起使用,限制参与join的最大记录数。

MySQL自带工具——mysql——--show-warnings

在执行完每一条query之后自动执行一次“show warnings”,显示出最后一次warning的内容。

MySQL自带工具——mysql——总结

mysql支持非常多的参数选项,有其自身的参数,也有提交给MySQL Server的。
mysql的所有参数选项都可以写在my.cnf[mysql]参数group中,还有部分连接选项参数会从[client]参数group中读取。

MySQL自带工具—— mysqladmin

Usage: mysqladmin [OPTIONS] command command ...

mysqadmin提供与MySQL管理相关的各种功能。如MySQL Server状态检查,各种统计信息的flush,创建/删除数据库,关闭MySQL Server。
mysqladmin能做的事情,大部分都可以通过mysql连接登录MySQL Server之后来完成,但是通过mysqladmin来完成操作会更简单更方便。

MySQL自带工具—— mysqladmin——ping命令

检测MySQL Server是否还能正常提供服务

mysqladmin -u sky -ppwd -h localhost ping
mysqld is alive

MySQL自带工具—— mysqladmin——status命令

获取当前MySQL Server的基本状态值:

mysqladmin -u sky -ppwd -h localhost status
Uptime: 20960  Threads: 1  Questions: 75  Slow queries: 0  Opens: 15  Flush tables:
1  Open tables: 9  Queries per second avg: 0.3

MySQL自带工具—— mysqladmin——processlist

获取当前数据库的连接线程信息:

mysqladmin -u sky -ppwd -h localhost processlist
+----+------+-----------+----+---------+------+-------+------------------+
| Id | User | Host      | db | Command | Time | State | Info             |
+----+------+-----------+----+---------+------+-------+------------------+
| 48 | sky  | localhost |    | Query   | 0    |       | show processlist |
+----+------+-----------+----+---------+------+-------+------------------+

MySQL自带工具—— mysqldump

Usage: mysqldump [OPTIONS] database [tables]
OR      mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR      mysqldump [OPTIONS] --all-databases [OPTIONS]

将MySQL Server中的数据以Query语句的形式导出(dump)成文本文件。MySQL的逻辑备份工具,Query生成导出工具
通过mysqldump所生成的文件,全部是Query语句,包括数据库和表的创建语句。
通过给mysqldump程序加“-T”选项参数,可以生成其他指定格式的文本文件。
这项功能实际上是调用MySQL中的“select * into OUTFILE from ...”语句实现的。
-d,--no-data”仅仅生成结构创建的语句。
当生成Query语句的时候,字符集设置这一项比较关键,建议每次执行mysqldump程序的时候都通过尽量做到“--default-character-set=name”显式指定字符集内容,防止以错误的字符集生成不可用的内容。
mysqldump所生成的SQL文件可以通过mysql工具执行。

MySQL自带工具——mysqlimport

Usage: mysqlimport [OPTIONS] database textfile ...

mysqlimport程序将以特定格式存放的文本数据(如“SELECT * INTO OUTFILE FROM ...”所生成的数据文件)导入指定的MySQL Server中,比如将一个标准的csv文件导入指定数据库的指定表中。
mysqlimport工具实际上只是“LOAD DATA INFILE”命令的一个包装实现。

MySQL自带工具——mysqlbinlog

Usage: mysqlbinlog [OPTIONS] log-files

分析MySQL Server产生的二进制日志。
通过之前备份的binlog做一些指定时间之类的恢复时,mysqlbinlog可以帮助找出恢复操作须要做哪些事情。
通过mysqlbinlog,可以把binlog中指定时间段或指定日志起始和结束位置的内容解析成Query语句,并导出到指定的文件中,在解析过程中,还可以通过指定数据库名称来过滤输出内容。

MySQL自带工具——mysqlcheck

Usage: mysqlcheck [OPTIONS] database [tables]
OR      mysqlcheck [OPTIONS] --databases DB1 [DB2 DB3...]
OR      mysqlcheck [OPTIONS] --all-databases

可以检查(check)、修复(repair)、分析(analyze)和优化(optimize)MySQL Server中的表,但并不是所有的存储引擎都支持这4项功能,像InnoDB就不支持修复功能。
mysqlcheck程序的这4项功能都可以通过mysql连接登录到MySQL Server之后来实现。

MySQL自带工具——myisamchk

Usage: myisamchk [OPTIONS] tables[.MYI]

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

MySQL自带工具——myisampack

Usage: myisampack [OPTIONS] filename ...

对MyISAM表进行压缩处理,以缩减占用的存储空间,主要用在归档备份的场景下,而且压缩后的MyISAM表会变成只读,不能进行任何修改操作。
当归档备份某些历史数据表,希望该表能够提供高效的查询服务时,就可以通过myisampack工具对MyISAM表进行压缩。
虽然更换成archive存储引擎也能够将表变成只读的压缩表,但是archive表是不支持索引的,而压缩后的MyISAM表仍然可以使用其索引。

MySQL自带工具——mysqlhotcopy

Usage: mysqlhotcopy db_name[./table_regex/] [new_db_name | directory]

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,通过给定匹配模式来中止客户端连接线程的mysql_zap,查看错误信息的perror,文本替换工具replace等一系列工具程序可供我们使用。
如果希望在MySQL源代码的基础上做一些自己的修改,如修改MyISAM存储引擎的时候,可以利用myisamlog来进行跟踪分析MyISAM的log。

小结

为什么MySQL实现不了在线DDL功能,可能很大程度上是因为SQL逻辑层与存储引擎实现层的过度解偶,造成很多信息在二者之间的传递存在一定的难度。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 197,368评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,941评论 2 374
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 144,369评论 0 326
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,848评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,719评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,505评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,904评论 3 388
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,528评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,819评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,848评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,652评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,468评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,912评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,095评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,389评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,906评论 2 343
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,120评论 2 339

推荐阅读更多精彩内容