文件

​ 有以下类型文件

  • 参数文件:告诉MYSQL实例启动时在哪里找到数据库文件,并且制定某些初始化参数。
  • 日志文件:用来记录MYSQL实例对某种条件作出响应时写入的文件。
  • socket文件:当用UNIX域套接字方式进行连接时需要的文件。
  • pid文件:MYSQL实例的进程ID文件
  • MySQL表结构文件:用来存放MYSQL表结构定义文件。
  • 存储引擎文件:

参数文件

​ 查找参数文件命令

mysql --help | grep my.cnf

​ 查找参数值命令

SELECT * FROM GLOBAL_VARIABLES WHERE VARIABLE_NAME LIKE 'innodb_buffer%'\G;

# 推荐使用
SHOW VARIABLES LIKE 'innodb_buffer%'\G;

​ 分为两类

  • 动态参数
  • 静态参数

​ 动态参数可以在MYSQL实例运行进行更改,静态参数则是不可更改的。更改动态参数的语法如下:

SET
| [global | session] system_var_name=expr
| [@@global. | @@session. | @@] system_var_name = expr

global:全局的,session:当前会话。说明参数的作用域是不通的。一些demo

# 改变当前会话,不会改变全局
SET read_buffer_size = 524288 # 改变全局会话参数,不会改变当前
SET @@global.read_buffer_size = 1048576; # 查询当前会话参数
SELECT @@session.read_buffer_size\G; # 查询全局会话参数
SELECT @@global.read_buffer_size\G;

​ 但是这种修改,并不最终修改配置文件my.cnf的参数值,所以重新启动后,参数还是按照配置文件中的加载。

日志文件

错误日志

​ 记录了所有的错误信息、警告信息。查找错误日志文件位置

SHOW VARIABLES LIKE 'log_error'\G;

慢查询日志

​ 记录查询慢的SQL,可以帮助优化。可以设置记录的阈值,并且打开开关

SHOW VARIABLES LIKE 'long_query_time'\G;
SHOW VARIABLES LIKE 'long_slow_queries'\G;

​ 还有一个参数,如果SQL语句没有使用索引,就会加入到慢查询日志文件(slow log)中。

SHOW VARIABLES LIKE 'log_queries_not_using_indeces'\G;

# 设置每分钟允许记录到slow log的且未使用所以的SQL语句次数,缺省为0,表示没有限制。
SHOW VARIABLES LIKE 'log_throttle_queries_not_using_indexs'

​ 但是如果数据量比较大的话,不好分析分件的话,可以使用MYSQL提供的mysqldumpslow命令

# 从指定文件读取日志
mysqldumpslow nh122-190-slow.log # 得到执行时间最长的10条SQL语句
mysqldumpslow -s al -n 10 david.log

​ 还可以经过配置,在slow_log中查询慢日志

# 慢日志表名
SHOW CREATE TABLE mysql.show_log\G; # 默认慢查询输出格式是FILE,则可以设为TABLE
SHOW VARIABLES LIKE 'log_output'\G;
SET GLOBAL log_output='TABLE';
SHOW VARIABLES LIKE 'log_output'\G; # 查询慢日志
SELECT * FROM mysql.slow_log\G;

​ 但是slow_log默认是用的CSV引擎,可使用MyISAM引擎,提升查询效率(大数据量)

ALTER TABLE mysql.slow_log ENGINE=MyISM;
SET GLOBAL slow_query_log=off;
ALTER TABLE mysql.slow_log ENGINE=MyISM;

​ 通过额外的参数记录相关信息到慢日志表中

​ 通过参数long_query_io将超过指定逻辑IO次数的SQL语句记录到slow log中。默认值是100.

​ 通过参数slow_query_type表示启动slow log的方式

  • 0:不将SQL记录到slow log
  • 1:根据运行时间将SQL语句记录到slow log
  • 2:根据逻辑IO次数将SQL语句记录到slow log
  • 3:根据运行时间以逻辑IO次数将SQL语句记录到slow log

查询日志

​ 记录了所有对MYSQL数据库请求的信息,名字一般为主机名.log

二进制日志(binary log)

​ 记录了对MYSQL数据库执行更改的所有操作。只要操作使得数据库发生变化,就会写入二进制日志。但操作若果未导致数据库发生变化,也有可能写入二进制日志。例如

UPDATE t SET a = 1 WHERE a = 2;
SHOW MASTER STATUS\G;
show binlog events in 'mysqld.000008'\G;

