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;
*************************** . row ***************************
VARIABLE_NAME: INNODB_BUFFER_POOL_FILENAME
VARIABLE_VALUE: ib_buffer_pool
*************************** . row ***************************
VARIABLE_NAME: INNODB_BUFFER_POOL_DUMP_NOW
VARIABLE_VALUE: OFF
*************************** . row ***************************
VARIABLE_NAME: INNODB_BUFFER_POOL_LOAD_NOW
VARIABLE_VALUE: OFF
*************************** . row ***************************
VARIABLE_NAME: INNODB_BUFFER_POOL_LOAD_ABORT
VARIABLE_VALUE: OFF
*************************** . row ***************************
VARIABLE_NAME: INNODB_BUFFER_POOL_SIZE
VARIABLE_VALUE:
*************************** . row ***************************
VARIABLE_NAME: INNODB_BUFFER_POOL_DUMP_AT_SHUTDOWN
VARIABLE_VALUE: OFF
*************************** . row ***************************
VARIABLE_NAME: INNODB_BUFFER_POOL_LOAD_AT_STARTUP
VARIABLE_VALUE: OFF
*************************** . row ***************************
VARIABLE_NAME: INNODB_BUFFER_POOL_INSTANCES
VARIABLE_VALUE:

不过还是推荐使用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;
*************************** . row ***************************
Variable_name: log_error
Value: /var/lib/mydata/iZeu234q4mamqhZ.err
row in set (0.00 sec)

慢查询日志

默认数据库不会启动慢查询日志,

慢查询日志的作用是为了优化数据库的查询。

一般运行时间超过设置阈值的SQL语句都会记录到慢查询日志中。

这个阈值为:

mysql> show variables like '%long%'\G;
*************************** . 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_log\G;
*************************** . 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() NOT NULL,
`rows_examined` int() NOT NULL,
`db` varchar() NOT NULL,
`last_insert_id` int() NOT NULL,
`insert_id` int() NOT NULL,
`server_id` int() unsigned NOT NULL,
`sql_text` mediumtext NOT NULL,
`thread_id` bigint() unsigned NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log'
row in set (0.00 sec)

默认慢查询日志的输出格式为文件

mysql> show variables like 'log_output'\G;
*************************** . row ***************************
Variable_name: log_output
Value: FILE
row in set (0.00 sec)

我们可以将它改为TABLE,之后就能通过slow_log这张表来查看慢查询日志了。

sleep()可以让SQL语句睡眠:

mysql> select sleep();
+----------+
| sleep() |
+----------+
| |
+----------+
row in set (5.00 sec)

慢查询表使用的是CSV引擎,可以把引擎换为MYISAM来提高查询效率。

但是注意,先把慢查询日志关了,才能进行引擎的更换。

mysql > alter table slow_log engine=myisam;

查询日志

查询日志记录了所有对数据库的操作,包括访问拒绝的信息也会被记录,默认并未开启。

Variable_name: general_log
Value: OFF
*************************** . row ***************************
Variable_name: general_log_file
Value: /var/lib/mydata/xxx.log

他和慢查询日志一样,可以存储在表中,默认是存储在文件中。

二进制日志

二进制日志记录了对数据库进行更改的操作,不包括select和show语句。

二进制日志主要有2个作用:

恢复:二进制日志在数据恢复方面可是非常重要的,点到点的恢复,增量恢复说的就是利用的二进制日志。

复制:数据库主从复制就是利用的二进制日志。

二进制日志的参数:

 log-bin=mysql-bin

如果不指定该参数的值,默认为主机名。

二进制日志默认在数据目录下,文件名为定义的值并且以序列号作为后缀:

-rw-rw----  mysql mysql        Jul   : mysql-bin.
-rw-rw---- mysql mysql Jul : mysql-bin.
-rw-rw---- mysql mysql Jul : mysql-bin.
-rw-rw---- mysql mysql Jul : mysql-bin.
-rw-rw---- mysql mysql Jul : mysql-bin.
-rw-rw---- mysql mysql Jul : mysql-bin.
-rw-rw---- mysql mysql Jul : mysql-bin.
-rw-rw---- mysql mysql Jul : mysql-bin.
-rw-rw---- mysql mysql Jul : mysql-bin.

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 |
+---------------+----------------------------+
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参数控制着处理重做日志的方式

