当前位置: 首页 > news >正文

MySQL的数据目录以及日志

1.MySQL数据目录

MySQL服务器的管理信息、业务数据、⽇志⽂件、磁盘缓冲⽂件默认存储在数据⽬录下.数据目录保存了我们用户的信息,以及我们创建的数据库和表的数据.维护了日志文件等.mysqld主要操作的就是我们的数据目录.

如何查看数据目录:

ll /var/lib/mysql

#ll 是查看指令
#/var/lib/mysql 是数据目录文件的路径

数据目录包括的东西:

1.二进制日志:主要是处理我们mysql集群,一个主服务器负责写操作,主服务器就会有一个二进制日志,将写操作以二进制文件的形式写入二进制文件.而其他的从服务器(负责查询操作) 会有一个中继日志负责读取主服务器的二进制日志从而获取最新的写操作(指的是对数据的增删改).

2.SSL和RSA证书和密钥文件:

        SSL作用:

                a.加密通信:前面在网络的时候我们介绍到过,这里也是一样的,使用非对称加密和对称加密结合的方式

                b.SSL 证书可用于验证服务器和客户端的身份。服务器证书用于证明 MySQL 服务器的身份,客户端在连接时会验证该证书以确认连接到正确的服务器,防止中间人攻击

                c.SL 协议具备校验机制,能确保传输的数据在传输过程中没有被修改。一旦数据被篡改,通信双方可立刻发现 

RSA 是一种非对称加密算法,在 MySQL 证书体系中:

  • 密钥对生成:RSA 算法用于生成公钥和私钥对。公钥包含在证书中,可被公开分发;私钥由服务器或客户端安全保存。在 SSL 握手过程中,利用公钥和私钥进行加密和解密操作,协商出用于后续数据加密传输的对称加密密钥 。

    

3.双写缓冲区文件

InnoDB 默认数据页大小为 16KB ,而操作系统内存页常为 4KB,即一个 InnoDB 页对应 4 个系统页。数据写入磁盘时,若因断电、系统崩溃等意外,可能出现只写入部分系统页的情况,导致数据页损坏。

4.我们自己创建的数据库也会保存在数据目录

5.mysql⽬录对应于mysql系统库,包含mysql服务器运⾏时所需的信息,该数据库包含数据字典 表和系统表

6.performance_schema⽬录对应于PerformanceSchema,提供了在运⾏时⽤于检查服务器内 部执⾏的信息;

7.sys⽬录对应于sys系统库,提供⼀组对象来帮助解释性能模式相关信息;


2.日志简介

日志类型说明
一般查询日志(General log)已建⽴的客⼾端连接和从客⼾端接收到的语句
错误日志(Error log)mysqld在启动、运⾏或停⽌时遇到的问题
二进制日志更改数据的语句(也⽤于主从复制)
慢查询日志(slow query log)执⾏时间超过 long_query_time 指定秒数的查询
中继日志从源服务器接收到的数据更改
DDL日志DDL语句执⾏的操作
回滚⽇志/撤销⽇志(undolog)⽤于事务的回滚操作
重做⽇志(redolog)⽤于服务器崩溃恢复

1.默认情况下,除Windows上的错误⽇志外,不启⽤任何⽇志,Linux下默认开启错误⽇志和⼆进制⽇志 

2.在服务器运⾏期间可以控制⼀般查询和慢查询⽇志的禁⽤与开启,也可以更改⽇志⽂件名(支持动态修改)

3.⼀般查询⽇志和慢查询⽇志记录可以写⼊⽇志表、⽇志⽂件或两者同时写⼊

4.默认情况下,所有启⽤的⽇志将写⼊数据⽬录,可以通过刷新⽇志强制服务器关闭并重新打开⽇志⽂件

5.通过 FLUSH LOGS 语句刷新⽇志来强制服务器关闭并重新打开⽇志⽂件,也可以使⽤ mysqladmin的 flush-logs refresh 参数,或mysqldump的--flush-logs 或-master-data 选项

6.中继⽇志仅⽤于主从复制过程中的从服务器。


2.1 一般查询日志和慢查询日志输出形式