​ 二进制日志主要作用

  • 恢复:某些数据的恢复需要二进制文件。例如,在一个数据库全被文件恢复后,用户可以通过二进制日志进行point-in-time恢复
  • 复制:通过复制和执行二进制日志使一台远程的MYSQL数据库(一般是slave或者standy)与一台MYSQL数据库(master或primary)进行实时同步。
  • 审计:用户可以通过二进制日志中的信息来进行审计,判断是否有对数据库进行注入的攻击。

​ 通过配置惨呼log-bin=[name]可以启动二进制日志。如果不指定name,则默认二进制日志文件名为主机名,后缀名为二进制日志的序列号。

# 查询二进制日志路径
show variablers like 'datadir'; # MYSQL调用LL
system ls -lh /user/local/mysql/data/;

bin_log.index为二进制的索引文件,用来存储过往产生的二进制日志序号。

​ 以下配置文件的参数影响着二进制日志记录的信息和行为。

  • max_binlog_size

    ​ 指定单个二进制日志文件的最大值。默认为1G

  • binlog_cache_size

    ​ 当使用事务的表存储引擎(INNODB)时,所有未提交的二进制日志会被记录到一个缓存中去,等待事务提交时直接将缓冲中的二进制日志写入二进制日志文件,而缓冲的大小由binlog_cache_size决定,默认大小为32K。

    ​ 值过大,浪费空间;值太小,会把缓冲中的日志写入到一个临时文件中。

    # 查询设置的缓存大小
    SHOW VARIABLES LIKE 'binlog_cache_size'; # 查看缓冲池状态
    SHOW GLOBAL STATUS LIKE 'binlong_cache%';

  • sync_binlog

    ​ 默认情况下,二进制日志是使用缓冲写的方式,但是数据库宕机时,有可能缺少一部分数据,给恢复和复制带来问题,所以使用参数sync_binlog=[N]表示每写缓冲多少次就同步到磁盘。如果N改成1的话,就是同步写磁盘来写二进制日志。可用性和IO性能需要进行取舍。

    ​ 且当sync_binlog=1时,假设有事务还没commit,也会将二进制日志立即写入磁盘,但是如果发生宕机,二进制日志已经记录了该事务信息,不能回滚。这个问题可以通过将参数innodb_support_xa为1来解决。

  • binlog-do-db

    ​ 表示需要写入哪些库的日志

  • binlog-ignore-db

    ​ 表示需要忽略写入哪些库的日志

  • log-slave-update

    ​ 如果需要搭建master->slave->slave架构的复制,需要设置log-slave-update参数。

  • binlog_format

    ​ 非常重要,影响记录二进制日志的格式。

    • STATEMENT:记录的是日志的逻辑SQL语句。

      ​ 这个对于复制是有一定要求的,如果再主服务器运行rand、uuid等函数,又或者使用触发器等操作,这些都可能会导致主从服务器上表中数据的不一致(not sync)。

      ​ 另一个影响是:导致INNODB使用的默认事务隔离级别是REPEATABLE READ,如果使用READ COMMITTED的事务隔离界别,会出现类似丢失更新的现象,导致主从数据库上的数据不一致。

    • ROW:记录表的行更改情况

      ​ 类似于Oracle的物理Standby,修复了Statement格式下的复制问题,也可以设置INNODB的事务隔离基本为READ COMMITTED,以获取更好的并发性。

    • MIXED:默认采用STATEMENT格式进行二进制日志文件的记录,但是在一些情况下会使用ROW格式。

      • 表的存储引擎为NDB

      • 使用了UUID()、USER()、CURRENT_USER()等不确定函数。

      • 使用了INSERT DELAY语句

      • 使用了用户定义函数(UDF)

      • 使用了临时表(temporary table)

    查看二进制日志文件,只能使用MYSQL提供的工具mysqlbinlog

# 查看STATEMENT格式
mysqlbinlog --start-position=203 test.00004 # 查看ROW格式
mysqlbinlog -vv --start-position=203 test.00004

套接字文件

​ UNIX本地连接MYSQL可以采用UNIX域套接字方式,这种方式需要个套接字文件

pid文件

​ MYSQL实例启动时,会将自己的进程ID写入一个文件中——该文件即为pid文件。文件名由参数pid_file控制。

表结构定义文件

​ MYSQL数据的存储是根据表进行的,每个表都会有与之对应的文件。但不论表采用何种存储引擎,MYSQL都有一个以frm为后缀名的文件,这个文件记录了该表的表结构定义。

​ 也可以用来存放视图的定义。frm文件可以直接查看。

INNODB存储引擎文件

表空间文件

​ innoDB将存储的数据按表空间进行存放。在默认配置下会有一个ibdatal文件,该文件就是默认的表空间文件。可以通过参数innodb_data_file_path对其进行设置

