MySQL 日志 socket_(3.12)mysql基础深入——mysql日志文件/其他文件(socket/pid/表结构/Innodb)...

(3.12)mysql基础深入——mysql日志文件/其他文件(socket/pid/表结构/Innodb)

关键词:mysql日志文件,mysqldumpslow分析工具

目录:日志文件的分类

1、错误日志(error log)

2、二进制日志(binlog):mysqlbinlog分析查看工具

3、慢查询日志(show query log):mysqldumpslow分析工具

4、通用日志(general log)

5、重做日志(redo log)

6、中继日志(relay log)

7、DDL日志(ddl log)

8、其他文件(socket/pid/表结构/Innodb)

详情:

1、错误日志(error log)

【1.1】查看错误日志是否启用

mysql> show variables like 'log_err%';

【1.2】配置文件设置

[mysqld]

log-error=[path/[file_name]]

【1.3】重建错误日志文件(如果日志文件不存在,mysql启动或者执行flush logs时会创建新的日志文件)

(1)mysqladmin -u root -p flush-logs

(2)mysql> flush logs;

【1】概念:mysql启动、运行、关闭过程的记录,记录错误、警告、正常的信息。-- 相当于oracle的alert日志

【2】参数查看:show variables like '%log_error%';

59cea0a86101728b156877ad125364ba.png

解析:log_error_verbosity :(1)只记录错误日志  (2)记录错误+警告信息  (3)记录错误+警告+正常信息

【3】linux系统异常日志:/var/log/messages

2、二进制日志(binlog)

【2.1】# 查看二进制文件

mysql> show variables like 'log_bin%'; #查看是否启用

mysql> show binary logs; #查看二进制文件个数及名称

【2.2】配置文件设置

[mysqld]

log-bin = PATH/[FILENAME] #这里定义的只是一个索引文件,例如这里给/log/binlog,那么会生成binlog.index,而实际存放数据是类似于binlog.00001 之类的,超出范围会继续新建binlog.00002,以此类推

expire_logs_days=10     #清除binlog文件中超过10天的内容,默认值为0,表示“没有自动删除”。当mysql启动或刷新二进制日志时可能删除该文件max_binlog_size=100M    #单个binlog文件的最大容量,如果有大事务运行,运行到一半binlog到达最大值了这个时候不会立马新建,而是会持续写到这个文件里,所以有binlog超出该值也正常。

#常用实践:

[mysqld]

server_id=3306 #服务ID,主从必须不一致。(建议数字:ip+端口) 5.7.3以后版本,必须加

#目录必须存在且授权好,binlog为索引文件,实际文件会自动根据索引文件建立如binlog.0000001

log_bin=/mysql/log/3306/binlog

sql_log_bin=on #开启binlog,如果用了log_bin配置,会自动开启

log_bin_index=/mysql/log/3306/binlog.index   #不设置的话,会根据log_bin值名称自动生成binlog.index

binlog_format='row' #(row,statement,mixed) #3种模式

binlog_rows_query_log_events=on #打开才能查看详细记录

expire_logs_days=10 #超过10天的数据会被认定为过期,且会被清理

max_binlog_size=100M #表示单个二进制文件的最大值为100M,如果有大事务可能会超出最大值

binlog_row_image=full #(full,minimal,noblob),分别表示binlog中内容全记录,只记录被操作的,和不记录二进制

【2.2.1】flush disk相关的

写binlog流程如下:

# 数据操作buffer pool > binlog buffer > file system buffer > commit > binlog file

在写binlog file之前,commit有3种模式,分别是:0,1,N

sync_binlog=0:mysql不会主动同步Binlog内容到磁盘文件中,而是依赖操作系统刷新文件的机会刷binlog file.一般是1S/次

sync_binlog=1:默认值,mysql主动刷新file system buffer到磁盘上的binlog file中,每1次commit,就主动fsync一次。

sync_binlog=N:非0非1,mysql主动刷新file system buffer到磁盘上的binlog file中,每N次commit,就主动fsync一次。

【2.2.2】数据库先写redo log还是先写binlog?

答案:先写redo LOG,再写binlog。如果2个有任一失败,就会回滚。

sync_binlog配合另一个参数innodb_flush_log_at_trx_commit;

如果都是1,数据库挂了以后,最多只丢一条一句或一个事务的数据;

show variables like 'innodb_flush_log_at_trx_commit';

但会影响性能,只能说在数据要求非常高的场景下使用。

【2.3】删除二进制文件

【2.3.1】一般形式

PURGE MASTER LOGS;

PURGE {MASTER | BINARY} LOGS TO 'log_name' #删除log_name 之前建立的文件,不包含该文件

PURGE {MASTER | BINARY} LOGS BEFORE 'date' #删除某个时间之前的所有文件内容,不包含该天

【2.3.2】删除所有二进制文件

RESET MASTER; #执行该语句,所有二进制日志将被删除,mysql 会重新创建二进制日志,新的日志文件扩展名将重新从000001开始编号

