19MySQL日志管理(下)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了19MySQL日志管理(下)相关的知识,希望对你有一定的参考价值。

通用日志

mysql服务器的通用日志(general log)记录了所有的SQL语句和系统事件,包括系统启动和关闭、数据库连接、查询执行等操作。通用日志文件默认是关闭的,因为开启它会导致MySQL在短时间内生成大量的日志文件,占用大量磁盘空间。

通用日志:记录对数据库的通用操作,包括:错误的SQL语句

通用日志可以保存在:file(默认值)或 table(mysql.general_log表)

general_log=ON|OFF
general_log_file=HOSTNAME.log
log_output=TABLE|FILE|NONE

19、MySQL日志管理(下)_二进制日志

#修改通用日志,记录通用日志至mysql.general_log表中
MariaDB [mysql]> set global log_output="table";
MariaDB [mysql]> SHOW GLOBAL VARIABLES LIKE log_output;

19、MySQL日志管理(下)_mysql_02

19、MySQL日志管理(下)_二进制日志_03

19、MySQL日志管理(下)_慢查询_04

范例:对访问的语句进行排序
[root@centos8 ~]#mysql -e select argument from mysql.general_log | awk sql[$0]++ENDfor(i in sql)print sql[i],i|sort -nr
[root@centos8 ~]#mysql -e select argument from mysql.general_log |sort |uniq -c |sort -nr
慢查询日志

MySQL 慢查询日志是一种记录在 MySQL 数据库服务器上执行时间超过设置阈值的语句的文件。可以用来识别并优化查询速度缓慢的查询语句。

慢查询相关变量

slow_query_log=ON|OFF #开启或关闭慢查询,支持全局和会话,只有全局设置才会生成慢查询文件
long_query_time=N #慢查询的阀值,单位秒
slow_query_log_file=HOSTNAME-slow.log #慢查询日志文件
log_slow_filter = admin,filesort,filesort_on_disk,full_join,full_scan,
query_cache,query_cache_miss,tmp_table,tmp_table_on_disk
#上述查询类型且查询时长超过long_query_time,则记录日志
log_queries_not_using_indexes=ON #不使用索引或使用全索引扫描,不论是否达到慢查询阀值的语句是否记录日志,默认OFF,即不记录
log_slow_rate_limit = 1 #多少次查询才记录,mariadb特有
log_slow_verbosity= Query_plan,explain #记录内容
log_slow_queries = OFF #同slow_query_log,MariaDB 10.0/MySQL 5.6.1 版后已删除
log_slow_admin_statements:用于记录管理员语句的慢查询日志。
log_slow_slave_statements:用于记录从数据库服务器上执行的慢查询语句。
max_connections_per_hour 和 max_user_connections:这些变量可以用来限制每个用户以及每个小时的最大连接数。这些限制可以帮助您避免慢查询问题。
innodb_buffer_pool_size:定义用于缓存表数据和索引数据的内存池的大小。如果内存池不足,会导致频繁的磁盘 I/O 操作,从而导致慢查询。
query_cache_size 和 query_cache_limit:这些变量用于定义用于缓存查询结果的查询缓存池的大小和每次查询缓存的最大大小。如果定义了过大的缓存池或缓存的查询结果太大,都可能导致慢查询。
join_buffer_size 和 sort_buffer_size:这些变量用于定义用于执行 JOIN 操作的缓存区和用于排序的缓存区的大小。如果这些缓存过小,可能会导致排序和 JOIN 操作变慢。
thread_cache_size:定义 MySQL 数据库服务器用于缓存客户端连接线程的数量。如果定义的线程数过少,可能会导致慢查询。

19、MySQL日志管理(下)_mysql_05

19、MySQL日志管理(下)_mysql_06

19、MySQL日志管理(下)_mysql_07

慢查询分析工具

mysqldumpslow -s c -t 10 lgw-linux-07-slow.log 

19、MySQL日志管理(下)_慢查询_08

19、MySQL日志管理(下)_二进制日志_09

注:控制台只显示1000行结果时,可以使用limit 参数显示所有行 SELECT * FROM table_name LIMIT 5000;

二进制日志

MySQL 二进制日志(Binary log)记录了对MySQL数据库实例进行更改的所有操作,包括插入(INSERT)、更新(UPDATE)和删除(DELETE)等操作。二进制日志是一种以二进制形式记录的日志,主要用于数据备份、数据库恢复、数据库同步等方面。

MySQL 二进制日志的重要性在于,它能够记录所有数据库操作的细节,无论是用什么方式进行的修改,都能够被追踪。这样,在数据库出现问题时,我们可以通过分析二进制日志来找出问题所在,并进行相应的恢复操作。