InnoDB:文件的更多相关文章

  1. innodb文件损坏处理

    innodb文件损坏报错如下: 2018-09-03T09:52:43.486363Z 0 [ERROR] InnoDB: Space id and page no stored in the pag ...

  2. innodb文件

    参数文件 日志文件 socket文件 pid文件 mysql表结构文件 存储引擎文件 1. 错误日志 启用错误日志方法 /etc/init.d/mysql启动文件中 /usr/bin/mysqld_s ...

  3. MySQL架构原理之存储引擎InnoDB数据文件

    MySQL架构原理之体系架构 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中简单介绍了MySQL的系统文件层,其中包含了数据文件.那么InnoDB的数据文件是如何分类并存储的呢? 一. ...

  4. [MySQL Reference Manual]14 InnoDB存储引擎

    14 InnoDB存储引擎 14 InnoDB存储引擎 14.1 InnoDB说明 14.1.1 InnoDB作为默认存储引擎 14.1.1.1 存储引擎的趋势 14.1.1.2 InnoDB变成默认 ...

  5. mysql innodb 数据打捞(一)innodb 页面结构特征

    如果文件系统损坏或意外删除了数据库文件,只要磁盘空间没有被覆盖,其实数据都还在磁盘的扇区中,还是可以恢复出来的,有些通用的文件恢复工具好象也可以恢复文件 ,但这里要研究的是在通用文件 恢复工具失效的时 ...

  6. ibdata1文件--缩小mysql数据库的ibdata1文件

    摘要 在MySQL数据库中,如果不指定innodb_file_per_table参数,单独存在每个表的数据,MySQL的数据都会存放在ibdata1文件. mysql ibdata1存放数据,索引等, ...

  7. mysql优化之使用iotop+pt-ioprofile定位具体top io文件

    今天,将一个环境切换成行情优化后的版本后,发现io等待还是挺高,这还是第一次出现的.其他很多套环境都没有这个问题了,故iotop看了下,基本可以确定为是mysql进程的问题,如下: 但是iotop只能 ...

  8. MySQL各类日志文件相关变量介绍

    文章转自:http://www.ywnds.com/?p=3721 MySQL各类日志文件相关变量介绍 查询所有日志的变量   1 mysql> show global variables li ...

  9. 018:InnoDB 存储引擎、表空间

    目录 一.InnoDB 存储引擎 1. InnoDB的历史 2. InnoDB的特点 3. InnoDB存储引擎的文件 3.1 概述 3.2 InnoDB - 表空间 3.3 General表空间 3 ...

  10. MySQL Innodb表空间不足的处理方法

    官方给出的解决方案: 添加和删除 InnoDB 数据和日志文件 这一节描述在InnoDB表空间耗尽空间之时,或者你想要改变日志文件大小之时,你可以做的一些事情. 最简单的,增加InnoDB表空间大小的 ...

随机推荐

  1. 18 个最佳代码编辑器/IDE推荐

    本文为开发人员收录了18个最好的代码编辑器/IDE工具,希望你会喜欢. 1) chocolatapp Chocolat是最新出现的一款强大的Mac系统文本编辑器,兼具原生的Cocoa及强大的文本编辑功 ...

  2. ms sql 在任何位置 添加列

    摘自: http://bbs.csdn.net/topics/40236129 在任何位置插入列:create proc addcolumn@tablename varchar(30),  --表名@ ...

  3. PhantomJS + Selenium webdriver 总结-元素定位

    webdriver提供了丰富的API,有多种定位策略:id,name,css选择器,xpath等,其中css选择器定位元素效率相比xpath要高些,使用id,name属性定位元素是最可靠,效率最高的一 ...

  4. Node.js monly图片批量下载爬虫1.00

    此爬虫又用到了iconv转码,代码如下: //====================================================== // mmonly图片批量下载爬虫1.00 ...

  5. 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-为什么没有自动识别成标准FBD功能块

    新建一个项目,是不会自动把FBD对应名称的模块识别成标准功能块的   你需要引入相应的类库重新输入FBD   然后才会自动生成     更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空间: ht ...

  6. JMeter 一:Elements of a Test Plan

    参考:http://jmeter.apache.org/usermanual/test_plan.html 最小测试集包括:Test Plan,一个Thread Group,以及一个或多个Sample ...

  7. Ubuntu 下apache2 增加新的module

    http://andrew913.iteye.com/blog/398648 首先来介绍下apache的一个工具apxs.apxs是一个为Apache HTTP服务器编译和安装扩展模块的工具,用于编译 ...

  8. LR 监控mysql

    sapphire的个人空间 中介绍了LoadRunner监控Mysql和Appache进程占用cpu的方法 方法如下: 公司的新产品需要监控Mysql和Appache进程,求高手帮忙总算成功了. 服务 ...

  9. 《Javascript权威指南》学习笔记之十九--HTML5 DOM新标准---处理文档元信息和管理交互能力

    一.了解DOM 1.DOM是Document Object Model的缩写,即文档对象类型,是文档在内存中的表示形式,是一个应用程序接口,定义了文档的逻辑结构以及一套訪问和处理文档的方法. 2.HT ...

  10. Telnet使用

    #使用telnet telnet #使用telnet,并连接到[ip] [port] telnet [ip] [port]     baidu zone - telnet使用方法