ch2 MySQL 架构组成

2 MySQL 架构组成

前言 html

麻雀虽小,五脏俱全。MySQL    虽然以简单著称,但其内部结构并不简单。本章从 MySQL 物理组成、逻辑组成,以及相关工具几个角度来介绍    MySQL    的总体架构组成,但愿可以让读者对    MySQL    有一个更全面深刻的了解。 mysql

21 MySQL 物理文件组成

2.1.1 日志文件

  1. 错误日志:Error    Log

错误日志记录了 MyQL    Server 运行过程当中全部较为严重的警告和错误信息,以及 MySQL Server 每次启动和关闭的详细信息。在默认状况下,系统记录错误日志的功能是关闭的,错误信息被输出到标准错误输出(stderr),若是要开启系统记录错误日志的功能,须要在启动时开启-log-error 选项。错误日志的默认存放位置在数据目录下,以 hostname.err 命名。可是可使用命令:--log-error[=file_name],修改其存放目录和文件名。 linux

为了方便维护须要,有时候会但愿将错误日志中的内容作备份并从新开始记录,这时候就能够利用 MySQL 的 FLUSH    LOGS 命令来告诉 MySQL 备份旧日志文件并生成新的日志文件。 c++

备份文件名以".old"结尾。 redis

  1. 二进制日志:Binary    Log    &    Binary    Log    Index

    二进制日志,也就是咱们常说的 binlog,也是 MySQL    Server 中最为重要的日志之一。 算法

当咱们经过"--log-bin[=file_name]"打开了记录的功能以后,MySQL 会将全部修改数据库数据的 query 以二进制形式记录到日志文件中。固然,日志中并不只限于 query 语句这么简单,还包括每一条 query 所执行的时间,所消耗的资源,以及相关的事务信息,因此 binlog 是事务安全的。 sql

和错误日志同样,binlog 记录功能一样须要"--log-bin[=file_name]"参数的显式指定才能开启,若是未指定 file_name,则会在数据目录下记录为 mysql-bin.******(*表明0~ 数据库

9 之间的某一个数字,来表示该日志的序号)。 windows

binlog 还有其余一些附加选项参数: api

"--max_binlog_size"设置 binlog 的最大存储上限,当日志达到该上限时,MySQL 会从新建立一个日志开始继续记录。不过偶尔也有超出该设置的 binlog 产生,通常都是由于在即将达到上限时,产生了一个较大的事务,为了保证事务安全,MySQL 不会将同一个事务分开记录到两个 binlog 中。

"--binlog-do-db=db_name"参数明确告诉 MySQL,须要对某个(db_name)数据库记录 binlog,若是有了"--binlog-do-db=db_name"参数的显式指定,MySQL 会忽略针对其余数据库执行的 query,而仅仅记录针对指定数据库执行的 query。

"--binlog-ignore-db=db_name"与"--binlog-do-db=db_name"彻底相反,它显式指定忽略某个(db_name)数据库的 binlog 记录,当指定了这个参数以后,MySQL 会记录指定数据库之外全部的数据库的 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    index)的功能是记录全部 Binary    Log 的绝对路径,保证    MySQL    各类线程可以顺利的根据它找到全部须要的 Binary    Log 文件。 三、更新日志:update    log

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

  1. 查询日志:query    log

查询日志记录 MySQL 中全部的 query,经过"--log[=fina_name]"来打开该功能。因为记录了全部的 query,包括全部的 select,体积比较大,开启后对性能也有较大的影响,因此请你们慎用该功能。通常只用于跟踪某些特殊的 sql 性能问题才会短暂打开该功能。默认的查询日志文件名为 hostname.log。

  1. 慢查询日志:slow    query    log

顾名思义,慢查询日志中记录的是执行时间较长的 query,也就是咱们常说的 slow

query,经过设--log-slow-queries[=file_name]来打开该功能并设置记录位置和文件名,默认文件名为 hostname-slow.log,默认目录也是数据目录。