MySQL 二进制日志的一些常用参数包括:

sql_log_bin=ON|OFF:#是否记录二进制日志,默认ON,支持动态修改,系统变量,而非服务器选项
log_bin=/PATH/BIN_LOG_FILE:#指定文件位置;默认OFF,表示不启用二进制日志功能,上述两项都开启才可以
binlog_format=STATEMENT|ROW|MIXED:#二进制日志记录的格式,默认STATEMENT
max_binlog_size=1073741824#单个二进制日志文件的最大体积,到达最大值会自动滚动,默认为1G
#说明:文件达到上限时的大小未必为指定的精确值
binlog_cache_size=4m #此变量确定在每次事务中保存二进制日志更改记录的缓存的大小(每次连接)
max_binlog_cache_size=512m #限制用于缓存多事务查询的字节大小。
sync_binlog=1|0:#设定是否启动二进制日志即时同步磁盘功能,默认0,由操作系统负责同步日志到磁盘
expire_logs_days=N:#二进制日志可以自动删除的天数。 默认为0,即不自动删除

当需要备份数据库时,我们可以通过使用 mysqldump 命令将数据导出为 SQL 语句的形式,但是这种方式比较慢,而且在数据量较大时可能会导致数据库压力过大。此时,我们可以使用基于二进制日志的备份方式进行备份。

当需要恢复数据时,我们可以利用备份时生成的二进制日志文件进行恢复。在进行数据恢复前,需要先将需要恢复的数据表进行锁定,然后通过 mysqlbinlog 命令解析并执行备份时生成的二进制日志文件,最后进行相应的解锁操作。

MySQL 二进制日志记录的格式有三种:

Statement-Based Logging(基于语句的日志记录):以SQL语句为单位记录,记录每个执行的SQL语句,日志量较少。

Row-Based Logging(基于行的日志记录):以某一条数据的变更为单位记录,将被修改的行记录在二进制日志中,日志量大,更安全,建议使用。

Mixed-Based Logging(混合模式的日志记录):Statement-Based Logging和Row-Based Logging的结合,根据实际情况选择使用哪种方式记录

19、MySQL日志管理(下)_慢查询_10

19、MySQL日志管理(下)_mysql_11

二进制日志文件的构成

有两类文件
1.日志文件:mysql|mariadb-bin.文件名后缀,二进制格式,如: mariadb-bin.000001
2.索引文件:mysql|mariadb-bin.index,文本格式

19、MySQL日志管理(下)_慢查询_12

19、MySQL日志管理(下)_慢查询_13

相关服务器变量

sql_log_bin=ON|OFF:#是否记录二进制日志,默认ON,支持动态修改,系统变量,而非服务器选项
log_bin=/PATH/BIN_LOG_FILE:#指定文件位置;默认OFF,表示不启用二进制日志功能,上述两项都开启才可以
binlog_format=STATEMENT|ROW|MIXED:#二进制日志记录的格式,默认STATEMENT
max_binlog_size=1073741824#单个二进制日志文件的最大体积,到达最大值会自动滚动,默认为1G
#说明:文件达到上限时的大小未必为指定的精确值
binlog_cache_size=4m #此变量确定在每次事务中保存二进制日志更改记录的缓存的大小(每次连接)
max_binlog_cache_size=512m #限制用于缓存多事务查询的字节大小。
sync_binlog=1|0:#设定是否启动二进制日志即时同步磁盘功能,默认0,由操作系统负责同步日志到磁盘
expire_logs_days=N:#二进制日志可以自动删除的天数。 默认为0,即不自动删除

19、MySQL日志管理(下)_mysql_14

19、MySQL日志管理(下)_mysql_15

查看二进制日志文件

SHOW BINARY | MASTER LOGS

19、MySQL日志管理(下)_慢查询_16

查看使用中的二进制日志文件

SHOW MASTER STATUS

19、MySQL日志管理(下)_mysql_17

在线查看二进制文件中的指定内容

SHOW BINLOG EVENTS [IN log_name] [FROM pos] [LIMIT [offset,] row_count]
[IN log_name]:指定二进制日志文件的名称。
[FROM pos]:从指定的位置开始显示所有日志事件。位置可以是日志中的任何有效位置,可以是十进制或16进制表示。
[LIMIT [offset,] row_count]:设置要从二进制日志中检索的事件的范围。row_count 可以指定显示的事件数量,而 offset 可以用于跳过前面的一些事件。

19、MySQL日志管理(下)_mysql_18

mysqlbinlog:二进制日志的客户端命令工具,支持离线查看二进制日志