如果启用一般查询日志和慢查询日志,日志的输出方式可以指定为日志文件和表的形式(mysql系统库中的general_log(一般查询日志)和slow_log(慢查询日志)).两者也可以同时指定

2.2.1 服务器启动时日志控制

log_out指的是日志输入的方式,并不会真正的开始日志输出.log_out可以有三个值:FILE(文件形式),TABLE(表的形式),NONE(不输出).可以同时指定多个值,中间用逗号隔开.未指定的时候默认值是FILE.如果我们同时指定了(FILE,NONE)或者(TABLE,NONE).结果都是按照NONE(不输出).也就是只要是指定了NONE就不输出(NONE的优先级最高).

一般查询日志开启:通过指定general_log系统变量为0(关闭),1(开启).如果要为日志指定自定义的路径或者文件名可以使用general_log_file系统变量.

实例:(在配置文件 my.cnf 中设置)

1.将一般查询日志写入文件和表

[mysqld]

#日志文件的输出形式

log_out=FILE,TABLE

#开始日志

general_log=1

2.仅将⼀般查询⽇志和慢查询⽇志写⼊⽇志表

[mysqld]

#日志文件的输出形式

log_out=TABLE

#开始一般查询日志

general_log=1

#开始慢查询日志

slow_log=1

3.仅将慢查询⽇志写⼊⽇志⽂件

[mysqld]

#日志输出形式

log_out=FILE

#开启慢查询日志

slow_log=1

4.将⼀般查询⽇志和慢查询⽇志写⼊⽇志⽂件,并指定⾃定义的⽇志路径

[mysqld]

#⽇志⽂件
log_output=FILE   

#开启⼀般查询⽇志   
general_log=1  
   

#指定⾃定义的⽂件名   
general_log_file=/var/lib/mysql/general.log 

#开启慢查询⽇志
slow_query_log=1     

#指定⾃定义的⽂件名
slow_query_log_file=/var/lib/mysql/slow_query.log

修改上述配置文件之后一般都要重新启动MySQL服务器.

#重启mysql服务器
systemctl restart mysql

#查看mysql服务器状态
systemctl status mysql


 查看我们设置的日志配置文件是否生效

配置文件

一般查询日志是否开启

一般查询日志路径

慢查询日志是否开启

慢查询日志路径


2.2.2 使用表查看一般查询日志和慢查询日志

查看表内包含字段:

#\G作为结束标识符结果会以垂直格式输出
# ; \g 结果会以表格形式呈现

#查看一般查询日志的表内字段
show  create table mysql.general_log\G

#查看慢查询日志的表内字段
show  create table mysql.slow_log\G

一般查询日志

 慢查询日志

接下来介绍下一般查询日志.


3.一般查询日志

其实就是将我们所有操作sql的语句都保存到日志中了

1.General query log-⼀般查询⽇志,记录客⼾端连接或断开连接的信息,也会记录从客⼾端接收的 每个SQL语句。如果开启将会产⽣⼤量的内容,⾮常耗费服务器资源,所以默认为关闭(不开启), 要启⽤⼀般查询⽇志可以使⽤ general_log=0(禁用)或者1(开启).

2.默认⽇志⽂件名为 主机名 .log ,可以使⽤general_log_file={自定义文件名}

3.Mysqld按照接收到SQL语句的顺序将语句写⼊查询⽇志,这个顺序可能与语句执⾏的顺序不同

表结构如下:

 分析每个字段的作用:

如果我们想要查看操作的语句需要使用 CAST(argument AS char).

#使用CAST(argument AS char)
select event_time,user_host,thread_id,server_id,command_type,CAST(argument AS char) from mysql.general_log\G


4.慢查询日志

1.慢查询⽇志由执⾏时间超过系统变量 long_query_time 指定的秒数的SQL语句组成,并且检查的⾏数⼤于系统变量min_examined_row_limit 指定值.long_query_time和min_examined_row_limit都满足的时候才是慢查询.

2.获取初始锁的时间不计⼊执⾏时间,mysqld在执⾏完SQL语句并释放所有锁后才将符合条件的语 句写⼊慢速查询⽇志,因此⽇志顺序可能与执⾏顺序不同。

