jacklife 2019-06-28
错误日志:Error Log
(1)错误日志记录来mysql server在运行过程中所有较为严重的警告和错误信息。 (2)错误日志还记录了mysql server 每次启动和关闭的详细信息。 (3)默认情况下,系统记录错误日志的功能是关闭的。错误信息被输出到标准错误输出(stderr)。 (4)如果想要开启错误日志记录功能,需要在启动时开启-log-error选项。 (5)错误日志的默认存放位置在数据目录下,以hostname.err命名。 (6)可以使用命令:--log-error[=file_name]修改其存放目录和文件名 (7)为了方便维护,有时候会希望将错误日志中的内容做备份并重新开始记录,这时候就可以使用mysql的FLUSH LOGS 命令来告诉mysql备份旧日志文件并生成新的日志文件。备份文件名以 ".old"结尾。
二进制日志:Binary Log & Binary Log Index
(1)二进制日志,就是我们常说的binlog,也是mysql server中最为重要的日志之一。 (2)通过“--log-bin[=file_name]”打开记录功能 (3)mysql会将所有修改数据库数据的query以二进制形式记录到日志文件中。 (4)当然,日志中不仅限与query语句这么简单,还包括了每一条query所执行的时间、所消耗的资源、以及相关的事务信息 (5)所以,binlog是事务安全的 (6)binlog记录功能需要“--log-bin[=file_name]”参数的显式指定才能开启,如果为指定file_name,则会在数据目录下记录为mysql-bin.****。(**代表0~9之间的某一个数字,来表示该日志的序号) (7)binlog还有一些其他的附加选项参数: 【1】“--max_binlog_size“ 《1》设置binlog最大的存储上限,当日志达到该上限时,msql会重新创建一个日志开始继续记录。 《2》不过偶尔也有超出该设置的binlog产生,一般都是因为在即将到达上限时,产生了一个较大的事务,为了保证事务安全,mysql不会将同一个事务分开记录到两个binlog中。 【2】“--binlog-do-db=db_name” 《1》此参数明确告诉mysql,需要对某个(db_name)数据库记录binlog 《2》此参数明确指定了忽略针对其他数据库执行的query,而仅仅记录指定的数据库执行的query 【3】“--binlog-ignore-db=db_name” 《1》此参数明确指定了忽略针对某个数据库执行的qurey 《2》当指定了某个数据库的此参数后,mysql将记录除了此数据库之外的所有数据库的binlog 【4】“--binlog-ignore-db=db_name”与“--binlog-do-db=db_name”两个参数有一个共同的概念需要理解清楚: 《1》参数中的db_name不是指query语句更新的数据所在的数据库,而是执行query语句的时候所处的连接的数据库。 《2》例如:query语句更新数据库B的数据,但是执行此query语句所在的数据库是A,那么binlog记录的是数据库A或者忽略数据库A的相关query信息 (8)mysql-bin.index文件(binary log index)的功能是记录所有binary log的绝对路经,保证mysql各种线程能够顺利的根据它找到所有需要的binary log文件。
更新日志:update log
(1)更新日志是mysql在较老的版本使用的,其功能和binlog基本类似,只不过不是用二进制记录而是用简单的文本格式记录内容。 (2)自从有了binlog后,就很少使用更新日志了。 (3)从版本5.0开始,mysql已经不支持更新日志了
查询日志:query log
(1)查询日志记录mysql中所有query (2)“--log[=fina_name]”打开该功能 (3)由于记录了所有的query,包括所有的select,体积比较大,开启后对性能影响较大,所有慎用该功能。 (4)一般只用于跟踪某些特殊的sql性能问题才会短暂打开该功能 (5)默认的查询日志文件名为hostname.log
慢查询日志:slow query log
(1)顾名思义,慢查询日志中记录的是执行时间较长的query,也就是我们常说的slow query (2)通过设--log-slow-queries[=file_name]来打开该功能并设置记录位置和文件名 (3)默认文件名是hostname-slow.log,默认目录也是数据目录。 (4)慢查询日志是简单的文本格式,可以通过各种文本编辑器查看内容。 (5)其中记录来语句执行的时刻、执行所消耗的时间、执行用户、连接主机等相关信息。 (6)mysql还提供了专门用来分析慢查询日志的工具程序mysqlslowdump,用来帮助数据库管理人员解决可能存在的性能问题。
Innodb的在线redo日志:innodb redo log
(1)Innodb是一个事务安全的存储引擎,其事务安全性主要是通过在线redo日志和记录在表空间中的undo信息来保证的。 (2)redo日志记录了innodb所做的所有物理变更和事务信息 (3)通过redo日志和undo信息,innodb保证了在任何情况下的事务安全性。 (4)innodb的redo日志默认存放在数据目录下 (5)可以通过innodb_log_group_home_dir来更改设置日志的存放位置,通过innodb_log_files_in_group设置日志的数量
“.frm”文件:
(1)与表相关的元数据(meta)信息都存放在“.frm”文件中 (2)包括表结构的定义信息等。 (3)不论表是什么存储引擎,每一个表都会有一个以表名命名的“.frm”文件。 (4)所有的“.frm”文件都存放在所属数据库的文件夹下面。
“.MYD”文件:
(1)“.MYD“文件是MyISAM存储引擎专用,存放MyISAM表的数据。 (2)每一个MyISAM表都会有一个“.MYD”文件与之对应,同样存储在所属数据库的文件夹下,和“.frm”文件在一起。
“.MYI“文件:
(1)“.MYI“也是专属与MyISAM存储引擎的,主要存放MyISAM表的索引相关信息。 (2)对于MyISAM存储来说,可以被cache的内容主要就是来源于“.MYI”文件中。 (3)每一个表对应一个“.MYI”文件,存放位置和“.frm”以及“.MYD”一样。
“.idb“文件和ibdata文件::
(1)这两种文件都是存储Innodb数据的文件 (2)之所以有两种文件来存放Innodb数据(包括索引),是因为Innodb的数据存储方式能够通过配置来决定是通过共享表空间存放数据,还是独享表空间存放存储数据。 (3)“.idb”代表使用独享表空间方式存储数据,每个表拥有一个“.idb”文件,文件存放在和MyISAM数据相同的位置。 (4)ibdata文件代表使用共享表空间的方式存储数据,所有表共同使用一个(或者多个,可配置)ibdata文件 (5)ibdata文件可以通过innodb_data_home_dir和innodb_data_file_path两个参数共同配置组成。innodb_data_home_dir配置数据存放的总目录,而innodb_data_file_path配置每一个文件的名称 (6)也可以不配置innodb_data_home_dir,而直接使用绝对路经配置innodb_data_file_path参数完成配置。 (7)innodb_data_file_path可以一次配置多个ibdata文件。文件是可以指定大小,也可以是自动扩展的,但是Innodb限制了仅仅只有最后一个ibdata文件能够配置成自动扩展类型。 (8)当我们需要添加新的ibdata文件的时候,只能添加在innodb_data_file_path配置的最后,而且必须重启mysql才能完成配置ibdata的添加工作。
master.info文件
(1)mysql的复制功能,类似主从复制,都会记录maseter.info文件 (2)master.info存放于slave端的数据目录下 (3)里边存放了该slave的master端的相关信息,包括master的主机地址、连接用户、连接密码、连接端口、当前日志位置、已经读取到的日志位置等信息。
relay和relay log index
(1)mysql进行主主复制或主从复制的时候会在home目录下面产生相应的relay log (2)relay log 很多方面都和binary log差不多。 (3)从服务器I/O 线程将主服务器的二进制日志读取过来记录到从服务器本地文件中,然后sql线程会读取relay-log日志的内容并应用到从服务器,从而使从服务器和主服务器的数据保持一致。 (4)mysql-relay-bin.xxxxx 文件用于存放slave端的I/O 线程从master端读取到的Binary Log信息 (5)然后由slave端的SQL线程从该relay log中读取并解析相应的日志信息,转化成master所执行的sql语句,然后在slave端应用。 (6)mysql-relay-bin.index文件的功能类似于mysql-bin.index,同样是记录日志的存放位置的绝对路经,只不过它所记录的不是Binary Log,而是Relay Log。
relay-log.info文件
(1)类似与master.info,它用来存放通过slave的I/O 线程写入到本地的relay log的相关信息。 (2)供slave端的sql线程以及某些管理操作随时能够获取当前复制的相关信息。
system config file
(1)mysql的系统配置文件一般是"my.cnf",unix/Linux下默认存放在/etc目录下,windows环境一般存放在“c:/windows”目录下面。 (2)“my.cnf”文件中包含多种参数选项组(group),每一种参数组都通过中括号给定了固定的组名。 (3)如“[mysqld]”组中包括了mysqld服务启动时候的初始化参数,“[client]”组中包含着客户端工具程序可以读取的参数,mysql程序使用的“[mysql]”,mysqlchk使用的“[mysqlchk]”等。 (4)如果读者朋友自己编写了某个客户端程序,也可以自己设定一个参数组名,将相关参数配置在里面,然后调用mysql客户端api程序中的参数读取api读取相关参数。
pid file
(1)pid file是mysqld应用程序在Unix/Linux环境下的一个进程文件,和许多其他Unix/Linux服务端程序一样,存放着自己的进程id。 (2)通过mysqld_safe启动mysql的时候,mysqld_safe会检查pid文件,如果pid文件不存在,不做处理;如果文件存在,且pid已占用则报错“A mysqld process already exists”;如果文件存在,但pid未占用,则删除pid文件。 (3)通过mysqld_safe启动时,mysql pid file的作用是:在数据文件是同一份,但端口不同的情况下,防止同一数据库被启动多次
socket file
(1)socket文件也是在Unix/Linux 环境下才有的 (2)用户在Unix/Linux 环境下客户端连接,可以不通过TCP/IP 网络而直接使用Unix Socket来连接mysql (3)网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket (4)一般在配置部署mysql环境时都会在mysql的my.cnf文件中[mysqld]组下添加上socket文件的路经,而这样做的好处是:如果启用了多实例mysql时,可以通过socket文件来快速的登陆mysql对应不同端口下的实例
初始化模块
(1)顾名思义,初始化模块就是在mysql server启动的时候,对整个系统做各种各样的初始化操作。 (2)比如buffer、cache结构的初始化和内存空间的申请,各种系统变量的初始化设定,各种存储引擎的初始化设置等。
核心API
(1)核心API模块主要是为了提供一些需要非常高效的底层操作功能的优化实现 (2)包括底层数据结构的实现,特殊算法的实现,字符串处理,小文件I/O ,格式化输出,以及最重要的内存管理部分。 (3)核心API模块的所有源代码都集中在mysys和strings文件夹下
网络交互模块
(1)底层网络交互模块抽象出底层网络交互所使用的接口api,实现底层网络数据的接收和发送,以方便各个模块调用,以及对这一部分的维护。 (2)所有源码都在vio文件夹下面。
Client & Server交互协议模块
(1)任何C/S结构的软件系统,都肯定会有自己独有的信息交互协议,mysql也不例外。 (2)mysql的Client & Server 交互协议模块,实现了客户端与mysql交互的所有协议。 (3)当然这些协议都是建立在现有的OS和网络协议之上,如TCP/IP 以及Unix Socket。
用户模块
(1)用户模块所实现的功能,主要包括用户的登陆连接、权限控制和用户的授权管理等。 (2)它就像myslq的大门守卫一样,决定是否给来访者“开门”。
访问控制模块
(1)造访客人进门了就可以想干嘛就干嘛吗?为了安全考虑,肯定不能如此随意。 (2)这时就需要访问控制模块实时监控客人的每一个动作,给不同客人以不同的权限。 (3)访问控制模块实现的功能就是根据用户模块中各用户的授权信息,以及数据库自身特有的各种约束,来控制用户对数据的访问。 (4)用户模块和访问控制模块两者结合起来,组成了mysql整个数据库系统的权限安全管理的功能。
连接管理、连接线程、线程管理
(1)连接管理模块负责监听mysql server接收的各种请求,接收连接请求,转发所有连接请求到线程管理模块。 (2)每一个连接上mysql server 的客户端请求都会被分配(或创建)一个连接线程为其单独服务。 (3)而连接线程的主要工作就是负责mysql server 与客户端的通信,接受客户端的命令请求,传递server端的结果信息等。 (4)线程管理模块则负责管理维护这些连接线程,包括线程的创建、线程的cache等。
query解析和转发模块
(1)在mysql中我们习惯将所有client端发送给server端的命令都称为query (2)在mysql里面,连接线程接收到客户端的一个query后,会直接将该query传递给专门负责将各种query进行分类然后转发给各个对应的处理模块,这个模块就是query解析和转发模块。 (3)其主要工作就是对query语句进行语义和语法的分析,然后按照不同的操作类型进行分类,然后作出针对性的转发。
query cache模块
(1)query cache模块在mysql server中是一个非常重要的模块。 (2)它的主要功能是将客户端提交给mysql server的select类query请求的返回结果集cache到内存中,与该query的一个hash值做一个对应。 (3)该query所取数据的基表发生任何数据的变化之后,mysql会自动使该query的cache失效。 (4)在读写比例非常高的应用系统中,query cache对性能的提高是非常显著的。当然它对内存的消耗也是非常大的。
query优化器模块
(1)顾名思义,就是优化客户端请求的query。 (2)根据客户端请求的query语句,和数据库中一些统计数据,在一系列算法的基础上进行分析,得出一个最优的策略,告诉后面的程序如何取得这个query语句的结果。
表变更管理模块
(1)表变更管理模块主要是负责完成一些DML和DDL的query; (2)如:update、delete、insert、create table、alter table 等语句的处理。
表维护模块
(1)表的状态检查、错误修复、以及优化和分析等工作都是表维护模块需要做的事情。
系统状态管理模块
(1)系统状态管理模块负责在客户端请求系统状态的时候,将各种状态返回给用户; (2)像DBA常用的各种show status命令、show variables命令等,所得到的结果都是由这个模块返回的。
表管理器
(1)每一个表都有一个表的定义文件,就是“.frm”文件 (2)表管理器的工作就是维护这些文件,以及一个cache,该cache中的主要内容是各个表的结构信息 (3)此外它还维护table级别的锁管理。
日志记录模块
(1)日志记录模块主要负责整个系统级别的逻辑层的日志的记录; (2)包括error log、binary log、slow query log等
复制模块
(1)复制模块又分为Master模块和Salve模块两部分。 (2)Master模块主要负责在Replication环境中读取Master端的binary日志,以及与Salve端的I/O 线程交互等工作。 (3)Salve模块比Master模块所要做的事情稍多一些,在系统中主要体现在两个线程上面: 【1】一个是负责从Master接收binary日志,并写入本地relay log中的I/O 线程。 【2】另外一个是负责从relay log中读取相关日志事件,然后解析成可以在Slave端正确执行并得到和Master端完全相同的结果的命令再交给Slave执行的SQL线程。
存储引擎接口模块
(1)存储引擎接口模块可以说是mysql最具有特色的一点了。 (2)目前各种数据库产品中,基本只有mysql可以实现其底层数据存储引擎的插件式管理。 (3)这个模块实际上只是一个抽象类,但正是因为它成功的将各种数据处理高度抽象化,才成就了今天mysql可插拔存储引擎的特色。
mysql启动初始化:
(1)当我们执行启动mysql命令之后,mysql 的初始化模块就会从系统配置文件中读取系统参数和命令行参数,并按照参数来初始化整个系统; (2)如申请并分配buffer、初始化全局变量、以及各种结构等。 (3)同时各个存储引擎也被启动,并进行各自的初始化工作。
当整个系统初始化结束后,由连接管理模块接手:
(1)连接管理模块会启动处理客户端连接请求的监听程序; (2)包括TCP/IP的连接监听,还有Unix的Socket监听。 (3)这时候,mysql server就基本启动完成,准备好接收客户端请求了
当连接管理模块监听到客户端的连接请求(借助网络交互模块的相关功能),双方通过Client & Server交互协议模块所定义的协议“寒暄”几句后
(1)连接管理模块就会将连接请求转发给线程管理模块,去请求一个连接线程。 (2)线程管理模块马上又会将控制交给连接线程模块,告诉连接线程模块:现在我这边有连接请求过来了,需要建立连接,你这边处理下。 (3)连接线程模块在接收到连接请求后,首先会检查当前连接线程池中是否有被cache的空闲连接线程; (4)如果有,就取出一个和客户端请求连接上,如果没有空闲的连接线程,则建立一个新的连接线程与客户端请求连接。 (5)当然,连接线程模块并不是在收到连接请求后马上取出一个连接线程和客户端请求连接,而是首先调用用户模块进行授权检查,只有客户端请求通过了授权检查后,才会将客户端请求和负责请求的连接线程连上。
在mysql中,将客户端请求分为两种类型:
(1)一种是query,需要调用Parser也就是Query解析和转发模块的解析才能够执行的请求; (2)一种是command,不需要调用Parser就可以直接执行的请求。
如果我们的初始化配置中打开了Full Query Logging的功能:
(1)那么Query解析与转发模块会调用日志记录模块将请求计入日志。 (2)不管是query类型的请求还是一个command类型的请求,都会被记录进入日志,所以,出于性能考虑,一般很少打开Full Query Logging的功能。
当客户端请求和连接线程“互通暗号(互通协议)”接上头之后,连接线程就开始处理客户端发送过来的各种命令(或query),接受相关请求。
(1)它将接收到的query语句转给query解析和转发模块; (2)query解析器先对query进行基本的语义和语法解析; (3)然后根据命令类型不同,有些会直接处理,有些会分发给其他模块来处理。
如果一个query类型的请求,会将控制交给query解析器。
(1)query解析器首先会分析看是否是一个select类型的query; (2)如果是,则调用查询缓存模块,让它检查该query在query cache中是否存在 (3)如果有,则直接将cache中的数据返回给连接线程模块,然后通过与客户端的连接线程将数据传输给客户端。 (4)如果不是一个可以被cache的query类型,或者cache中没有该query数据,那么query将被继续传回query解析器,让query解析器进行处理,再通过query分发器分发给相关处理模块。 (5)如果解析器解析结果是一条未被cache的select语句,则将控制权交给Optimizer,也就是Query优化器模块; (6)如果是DML或者是DDL语句,则会交给表变更管理模块; (7)如果是一些更新统计信息、检测、修复和整理类的query则会交给表维护模块去处理; (8)复制相关的query则转交给复制模块去进行相应的处理; (9)请求状态的query则转交给了状态收集报告模块。 (10)实际上表变更管理模块根据所对应的处理请求的不同,是分别由insert处理器、delete处理器、update处理器、create处理器,以及alter处理器这些小模块来负责不同的DML和DDL的。
在各个模块收到query解析和分发模块分发过来的请求后:
(1)首先会通过访问控制模块检查连接用户是否有访问目标表以及目标字段的权限, (2)如果有,就会调用表管理模块请求相应的表,并获取对应的锁。 (3)表管理模块首先会查看该表是否已经存在于table cache中, (4)如果已经打开,则直接进行锁相关的处理,如果没有在cache中,则需要再打开表文件获取锁,然后将打开的表交给表变更管理模块。 (5)当表变更管理模块获取打开当表之后,就会根据该表的相关meta信息,判断表的存储引擎类型和其他相关信息。 (6)根据表的存储引擎信息,提交请求给存储引擎接口模块,调用对应的存储引擎实现模块,进行相应的处理。 (7)不过,对于表变更管理模块来说,可见的仅是存储引擎接口模块所提供的一系列标准接口,底层存储引擎实现模块的具体实现,对于表变更管理模块来说是透明的。 (8)它只需要调用对应的接口,并指明类型,接口模块会根据表类型调用正确的存储引擎来进行相应的处理
当一条query或者一个command处理完成(成功或失败)之后,控制权都会交给连接线程模块。
(1)如果处理成功,则将处理结果通过连接线程反馈给客户端。 (2)如果处理过程中发生错误,也会将相应的错误信息发送给客户端,然后连接线程模块会进行相应的清理工作,并继续等待后面的请求,重复上面提到的过程,或者完成客户端断开连接的请求。
mysql:
(1)为用户提供一个命令行接口来操作管理mysql服务器 (2)基本的语法就不具体介绍了,大家可以 运行一下“mysql --help”就会得到相应的使用帮助信息
mysqladmin:
(1)顾名思义,提供的功能都是与mysql管理相关的各种功能 (2)如mysql server状态检查,各种统计信息的flush,创建/删除数据库,关闭mysql server等等 (3)mysqladmin所能做的事情,虽然大部分都可以通过mysql连接登陆上mysql server之后完成,但是大部分通过mysqladmin来完成操作会更加简单方便。
mysqldump
(1)mysqldump功能就是将mysql server中的数据以sql语句的形式从数据库中dump成文本文件 (2)虽然mysqldump是作为mysql的一种逻辑备份工具为大家所认识,但也可以看作sql语句生成导出工具,因为通过mysqldump所生成的文件,全都是sql语句,包括数据库和表的创建语句 (3)mysqldump所生成的sql文件可以通过mysql工具执行 (4)通过参数“-d,--no-data”仅仅生成结构创建的语句
mysqllimport
(1)mysqlimport程序是一个将以特定格式存放的文本数据导入到指定的MySQL Server中的工具程序,比如将一个标准的csv文件导入到某指定数据库的指定表中 (2)mysqlimport工具实际上也只是“load data infile”命令的一个包装实现。
mysqlbinlog
(1)mysqlbinlog程序的主要功能就是分析MySQL Server所产生的二进制日志(也就是大家所熟知的binlog)。 (2)当我们希望通过之前备份的binlog做一些指定时间之类的恢复的时候,mysqlbinlog就可以帮助我们找到恢复操作需要做那些事情 (3)通过mysqlbinlog,我们可以解析出binlog中指定时间段或者指定日志起始和结束位置的内容解析成SQL语句,并导出到指定的文件中, (4)在解析过程中,还可以通过指定数据库名称来过滤输出内容。
mysqlcheck
(1)mysqlcheck工具程序可以检查(check),修复(repair),分析(analyze)和优化(optimize)MySQL Server中的表 (2)但并不是所有的存储引擎都支持这里所有的四个功能,像Innodb就不支持修复功能。 (3)实际上,mysqlcheck程序的这四个功能都可以通过mysql连接登录到MySQL Server之后来执行相应命令完成完全相同的任务。
myisamchk
(1)功能有点类似“mysqlcheck -c/-r”,对检查和修复MyISAM存储引擎的表, (2)但只能对MyISAM存储引擎的索引文件有效,而且不用登录连接上MySQL Server即可完成操作。
myisampack
(1)对MyISAM表进行压缩处理,以缩减占用存储空间, (2)一般主要用在归档备份的场景下, 而且压缩后的MyISAM表会变成只读,不能进行任何修改操作。 (3)当我们希望归档备份某些历史数据表,而又希望该表能够提供较为高效的查询服务的时候,就可以通过myisampack工具程序来对该MyISAM表进行压缩,因为即使虽然更换成archive存储引擎也能够将表变成只读的压缩表,但是archive表是没有索引支持的,而通过压缩后的MyISAM表仍然可以使用其索引。
mysqlhotcopy
(1)mysqlhotcopy和其他的客户端工具程序不太一样的是他不是c(或者c++)程序编写的,而是一个perl脚本程序 (2)仅能在Unix/Linux环境下使用。 (3)他的主要功能就是对MySQL 中的MyISAM存储引擎的表进行在线备份操作, (4)其备份操作实际上就是通过对数据库中的表进行加锁,然后复制其结构,数据和索引文件来完成备份操作, (5)当然,也可以通过指定“--noindices”告诉mysqlhotcopy不需要备份索引文件。
其他工具
(1) 除了上面介绍的这些工具程序之外,MySQL还有自带了其他大量的工具程序, (2)如针对离线 Innodb 文件做 checksum 的 innochecksum, (3)转换 mSQL C API 函数的 msql2mysql,dumpMyISAM全文索引的myisam_ftdump, (4)分析处理slowlog的sqldumpslow, (5)查询mysql相关开发包位置和include文件位置的mysql_config, (6)向MySQL AB报告bug的mysqlbug, (7)测试套件mysqltest 和 mysql_client_test , (8)批量修改表存储引擎类型的mysql_convert_table_format, (9)能从更新日志中提取给定匹配规则的 query 语句的mysql_find_rows, (10)更改MyIsam存储引擎表后缀名的mysql_fix_extensions, (11)修复系统表的mysql_fix_privilege_tables, (12)查看数据库相关对象结构的mysqlshow, (13)MySQL升级工具 mysql_upgrade, (14)通过给定匹配模式来kill客户端连接线程的mysql_zap, (15)查看错误号信息的perror,文本替换工具replace,等等一系列工具程序可供我们使用。 (16)如果您希望在MySQL源代码的基础上做一些自己的修改,如修改MyISAM存储引擎的时候,可以利用myisamlog来进行跟踪分析MyISAM的log。