慢查询日志采用的是简单的文本格式,能够经过各类文本编辑器查看其中的内容。其中记录了语句执行的时刻,执行所消耗的时间,执行用户,链接主机等相关信息。MySQL 还提供了专门用来分析满查询日志的工具程序 mysqlslowdump,用来帮助数据库管理人员解决可能存在的性能问题。

  1. 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 设置日志的数量。

2.1.2 数据文件

在 MySQL 中每个数据库都会在定义好(或者默认)的数据目录下存在一个以数据库名字命名的文件夹,用来存放该数据库中各类表数据文件。不一样的 MySQL 存储引擎有各自不一样的数据文件,存放位置也有区别。多数存储引擎的数据文件都存放在和 MyISAM 数据文件位置相同的目录下,可是每一个数据文件的扩展名却各不同。如 MyISAM 用".MYD"做为扩展名,Innodb 用".ibd",Archive 用".arc",CSV 用".csv",等等。

  1. ".frm"文件

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

  1. ".MYD"文件

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

  1. ".MYI"文件

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

  1. ".ibd"文件和 ibdata 文件

这两种文件都是存放 Innodb 数据的文件,之因此有两种文件来存放 Innodb 的数据(包括索引),是由于 Innodb 的数据存储方式可以经过配置来决定是使用共享表空间存放存储数据,仍是独享表空间存放存储数据。独享表空间存储方式使用".ibd"文件来存放数据,且每一个表一个".ibd"文件,文件存放在和 MyISAM 数据相同的位置。若是选用共享存储表空间来存放数据,则会使用 ibdata 文件来存放,全部表共同使用一个(或者多个,可自行配置)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 的添加工做。不过若是咱们使用独享表空间存储方式的话,就不会有这样的问题,可是若是要使用裸设备的话,每一个表一个裸设备 ,可能形成裸设备数量很是大,并且不太容易控制大小,实现比较困难,而共享表空间却不会有这个问题,容易控制裸设备数量。我我的仍是更倾向于使用独享表空间存储方式。固然,两种方式各有利弊,看你们各自应用环境的侧重点在那里了。

上面仅仅介绍了两种最经常使用存储引擎的数据文件,此外其余各类存储引擎都有各自的数据文件,读者朋友能够自行建立某个存储引擎的表作一个简单的测试,作更多的了解。

2.1.3 Replication 相关文件:

  1. master.info 文件:

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

  1. relay    log    和 relay    log    index

mysql-relay-bin.xxxxxn 文件用于存放    Slave    端的 I/O 线程从    Master    端所读取到的    Binary    Log    信息,而后由    Slave    端的    SQL    线程从该    relay    log    中读取并解析相应的日志信息,转化成    Master    所执行的    SQL    语句,而后在    Slave    端应用。

mysql-relay-bin.index 文件的功能相似于    mysql-bin.index ,一样是记录日志的存放位置的绝对路径,只不过他所记录的不是    Binary    Log,而是    Relay    Log。

  1. relay-log.info 文件:

相似于 master.info,它存放经过 Slave 的 I/O 线程写入到本地的 relay log 的相关信息。供 Slave 端的 SQL 线程以及某些管理操做随时可以获取当前复制的相关信息。

2.1.4    其余文件:

  1. 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 读取相关参数。

  1. pid    file

    pid    file 是 mysqld 应用程序 在 Unix/Linux 环境下的一个进程文件,和许多其余

Unix/Linux 服务端程序同样,存放着本身的进程 id。

  1. socket    file

socket 文件也是在 Unix/Linux 环境下才有的,用户在 Unix/Linux 环境下客户端链接

能够不经过 TCP/IP 网络而直接使用 Unix    Socket 来链接 MySQL。

22 MySQL Server 系统架构

2.2.1 逻辑模块组成

