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

MYSQL日志与事件

MYSQL日志记录了MYSQL服务实例的运行轨迹以及数据库用户使用,操作数据库的历史信息。MYSQL事件是能够自动执行或者定期执行的任务。

1.MYSQL日志

MYSQL提供了四种日志,错误日志,普通查询日志,二进制日志,慢查询日志。
在这里插入图片描述
(1)错误日志
MYSQL错误日志主要用于记录MYSQL服务实例每次启动,停止的详细信息,以及MYSQL服务实例运行过程中产生的警告或者错误信息。与其他日志不同,MYSQL错误日志必须开启,无法关闭。
与MYSQL错误日志有关的参数包括1个。
log_error : 设置了错误日志文件的物理位置
使用MYSQL命令"show variables like ‘log_error’\G"可以查看错误日志文件的物理位置。
一般当MYSQL服务器意外停止或者无法启动时,可以通过错误日志文件的内容分析产生故障的原因。
注意:MYSQL错误日志不会记录所有的错误信息,只有MYSQL服务实例运行过程中发生的关键错误信息才会被记录。
(2)普通查询日志
MYSQL普通查询日志记录了MYSQL服务实例的所有操作,无论这些操作是否成功执行。另外,还包含一些其他事件,例如,MYSQL客户机与MYSQL服务器连接和断开连接的相关信息,无论链接成功还是失败。与MYSQL普通查询日志相关的参数包括3个。
general_log :设置了普通查询日志是否开启。使用MYSQL命令"show variables like ‘general_log’“;可以查看普通查询日志是否开启,使用"set @@global.general_log=1”;可以开启普通查询日志。
general_log_file:该参数设置了普通查询日志文件的物理位置。使用MYSQL命令"show variables like ‘general_log_file’\G"可以查看普通查询日志文件的物理位置,默认情况下,普通查询日志文件所在的目录为数据库根目录。
注意:由于普通查询日志记录了MYSQL的所有操作,对于数据访问频繁的数据库服务器而言,如果开启MYSQL普通查询日志将大幅降低数据库服务器的性能,因此建议关闭普通查询日志。在特定时期,如果需要跟踪某些特殊的查询语句,可以临时开启普通查询日志。
log_output:该参数设置了普通查询日志以及慢查询日志的输出格式,默认值为FILE,表示以文件的形式报错普通查询日志以及慢查询日志的内容,使用命令"show variables like ‘log_output’;“可以查看日志的输出格式。
MYSQL还允许将普通查询日志以及慢查询日志的内容存储到数据库表中。例如,使用MYSQL命令"set @@global.log_output=‘table’”;可以将普通查询日志以及慢查询日志分别存储到mysql系统数据库中的general_log表以及slow_log表中,此后查看新的普通查询日志内容时便可以使用SQL语句“select * from mysql.general_log\G”。
(3)MYSQL慢查询日志
使用MYSQL慢查询日志可以有效跟踪“执行事件过长”或者“没有使用索引”的查询语句,为了优化查询语句提供帮助。与普通查询日志的另一个区别在于,慢查询日志只包含成功执行过的查询语句。与慢查询日志有关的参数包括5个。
slow_query_log : 设置了慢查询日志是否开启。使用命令“show variables like ‘slow_query_log’”可以查看,“set @@global.slow_query_log=1”;可以开启慢查询日志。
slow_query_log_file:慢查询日志一旦开启,MYSQL服务实例将自动创建慢查询日志,slow_query_log_file参数设置了慢查询日志文件的物理位置。使用MYSQL命令"show variables like ‘slow_query_log_file’“可以查看慢查询日志文件的物理位置。
long_query_time:设置了慢查询的时间阈值,默认值是10秒。使用MYSQL命令“show variables like ‘long_query_time’”可以查看,而long_query_time可以通过修改配置文件进行更改。
log_queries_not_using_indexes:是否将“没有索引的查询语句”记录到慢查询日志中,无论他的执行速度有多快。“show variables like ’log_queries_not_using_indexes‘”查看,而”set @@global.log_queries_not_using_indexes=1“设置为开启。
log_output:设置了普通查询日志以及慢查询日志的输出形式,默认值为FILE。
(4)慢查询日志的查看
方式1:将慢查询日志的输出形式设置为table,执行"select * from mysql.slow_log”\G即可查看慢查询日志的内容。
方式2:将慢查询日志的输出形式设置为file,那么数据库管理员可以直接以记事本的方式打开慢查询日志,查看其内容。当慢查询日志文件内容逐渐庞大,分析该日志文件并不是那么容易,可以借助工具mysqlddumpslow命令获取日志中的摘要信息,进而分析哪些语句是MYSQL性能的瓶颈。
使用方式例子:返回访问次数最多的20条SQL语句
mysqldumpslow -s c -t 20 文件名
其中:-s表示按照何种方式排序,子选项有c,t,l,r分别是按照SQL语句执行的次数,时间,锁等待的时间,返回的记录条数来排序,al,ar以及at表示按照对应的平均值进行排序,-t 表示返回前几条记录,-g 后面是一个模糊匹配模式。