mysqlbinlog [OPTIONS] log_file…
--start-position=# 指定开始位置
--stop-position=#
--start-datetime= #时间格式:YYYY-MM-DD hh:mm:ss
--stop-datetime=
--base64-output[=name]
-v -vvv

举例

将二进制日志输出到终端

mysqlbinlog /var/lib/mysql/mysql-bin.000123

这个命令将解析二进制日志文件 mysql-bin.000123 并在终端上输出可读的 SQL 查询语句,以及其他有关每个事件的信息。

将二进制日志输出到文件

mysqlbinlog /var/lib/mysql/mysql-bin.000123 > /tmp/mysql-bin.000123.sql

这个命令将解析二进制日志文件 mysql-bin.000123 并将输出写入到名为 /tmp/mysql-bin.000123.sql 的文件中。您可以使用这个文件将日志中的查询语句迁移到另一个 MySQL 实例。

解析二进制日志文件并在指定时间之后的事件中输出所有查询

mysqlbinlog --start-datetime="2022-01-01 00:00:00" /var/lib/mysql/mysql-bin.000123

这个命令将解析二进制日志文件 mysql-bin.000123 并输出自 2022 年 1 月 1 日 00:00:00 以来的所有查询事件,以及相关的元数据。

二进制日志事件的格式

# at 328
#151105 16:31:40 server id 1 end_log_pos 431 Query thread_id=1
exec_time=0 error_code=0
use `mydb`/*!*/;
SET TIMESTAMP=1446712300/*!*/;
CREATE TABLE tb1 (id int, name char(30))
/*!*/;
事件发生的日期和时间:151105 16:31:40
事件发生的服务器标识:server id 1
事件的结束位置:end_log_pos 431
事件的类型:Query
事件发生时所在服务器执行此事件的线程的ID:thread_id=1
语句的时间戳与将其写入二进制文件中的时间差:exec_time=0
错误代码:error_code=0
事件内容:
GTID:Global Transaction ID,mysql5.6以mariadb10以上版本专属属性:GTID

清除指定二进制日志

PURGE  BINARY | MASTER  LOGS  TO log_name | BEFORE datetime_expr 
举例
PURGE BINARY LOGS BEFORE 2017-01-23;
PURGE BINARY LOGS BEFORE 2017-03-22 09:25:30;

19、MySQL日志管理(下)_二进制日志_19

删除所有二进制日志,index文件重新记数