总的来讲,MySQL 能够当作是二层架构,第一层咱们一般叫作 SQL Layer,在 MySQL 数据库系统处理底层数据以前的全部工做都是在这一层完成的,包括权限判断,sql 解析,执行计划优化,query cache 的处理等等;第二层就是存储引擎层,咱们一般叫作 Storage Engine Layer,也就是底层数据存取操做实现部分,由多种存储引擎共同组成。因此,能够用以下一张最简单的架构示意图来表示 MySQL 的基本架构,如图 2-1 所示:

    图    2-1

虽然从上图看起来 MySQL 架构很是的简单,就是简单的两部分而已,但实际上每一层中都含有各自的不少小模块,尤为是第一层 SQL Layer,结构至关复杂的。下面咱们就分别针对 SQL Layer 和 Storage Engine Layer 作一个简单的分析。

    SQL    Layer 中包含了多个子模块,下面我将逐个作一下简单的介绍:

  1. 初始化模块

顾名思议,初始化模块就是在 MySQL    Server 启动的时候,对整个系统作各类各样的初始化操做,好比各类 buffer,cache 结构的初始化和内存空间的申请,各类系统变量的初始化设定,各类存储引擎的初始化设置,等等。

  1. 核心 API

核心 API 模块主要是为了提供一些须要很是高效的底层操做功能的优化实现,包括各类底层数据结构的实现,特殊算法的实现,字符串处理,数字处理等,小文件 I/O,格式化输出,以及最重要的内存管理部分。核心 API 模块的全部源代码都集中在 mysys 和 strings 文件夹下面,有兴趣的读者能够研究研究。

  1. 网络交互模块

底层网络交互模块抽象出底层网络交互所使用的接口 api,实现底层网络数据的接收与

发送,以方便其余各个模块调用,以及对这一部分的维护。全部源码都在 vio 文件夹下面。

  1. Client    &    Server    交互协议模块

任何 C/S 结构的软件系统,都确定会有本身独有的信息交互协议,MySQL 也 不例 外。MySQL 的 Client & Server 交互协议模块部分,实现了客户端与 MySQL 交互过程当中的全部协议。

固然这些协议都是创建在现有的 OS 和网络协议之上的,如 TCP/IP 以及 Unix    Socket。

  1. 用户模块

用户模块所实现的功能,主要包括用户的登陆链接权限控制和用户的受权管理。他就像

MySQL 的大门守卫同样,决定是否给来访者"开门"。

  1. 访问控制模块

造访客人进门了就能够想干吗就干吗么?为了安全考虑,确定不能如此随意。这时候就须要访问控制模块实时监控客人的每个动做,给不一样的客人以不一样的权限。访问控制模块实现的功能就是根据用户模块中各用户的受权信息,以及数据库自身特有的各类约束,来控制用户对数据的访问。用户模块和访问控制模块二者结合起来,组成了 MySQL 整个数据库系统的权限安全管理的功能。

  1. 链接管理、链接线程和线程管理

链接管理模块负责监听对 MySQL Server 的各类请求,接收链接请求,转发全部链接请求到线程管理模块。每个链接上 MySQL Server 的客户端请求都会被分配(或建立)一个链接线程为其单独服务。而链接线程的主要工做就是负责 MySQL Server 与客户端的通讯,接受客户端的命令请求,传递 Server 端的结果信息等。线程管理模块则负责管理维护这些链接线程。包括线程的建立,线程的 cache 等。

  1. Query 解析和转发模块

在 MySQL 中咱们习惯将全部 Client 端发送给 Server 端的命令都称为 query,在 MySQL Server 里面,链接线程接收到客户端的一个 Query 后,会直接将该 query 传递给专门负责将各类 Query 进行分类而后转发给各个对应的处理模块,这个模块就是 query 解析和转发模块。其主要工做就是将 query 语句进行语义和语法的分析,而后按照不一样的操做类型进行分类,而后作出针对性的转发。

  1. Query    Cache 模块