2.二进制日志

二进制日志主要用于记录数据库的变化情况,内容主要包括数据库所有的更新操作,例如use语句,insert语句,delete语句,update语句,create语句,alter语句,drop语句等,但不包括select和show等查询操作。二进制日志以事件的形式记录各个更新操作,每个事件都会附加一些其他信息。
(1)启动二进制日志
查看”show variables like ‘log_bin’“;可以查看二进制日志是否开启。
在my.cnf配置文件的mysqld选项组中添加log_bin=binary_log可以开启二进制日志。
之后MYSQL会自动创建二进制日志文件binlog.000001,默认情况下,该文件位于数据库根目录下,文件名是参数log_bin的值,扩展名为00001,000002等。每次重启MYSQL服务后,都会生成一个新的二进制日志文件,扩展名依次递增。
使用MYSQL命令”show variables like ‘log_bin_index’“可以查看二进制日志索引文件名。
注意:系统变量log_bin和log_bin_index都是静态变量,无法使用set命令对其进行赋值
(2)二进制日志文件以二进制方式存储,不能直接查看内容,数据库管理员可以通过mysql自带工具mysqlbinlog或者命令"show binlog events"查看。
方式1:mysqlbinlog命令常用选项:
在这里插入图片描述

例子1:mysqlbinlog -s binary_log.000001
以精简方式显示二进制日志信息
例子2:mysqlbinlog -v binary_log.00001从binary_log.000001日志文件中提取该insert语句对应的二进制日志信息。
以详细方式显示二进制日志信息。

