前言:本文是自己的阅读《Mysql技术内幕——InnoDB存储引擎》的笔记,主要是为了将阅读和实践结合起来,途中会穿插自己的理解及自己工作中的实践。我理解阅读一本经典的书,无论是技术书籍还是生活数据,带着目的去读,知道书讲得是什么,并且结合自己的理解,输出一定的文字。
告诉MySQL实例启动时在哪里可以找到数据库文件,并且指定某些初始化参数,这些参数定义了某种内存结构的大小等设置,还会介绍各种参数的类型
默认情况下,mysql会按照一定的顺序在指定的位置进行读取,可以通过命令mysql --help | grep my.cnf
查找配合文件
mysql中的参数一般是一个键值(key/value)的方式
可以通过 show variables 查看所有的参数,当然也可以加上like进行筛选
可以在表中查询具体的数据
SHOW VARIABLES LIKE 'innodb_buffer%'\G;
SET
| [global | session ] system_var_name = expr //global和session判别基于当前会话还是整个生命周期
| [@@global. | @@session. | @@] system_var_name=expr
配合全局设置
SET @@session.read_buffer_size=13421;
用来记录MySQL实例对某种条件做出响应时写入的文件。如错误日志文件、二迸制日志文件、慢查询日志文件、查询日志文件等。
错误日志文件对MySQL的启动、运行、关闭过程进行了记录。MySQL DBA在遇到问题时应该首先查看该文件以便定位问题。该文件不仅记录了所有的错误信息,也记录一些警告信息或正确的信息。
show variables like 'log_error'\G;
慢查询日志( slow log)可帮助DBA定位可能存在问题的SQL语句,从而进行SQL语句层面的优化。
例如,可以在MySQL启动时设一个阈值,将运行时间超过该值的所有SQL语句都记录到慢查询日志文件中。
DBA每天或每过一段时间对其进行检查,确认是否有SQL语句需要进行优化。
该阈值可以通过参数long_query_time
来设置,默认值为10,代表10秒。
参数设置
SHOW VARIABLES LIKE 'long_query_time'\G;
// 查看是否开启慢查询日志
SHOW VARIABLES LIKE 'log_slow_queries\G';
与慢查询有关的语句,检查是否开启了索引
SHOW VARIABLES LIKE 'log_queries_not_using_indexes'\G;
针对于慢查询,MYSQL数据库提供了mysqldumpslow命令
mysqldumpslow xxx.log
将慢查询日志记录到一张表中,默认放到表slow_log表
-- 查看慢查询表的结构
SHOW CREATE TABLE mysql.slow_log\G;
查询日志记录了所有对MySQL数据库请求的信息,无论这些请求是否得到了正确的执行。
默认文件名为:主机名.log。
如查看一个查询日志:
cat xx.log
二进制日志(binary log)记录了对MySQL数据库执行更改的所有操作,但是不包括SELECT和SHOW这类操作。
因为这类操作对数据本身并没有修改。然而,若操作本身并没有导致数据库发生变化,那么该操作可能也会写入二进制日志。
比如:如果需要监听数据库修改之后,再做其他的动作,可以监听二进制日志的变化
主要作用
point-in-time
的恢复。查看二进制文件的路径
show variables like 'datadir';
STATEMENT
:记录的是逻辑SQL格式。ROW
:记录表的行更改情况,一般设置为这种模式,可以为数据库恢复和复制带来更好的性能,但是空间消耗更大。MIXED
:混合模式。设置方式
SET SESSION binlog_format='ROS'\G;
如何查看二进制文件
mysqlbinlog --start-position=20 binlog.000018
当用UNIX域套接字方式进行连接时需要的文件。
查看套接字文件:
show variables like 'socket'\G;
MySQL实例的进程ID文件。
当MySQL实例启动时,会将自己的进程ID写入一个文件中——该文件即为pid文件。
该文件可由参数pid_file
控制,默认位于数据库目录下,文件名为主机名.pid:
show variables like 'pid_file'\G;
用来存放MySQL表结构定义文件,以frm为后缀名的文件。
因为MySQL表存储引擎的关系,每个存储引擎都会有自己的文件来保存各种数据。
将存储数据按照表空间进行存放(可以设置每个表一个表空间),默认情况下,会有一个初始化大小为10MB,名为ibdata1的文件
设置方式
innodb_data_file_path = 'xxx'
//可以设置每个表一个表空间
SHOW VARIABLES LIKE 'innodb_file_per_table'\G;
主要作用:用于保证数据的稳定性,例如,数据库由于所在主机掉电导致实例失败,InnoDB存储引擎会使用重做日志恢复到掉电前的时刻,以此来保证数据的完整性。这也就是事务中持久化的保证。
记录对于InnoDB存储引擎的事务日志
同样是记录事务,二进制日志和重做日志文件区别?
注意:重做日志不是直接写入,而是先写入一个重做缓冲区,然后再按照一定的顺序写入到文件中。
如何做到持久化?
每当有事务提交时,必须确保事务都已经写入重做日志文件(写入到磁盘),如果数据库发生意外宕机时,可以通过重做日志文件恢复,并且可以保证已经提交的事务。
本篇文章主要介绍数据库中的一些文件,包括各个文件的作用,其中二进制文件(binlog)和重做日志文件(redo log)尤其重要,前者可以用来恢复和复制数据库,后者用来确保事务的持久性。
思考题:如果保证事务的隔离性和原子性呢?