innodb_data_file_path=datafile_spec1[;datafile_spec2]...

#demo
#文件大小都设置为2000MB,其次ibdata2文件使用完2000M之后可以自动增长。
[mysqld]
innodb_data_file_path = /db/ibdatal:2000M;/dr2/db/ibdata2:2000M:autoextend

​ 使用两个文件组成表空间,若两个文件位于不同的磁盘,可以平均磁盘负载,提高数据的整体性能。设置之后所有数据都会存入共享表空间。如果设置参数innodb_filw_per_table就会给每个表一个独立的存储空间。

SHOW VARIABLES LIKE 'innodb_file_per_table'\G;

​ 注意,即使开启了上述参数,独立的表空间也只存储对应表的数据、索引和插入缓冲BITMAP等信息。其他信息还是放在默认的表空间中。

重做日志文件

​ 默认情况下,INNODB存储引擎的数据目录下会有两个名为ib_logfile0ib_logfile1的文件。称为重做日志文件,在恢复时至关重要。

​ 每个INNODB存储引擎至少有一个重做日志文件组,每个文件组下至少有2个重做日志文件。为了更高的可靠性,用户可以设置多个的镜像日志组,将不同的文件组放在不同的磁盘上,提高重做日志的可用性。

​ 在日志组中每个重做日志文件的大小一致,并以循环写入的方式运行。

​ 下列参数严重影响重做日志文件的属性。

  • innodb_log_file_size

    ​ 指定每个重做日志文件的大小。

    ​ 设置的过大,在恢复时可能需要很多的时间。设置的过小,一个事务需要多次切换重做日志文件。还可能导致频繁的async checkpoint

  • innodb_log_files_in_group

    ​ 指定日志文件组中重做文件的数量。

  • innodb_mirrored_log_grooups

    ​ 指定日志镜像文件组的数量,默认为1.

  • innodb_log_group_home_dir

    ​ 指定日志文件组所在路径。默认为./,表示在数据库的数据目录下

SHOW VARIABLES LIKE 'innodb%log%'\G;

​ 事务日志和二进制日志的区别:

  • 二进制会记录所有MYSQL数据库有关的日志记录。包括各种引擎的日志,而重做日志只记录有关该存储引擎本身的事务日志。
  • 记录的内容不同。二级制日志文件记录的是关于一个事务的具体操作,即该日志的逻辑日志。而INNODB存储引擎的重做日志文件记录的是关于每个页的更改的物理情况。
  • 写入的时间也不同,二进制日志文件仅在事务提交前进行提交,即只写磁盘一次,不论这时事务多大。而在事务进行的过程中,却不断有重做日志条目被写入到重做日志文件中。

​ INNODB存储引擎中,对于各种不同的操作有着不同的重做日志格式,但是基本格式相同。

1 2 3 4
reg_log_type space page_no redo_log_body

​ 由四个部分组成:

  • redo_log_type占用1字节,表示重做日志的类型。
  • space表示表空间的ID,但采用压缩的方式,因此占用的空间可能小于4字节。
  • page_on表示页的偏移量,同样采用压缩的方式
  • redo_log_body表示每个重做日志的数据部分,恢复时需要调用响应的函数进行解析。

​ 从重做日志缓冲往磁盘写入时,是按512字节(一个扇区)的大小进行写入。所以保障写入必定成功。不需要有doublewrite

​ 触发缓冲写入重做日志的条件:

  • 主线程每秒会将重做日志写入磁盘的重做日志中,不论事务是否已经提交。
  • 通过innodb_flush_log_at_trx_commit控制,表示在commit操作时,处理重做日志的方式
    • 0:表示事务提交时,并不将事务的重做日志写入磁盘上的日志文件,而是等待主线程每秒的刷新
    • 1:在执行commit时将重做日志缓冲同步写入磁盘
    • 2:在执行commit时将重做日志缓冲异步写入磁盘,只保证这个动作会发生。

​ 所以,为了保障ACID中的持久性,一般就把这个参数设置为1。

