mysql-log日志系统浅谈

来源:互联网 发布:java子类方法重写 编辑:程序博客网 时间:2024/06/04 14:40

这里主要说明下mysql的7种日志

㈠ 错误日志(Error log)

        
        ① 参数
           
           log_error:指定日志的位置和名称
        
        ② 作用
           
           ⑴出错/告警信息

           ⑵优化帮助

 

规模化运维如何解决:
日志汇总
日志监控

           

 ㈡ 慢查询日志(Slow log)

        
        ① 参数 
           
           log_slow_queries:指定日志的位置和名字
           long_query_time:运行时间小于等于该阈值的SQL不会被记录
           log_queries_not_using_indexes:没有使用索引的SQL会被记录
           log_output:指定日志的输出格式、默认是FILE、亦可另置为TABLE
           
        ② 作用
           

           SQL优化


慢日志分析工具

mysqldumpslow

mysqlsla
pt-query-digest(推荐)

           
           
㈢ 事务日志(undo/redo log)
        
        ① 参数 
           
           innodb_log_file_size:日志文件大小
           innodb_log_files_in_group:每组有多少日志文件
           innodb_mirrored_log_groups:有多少组
           innodb_log_group_home_dir:日志组所在路径
           
        ② 作用
           
           实例或介质恢复

           

㈣ 中继日志(relay log)

        
        ① 参数  
        
           relay-log:指定中继日志的位置和名字
        
        ② 作用
           
           备库将主库的日志复制到自己的中继日志里

           

㈤ 通用日志(General log)

        
        ① 参数 
           
           general_log_file:指定通用日志的位置和名字
           general_log:1开启;0关闭
        
        ② 作用
           
           审计:哪个账号、在哪个时段、做了哪些事情
           
㈥ 二进制日志(Bin log)
        
        ① 参数 
           
           log_bin:指定日志位置和名称【注意一下:在my.cnf应为log-bin、而作为参数是log_bin】
           binlog_format:指定日志格式
           sync_binlog:1表示同步写磁盘的方式写日志
        
        ② 作用
           
           ⑴ 基于时间点恢复

           ⑵ 复制


二进制日志分析工具:

mysqlbinlog

            

Row(推荐)、Statement、Mix(Statement为主,特殊条件下切换为Row)

㈦ 查询日志

        
        ① 参数 
           
           log:指定日志名字
           log_output:若为TABLE、则在mysql库下
           
        ② 作用
           

           记录了所有对MySQL请求的信息


日志当中有个难点,undo log 与 redo log的区别

undo log 撤销日志,记录是数据修改前的值,假设修改 tba 表中 id=2的行数据,把Name='B' 修改为Name = 'B2' ,那么undo日志就会用来存放Name='B'的记录,如果这个修改出现异常,可以使用undo日志来实现回滚操作,保证事务的一致性。


redo log重做日志,你可以理解为它是物理磁盘的一个临时存放点,数据先放入临时区域,再写进物理磁盘。这里要讲到redo-log的由来:

1、数据库对数据做修改的时候,需要把数据页从磁盘读到buffer pool中,然后在buffer pool中进行修改;

2、那么这个时候buffer pool中的数据页就与磁盘上的数据页内容不一致,称buffer pool的数据页为dirty page 脏数据;

3、如果这个时候发生非正常的DB服务重启,那么这些数据还没在内存,并没有同步到磁盘文件中(注意,同步到磁盘文件是个随机IO),也就是会发生数据丢失;

4、如果这个时候,能够在有一个文件,当buffer pool 中的data page变更结束后,把相应修改记录记录到这个文件(注意,记录日志是顺序IO),那么当DB服务发生crash的情况,恢复DB的时候,也可以根据这个文件的记录内容,重新应用到磁盘文件,数据保持一致。

使用redo-log的好处:

  • 1、当buffer pool中的dirty page 还没有刷新到磁盘的时候,发生crash,启动服务后,可通过redo log 找到需要重新刷新到磁盘文件的记录;
  • 2、buffer pool中的数据直接flush到disk file,是一个随机IO,效率较差,而把buffer pool中的数据记录到redo log,是一个顺序IO,可以提高事务提交的速度;
写到这,不得不引出binlog与redolog的区别:

首先,二进制日志会记录所有与MySQL数据库有关的日志记录,包括InnoDB、MyISAM、Heap等其他存储引擎的日志。而InnoDB存储引擎的重做日志只记录有关该引擎本身的事务日志。

其次,记录的内容不同。无论用户将二进制日志文件记录的格式设为STATEMENT还是ROW,又或是MIXED,其记录的都是关于一个事务的具体操作内容,即该日志是逻辑日志。而InnoDB存储引擎的重做日志是关于每个页(Page)的更改的物理情况。

此外,写入的时间也不同。二进制日志文件仅在事务提交后进行写入,即只写磁盘一次,不论这时该事务多大。而在事务进行的过程中,却不断有重做日志条目(redo entry)被写入到重做日志文件中。



参考文章:

http://doc.okbase.net/xinysu/archive/259593.html

原创粉丝点击