【数据库】日志
MySQL 的日志系统是数据库管理系统中的一个关键组件,它通过记录各种类型的操作信息来帮助进行数据恢复、性能分析、错误排查等任务。MySQL 的日志种类繁多,每种日志都有其特定的用途:
- 二进制日志(Binary Log):记录了对 MySQL 数据库执行更改数据的所有语句,如 INSERT、UPDATE、DELETE 以及数据定义语言(DDL)操作如 CREATE TABLE、ALTER TABLE 等。不包括没有改变数据的查询(如 SELECT)。对于数据恢复和主从复制非常重要。
- 错误日志(Error Log):记录 MySQL 服务器启动、运行过程中遇到的警告信息和错误信息。对于识别和解决服务器问题至关重要。
- 通用查询日志(General Query Log):记录所有到达 MySQL 服务器的连接和查询信息,包括客户端连接的建立与断开、所有的 SQL 语句等,无论这些操作是否影响到数据。由于其会记录大量信息且可能影响性能,通常在生产环境中关闭。
- 慢查询日志(Slow Query Log):记录执行时间超过预设阈值的 SQL 查询,帮助识别和优化性能瓶颈。通过分析慢查询日志,可以找出需要优化的查询语句或索引设计。
- 中继日志(Relay Log):特定于 MySQL 的复制环境中的从库。当主库的二进制日志事件传输到从库时,这些事件被写入中继日志,然后从库从中继日志中读取并执行这些事件以保持与主库的数据同步。
- 事务日志(InnoDB Redo Log):InnoDB 存储引擎特有的日志,用于保证事务的持久性。当事务提交时,先将修改记录到 redo log 中,确保即使在发生故障时也能根据 redo log 恢复数据。
-
回滚日志(InnoDB Undo Log):同样是 InnoDB 存储引擎的一部分,用于事务的回滚操作,即在事务中如果需要撤销某个操作,可以根据 undo log 恢复到操作前的状态。
日志类型:
一、binlog
原始SQL,
应用场景:集群主备同步
三种模式区别:
1、row
日志会记录成每一行数据被修改成的形式,然后再slave端再对相同的数据进行修改,只记录要修改的数据,只有value,不会有sql多表关联的情况。
优点:在row模式下,bin-log中可以不记录执行的sql语句的上下文相关信息,仅仅需要记录哪一条记录被修改了,修改成什么信样了,所以row的日志内容会非常清楚的记录下每一行数据修改的细节,非常容易理解。而且不会出现在某些特定情况下的存储过程和function,以及trigger的调用和处罚无法被正确复制问题。
缺点:在row模式下,所有执行的语句当记录到日志中的时候,都将以每行记录的修改来记录,这样可能会产生大量的日志内容。比如有这样一条update语句:updateproduct set name='gongli' 这条语句不是记录的一条,而是修改每一条的都会记录下来
100w条记录:updatetest set name='tintin'; binilog 里面就用100w条update test set name='tintin';语句
2、statement
每一条会修改数据的sql都会记录到master的binlog中,slave在复制的时候sql进程会解析成和原来master端相同的sql再执行。
优点:在Statement模式下首先就是解决了row模式下的缺点,不需要记录记录每一行日志的变化,减少了bin-log日志量,节省了I/O以及存储资源,提高性能。因为它们只需要激励在master上所执行的语句的细节以及执行语句时候的上下文信息。
缺点:在Statement模式下,由于它记录的执行语句,所以,为了让这些语句在slave端也能正确执行,那么它还必须记录每条语句在执行的时候的一些相关信息,也就是上下文信息,以保证所有语句在slave端被执行的时候能够得到和在master端执行时候的结果。另外,由于MySQL现在发展较快,很多的新功能不断的加入,使MySQL的复制遇到了不小的挑战,自然复制的时候涉及到越复杂的内容,bug也就越容易出现。在Statement中,目前已经发现不少情况会造成MySQL的复制出现问题,主要是修改数据的时候使用了某些特定的函数或者功能的时候会出现。比如:sleep()函数在有些版本中就不能直接复制,在存储过程中使用了last_insert_id()函数,可能会使slave和master上得到不一致的id等等。由于rowlevel是基于每一行来记录的变化,所以不会出现类似的问题
100w条记录:updatetest set name='tintin'; binilog 里面就只用update test set name='tintin';
3、mixed
在mixed模式下,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和row之间选择一种。新版本中的Statement还是和以前一样,仅仅记录执行的语句。而新版本的MySQL中对row模式也做了优化,并不是所有的修改都会以row模式来记录,比如遇到表结构变更的时候就会以Statement模式来记录,如果sql语句确实是update或者delete等修改数据的语句,那么还是会记录所有行的变更。
中间件:canal
需要关注点,劣势:
二、redo log
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
2021-05-25 【Spring-AOP】