4.1 慢查询日志的参数

long_query_time:默认时间为10s

 min_examined_row_limit(默认行数为0行)

只有都满足才会定义为慢sql,才会将这条sql语句存储到慢查询日志中


1.默认情况下,不记录管理语句(数据库的创建、用户权限管理、备份恢复、性能监控等),也不记录不使⽤索引的查询(在创建数据库的时候一般会将id作为主键,也就是生成了主键索引.不记录不使用索引的查询就是查询数据的时候没有使用id字段的查询).

下面这种查询语句就是没有使用索引(默认即使符合慢查询也不会被记录,如果想要被记录就修改)

2.默认为关闭(不开启),要启⽤慢查询⽇志可以使⽤:请使⽤--slow_query_log[={0|1}]

3.默认⽇志⽂件名为 host_name-slow.log ,可以使⽤ slow_query_log_file= file_name 修改

4.使⽤--log-short-format 选项,以简要格式记录慢查询⽇志

5.要记录管理语句,启⽤ log_slow_admin_statements 系统变量。

6.要记录不使⽤索引的查询,启⽤ log_queries_not_using_indexes 系统变量。当记录不使 ⽤索引的查询时,⽇志会快速增⻓,通过设置系统变量log_throttle_queries_not_using_indexes 限制每分钟写⼊慢查询⽇志同类查询的数 量,默认值是0,表⽰⽆限制


4.2 慢查询日志的内容(文件)

Query_time:SQL语句执行的时间,单位是秒

Lock_time:获取到锁的时间,单位秒

Rows_sent:发送到客户端的行数(也就是返回的结果集的行数)

Rows_examined:服务器检查的行数(服务器扫描数据表中具体数据行的数量)

启⽤--log-slow-extra[={OFF|ON}]系统变量会将以下额外字段写⼊到FILE中,TABLE形式不受影 响 

Thread_id: 线程标识符

Errno: 错误码,没有发⽣错误则为0

Killed: 如果语句被终⽌,⽤错误码表⽰原因,如果语句正常终⽌则为0

Bytes_received: 接收到SQL语句的Bytes值。

Bytes_sent: 返回给客⼾端的Byte值。

Read_first: 索引中第⼀个条⽬被读取的次数,如果这个值很⾼,表明服务器正在执⾏⼤ 量完整索引扫描

Read_last: 读取索引中最后⼀个键的请求数

Read_key: 基于索引读取⼀⾏数据的请求数。如果这个值很⾼,表明表为当前查询建⽴了 正确的索引

Read_next: 按索引排序读取下⼀⾏的请求数,查询具有范围约束的索引列,或者进⾏索引 扫描,此值将递增。

Read_prev: 按索引排序读取前⼀⾏的请求数。主要⽤于优化ORDERBY DESC。

Read_rnd: 基于固定位置读取⼀⾏的请求数。这个值很⾼表⽰,正在执⾏⼤量需要对结果进 ⾏排序的查询,可能有很多查询进⾏了全表扫描整,或者没有正确使⽤索引的连接

Read_rnd_next: 读取数据⽂件中下⼀⾏的请求数。如果进⾏⼤量的表扫描,这个值会很 ⾼。通常,表⽰表没有建⽴正确地索引,或者查询没有利⽤索引。

Sort_merge_passes: 排序算法完成的归并次数,如果这个值很⼤,考虑增加 sort_buffer_size 系统变量的值。

Sort_range_count: 使⽤范围进⾏排序的次数

Sort_rows: 排序的⾏数。  

Sort_scan_count: 通过扫描表完成的排序数。

Created_tmp_disk_tables: 服务器在执⾏语句时创建内部磁盘临时表的数量。 Created_tmp_tables: 服务器在执⾏语句时创建的内部临时表的数量。

Start: 执⾏SQL语句开始时间

End: 执⾏SQL语句结束时间

4.3用表的形式输出

mysql> show create table mysql.slow_log\G


5.错误日志

错误⽇志⼀般会记录mysqld启动和关闭的次数、诊断消息,以及服务器运⾏期间发⽣的错误和警 告;例如MySQL需要⾃动检查或修复⼀个表,就会在错误⽇志中写⼊⼀条记录。错误⽇志默认使⽤ UTF-8 ( utf8mb3 )编码格式,并使⽤英语⽣成记录.