Query    Cache 模块在 MySQL 中是一个很是重要的模块,他的主要功能是将客户端提交给 MySQL 的 Select 类 query 请求的返回结果集 cache 到内存中,与该 query 的一个 hash 值作一个对应。该 Query 所取数据的基表发生任何数据的变化以后,MySQL 会自动使该 query 的 Cache 失效。在读写比例很是高的应用系统中,Query    Cache 对性能的提升是很是显著的。

固然它对内存的消耗也是很是大的。

  1. Query 优化器模块

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

  1. 表变动管理模块

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

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

系统状态管理模块负责在客户端请求系统状态的时候,将各类状态数据返回给用户,像 DBA 经常使用的各类 show status 命令,show variables 命令等,所获得的结果都是由这个模块返回的。

  1. 表管理器

这个模块从名字上看来很容易和上面的表变动和表维护模块相混淆,可是其功能与变动及维护模块却彻底不一样。你们知道,每个 MySQL 的表都有一个表的定义文件,也就是*.frm 文件。表管理器的工做主要就是维护这些文件,以及一个 cache,该 cache 中的主要内容是各个表的结构信息。此外它还维护 table 级别的锁管理。

  1. 日志记录模块

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

  1. 复制模块

复 制 模 块 又 可 分 为 Master 模 块 和 Slave 模 块 两 部 分 , Master 模 块 主 要 负 责 在

Replication 环境中读取 Master 端的 binary 日志,以及与 Slave 端的 I/O 线程交互等工做 。 Slave 模块比 Master 模块所要作的事情稍多一些,在系统中主要体如今两个线程上面。一个是负责从 Master 请求和接受 binary 日志,并写入本地 relay    log 中的 I/O 线程。另一个是负责从 relay    log 中读取相关日志事件,而后解析成能够在 Slave 端正确执行并获得和

Master 端彻底相同的结果的命令并再交给 Slave 执行的 SQL 线程。

  1. 存储引擎接口模块

存储引擎接口模块能够说是 MySQL 数据库中最有特点的一点了。目前各类数据库产品中,基本上只有 MySQL 能够实现其底层数据存储引擎的插件式管理。这个模块实际上只是一个抽象类,但正是由于它成功地将各类数据处理高度抽象化,才成就了今天 MySQL 可插拔存储引擎的特点。

2.2.2 各模块工做配合

在了解了 MySQL 的各个模块以后,咱们再看看 MySQL 各个模块间是如何相互协同工做的 。接下来,咱们经过启动 MySQL,客户端链接,请求 query,获得返回结果,最后退出,这样一整个过程来进行分析。

当咱们执行启动 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 打开了 binlog 功能,则对应的处理模块还会调用日志处理模块将相应的变动语句以更新事件的形式记录到相关参数指定的二进制日志文件中。

在上面各个模块的处理过程当中,各自的核心运算处理功能部分都会高度依赖整个 MySQL 的核心 API 模块,好比内存管理,文件 I/O,数字和字符串处理等等。

了解到整个处理过程以后,咱们能够将以上各个模块画成如图 2-2 的关系图:

    图    2-2

23 MySQL 自带工具使用介绍

MySQL 数据库不只提供了数据库的服务器端应用程序,同时还提供了大量的客户端工具程序,如 mysql,mysqladmin,mysqldump 等等,都是你们所熟悉的。虽然有些人对这些工具的功能都已经比较了解了,可是真正能将这些工具程序物尽其用的人可能并非太多,或者知道的不全,也可能并不彻底了解其中的某种特性。因此在这里我也简单地作一个介绍。

一、mysql

相信在全部 MySQL 客户端工具中,读者了解最多的就是 mysql 了,用的最多的应该也非

他莫属。mysql 的功能和 Oracle 的 sqlplus 同样,为用户提供一个命令行接口来操做管理 MySQL 服务器。其基本的使用语法这里就不介绍了,你们只要运行一下"mysql --help"就会获得以下相应的基本使用帮助信息:

sky@sky:~$    mysql    --help

mysql Ver 14.14 Distrib 5.1.26-rc, for pc-linux-gnu (i686) using EditLine wrapper

Copyright    (C)    2000-2008    MySQL    AB

This    software    comes    with    ABSOLUTELY    NO    WARRANTY.    This    is    free    software, and    you    are    welcome    to    modify    and    redistribute it    under    the    GPL    license

Usage:    mysql    [OPTIONS]    [database]

-?,    --help ...    ...

Display    this    help    and    exit.

-e,    --execute=name

Execute    command    and    quit.    (Disables    --force    and    history file)

-E,    --vertical ...    ...

Print    the    output    of    a    query    (rows)    vertically.

-H,    --html

Produce    HTML    output.

-X,    --xml ...    ...

Produce    XML    output

--prompt=name ...    ...

Set    the    mysql    prompt    to    this    value.

--tee=name

Append    everything    into    outfile.    See    interactive    help    (\h)

    also.    Does    not    work    in    batch    mode.    Disable    with

    --disable-tee. This    option    is    disabled    by    default.

...    ...

-U,    --safe-updates    Only    allow    UPDATE    and    DELETE    that    uses    keys.

--select_limit=#

Automatic    limit    for    SELECT    when    using    --safe-updates

--max_join_size=# ...    ...

Automatic    limit    for    rows    in    a    join    when    using

--safe-updates

--show-warnings

Show    warnings    after    every    statement.

...    ...

上面的内容仅仅只是输出的一部分,省略去掉了你们最经常使用的一些参数(由于你们应该已经很熟悉了),留下了部分我的认为可能不是太常常用到,可是在有些状况下却能给咱们带来意料以外的惊喜的一些参数选项。

首先看看"-e, --execute=name"参数,这个参数是告诉 mysql,我只要执行"-e"后面的某个命令,而不是要经过 mysql 链接登陆到 MySQL Server 上面。此参数在咱们写一些基本的 MySQL 检查和监控的脚本中很是有用,我我的就常常在脚本中使用到他。

若是在链接时候使用了"-E, --vertical"参数,登入以后的全部查询结果都将以纵列显示,效果和咱们在一条 query 以后以"\G"结尾同样,这个参数的使用场景可能不是特别多。

"-H, --html"与"-X, --xml"这两个参数颇有意思的,在启用这两个参数以后,select 出来的全部结果都会按照"Html"与"Xml"格式来输出,在有些场合之下,好比但愿 Xml 或者 Html 文件格式导出某些报表文件的时候,是很是方便的。

"--prompt=name"参数对于作运维的人来讲是一个很是重要的参数选项,其主要功能是定制本身的 mysql 提示符的显示内容。在默认状况下,咱们经过 mysql 登入到数据库以后 , mysql 的提示符只是一个很简单的内容"mysql>",没有其余任何附加信息。很是幸运的是 mysql 经过"--prompt=name"参数给咱们提供了自定义提示信息的办法,能够经过配置显示登入的主机地址,登陆用户名,当前时间,当前数据库 schema,MySQL    Server 的一些信息等等。我我的强烈建议将登陆主机名,登陆用户名和所在的 schema 这三项加入提示内容,由于当你们手边管理的 MySQL 愈来愈多,操做愈来愈频繁的时候,很是容易由于操做的时候没有太在乎本身当前所处的环境而形成在错误的环境执行了错误的命令并形成严重后果的状况。若是咱们在提示内容中加入了这几项以后,至少能够更方便的提醒本身当前所处环境 ,以尽可能减小犯错误的几率。

    我我的的提示符定义:    "\\u@\\h    :    \\d    \\r:\\m:\\s>    ",显示效果:

    "sky@localhost :    test    04:25:45>"

