3.1参数文件
3.1.1 什么是参数
可以通过SHOW VARIABLES查看数据库中的所有参数
从5.1版本开始,可以通过information_schema架构下的GLOBAL_VARIABLES视图
3.1.2 参数类型
MySQL数据库中的参数可以氛围两类:
- 动态参数:整个实例生命周期内不得进行更改
- 静态参数:可以在MySQL实例运行过程中进行更改
静态参数不可进行修改
可以通过set参数来对动态参数进行设置
SET
| [global | session] system_var_name=expr
| [@@global. | @@session. | @@] system_var_name=expr
global/session表明该参数的修改是基于当前会话还是整个实例的生命周期
对MySQL变量的全局值进行了修改,在这次的实例生命周期内都有效,但MySQL实例本身不会对参数文件中的该值进行修改。也就是说,下一次启动MySQL实例还是会读取参数文件,要保留当前文件,那么用户需要修改参数文件。
3.2 日志文件
MySQL中常见的日志:
- 错误日志 error log
- 二进制日志 binlog
- 慢查询日志 slow query log
- 查询日志 log
3.2.1 错误日志
SHOW VARIABLES LIKE 'log_error';定位错误日志文件的位置
3.2.2 慢查询日志
帮助定位可能存在问题的SQL语句,从而进行SQL语句层面的优化。阈值可以通过long_query_time来设置,默认为10秒
log_slow_queries: 默认情况下,不启动慢查询日志,需要手动设置参数‘log_slow_queries’
log_queries_not_using_indexes: 另一个重要参数log_queries_not_using_indexes控制是否记录没有使用索引的查询语句
5.6.5版本之后,新增了一个参数log_throttle_queries_not_using_indexes,表示每分钟允许记录到slow log的且未使用索引的SQL的语句次数
mysqldumpslow
--verbose verbose
--debug debug
--help help
-v verbose
-d debug
-s ORDER
al:average lock time
ar:average rows time
at:average query time
c: count
l: lock time
r: rows sent
t: query time
-r reverse the sort order
-t NUM top n queries
-a 不将数字抽象成N,字符串抽象成‘S’
-n NUM 将数字抽象成至少N位的数字
-g PATTERN 正则表达式
-h HOSTNAME 数据库的主机
-i NAME 服务器实例名
-l 不从总时间减去lock时间
5.1版本开始会有一张慢查询表slow_log,可以通过SHOW CREATE TABLE mysql.slow_log;G查看
将参数log_out从‘FILE'可以设为‘TABLE’,然后就可以通过show_log表进行查询了
查看slow_log表的定义会发现该表使用的CSV引擎。用户可以把slow_log引擎转换到MyISAM,并在start_time列上缇娜家索引可以进一步提高查询的效率。如果已经启动了慢查询,将会提示错误。
InnoSQL中加强了SQL语句的捕获模式,增加了逻辑读取与物理读取
long_query_io,默认100,表示对于逻辑读取次数大于100的SQL语句记录到slow log,
slow_query_type表示启用SQL的方式:
- 0表示不将SQL语句记录到slow log
- 1表示根据SQL将SQL记录到slow log
- 2根据逻辑IO次数将SQL记录到slow log
- 3根据运行事件和逻辑IO次数将SQL语句记录到slow log
3.2.3 查询日志
查询日志记录了所有MySQL数据库请求的信息。默认文件名:主机名.log
5.1版开始,可以将查询日志放入mysql架构下的general_log表中,使用方法和slow_log表一样
3.2.4 二进制日志
二进制日志记录了所有对MySQL数据库执行更改的所有操作,但是不包括select和show这类操作。
SHOW BINLOG EVENTS IN 'mysqld.000008'G;
二进制日志的主要作用:
- 恢复:某些数据的恢复需要二进制日志
- 复制:通过复制和执行二进制日志是一个远程MySQL数据库和一台MySQL数据库进行实时同步
- 审计:用户可以通过二进制日志中的信息来进行审计,判断是否有对数据库进行注入的攻击
通过配置参数log-bin[=name]可以启动二进制日志。如果不指定name,则默认二进制日志文件为主机名,后缀名为二进制日志的序列号,所在路径为数据库所在目录(datadir)。
bin_log.index为二进制的索引文件,用来存储过往产生的二进制文件
二进制日志文件在默认情况下并没有启动,需要手动指定参数来启动。
以下配置文件影响着二进制日志记录的信息和行为:
- max_binlog_size:单个二进制日志文件的最大值
- binlog_cache_size:决定缓冲二进制日志的大小,基于会话,可以通过SHOW GLOBAL STATUS查看binlog_cache_use(记录使用缓冲写二进制日志的次数),binlog_disk_use(记录了使用临时文件来写二进制日志的次数)来判断大小是否合适
- sync_binlog:表示每写缓冲多少次就写到磁盘;默认为0,1表示同步写磁盘的方式来写二进制日志,不实用缓冲。通过参数innodb_support_xa=1来确保二进制日志和InnoDB存储文件的同步
- binlog-do-db:表示需要写入哪些库的日志
- binlog-ignore-db:表示需要忽略写入哪些库的日志
- log-slave-update:如果当前数据库为slave,且需要从master取得并执行的二进制日志写入自己的二进制日志,则需要设置,如果需要master=>slave=>slave,则必须设置该参数
- binlog_format:影响记录二进制日志的格式
binlog_format:
- STATEMENT日志的逻辑SQL语句
- ROW 记录表更改情况,可以将InnoDB的事务隔离级别设置为READ_COMMITED,能获得更好的并发性
- MIXED 格式下,默认使用STATEMENT格式,一些情况下会使用ROW
- 存储引擎为NDB,DML操作都用ROW格式
- UUID(),USER(),CURRENT_USER(),FOUND_ROWS(),ROW_COUNT()等不确定的函数
- 使用INSERT DELAY语句
- 使用了用户定义函数UDF
- 使用了临时表(temporary table)
查看二进制日志文件需要通过MySQL提供的工具mysqlbinlog
3.3 套接字文件
在UNIX下本地系统mysql可以用UNIX域套接字方式。套接字文件由参数socket控制。一般为/tmp/mysql.socket
3.4 pid文件
当MySQL实例启东时,会将自己的进程ID写入一个文件中即PID文件。该文件由pid_file控制,默认位于数据库目录下,文件名为主机名.pid
3.5 表结构定义文件
frm文件用来存放表结构和视图的定义
3.6 InnoDB存储引擎文件
3.6.1 表空间文件
在默认配置下会有一个初始大小为10MB名为ibddata1的默认表空间文件,用户可以通过innodb_data_file_path对其进行设置
用户可以多个文件组成一个表空间
[mysqld]
innodb_data_file_path=/db/ibdata1:2000M;/dr2/db/ibdata2:2000M:autoextend
设置innodb_data_file_path参数后,所有基于innodb存储引擎的表的数据都会记录到该共享表的空间中。若设置了参数innodb_file_per_table,则用户可以将每个基于innodb存储引擎的表产生一个独立表空间。独立表空间的命名规则:表名.ibd
单独的表仅存储该表的数据,索引和插入缓冲BITMAP等信息。
3.6.2 重做日志文件redo log file
在默认情况下,innoDB存储引擎的数据目录下会有两个名为ib_logfile0和ib_logfile1的文件。每个InnoDB存储引擎至少有1个重做日志文件组,每个文件组下至少两个重做日志文件ib_logfile0和ib_logfile1
下列参数影响者重做日志文件的属性:
- innodb_log_file_size: 指定每个重做日志文件的大小
- innodb_log_flles_in_group:指定日志文件组中重做日志文件的数量,默认为2.
- innodb_mirrored_log_groups:指定日志镜像文件组的数量,默认为1
- innodb_log_group_home_dir:指定了日志文件组的路径,默认为./,表示在MySQL的数据目录下
重做日志文件大小对存储引擎性能性能影响很大:
- 如果设置得太大,在恢复时可能需要很长时间
- 如果设置得太小,可能一个事务的日志需要多次切换重做日志文件,此外,还会导致频繁地发生async checkpoint,导致性能的抖动。
重做日志有个capacity变量,该表代表了最后的检查点不能超过这个阈值,否贼必须将缓冲池中的脏页中的部分脏数据写回,这会导致用户线程的阻塞
重做日志和二进制日志的区别
- 二进制日志会记录所有与MySQL有关的日志记录,包括InnoDB,MyISAM等其他存储引擎的日志。而InnoDB存储引擎的重做日志只记录相关引擎本身的事务日志
- 记录的内容不同。二进制日志记录事务的具体操作内容即该日志是逻辑日志。而InnoDB存储引擎的重做日志记录的是关于每个页的更改的物理情况
- 写入时间不同。二进制日志文件需要在事务提交前提交,即只写磁盘一次。而事务进行过程中不断写入重做日志文件中。
重做日志条目结构
- redo_log_type:占用1字节,表示重做日志的类型
- space: 表示表空间的ID,但采用压缩的方式,因此占用的空间可能小于4字节
- page_no:表示页的偏移量,同样采用压缩的方式
- redo_log_body:表示每个重做日志的数据部分,恢复时需要调用相应的函数进行解析
从日志往磁盘写入时,是按512字节,即一个扇区写入,不需要double write
另一个出发写磁盘的过程是由参数innodb_flush_log_at_trx_commit控制,表示在提交时,处理重做日志的方式:
0: 当提交事务时,不将事务的重做日志写入磁盘上的日志文件,而是等待主线程每秒的刷新
1:表示在执行commit是将重做日志缓冲同步写到磁盘,即伴有fsync的调用
2:表示将重做日志一步写到磁盘中,即写到文件系统的缓存中。
为了保持事务中ACID持久性必须将innodb_flush_log_at_trx_commit置为1,也就是每当有事务提交时,必须确保事务已经写入重做日志文件。当设置为2时,如果当MySQL宕机,但操作系统及服务器并没有发生宕机时,由于此时未写入磁盘的事务日志文件保存在文件系统缓存中,当恢复时同样保证数据不会丢失。