5.1配置错误日志文件

错误⽇志输出的位置,可以是控制台或指定⽂件,"控制台"表⽰stderr 标准错误输出。

5.1.1 Windows路径下

在Windows系统中,mysqld使⽤ --log-error和--console 选项来确定默认的错误⽇志⽬标是控制台还是⽂件,规则如下:

1.如果指定了--console 选项,默认在控制台输出错误⽇志,如果--console 和--log error 同时指定,则--console 优先级更⾼,并且--log-error 将失效。

2.如果没有指定--log-error 或者没有指定具体的⽂件名,默认在数据⽬录中⽣成名为host_name.err 的日志文件

3.可以通过指定绝对路径,来更改默认的⽇志位置。

[mysqld]
#⾃定义错误⽇志的路径
 log-error=D:/log/MySQL/Error/error_log.err  

5.1.2 Linux下

在Unix和Linux系统中,mysqld使⽤--log-error 选项来指定默认错误⽇志⽬标,可以指定控制台或是⽂件,如果是⽂件,规则如下

1.如果错误⽇志输出⽬标是控制台,则服务器将 log_error 系统变量设置为 stderr .否则,将 以⽂件形式输⼊错误⽇志,并以 log_error 的值为⽂件名

2.如果显⽰写出--log-error 但没有指定具体⽂件,则默认路径是数据⽬录中host_name.err 的⽂件

3.可以通过指定绝对路径,来更改默认的⽇志位置

[mysqld]
#⾃定义错误⽇志的路径
log-error=/var/log/mysql/error_log.err 


5.2 错误日志中事件的字段

time :件时间戳,精度为微秒;

msg :事件消息字符串;

prio :事件优先级,包括 System event-系统(0)、 Error event-错误(1)、 Warning event-警告(2)或 Note/information event-通知/提⽰事件(3),值越⼩优先级越⾼

MySQL内部维护的一套错误代码的定义

err_code :事件错误代码;

err_symbol :以字符串形式表⽰的事件错误符,例如 'ER_DUP_KEY' ;

SQL_state :事件SQLSTATE值,与 err_symbol 对应,例如 'ER_DUP_KEY' 对应的 SQLSTATE为23000

subsystem :事件发⽣的⼦系统。可能的值: InnoDB (InnoDB存储引擎)、 Repl (复制⼦系 统)、 Server (其他)。

#查看日志文件
cat /var/log/mysql/'日志文件名'

错误日志官网:

MySQL :: MySQL 8.0 Error Reference :: 4 Global Error Message Referencehttps://dev.mysql.com/doc/mysql-errors/8.0/en/global-error-reference.html#error_ee_sync


5.3 刷新错误日志和重命名

如果使⽤ FLUSH ERROR LOGS FLUSH LOGS 语句或 mysqladmin flush-logs 命令刷 新错误⽇志,服务器会将正在写⼊的任何错误⽇志⽂件关闭并重新打开。

如果要⼿动重命名错误⽇志⽂件,可以在重命名操作之后执⾏刷新操作,服务器会以原⽂件名⽣成 ⼀个新的错误⽇志⽂件,例如⽇志⽂件名为 host_name .err ,可以按以下步骤操作:

#重命名⽇志⽂件
mv host_name.err host_name.err-old 

# 刷新操作
mysqladmin flush-logs 

# 把重命名的⽇志⽂件移动到备份⽬录
mv host_name.err-old backup-directory

6.二进制日志

二进制日志可以用于MySQL集群用来主从复制.下面先简单介绍下MySQL集群.在我们项目访问量比较小.没必要对数据库进行分库分表.但是如果项目突然爆火,访问量骤增.此时数据库就顶不住压力此时就要使用MySQL集群.就是一个主服务器负责写操作,其他的从服务器负载查询操作.

那么如何实现数据同步呢?主服务器修改了数据如何将修改的数据同步给从服务器?