【2.4】阅读查看二进制文件

mysqlbinlog /log/binlog.00001 > /tmp/binlog1.log

【2.5】binlog恢复数据

mysqlbinlog恢复数据的语法如下:

mysqlbinlog [option] filename|mysql -uuser -ppass

option是一些可选项,filename是日志文件名

比较重要的两对option参数是--start-datetime、--stop-datetime--start-position、--stop--position--start-date、--stop-date可以指定恢复数据库的起始时间点和结束时间点--start-position、--stop--position可以指定恢复数据的开始位置和结束位置

使用mysqlbinlog恢复mysql数据库到2014年7月2日15:27:48时的状态,执行下面命令

mysqlbinlog--stop-datetime="2014-7-2 15:27:48" D:\mysql\log\binlog\binlog.000008 |mysql -u user -p password

该命令执行成功后,会根据binlog.000008日志文件恢复2014年7月2日15:27:48前的所有操作。

这种方法对误操作的删除数据比较有效

【1】概念:记录数据库发生更改的SQL语句,以二进制方式保存在磁盘中。--相当于Oracle的归档日志

【2】作用:备份恢复、复制、审计

【3】特点:

(1)记录是SQL语句的形式

(2)commit提交的时候才写binlog,提交之前写binlog_buffer,提交时才回写到binlog日志文件。

binlog不会被覆盖,会一直存在(但可以设置保留多场时间的数据,可清多少天之前的数据清理)

(3)对所有表起作用

【4】查看:mysqlbinlog -vv [binlog_filename]

3、慢查询日志(slow query log)

【3.1】查看慢查询日志路径与开启

show variables like'slow_query%';

【3.2】配置文件参数(下面选其一)

[mysqld]

log-slow-queries=[path/[filename]] #开启慢查询并指定日志文件

long_query_time=n #超过n秒的查询记录到慢查询日志中,为0则记录所有查询

[mysqld]

###***logs

long_query_time= 10 #慢查询判断时间/s,为0记录所有查询

slow_query_log= 1#是否开启1开启0关闭

slow_query_log_file=/mysql/slow.log #开启后指定日志文件路径

【3.3】文件内容释义

#time:2019-03-20T00:14:20+08:00

#User@Host:root[root]@[10.10.10.11] ID:4

#Query_time:0.01 这条SQL执行总时间,locak_time:0.001,锁等待时间

#Row_sent:10 这条SQL返回给用户有几条数据 Rows_examined:109,这条SQL一共检查扫描处理了多少行数据。

【3.4】慢查询的原因

(1)lock_time锁等待时间太长  (2)examined处理的数据太多

【3.5】相关参数:

(1)log_queries_not_using_indexes:默认值off,当off时,表示如果使用了索引,就算慢,也不会记录日志。建议on

(2)log_throttle_queries_not_using_indexes:默认值0,即默认1分钟刷一次。表示每1分钟记录下所有未使用索引的SQL(5.6以后才有此参数)。建议10分钟以上

(3)log_output:默认是文件(FILE值),还有一个值是table

【3.6】如何分析查看是否有使用索引?

使用执行计划(1)desc select……   (2)explain select……

【3.7】慢查询日志分析工具(mysql自带)

mysqldumpslow /mysql/slow_query.log

使用 mysqldumpslow --help 查看使用方式

常用核心参数

【3.7.1】-s ORDER what to sort by (al, at, ar, c, l, r, t), 'at'is default

al: average locktime

ar: average rows sent

at: average querytimec: count

l: locktimer: rows sent

t: querytime【3.7.2】-t NUM just show the top n queries

【3.7.3】-g PATTERN grep: only consider stmts that include this string

【3.7.4】

(1)举例取慢查询日志文件中锁定时间最长的10条SQL

mysqldumpslow -s al -t 10 /mysql/slow_query.log(2)获取慢查询日志文件中平均用时最长的包括right join的10条SQL

mysqldumpslow -s at -t 10 -g "right join" /mysql/slow_query.log

【3.8】删除慢查询日志

(1)mysqladmin -u root -p flush logs  (2)mysql> flush logs;

【3.9】注意事项

记住,慢查询日志只会记录已经查询完的SQL语句,正在执行的不会被记录;

【3.10】MySQL的slow log中Query_time包含了Lock_time吗?

首先先给出结论,Query_time包含了Lock_time

下面给出slow log的头部示例:

# Time: 2019-10-08T08:46:34.635823Z

# User@Host: root[root] @ localhost [] Id: 16

# Query_time: 0.064742 Lock_time: 0.000460 Rows_sent: 1 Rows_examined: 9997

其中:

1、Query_time为SQL的消耗时间

2、Lock_time为锁等待的时间,包括行锁、MDL锁等

3、是否记录slow log的判定条件为SQL的实际执行时间(Query_time - Lock_time)是否超过long_query_time,或者是否开启log_queries_not_using_indexes

4、通用日志(general log)

记录数据库的所有操作,任何情况下都不建议开启