方式2:使用命令”show binlog events“查看二进制日志文件的内容
show binlog events in ‘binary_log.000001’;
(3)获取当前的二进制日志文件以及偏移位置
使用MYSQL命令”show master status“可以获取当前MYSQL服务实例正在使用的二进制日志文件以及偏移位置等信息。
(4)使用二进制日志恢复数据库
二进制日志文件中的内容是符合MYSQL语法格式的更新语句,当数据库遭到破坏时,数据库管理员可以借助mysqlbinlog工具,读取二进制日志文件中指定的日志内容,并将该日志内容赋值,黏贴到MYSQL客户机中直接运行,将数据库库恢复到正确的状态。也可以使用管道操作符"|"直接将指定的二进制日志内容导入到mysql客户机中运行,管道操作符”|“的使用方法如下:
mysqlbinlog 日志文件 | mysql -u root -p
例子1:数据库管理员在2013-02-08 00:00:00备份了数据库物理文件,到了2013-02-08 10:00:00数据库发生异常。
恢复步骤1:停止mysql服务,使用备份数据库物理文件将数据库恢复到时间点2013-02-08 00:00:00。
恢复步骤2:重启mysql服务
恢复步骤3:运行从备份时间点开始到数据库发生异常的时间点的二进制日志文件的记录。
mysqlbinlog --start-datetime=“2013-02-08 00:00:00” --stop-datetime=“2013-02-08 10:00:00” binary_log.000001 | mysql -u -root -p
例子2:数据库从二进制日志操作点编号最低的命令开始执行,一直到指定的操作点编号1099。
mysqlbinlog --stop-position=“1099” binary_log.000001 | mysql -u root -p
(5)与mysql二进制日志有关的参数
max_binlog_size:单个二进制日志文件的大小,如果超过该值,则产生新的二进制日志文件,后缀名+1.
binlog_cache_size:对innodb存储引擎的表进行更新操作时,如果关闭自动提交,每提交一次事务,该事务的对应的二进制日志信息会被缓存到一个内存缓存区当中,内存缓存区的大小由binlog_cache_size决定。
sync_binlog:设置了将内存缓存中的二进制日志写入外存二进制文件的时机。默认情况下,内存缓存中的二进制日志不会立即写入外存二进制日志文件中。参数sync_binlog=[N]表示没写缓存多少次,则将内存缓存中的二进制日志写入外存二进制日志文件中。
log_slave_updates: 该参数用于配置从服务器的复制功能。
binlog_format : 以什么格式记录二进制日志,该参数的取值范围是statement,row和mixed。在statement格式下,二进制日志文件记录的是逻辑sql语句。在ROW格式下,二进制日志记录的不再是简单的SQL语句,而实记录表中数据的更改情况。在MIXED格式下,MYSQL默认采用STATEMENT格式进行二进制日志文件的记录,但是在某些情况下会使用row格式。
在这里插入图片描述
(6)二进制日志的清理
一旦启动二进制日志,每次重启MYSQL服务时,都会产生新的二进制日志文件。如果二进制日志长时间不清理,将会对硬盘空间带来很大的浪费。定期清理二进制日志是数据库管理员维护MYSQL的一个重要工作。
方式1:使用reset master命令
使用MYSQL命令”show master logs“可以查看所有二进制日志列表。执行MYSQL命令reset master可以删除所有二进制日志文件,重置二进制文件的索引文件为空,然后产生的二进制文件以及索引文件。
方式2:purge master logs to 文件名
命令可以删除指定二进制文件名之前的所有二进制日志文件。例如删除binary_log.000004之前的所有二进制日志文件可以使用下面的命令,该命令删除binary_log.000001,binary_log.000002以及binary_log.000003的二进制文件。
方式3:purge master logs before ‘yyyy-mm–dd hh:mm:ss’;
该命令可以删除指定时间之前的二进制日志。
方式4:在my.cnf配置文件的[mysqld]选项组中设置expire_logs_days参数,该参数定义了二进制文件的过期天数,过期的二进制日志文件将被删除。

3.innodb事务日志

mysql会最大程度的使用缓存机制,从而提高数据的访问效率。试想缓存中的数据在刷新到硬盘的途中,服务器突然崩溃,会发生什么事情?由于缓存中的数据未能全部写入硬盘,此时会造成因数据丢失而产生数据不一致的问题。我们也知道,innodb是一个事务安全的存储引擎,而一致性是事务ACID中的一个重要特性。针对这种情形,innodb是如何保证事务安全,避免数据丢失以及数据不一致问题的发生的呢?innodb存储引擎主要是通过innodb事务日志实现的,innodb事务日志包括重做日志以及回滚日志。
(1)重做日志主要记录以及全部完成的事务,即执行了commit的事务,默认情况下,重做日志的信息记录在ib_logfile0以及ib_logfile1中,回滚日志主要记录部分完成并写入硬盘的未完成事务,默认情况下,回滚日志的信息记录在表空间文件中(共享表空间文件ibdata1或者独享表空间ibd文件)中。
(2)checkpoint机制
理论上讲,MYSQL服务器崩溃后,重新启动MYSQL服务时,由于重做日志与回滚日志的存在,innodb通过回滚日志将所有已部分完成并写入硬盘的未完成事务进行回滚操作(rollback),然后将重做日志中的事务全部重新执行一遍即可恢复所有的数据。但是随着时间的积累,重做日志的内容愈来愈多,如果每次都从重做日志的第一条记录开始恢复,恢复的过程就会很慢,从而无法容忍。为了缩短恢复的时间,innodb引入了checkpoint机制。
checkpoint机制原理:假设在某个时间点,所有的脏页都被刷新到硬盘上,这个时间点之前的所有重做日志就不需要做了。系统记录下这个时间点重做日志的结尾位置,作为checkpoint。在进行恢复时,从这个checkpoint的位置开始恢复即可,checkpoint点之前的重做日志也就不再需要重做了。可以删除掉。为了更好利用重做日志空间,innodb采用轮询策略使用重做日志空间,因此innodb重做日志文件至少2个。
(3)innodb重做日志的参数
innodb_log_buffer_size: 设置了重做日志缓存的大小
innodb_log_files_in_group: 设置了日志文件组中重做日志文件的数量,默认是2,分别是ig_logfile0和ib_logfile1
innodb_log_file_size:设置了重做日志文件的大小。innodb日志文件总体大小由innodb_log_file_size和innodb_log_files_in_group决定,重做日志文件越大,恢复数据时需要的时间越长。
innodb_mirrored_log_groups: 设置了日志镜像文件组的数量,默认为1,且值只能为1,表示只有一个日志文件组,没有镜像。
innodb_log_group_home_dir: 设置了日志文件组存放的目录,默认在数据库根目录下。
(4)innodb回滚日志的参数
默认情况下,回滚日志的信息记录在表空间文件中,也可以设置相应的参数将回滚日志从表空间文件中分离出去。
innodb_undo_directory:设置了回滚日志存放的目录,默认数据库根目录
innodb_undo_logs:设置了回滚日志的回滚段大小,默认128k。
innodb_undo_tablespaces:设置了回滚日志由多少个回滚日志文件组成,默认为0.