这里就使用到我们的二进制日志(主服务器修改完数据库后会存储到二进制日志),从服务器会有一个中继日志,二进制日志会将数据同步到从服务器的中继日志里,从服务器读取中继日志获取信息.


6.1 介绍

⼆进制⽇志包含数据库更改的"事件",不会记录 SELECT 和 SHOW ,例如:记录表的创建操作或 表数据的更改,⼆进制⽇志还包含每个语句更新数据时花费的时间信息,启动⼆进制⽇志,对服务 器性能稍微有些影响;

除了基于⾏的⽇志模式,它还包含可能进⾏更改数据的语句事件,例如 DELETE 操作没有匹配到 查找到的⾏

二进制日志的作用:

主从节点数据复制:上面简单介绍了

数据恢复:从某个时间点恢复备份数据后,将重新执⾏备份时间点之后记录在⼆进制⽇志中的 事件。这些事件使数据库从备份点更新到当前最新状态。

⼆进制⽇志的语句中如果涉及⽤⼾的密码,则由服务器进⾏加密,不会以纯⽂本形式出现

6.2查看二进制日志的系统变量

#查看二进制日志的系统变量
show variables like '%bin%';

6.3 查看二进制日志的状态变量

#查看二进制日志的状态变量
show  status like '%bin%';


6.4 二进制日志分析

1.默认情况下启⽤⼆进制⽇志, log_bin 系统变量 ON

2.禁⽤⼆进制⽇志,可以指定 --skip-log-bin --disable-log-bin 选项。如果同时指--log-bin后指定的选项优先;

3.选项--log-bin[= base_name] ⽤于指定⼆进制⽇志⽂件的基本名称,如果不指定 bin 选项,默认基本名称为 binlog ,建议为⼆进制⽇志指定⼀个基本名;

4.⼆进制⽇志⽂件名是由基本名+数字扩展名组成的,服务器每次创建⼀个新的⽇志⽂件时,数字扩展名都会增加,从⽽保证有序的⽂件系列,发⽣以下事件时,服务器都会在创建⼀个新的⽇志⽂件

服务器已启动或重新启动

服务器刷新⽇志

当前⽇志⽂件的⼤⼩达到 max_binlog_size (单个⽇志⽂件的最⼤字节数,最⼩值4096字 节,最⼤值和默认值1GB).

TIPS:⼆进制⽇志⽂件⼤⼩可能会超出 max_binlog_size 设定的值,因为⼆进制⽇志在记录事务 时,会完整的记录整个事务,不存在把⼀个事务拆分的情况,如果遇到⼀个⼤事务时,即使记录 整个事务会超过⽇志⼤⼩限制,也会保证事务的完整性

5.mysqld还会创建⼀个包含⼆进制⽇志⽂件名的⽇志索引⽂件,默认情况下,这与⼆进制⽇志⽂件 具有相同的基本名称,扩展名为 .index . 可以使⽤选项--log-bin-index[= file_name] 修改索引⽂件

6.⼆进制⽇志⽂件和索引⽂件的默认位置是数据⽬录。可以使⽤--log-bin[= file_name] 格式=绝对路径+基本名。 指定⾃定义路径, file_name] 选项--log-bin 对应的系统变量是 log_bin_basename 

注意下面四个选项或者系统变量:

7.MySQL5.7中,启⽤⼆进制⽇志必须指定服务器ID,对应 server_id 选项启动。否则服务器将⽆法启动.在MySQL8.0中 server_id 系统变量默认设置为1,在集群环境中,每台MySQL服务 器必须有唯⼀的service_id


6.5 查看二进制日志

6.5.1 使用客户端工具mysqlbinlog查看

mysqlbinlog binlog.000003 > binlog.000003

6.5.2 使用mysql 语句查看

mysql> show binlog events in 'binlog.000001' from N limit S;


6.6 二进制日志格式

1.基于语句的⽇志格式,最初MySQL是基于SQL语句复制实现主从节点同步,

通过指定选项 --binlog-format=STATEMENT 使⽤此格式

2.基于⾏的⽇志格式(默认)中,主节点将事件写⼊⼆进制⽇志,表⽰各个表的⾏受到的影响,可以通 过指定选项--binlog-format=ROW 使⽤此格式 