"--tee=name"参数也是对运维人员很是有用的参数选项,用来告诉 mysql,将全部输入和输出内容都记录进文件。在咱们一些较大维护变动的时候,为了方便被查,最好是将整个操做过程的全部输入和输出内容都保存下来。有了"--tee=name"参数,就不再用经过 copy 屏幕来保存操做过程了。

"-U, --safe-updates","--select_limit=#"和"--max_join_size=#"三个参数都是出于性能相关考虑的参数。使用"-U, --safe-updates"参数以后,将禁止全部不能使用索引的 update 和 delete 操做的请求,"--select_limit=#"的使用前提是有"-U, --safeupdates"参数,功能是限制查询记录的条数,"--max_join_size=#"也须要与"-U, --safeupdates"一块儿使用,限制参与 join 的最大记录数。

"--show-warnings"参数做用是在执行完每一条 query 以后都会自动执行一次"show warnings",显示出最后一次 warning 的内容。

上面仅仅介绍了部分不是太常使用可是颇有特色的少数几个参数选项,实际上 mysql

程序支持很是多的参数选项,有其自身的参数,也有提交给 MySQL Server 的。mysql 的全部参数选项均可以写在 MySQL Server 启动参数文件(my.cnf)的[mysql]参数 group 中,还有部分链接选项参数会从[client]参数 group 中读取,这样不少参数就能够不用在每次执行 mysql 的时候都手工输入,而由 mysql 程序本身自动从 my.cnf 文件 load 这些参数。

若是读者朋友但愿对 mysql 其余参数选项或者 mysql 的其余更国有图有更深刻的了解,

能够经过 MySQL 官方参考手册查阅,也能够经过执行"mysql    --help"获得帮助信息以后经过自行实验来作进一步的深入认识。固然若是您是一位基本能看懂 c 语言的朋友,那么您彻底能够经过 mysql 程序的源代码来发现其更多有趣的内容。

二、mysqladmin

    Usage:    mysqladmin    [OPTIONS]    command    command    ...

mysqadmin,顾名思义,提供的功能都是与 MySQL 管理相关的各类功能。如 MySQL    Server 状态检查,各类统计信息的 flush,建立/删除数据库,关闭 MySQL    Server 等等。mysqladmin 所能作的事情,虽然大部分均可以经过 mysql 链接登陆上 MySQL    Server 以后来完成,可是大部分经过 mysqladmin 来完成操做会更简单更方便。这里我将介绍一下本身常用到的几个经常使用功能:

    ping 命令能够很容易检测 MySQL    Server 是否还能正常提供服务

sky@sky:~# mysqladmin -u sky -ppwd -h localhost ping mysqld is alive

    status 命令能够获取当前 MySQL    Server 的几个基本的状态值:

    sky@sky:~#    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

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

    sky@sky:~#    mysqladmin    -u    sky    -ppwd    -h    localhost    processlist

+----+------+-----------+----+---------+------+-------+------------------+

|    Id    |    User    |    Host    |    db    |    Command    |    Time    |    State    |    Info    | +----+------+-----------+----+---------+------+-------+------------------+

    |    48    |    sky    |    localhost    |    |    Query    |    0    |    |    show    processlist    |

+----+------+-----------+----+---------+------+-------+------------------+

上面的这三个功能是我在本身的一些简单监控脚本中常用到的,虽然获得的信息仍是比较有限,可是对于完成一些比较基本的监控来讲,已经足够胜任了。此外,还能够经过 mysqladmin 来 start    slave 和 stop    slave,kill 某个链接到 MySQL    Server 的线程等等。

  1. mysqldump

    Usage:    mysqldump    [OPTIONS]    database    [tables]

OR    mysqldump    [OPTIONS]    --databases    [OPTIONS]    DB1    [DB2    DB3...] OR    mysqldump    [OPTIONS]    --all-databases [OPTIONS]