4.日志文件的备份

MYSQL日志记录了MYSQL服务实例的运行轨迹。管理员有必要对日志文件进行备份,防止丢失。数据库管理员可以使用命令"flush logs"关闭所有当前日志文件,然后产生新日志文件。关闭日志文件后,数据库管理员就可以采用复制,粘贴所有旧日志文件的办法,进行备份。

5.MYSQL事件

MYSQL事件时能够自动执行或者定期执行的任务。在实际应用中,数据库管理员可以将未来某个特定的时间点自动运行或者未来某个特定时间段内周期性自动运行的若干条MYSQL语句封装成一个事件。MYSQL事件与MYSQL触发器不同的地方在于,事件随时间而触发,而触发器随数据库更新动作而触发。
(1)创建MYSQL事件
create event 事件名
on schedule 执行的时机
[on completion [not] preserve]
[enable | disable]
do 事件程序;
说明:on schedule定义了事件的有效期;时机的定义格式为at timestamp [ + interval时间间隔]。
on completion [not] preserve表示时间成功执行是否保留。不保留则删除
enable|disable表示是否禁用MYSQL事件。
do 子句定义了事件程序,一个程序可以是一条MYSQL语句,也可以时一个begin-end语句块。
举例:
create event event1
on schedule at current_timestamp + interval 5 minute
do
update account set balance = 100000 where account_no = 1;
(2)事件由一个特定的MYSQL线程进行调用,该线程称为事件调度器。成功定义MYSQL事件后,只有开启MYSQL事件调度参数event_scheduler,MYSQL事件才能在未来被调度。
set @@global.event_scheduler=1语句可以开启调度器。
(3)查看事件的定义(三种方式)
show events
select * from mysql.event
select * from information_schema.events
(4)删除事件(四种方式)
drop event 事件名
使用on completion not preserve子句
删除mysql数据库的event表的记录
删除information_schema数据库中events表的记录

相关文章:

  • 【OCCT+ImGUI系列】009-Geom2d-Geom2d_AxisPlacement
  • leetcode2844. 生成特殊数字的最少操作-medium
  • vue页面实现table动态拆分列功能
  • MyBatis:简化数据库操作的持久层框架
  • 什么是endpoints?
  • 江科大TIM定时器hal库实现
  • Python训练Day30
  • 用python实现汉字转拼音工具
  • shell脚本之函数详细解释及运用
  • 车载诊断架构 --- LIN 节点 ECU 故障设计原则
  • git工具使用
  • 第22天-Python ttkbootstrap 界面美化指南
  • Vue Router动态路由与导航守卫实战
  • Captiks动捕与步态分析步态分析系统MOVIT:16μs 无线同步 + 快速校准,破解传统光电困局
  • 【攻防实战】MacOS系统上线Cobalt Strike
  • VoiceFixer语音修复介绍与使用
  • 环境搭建
  • 第十节第四部分:常见API:秒杀案例、Calendar(技术已过时,了解即可)
  • redisson-spring-boot-starter 版本选择
  • 【Oracle 专栏】清理用户及表空间
  • 天津河西做网站公司/seo工作内容有哪些
  • 拍摄网/厦门seo排名
  • 专题网站建设/推广引流方法与渠道
  • 什么是门户类型的网站/沈阳网站seo排名公司
  • 外综服务平台哪里做网站/企业seo关键词优化
  • 长春学校网站建设方案咨询/南昌企业网站建设