MySQL InnoDB读书笔记07 MySQL中各种类型文件详解

Posted 代码被吃掉了

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL InnoDB读书笔记07 MySQL中各种类型文件详解相关的知识,希望对你有一定的参考价值。

一、参数文件

1. 参数文件作用

当数据库启动时,数据库首先会去按顺序读取若干个配置参数文件,这些文件当中包含:各种文件路径定义、各种数据结构的大小等

通过mysql --help | grep my.cnf查看 MySQL 配置文件及读取顺序

[gongruiyang@localhost ~]$ mysql --help | grep my.cnf
/etc/mysql/my.cnf /etc/my.cnf ~/.my.cnf  order of preference, my.cnf, $MYSQL_TCP_PORT,

MySQL 和 Oracle 是两个比较常见的数据库产品,其中 Oracle 必须读取配置文件才能正常启动,而 MySQL 可以不读取任何配置文件并能正常启动,这时,MySQL 中的各种数据结构分配的大小取决于源码中定义的默认值

2. 参数的定义

简单来说,我们可以把数据库参数看成一个key - value(键值)对,如下例:

MySQL [(none)]> show variables like 'innodb_buffer_pool_size'\\G;
*************************** 1. row ***************************
Variable_name: innodb_buffer_pool_size
        Value: 8388608
1 row in set, 1 warning (0.00 sec)
MySQL [information_schema]> select * from GLOBAL_VARIABLES where VARIABLE_NAME like 'innodb_buffer_pool_size'\\G
*************************** 1. row ***************************
 VARIABLE_NAME: INNODB_BUFFER_POOL_SIZE
VARIABLE_VALUE: 8388608
1 row in set, 1 warning (0.01 sec)

这个参数的keyinnodb_buffer_pool_size,而value8388608

查看参数及其值的方法:

  1. 我们可以通过show variables like查看指定的参数的取值
  2. 通过information_schema 架构下的GLOBAL_VARIABLES 视图来进行查找

3. 参数的类型

根据是否可以修改分为:

  1. 动态参数:指 MySQL 实例运行中可以进行修改
  2. 静态参数:在整个 MySQL 实例的生命周期内都不可以修改,故这种参数为只读参数

同一个参数,它会有两个作用范围:

  1. global 范围:作用域为整个数据库
  2. session 范围:作用域为当前建立的会话
MySQL [information_schema]> select @@global.read_buffer_size\\G;
*************************** 1. row ***************************
@@global.read_buffer_size: 65536
1 row in set (0.00 sec)

MySQL [information_schema]> select @@session.read_buffer_size\\G;
*************************** 1. row ***************************
@@session.read_buffer_size: 65536
1 row in set (0.00 sec)

MySQL [information_schema]> set read_buffer_size=524288;
Query OK, 0 rows affected (0.00 sec)

MySQL [information_schema]> select @@session.read_buffer_size\\G;
*************************** 1. row ***************************
@@session.read_buffer_size: 524288
1 row in set (0.00 sec)

MySQL [information_schema]> select @@global.read_buffer_size\\G;
*************************** 1. row ***************************
@@global.read_buffer_size: 65536
1 row in set (0.00 sec)
参数修改前修改后
session.read_buffer_size65536524288
global.read_buffer_size6553665536

示例中仅仅是将当前会话的read_buffer_size修改了,如果再建立其他的会话,read_buffer_size依然和global的保持一致

4. 参数的修改

当前会话参数设置:

set session.VARIABLE_NAME=VARIABLE_VALUE;

数据库参数设置:

set global.VARIABLE_NAME=VARIABLE_VALUE;

若修改只读变量,会出现以下报错:

MySQL [information_schema]> set global datadir='c:db';
ERROR 1238 (HY000): Variable 'datadir' is a read only variable

二、日志文件

1. 日志文件的分类

MySQL 的日志文件分为以下几类:

  1. error log(错误日志)
  2. bin log(二进制日志)
  3. slow query log(慢查询日志)
  4. log(查询日志)