# 
基于⾏,记录每⼀⾏的更改
update student set age = 18 where id = 10;
 update student set age = 18 where id = 11;
 update student set age = 18 where id = 12;

3.混合⽇志记录格式,默认情况下使⽤基于语句的⽇志记录,如果MySQL认为基于语句的格式不能保 证主从复制过程中的数据安全时,会⾃动切换到基于⾏的⽇志格式


6.7 服务器日志维护

MySQL服务器可以创建多种不同的⽇志⽂件来帮助我们查看服务器的活动。但是必须定期清理这 些⽂件,以免⽇志占⽤过多的磁盘空间。在启⽤⽇志的情况下,通常希望备份和删除旧的⽇志⽂件, 并把⽇志写到新⽂件。

默认⼆进制⽇志的过期时间为30天,过期后将⾃动删除,要指定⾃定义过期时间,可以使⽤系统变 量 binlog_expire_logs_seconds=N 单位为秒,在下⼀次启动服务器和刷新⽇志时删除过期 ⽇志⽂件.

强制使⽤新的⽇志⽂件可以⼿动刷新⽇志,当执⾏ FLUSH LOGS 语句或 mysqladmin refresh logs mysqldump --flush-logs mysqladmin flush mysqldump - master-data 命令时,会发⽣⽇志刷新。此外当⼆进制⽇志⽂件⼤⼩达到 max_binlog_size 系统变量指定的值时,服务器会⾃动刷新⼆进制⽇志.

F LUSH LOGS ⽀持可选的修饰符以启⽤个别⽇志的选择性刷新

FLUSH BINARY LOGS  # 刷新⼆进制⽇志

FLUSH ERROR LOGS   # 刷新错误⽇志

FLUSH GENERAL LOGS # 刷新⼀般查询⽇志

FLUSH RELAY FLUSH LOGS   #刷新中继⽇志

SLOW LOGS    #刷新慢查询⽇志

http://www.dtcms.com/a/108316.html

相关文章:

  • 企业网络优化方案:SD-WAN赋能企业远程办公
  • 使用JSON.stringify报错:Uncaught TypeError: cyclic object value
  • RNN模型与NLP应用——(6/9)Text Generation(文本自动生成)
  • UE小:在Unreal Engine 5中实现多层静态网格体遮挡拾取
  • 【落羽的落羽 C++】模板简介
  • 交易引擎中的设计模式
  • 「青牛科技」GC5331 5V三相无感正弦波电机驱动芯片 对标茂达APX9331/灿瑞OCH2360
  • Spring Cloud Gateway 的核心作用
  • Flutter项目之登录注册功能实现
  • Debian/Ubuntu的networking的`/etc/network/interfaces`配置文件,如何配置route路由
  • SQL问题分析与诊断(8)——关键信息(2)
  • 数据结构----栈
  • LangChain/Eliza框架在使用场景上的异同,Eliza通过配置实现功能扩展的例子
  • 【力扣hot100题】(036)二叉树的最大深度
  • Spring Boot 工程创建详解
  • 小游戏中Enable Exceptions的各选项有何区别
  • 基于开源AI大模型与S2B2C模式的线下服务型门店增长策略研究——以AI智能名片与小程序源码技术为核心
  • 从静态到动态:D * 算法如何革新机器人路径规划
  • 图形渲染: tinyrenderer 实现笔记(Lesson 1 - 4)
  • ATEngin开发记录_1_在Vsiual Studio2022中使用ReShaper创建类模板
  • 理解激活函数,多个网络层之间如何连接
  • 红宝书第二十七讲:详解WebAssembly与asm.js如何实现高效执行
  • 七种分布式ID生成方式详细介绍--Redis、雪花算法、号段模式以及美团Leaf 等
  • 二分查找与二分答案入门c++
  • 如何对后端API进行负载测试
  • vue将组件中template转为js
  • codeforces C. Creating Keys for StORages Has Become My Main Skill
  • systemd服务开机启动(code=exited, status=203/EXEC)错误,由于SELinux 开启安全模式
  • AI知识补全(十五):AI可解释性与透明度是什么?
  • 详细说明一下C++中的static关键字