Mysql中有多种类型的文件,每种类型的文件都有其特定的作用,下面就来说说:
参数文件:告诉Mysql实例数据库文件的位置,定义参数。
日志文件:Mysql实例对某种条件作出的响应写入文件,这个文件就是日志文件,
常见的日志文件有:错误日志、二进制日志、慢查询日志以及查询日志。
socket文件:采用Unix域套接字方式进行连接时会用到的文件,
一般,我们在本地用mysql命令行连入数据库就是采用的该方式。
pid文件:Mysql实例的进程ID文件。
Mysql表结构文件:用来存放表结构定义的文件
存储引擎文件:每个表存储引擎都会有个文件来保存该引擎相关的数据,
这些数据主要是数据和索引数据。
参数文件
Mysql实例启动时,回去读取参数文件,其实就是配置文件,通过读取该文件,实例就知道了哪些文件在什么位置,
知道了参数的默认值,需要注意的是,该文件可不止一个,会按照次序来读取,后读取的优先级更高。
Mysql实例没有参数也能启动成功,因为编译的时候也有定义参数,再不济源代码中也有定义参数;但是oracle没有
参数文件,不会启动成功。
oracle参数文件分二进制和文本2种,mysql中只有文本参数文件。
mysql数据目录中有个数据结构的文件,该文件记录着有实例启动的权限,如果该文件不存在,mysql不能成功启动。
参数
参数就是K/V形式的数据。可以通过information_schema数据库中的GLOBAL_VARIABLES表来查看所有的参数:
mysql> select * from GLOBAL_VARIABLES where VARIABLE_NAME like 'innodb_buffer%'G;
*************************** 1. row ***************************
VARIABLE_NAME: INNODB_BUFFER_POOL_FILENAME
VARIABLE_VALUE: ib_buffer_pool
*************************** 2. row ***************************
VARIABLE_NAME: INNODB_BUFFER_POOL_DUMP_NOW
VARIABLE_VALUE: OFF
*************************** 3. row ***************************
VARIABLE_NAME: INNODB_BUFFER_POOL_LOAD_NOW
VARIABLE_VALUE: OFF
*************************** 4. row ***************************
VARIABLE_NAME: INNODB_BUFFER_POOL_LOAD_ABORT
VARIABLE_VALUE: OFF
*************************** 5. row ***************************
VARIABLE_NAME: INNODB_BUFFER_POOL_SIZE
VARIABLE_VALUE: 134217728
*************************** 6. row ***************************
VARIABLE_NAME: INNODB_BUFFER_POOL_DUMP_AT_SHUTDOWN
VARIABLE_VALUE: OFF
*************************** 7. row ***************************
VARIABLE_NAME: INNODB_BUFFER_POOL_LOAD_AT_STARTUP
VARIABLE_VALUE: OFF
*************************** 8. row ***************************
VARIABLE_NAME: INNODB_BUFFER_POOL_INSTANCES
VARIABLE_VALUE: 8
不过还是推荐使用show variables语句来查询变量:
mysql> show variables like 'innodb_buffer%'G;
参数类型
Mysql中参数的类型分为动态参数和静态参数,静态参数不能在数据库实例运行时修改,
动态参数可以在数据库实例运行时修改,修改动态参数使用
set global|session variable_name=value或者
set @@global|@@session.variable_name=value语句
需要注意的是全局参数更改了之后,当前会话中参数不会改变,而且下次启动数据库实例时,还是会读取参数文件来初始化。
如果想在当前会话立即生效,则需要指定修改当前会话的参数。
日志文件
日志文件记录了影响Mysql数据库的各种活动。
常见的日志文件有:错误日志、二进制日志、慢查询日志以及查询日志
错误日志
该日志记录了Mysql实例启动、运行以及关闭的过程,mysql出了错,首先应该查看该文件。
可以通过log_error变量名在数据库中找到该日志的存放位置
mysql> show variables like 'log_error'G;
*************************** 1. row ***************************
Variable_name: log_error
Value: /var/lib/mydata/iZeu234q4mamqhZ.err
1 row in set (0.00 sec)
慢查询日志
默认数据库不会启动慢查询日志,
慢查询日志的作用是为了优化数据库的查询。
一般运行时间超过设置阈值的SQL语句都会记录到慢查询日志中。
这个阈值为:
mysql> show variables like '%long%'G;
*************************** 1. row ***************************
Variable_name: long_query_time
Value: 10.000000
默认为10秒。需要注意的是,等于该值的SQL语句并不会被记录。
另一个和慢查询相关的参数是 log_queries_not_using_indexes,默认为OFF
如果该值为ON,没有使用索引的SQL语句也会记录到慢查询日志中。
Mysql提供了mysqldumpslow工具来查看慢查询日志:
# mysqldumpslow --help
Usage: mysqldumpslow [ OPTS... ] [ LOGS... ]
Parse and summarize the MySQL slow query log. Options are
--verbose verbose
--debug debug
--help write this text to standard output
-v verbose
-d debug
-s ORDER what to sort by (al, at, ar, c, l, r, t), 'at' is default
al: average lock time
ar: average rows sent
at: average query time
c: count
l: lock time
r: rows sent
t: query time
-r reverse the sort order (largest last instead of first)
-t NUM just show the top n queries
-a don't abstract all numbers to N and strings to 'S'
-n NUM abstract numbers with at least n digits within names
-g PATTERN grep: only consider stmts that include this string
-h HOSTNAME hostname of db server for *-slow.log filename (can be wildcard),
default is '*', i.e. match all
-i NAME name of server instance (if using mysql.server startup script)
-l don't subtract lock time from total time
慢查询在mysql中单独有一张表:
mysql> show create table slow_logG;
*************************** 1. row ***************************
Table: slow_log
Create Table: CREATE TABLE `slow_log` (
`start_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`user_host` mediumtext NOT NULL,
`query_time` time NOT NULL,
`lock_time` time NOT NULL,
`rows_sent` int(11) NOT NULL,
`rows_examined` int(11) NOT NULL,
`db` varchar(512) NOT NULL,
`last_insert_id` int(11) NOT NULL,
`insert_id` int(11) NOT NULL,
`server_id` int(10) unsigned NOT NULL,
`sql_text` mediumtext NOT NULL,
`thread_id` bigint(21) unsigned NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log'
1 row in set (0.00 sec)
默认慢查询日志的输出格式为文件
mysql> show variables like 'log_output'G;
*************************** 1. row ***************************
Variable_name: log_output
Value: FILE
1 row in set (0.00 sec)
我们可以将它改为TABLE,之后就能通过slow_log这张表来查看慢查询日志了。
sleep()可以让SQL语句睡眠:
mysql> select sleep(5);
+----------+
| sleep(5) |
+----------+
| 0 |
+----------+
1 row in set (5.00 sec)
慢查询表使用的是CSV引擎,可以把引擎换为MYISAM来提高查询效率。
但是注意,先把慢查询日志关了,才能进行引擎的更换。
mysql > alter table slow_log engine=myisam;
查询日志
查询日志记录了所有对数据库的操作,包括访问拒绝的信息也会被记录,默认并未开启。
Variable_name: general_log
Value: OFF
*************************** 16. row ***************************
Variable_name: general_log_file
Value: /var/lib/mydata/xxx.log
他和慢查询日志一样,可以存储在表中,默认是存储在文件中。
二进制日志
二进制日志记录了对数据库进行更改的操作,不包括select和show语句。
二进制日志主要有2个作用:
恢复:二进制日志在数据恢复方面可是非常重要的,点到点的恢复,增量恢复说的就是利用的二进制日志。
复制:数据库主从复制就是利用的二进制日志。
二进制日志的参数:
log-bin=mysql-bin
如果不指定该参数的值,默认为主机名。
二进制日志默认在数据目录下,文件名为定义的值并且以序列号作为后缀:
-rw-rw---- 1 mysql mysql 143 Jul 7 16:34 mysql-bin.000001
-rw-rw---- 1 mysql mysql 143 Jul 7 16:40 mysql-bin.000002
-rw-rw---- 1 mysql mysql 143 Jul 7 16:40 mysql-bin.000003
-rw-rw---- 1 mysql mysql 510 Jul 7 16:43 mysql-bin.000004
-rw-rw---- 1 mysql mysql 195481 Jul 20 18:21 mysql-bin.000005
-rw-rw---- 1 mysql mysql 520 Jul 20 19:11 mysql-bin.000006
-rw-rw---- 1 mysql mysql 143 Jul 20 19:11 mysql-bin.000007
-rw-rw---- 1 mysql mysql 143 Jul 20 19:16 mysql-bin.000008
-rw-rw---- 1 mysql mysql 143 Jul 20 19:16 mysql-bin.000009
mysql-bin.index为索引文件,记录着二进制日志序列号(其实是二进制日志的名称)
开启二进制日志对mysql的性能影响非常小,大约1%,但带来的好处却是大大的。
以下参数和二进制日志有关:
参数max_binlog_size记录了单个二进制日志的最大值,如果超过了该值,就重新创建一个文件,并且将文件名记录到index文件中。
默认大小是1G。
binlog_cache_size,如果使用了支持事务的表引擎(InnoDB),在事务未提交之前,二进制日志记录在缓冲区中,提交之后再写到
二进制日志文件中,这个参数就是指定该缓冲区的大小,默认大小为32K。
binlog_cache_use是二进制日志写入二进制文件的次数,可以通过show global status查看。
binlog_cache_disk_use记录了二进制日志写入临时文件的次数,
当事务的记录大于设置的缓冲大小,多余的二进制日志就会记录到磁盘上的临时文件中。
sync_binlog,二进制日志并非每次写的时候都会记录到磁盘中,所以当数据库宕机时,会造成数据丢失,这会给恢复和复制带来问题。
该值就是指定,写了多少次之后就把二进制日志写到磁盘中。
如果该值设置为1,表示同步写磁盘方式来写二进制日志,不会用到缓冲区。但是有种情况,就是二进制日志写入了磁盘,但是事务并未提交
这时下次启动的时候不能回滚。可以通过设置innodb_support_xa=1来解决这个问题。
默认该值为0。如果该值设置为ON,会增加IO压力,但是能够提供较好的复制性能。
参数binlog-do-db和binlog-ingore-db表示哪些数据库不用记录到二进制日志中,默认为空。
如果该数据库时从节点,默认不会将从主节点取来并执行的二进制日志写入到本地的二进制日志中,如果要写,就要设置log-slave-update。
binlog_format参数非常重要,该参数影响了二进制日志的格式。
该参数可设置的值有,STATEMENT、ROW、MIXED。
1.STATEMENT和之前的版本一样,记录的是日志的逻辑SQL语句。
2.ROW格式下,记录的是行更改情况,同时可以将事务的隔离级别设置为READ COMMITED来获得更好的性能。
但是,此格式对磁盘和IO都会有影响。
3.MIXED格式下,采用STATEMENT格式进行二进制日志的记录。
二进制日志只能使用mysqlbinlog工具来查看。
套接字文件
这个就是采用Unix域套接字方式连接时用到的文件。
pid文件
mysql实例启动时,进程ID会记录到这个文件,可以通过pid_file查看文件位置:
mysql> show variables like 'pid_file';
+---------------+----------------------------+
| Variable_name | Value |
+---------------+----------------------------+
| pid_file | /var/run/mysqld/mysqld.pid |
+---------------+----------------------------+
1 row in set (0.01 sec)
表结构定义文件
无论采用何种存储引擎,都会有一个.frm文件,用来记录表结构定义。
InnoDB存储引擎文件
主要就是重做日志文件和表空间文件。
存储的数据按照表空间存放,默认会初始化一个大小12M,文件名为ibdata1的文件,这个文件就是表空间文件
可以通过参数innodb_data_file_path来进行设置。
可以设置多个表空间文件。
设置了该参数之后,所有基于InnoDB存储引擎的数据都会记录到该文件中。
而通过设置了innodb_file_per_table,可以为每个表单独创建一个表空间,就是.ibd后缀的文件。
需要注意的是,并非所有的表信息都存储在.ibd文件中。有一部分会存储在默认的表空间中。
重做日志文件
默认会有2个文件,ib_logfile0和ib_logfile1。
重做日志的主要作用是,万一实例或者介质失败,能够用重做日志来恢复数据库。
每个InnoDB引擎至少有一个重做日志组,每个组下面至少会有2个文件。可以设置多个重组日志组。
参数innodb_log_file_size指定了重做日志文件的大小,
innodb_log_files_in_group指定了日志组中文件的数量,
innodb_mirrored_log_groups指定了日志组的数量
innodb_log_group_home_dir指定了日志文件组所在位置。
重做日志和二进制日志的不同:
二进制日志不论引擎类型,只要是mysql修改操作都会记录,而重做日志只记录其本身有关的事务。
二进制日志记录的是详细的事务操作,而重做日志记录的是每个页更改的物理情况。
写入时间也不相同,二进制日志在事务提交之前记录;重做日志在事务提交过程中也会记录。
重做日志先写入日志缓冲,然后再写到重做日志文件中。
关于重做日志写到磁盘的条件:
innodb_flush_log_at_trx_commit参数控制着处理重做日志的方式