RESET MASTER [TO #]; #删除所有二进制日志文件,并重新生成日志文件,文件名从#开始记数,默认从1开始,一般是master主机第一次启动时执行,MariaDB 10.1.6开始支持TO #

19、MySQL日志管理(下)_mysql_20

19、MySQL日志管理(下)_mysql_21

切换日志文件:

FLUSH LOGS;

19、MySQL日志管理(下)_mysql_22


MySQL 日志管理

MySQL 日志管理

由于rizhi文件是掌握数据库运行的重要参考。因此日志文件的维护也是十分重要的意义

MySQL的日志类型:错误日志,普通查询日志,二进制日志,慢查询日志

1.错误日志

(1)错误日志主要记录当MySQL启动和停止时,以及在运行过程中发生任何错误时的相关消息。错误日志迷人保存在MySQL的安装路径data文件夹下,后缀名为.err。在配置文件中指定
[[email protected] data] vim /etc/my.cnf #在mysqld里面添加
[mysqld]
log-error=/usr/local/mysql/data/mysql_error.log
[[email protected] ~]# systemctl restart mysqld.service #重启之后会生成这个文件
[[email protected] ~]# cd /usr/local/mysql/data/
[[email protected] data]# ls
mysql_error.log

2:查询通用日志

(1)通用查询日志用来记录MySQL的所有连接的语句,默认状态关闭,。使用SHOW可以查询处日志信息
mysql> show variables like ‘general%‘;
+------------------+-------------------------------------+
| Variable_name    | Value                               |
+------------------+-------------------------------------+
| general_log      | OFF                                 |
| general_log_file | /usr/local/mysql/data/localhost.log |
+------------------+-------------------------------------+
2 rows in set (0.01 sec)
在配置文件中声明开启
[[email protected] data] vim /etc/my.cnf
[mysqld]
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log
[[email protected] data] systemctl restart mysqld.service 
mysql_general.log
mysql> show variables like ‘general%‘; #状态开启
+------------------+-----------------------------------------+
| Variable_name    | Value                                   |
+------------------+-----------------------------------------+
| general_log      | ON                                      |
| general_log_file | /usr/local/mysql/data/mysql_general.log |
+------------------+-----------------------------------------+
2 rows in set (0.01 sec)

3:二进制日志

二进制日志用来记录所有更新或者已经潜在更新了数据的语句,记录了数据的更改主要目的是能够最大程度的恢复数据
mysql> show variables like ‘log_bin%‘; #默认是关闭状态
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| log_bin                         | OFF   |
| log_bin_basename                |       |
| log_bin_index                   |       |
| log_bin_trust_function_creators | OFF   |
| log_bin_use_v1_row_events       | OFF   |
+---------------------------------+-------+
5 rows in set (0.00 sec)
在配置文件中加入一句话
[[email protected] data] vim /etc/my.cnf
[mysqld]
log_bin=mysql-bin
[[email protected] data] systemctl restart mysqld.service 
[[email protected] data] ls
mysql-bin.000001
mysql-bin.index
[[email protected] data]# mysql -u root -p
mysql> show variables like ‘log_bin%‘;
+---------------------------------+---------------------------------------+
| Variable_name                   | Value                                 |
+---------------------------------+---------------------------------------+
| log_bin                         | ON                                    |
| log_bin_basename                | /usr/local/mysql/data/mysql-bin       |
| log_bin_index                   | /usr/local/mysql/data/mysql-bin.index |
| log_bin_trust_function_creators | OFF                                   |
| log_bin_use_v1_row_events       | OFF                                   |
+---------------------------------+---------------------------------------+
5 rows in set (0.01 sec)
查询二进制命令
[[email protected] data] mysqlbinlog --no-defaults mysql-bin.000001  #关闭默认的utf8字符集
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @[email protected]@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#180628 16:56:21 server id 1  end_log_pos 123 CRC32 0x4ecddb44  Start: binlog v 4, server v 5.7.17-log created 180628 16:56:21 at startup
# Warning: this binlog is either in use or was not closed properly.
ROLLBACK/*!*/;
BINLOG ‘
taI0Ww8BAAAAdwAAAHsAAAABAAQANS43LjE3LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAC1ojRbEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA
AUTbzU4=
‘/*!*/;
# at 123
#180628 16:56:21 server id 1  end_log_pos 154 CRC32 0x0b6126ac  Previous-GTIDs
# [empty]
SET @@SESSION.GTID_NEXT= ‘AUTOMATIC‘ /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET [email protected]_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

4:慢查询日志

慢查询日志是记录所有命令执行时间查过long_query_time的设置时间用于查询那些超过系统设置的时间与其对其进行优化
mysql> show variables like ‘%slow%‘; #默认是关闭的
+---------------------------+------------------------------------------+
| Variable_name             | Value                                    |
+---------------------------+------------------------------------------+
| log_slow_admin_statements | OFF                                      |
| log_slow_slave_statements | OFF                                      |
| slow_launch_time          | 2                                        |
| slow_query_log            | OFF                                      |
| slow_query_log_file       | /usr/local/mysql/data/localhost-slow.log |
+---------------------------+------------------------------------------+
5 rows in set (0.00 sec)
对其进行开启
第一种方法
mysql> set global slow_query_log=ON;
Query OK, 0 rows affected (0.01 sec)

mysql> show variables like ‘%slow%‘;
+---------------------------+------------------------------------------+
| Variable_name             | Value                                    |
+---------------------------+------------------------------------------+
| log_slow_admin_statements | OFF                                      |
| log_slow_slave_statements | OFF                                      |
| slow_launch_time          | 2                                        |
| slow_query_log            | ON     #开启                                  |
| slow_query_log_file       | /usr/local/mysql/data/localhost-slow.log |
+---------------------------+------------------------------------------+
5 rows in set (0.00 sec)
第二种方法直接在配置文件里面设定
[[email protected] data] vim /etc/my.cnf
slow_query_log=ON           #开启慢日志
slow_query_log_file=mysql_slow_query.log
long_query_time=5 #时间为5秒
查看慢查询时间
mysql> show variables like ‘long_query_time‘;
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| long_query_time | 5.000000 |
+-----------------+----------+
1 row in set (0.00 sec)
MySQL里面的乱码是设定它的字符集两种方法
1:临时修改
mysql> set names utf8; #开启重启后失效
2:永久性修改(安装MySQL的时候在配置文件里面就指定字符集utf-8格式)
[[email protected] data] vim /etc/my.cnf
[client]
default-character-set=utf8
[mysql]
default-char[mysqld]
[mysqld]
character_set_server=utf8

以上是关于19MySQL日志管理(下)的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 日志管理

MySQL日志管理

学习笔记之MySQL 日志文件管理

实现MySQL半同步架构

引入swagger项目无法正常启动--微服务环境下

MongoDB复制选举原理及复制集管理