【4.1】查看通用日志

mysql> show variables like '%general%'

【4.2】配置文件设置

[mysqld]

log[=path/[filename]] #可以指定通用日志文件,也可以只写一个log(默认路径)

【4.3】查看内容

329a0d0ae33c35ba5ade96ac78f4b22a.png

5、重做日志(redo log)(深入了解参考:https://www.cnblogs.com/f-ck-need-u/archive/2018/05/08/9010872.html)

【5.1】作用

在mysql数据库挂了之后,通过redo log + 旧的数据块 进行数据前滚,再undo进行回滚保障数据一致性

【5.2】特点

(1)mysql数据库记录dml操作,redo log是循环的,能保障脏页没有写磁盘上时,对应的redo log不会被覆盖。

(2)mysql里的redo log只能用于崩溃恢复

(3)只针对innodb的表起作用

【5.3】log buffer => log file 触发机制

(1)强制每1s写一次。

(2)大于log buffer空间1/2的时候

(3)commit的时候

(4)log buffer写到1M的时候

(5)日志先写机制,后台的脏页写磁盘之前,就先把日志写过来。

innodb_flush_log_at_trx_commit =1 #innodb每次提交事务redo buffer 刷新到redo log

innodb_doublewrite =on #开启innodb特性“二次写”

【5.4】查看物理文件位置

c213d9ca9d035ccc8dfb1a0105464349.png

即为datadir目录牟其中ib_logfile0/ib_logfile1为redo log file,ibdata1为 undo log file

12e4f35d2bc1172a3e7e67ecf7c0aab0.png

6、中继日志(relay log)

【6.1】概念

与二进制日志有些相似,用于存取从服务器的IO线程接受来自主服务器发来的变更日志。一般用于主从复制。

【6.2】查看

show variables like '%relay%';

0bfb712cc0dca494824bb2dfddccb21f.png

7、DDL日志(ddl log)

【7.1】概念

记录元数据变更的操作(DDL操作)

【7.2】文件

ddl_log.log

#为了在DDL崩溃后恢复,以二进制方式存取,不可读,文件大小最大约4G,大约100W行数据。

#如果慢了后要清理,否则就不能再运行别的DDL语句。

8、其他文件(socket/pid/表结构/Innodb)

【8.1】socket 套接字文件

【8.1.1】组成:ip+端口(本地IP:port,远程IP:port)

【8.1.2】进行网络通信必须5种信息:协议、本地IP、本地协议端、远程IP、远程协议端口

【8.1.3】查看定义:show variables like '%socket%';

【8.1.4】如果主机上有多个实例,通过连接socket可以连接相应实例

如:mysql -uroot -p -S /mysql/data/3306/mysql.sock

【8.1.5】建立连接的大致过程

(1)建立socket套接字

(2)给socket套接字赋予地址

(3)建立socket连接

【8.1.6】配置文件

[mysqld]

socket = [path/file_name]

【8.2】pid文件

【8.2.1】查看

show variables like '%pid%';(每次启动都会去写入pid文件)

【8.3】表结构文件

innodb:二进制形式文件(1).frm为表定义 信息  (2).ibd 表的数据和索引信息

MyISAM:(1).frm 为表定义信息   (2).MYD 为表数据文件  (3).MYI 为表索引文件

【8.4】innodb存储引擎相关的文件

【8.4.1】表空间文件:数据文件、临时文件;

独立表空间设置参数:show variables like 'innodb_file_per_table';

(1)参数为 off/0,就是共享表空间。所有的库/表数据都放在一个或几个文件

(2)参数为on/1,就是独立表空间。每一个表都有自己的表空间(即每个表都有独立的文件)

【8.4.2】数据文件与临时文件

show variables like '%innodb%data%';

如图:

(1)临时文件:innodb_data_file_path 。如下图,这里没有路径,那么默认就在datadir下。

(2)临时文件

6bb9091336f133b08865bb7b47a3e43b.png

【8.4.3】配置文件

[mysqld]

innodb_data_file_path=ibdata1:1G:autoextend:max:5G

innodb_temp_data_file_path = ibtemp1:200M:autoextend:max:10G

【8.5】redo文件与undo文件

【8.5.1】查看

(1)redo:show variables like '%innodb_log%';

ffad1b9e5933e0faf4eed6e70c0efba0.png

选中的行是存放位置,./  就是datadir;

(2)undo:show variables like '%innodb_undo%';

309523416f45de0289b84f13cb2c47f5.png

同上。

【8.6】其他文件总结,所有文件几乎都在配置文件里配置了。

但是undo与redo一般情况下是默认的。

d33e13887e1a9d6f36f7004c56df2de3.png

如图:

【1】ib_logfile0/ib_logfile0 :为redo文件。

【2】ibtemp1:为Innodb临时文件

【3】ibdata1:为Innodb共享表空间、原数据文件、undo日志、double write 存放

【4】ib_buffer_pool:innodb缓存池预热保存文件

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值