2. error log

错误日志(error log)文件对数据库的启动、运行、关闭过程进行了记录,该文件不仅仅显示错误信息,还会记录一些警告信息和正确的信息

查看 error log 文件所在路径:

MySQL [information_schema]> show variables like 'log_error';
+---------------+-------------------+
| Variable_name | Value             |
+---------------+-------------------+
| log_error     | .\\GONGRUIYANG.err |
+---------------+-------------------+
1 row in set (0.00 sec)

所以,当数据库无法启动时,我们可以看看 error log 来判断问题出在了哪里。

error log 文件内容:

3. bin log

二进制日志(binary log)记录了所有对 MySQL 数据库执行更改的操作,更改的操作包括 update 、insert、delete、alter 等

3.1 开启 bin log 功能

  1. 修改配置文件:

  1. 重启 MySQL 服务
  2. 连接 MySQL
  3. 运行 show binary logs命令
MySQL [(none)]> show binary logs;
+----------------+-----------+
| Log_name       | File_size |
+----------------+-----------+
| log-bin.000001 |       154 |
+----------------+-----------+
1 row in set (0.00 sec)

3.2 查看 bin log 变化过程

运行两个 update 语句,观察 binlog 文件大小变化过程:

MySQL [(none)]> show binary logs;
+----------------+-----------+
| Log_name       | File_size |
+----------------+-----------+
| log-bin.000001 |       154 |
+----------------+-----------+
1 row in set (0.00 sec)

MySQL [gongruiyang]> update test set a = '1' where a = '2';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

MySQL [gongruiyang]> show binary logs;
+----------------+-----------+
| Log_name       | File_size |
+----------------+-----------+
| log-bin.000001 |       434 |
+----------------+-----------+
1 row in set (0.00 sec)

MySQL [gongruiyang]> update test set a = '1' where a = '2';
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0  Changed: 0  Warnings: 0

MySQL [gongruiyang]> show binary logs;
+----------------+-----------+
| Log_name       | File_size |
+----------------+-----------+
| log-bin.000001 |       434 |
+----------------+-----------+
1 row in set (0.00 sec)
  1. 第一次执行 update 语句,数据发生变化时才会写入 binlog
  2. 第二次执行 update 语句,数据没有发生变化不会写入 binlog

binary log 文件内容:

3.3 binlog 的作用

binary log 有以下几个作用:

  1. 数据的恢复:某些数据的恢复需要二进制文件,例如:在一个数据库全备份文件恢复后,用户可以通过二进制日志恢复某个特定时刻的数据
  2. 主从复制:通过复制和执行二进制文件使得一台远程 MySQL 数据库与一台 MySQL 数据库进行实时同步
  3. 审计检查:用户可以通过二进制文件中的信息来进行审计,判断是否有对数据库进行注入攻击

3.4 binlog 文件和 index 文件

gongruiyang@gongruiyang$ ls log-bin.*
log-bin.000001  log-bin.index
  • log-bin.000001就是二进制日志文件,后缀名为文件序号

  • log-bin.index是用来管理二进制文件序号的

gongruiyang@gongruiyang$ cat log-bin.index
.\\log-bin.000001

3.5 binlog 日志流转过程

当使用支持事务的存储引擎(例如:InnoDB)时,所有未提交的二进制日志都会被记录到一个缓存中去,等待事务提交后,直接将缓冲中的二进制日志写入二进制日志文件中去。

cache的大小由参数binlog_cache_size控制:

MySQL [gongruiyang]> show variables like 'binlog_cache_size'\\G;
*************************** 1. row ***************************
Variable_name: binlog_cache_size
        Value: 32768
1 row in set, 1 warning (0.00 sec)

当一个进程开始一个事务时,会自动分配一个大小为 binlog_cache_size 的 cache 用来容纳二进制日志,当 cache 被写满后,会将 cache 中的二进制日志写入临时文件中去,故 binlog_cache_size 设置要适中