mysqldump 这个工具我想大部分读者可能都比较熟悉了,其功能就是将 MySQL Server 中的数据以 SQL 语句的形式从数据库中 dump 成文本文件。虽然 mysqldump 是作为 MySQL 的一种逻辑备份工具为你们所认识,但我我的以为称他为 SQL 生成导出工具更合适一点,由于经过 mysqldump 所生成的文件,所有是 SQL 语句,包括数据库和表的建立语句。固然,经过给 mysqldump 程序加"-T"选项参数以后,能够生成非 SQL 形式的指定给是的文本文件。这个功能其实是调用了 MySQL 中的"select * into OUTFILE from ..."语句而实现。也能够经过"-d,--no-data"仅仅生成结构建立的语句。在声称 SQL 语句的时候,字符集设置这一项也是比较关键的,建议每次执行 mysqldump 程序的时候都经过尽可能作到"--defaultcharacter-set=name"显式指定字符集内容,以防止以错误的字符集生成不可用的内容。 mysqldump 所生成的 SQL 文件能够经过 mysql 工具执行。

  1. mysqlimport

    Usage:    mysqlimport    [OPTIONS]    database    textfile    ...

mysqlimport 程序是一个将以特定格式存放的文本数据(如经过"select * into OUTFILE from ..."所生成的数据文件)导入到指定的 MySQL Server 中的工具程序,好比将一个标准的 csv 文件导入到某指定数据库的指定表中。mysqlimport 工具实际上也只是 "load data infile"命令的一个包装实现。

  1. mysqlbinlog

    Usage:    mysqlbinlog    [OPTIONS]    log-files

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

  1. mysqlcheck

    Usage:    mysqlcheck    [OPTIONS]    database    [tables]

OR    mysqlcheck    [OPTIONS]    --databases    DB1    [DB2    DB3...] OR    mysqlcheck    [OPTIONS]    --all-databases

mysqlcheck 工具程序能够检查(check),修复( repair),分析( analyze)和优化(optimize)MySQL Server 中的表,但并非全部的存储引擎都支持这里全部的四个功能,像 Innodb 就不支持修复功能。实际上,mysqlcheck 程序的这四个功能均可以经过 mysql 链接登陆到 MySQL Server 以后来执行相应命令完成彻底相同的任务。

  1. myisamchk

    Usage:    myisamchk    [OPTIONS]    tables[.MYI]

功能有点相似"mysqlcheck -c/-r",对检查和修复 MyISAM 存储引擎的表,但只能对 MyISAM 存储引擎的索引文件有效,并且不用登陆链接上 MySQL Server 便可完成操做。

  1. myisampack

    Usage:    myisampack    [OPTIONS]    filename    ...

对 MyISAM 表进行压缩处理,以缩减占用存储空间,通常主要用在归档备份的场景下,

并且压缩后的 MyISAM 表会变成只读,不能进行任何修改操做。当咱们但愿归档备份某些历史数据表,而又但愿该表可以提供较为高效的查询服务的时候,就能够经过 myisampack 工具程序来对该 MyISAM 表进行压缩,由于即便虽然更换成 archive 存储引擎也可以将表变成只读的压缩表,可是 archive 表是没有索引支持的,而经过压缩后的 MyISAM 表仍然可使用其索引。

  1. mysqlhotcopy

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

mysqlhotcopy 和其余的客户端工具程序不太同样的是他不是 c(或者 c++)程序编写的 ,

而是一个 perl 脚本程序,仅能在 Unix/Linux 环境下使用。他的主要功能就是对 MySQL 中的 MyISAM 存储引擎的表进行在线备份操做,其备份操做实际上就是经过对数据库中的表进行加锁,而后复制其结构,数据和索引文件来完成备份操做,固然,也能够经过指定 "-noindices"告诉 mysqlhotcopy 不须要备份索引文件。

  1. 其余工具除了上面介绍的这些工具程序以外,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。

相关文章
相关标签/搜索