MySQL技术内幕读书笔记(三)——文件的更多相关文章

  1. 深入理解linux网络技术内幕读书笔记(三)--用户空间与内核的接口

    Table of Contents 1 概论 1.1 procfs (/proc 文件系统) 1.1.1 编程接口 1.2 sysctl (/proc/sys目录) 1.2.1 编程接口 1.3 sy ...

  2. Struts2技术内幕 读书笔记三 表示层的困惑

    表示层能有什么疑惑?很简单,我们暂时忘记所有的框架,就写一个注册的servlet来看看. index.jsp <form id="form1" name="form ...

  3. MySQL技术内幕读书笔记(八)——事务

    事务的实现 ​ 事务隔离性由锁来实现.原子性.一致性.持久性通过数据库的redo log和undo log来完成.redo log称为重做日志,用来保证事务的原子性和持久性.undo log用来保证事 ...

  4. MySQL技术内幕读书笔记(七)——锁

    锁 ​ 锁是数据库系统区分与文件系统的一个关键特性.为了保证数据一致性,必须有锁的介入.数据库系统使用锁是为了支持对共享资源进行并发访问,提供数据的完整性和一致性. lock与latch ​ 使用命令 ...

  5. MySQL技术内幕读书笔记(五)——索引与算法

    索引与算法 INNODB存储引擎索引概述 ​ INNODB存储引擎支持以下几种常见的索引: B+树索引 全文索引 哈希索引 ​ InnoDB存储引擎支持的哈希索引是自适应的.会根据表的情况自动添加 ​ ...

  6. MySQL技术内幕读书笔记(四)——表

    目录 表 索引组织表 InnoDB逻辑存储结构 INNODB行记录格式 INNODB数据页结构 约束 视图 分区表 表 ​ 表就是关于特定实体的数据集合,是关系型数据库模型的核心. 索引组织表 ​ 在 ...

  7. MySQL技术内幕读书笔记(二)——InnoDB存储引擎

    目录 InnoDB存储引擎 InnoDB存储架构 Checkpoint技术 Master Thread 工作方式 InnoDB关键特性(放一下,感觉看后面,再看总结吧) InnoDB存储引擎 Inno ...

  8. MySQL技术内幕读书笔记(一)——Mysql体系结构和存储引擎

    目录 MySQL体系结构和存储引擎 定义数据库和实例 MYSQL体系结构 MYSQL存储引擎 MySQL体系结构和存储引擎 定义数据库和实例 数据库:物理操作系统文件或者其他形式文件类型的结合.在MY ...

  9. MySQL技术内幕读书笔记(六)——索引与算法之全文索引

    全文索引 概述 ​ 通过索引字段的前缀进行查找,B+树索引是支持的,利用B+树索引就可以进行快速查询. SELECT * FROM blog WHERE content like 'xxx%'; ​ ...

随机推荐

  1. Windows10 下Apache服务器搭建

    Windows10 下Apache服务器搭建   转 https://blog.csdn.net/sunqian666888/article/details/78561399 目录 一.软件下载 二. ...

  2. Linux常用命令大全(转)

    (转)Linux常用命令大全(非常全!!!) 最近都在和Linux打交道,感觉还不错.我觉得Linux相比windows比较麻烦的就是很多东西都要用命令来控制,当然,这也是很多人喜欢linux的原因, ...

  3. PAT (Advanced Level) Practise 1004 解题报告

    GitHub markdownPDF 问题描述 解题思路 代码 提交记录 问题描述 Counting Leaves (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 1600 ...

  4. for循环以及数据类型

    一.for循环(迭代式循环) 了解:当我们在写代码时,如果代码是纯运算的代码,会占用大量的CPU,如果是I/O代码,则不会占用CPU. for i in range(10):  #可以是任意类型(字符 ...

  5. C语言实现密码修改

    /* *修改密码 *描述: *1.本来已经存在密码 *2.很多时候需要输入两次密码,对比是否正确,才能确认修改密码正确 *敲代码思路: *1.输入旧的密码判断是否正确 *2.提示输入修改后的密码 *3 ...

  6. mongodb副本集与分片结合

    1.在三个不同服务器上,分别建立副本集: 202服务器: 192.8.123.202:27017 replSet = r202 192.8.123.202:27018 replSet = r202 1 ...

  7. 解决 插件LArea 在IOS上浮出软键盘问题

    移动端使用 省市县城市选择三级联动的时候, 插件LArea 会有一个问题 ios浏览器和ie9已下(包括ie9)浏览器都有input设置readonly之后input还有聚焦的问题. ios inpu ...

  8. Spring(2)—IOC

    一.Spring IOC是什么 1.简述 Spring是一个开源框架 Spring为简化企业级应用开发而生,使用Spring可以使简单的JavaBean实现以前只有EJB才能实现的功能 Spring是 ...

  9. 如何移除HTML5 input在type="number"时的上下小箭头

      在chrome下: input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{    -webkit-appearance ...

  10. Linux内存管理学习资料

    下面是Linux内存管理学习的一些资料. 博客 mlock() and mlockall() system calls. All about Linux swap space 逆向映射的演进 Linu ...