cache其他相关参数:

MySQL [gongruiyang]> show global status like 'binlog_cache%'\\G;
*************************** 1. row ***************************
Variable_name: Binlog_cache_disk_use
        Value: 0
*************************** 2. row ***************************
Variable_name: Binlog_cache_use
        Value: 1
2 rows in set (0.00 sec)
  • Binlog_cache_disk_use:记录使用临时文件的次数
  • Binlog_cache_use:记录使用 cache 的次数

3.6 其他重要参数

sync_binlog:表示每向 cache 中写多少次后就同步到磁盘上,该值为 1 表示采用同步写磁盘的方式写二进制日志,这时表示不使用操作系统的 cache 来写二进制日志

MySQL [gongruiyang]> show variables like 'sync_binlog'\\G;
*************************** 1. row ***************************
Variable_name: sync_binlog
        Value: 1
1 row in set, 1 warning (0.00 sec)

log_slave_updates:如果当前数据库是 slave 角色,则需要开启该参数,表示它会从 master 取得 binlog 写入自己的 binlog 文件中,进而实现主从复制

MySQL [(none)]> show variables like 'log_slave_updates'\\G;
*************************** 1. row ***************************
Variable_name: log_slave_updates
        Value: OFF
1 row in set, 1 warning (0.00 sec)

binlog_format:表示记录二进制日志的格式,是动态参数,MySQL实例运行时可修改

MySQL [(none)]> show variables like 'binlog_format'\\G;
*************************** 1. row ***************************
Variable_name: binlog_format
        Value: ROW
1 row in set, 1 warning (0.00 sec)

日志格式有三种:

  1. STATEMENT 格式:记录原生 SQL 语句
  2. ROW 格式:记录表的行更改情况,产生的日志会更大一些
  3. MIXED 格式:默认情况下使用 STATEMENT 格式,一些情况下使用 ROW 格式

特殊情况:表引擎为 NDB、使用不确定函数 UUID() 等、使用 insert delay 语句、使用用户定义函数、使用临时表

4. slow query log

慢查询日志文件中记录的是:

  1. 运行时间超过某阈值的所有 SQL 语句
  2. 没有使用索引的 SQL 语句

慢查询日志可以存放在两个地方:

  1. slow_log 文件中
  2. mysql 架构下的 slow_log 表中

4.1 开启 slow log 功能相关参数

该文件可以帮助 DBA 来确认是否需要将某些查询语句进行优化,阈值由参数 long_query_time 控制

MySQL [(none)]> show variables like 'long_query_time'\\G;
*************************** 1. row ***************************
Variable_name: long_query_time
        Value: 10.000000
1 row in set (0.00 sec)

查看是否启用慢查询日志功能参数:slow_query_log

MySQL [(none)]> show variables like 'slow_query_log'\\G;
*************************** 1. row ***************************
Variable_name: slow_query_log
        Value: ON
1 row in set (0.00 sec)

是否开启记录不走索引的 SQL 语句参数:log_queries_not_using_indexes

每分钟最大记录不走索引的 SQL 语句条数参数:log_throttle_queries_not_using_indexes

MySQL [(none)]> show variables like 'log_queries_not_using_indexes'\\G;
*************************** 1. row ***************************
Variable_name: log_queries_not_using_indexes
        Value: OFF
1 row in set (0.00 sec)

MySQ

以上是关于MySQL InnoDB读书笔记07 MySQL中各种类型文件详解的主要内容,如果未能解决你的问题,请参考以下文章

《MySQL技术内幕InnoDB存储引擎》读书笔记 第一章

读书笔记《MySQL体系结构和存储引擎》

读书笔记使用JMeter创建数据库(Mysql)测试

高性能mysql读书笔记:Schema与数据类型优化

《高性能MySQL》读书笔记

《mysql必知必会》读书笔记--存储过程的使用