跳转至

14. 错误日志、二进制日志、慢日志

1. 错误日志

1.作用:
    记录启动、关闭、日常运行过程中,MySQL的状态信息、警告信息、错误信息等

2.默认开启:
    数据路径下/hostname.err

3.手工设定:
    vim /etc/my.cnf
    [mysqld]
    log_error=/var/log/mysql.log

4.查看错误日志路径:
    show variables like 'log_error';
    log_error=/var/log/mysql.log

5.错误日志内容查看:
    主要关注[error]及上下文内容
mysql> show variables like 'log_error';
+---------------+--------------------+
| Variable_name | Value              |
+---------------+--------------------+
| log_error     | /var/log/mysql.log |
+---------------+--------------------+
1 row in set (0.00 sec)

2. 二进制日志

1.作用:
    1)备份恢复
    2)主从环境

2.配置:(# 注意:/data/mysql/目录必须提前创建好且有mysql用户权限,否则报错!)
    vim /etc/my.cnf
        [mysqld]
        server_id=6
        log_bin=/data/mysql/mysql-bin
        binlog_format=row

 3.二进制日志记录的内容:
    MySQL数据库所有变更类的SQL语句
        DDLDCL的记录方式SQL语句直接记录下来
        DML的记录方式:已经commit的DML语句
            记录格式:
                statement-->5.6默认,只记录语句
                    特点:可读性较高,日志量较少,但是恢复数据时可能是错误数据
                    例:insert into t1(stime) values(now());
                row      -->5.7默认,记录数据行变化
                    特点:可读性较差,日志量较大,但是数据够精确
                mixed   不用

 4.event:二进制日志的最小记录单元
    对于DDLDCL:一个语句就是一个event
    对于DML
        例如以下例子,分成4event
        begin;
        dml1
        dml2
        commit;
 event的组成
    开始位置(#at 157+实践内容+结束位置(#at 890/end_log_pos890

 5.日志文件查看
    show binary logs;    #查看所有的二进制文件
    show master status;   #查看当前再用的二进制文件

 6.日志内容查看
    1.mysql客户端中简单查看binlog内容
        show binlog events in 'mysql-bin.000001'; #查看000001的内容
    2.命令行中binlog文件内容详细查看
        mysqlbinlog /data/mysql/mysql-bin.000001
        #翻译插入语句后,显示具体内容
        mysqlbinlog --base64-output=decode-rows -vvv /data/mysql/mysql-bin.000001
        #查看单个库的二进制文件(不知道常不常用)
        mysqlbinlog -d world /data/mysql/mysql-bin.000001

7.二进制日志截取
    mysqlbinlog --start-position=321 --stop-position=513 /data/mysql/mysql-bin.000001>/tmp/binlog.sql
    重点难点:如何找起点
    导入数据
        set sql_log_bin=0;
        source /tmp/binlog.sql
        set sql_log_bin=1;

8.使用二进制日志恢复数据案例
    数据库故障(损坏)原因:
        1.软件损坏
        2.数据损坏
        3.物理损坏:硬件损坏
        4.逻辑损坏:SQL语句导致的误删除,误修改
1)故障案例模拟:
    create database db charset utf8;
    use db;
    create table t1(id int);
    insert into t1 values(1),(2),(3),(4),(5),(6);
    commit;
    update t1 set id=30 where id=3;
    commit;
    delete from t1 where id=4;
    commit;
    drop table t1;
    如何恢复?
2)查看二进制日志事件:找到要截取的开始位置,结束位置
    show master status;
    show binlog events in 'mysql-bin.000001';
3)恢复数据:
    mysqlbinlog --start-position=614 --stop-position=1470 /data/mysql/mysql-bin.000001 >/tmp/binlog.sql

    set sql_log_bin=0;
    source /tmp/binlog.sql;
    select * from t1;
    set sql_log_bin=1;
4)验证数据
    select * from db.t1;

9.二进制日志其他操作
1)自动清理日志
    show variables like '%expire%';
    expire_logs_days=0              #默认是0,不清理
    set global expire_logs_days=15;      #一般按照全备周期(7天)*2+1设置
    永久生效设置:
        vim /etc/my.cnf
        [mysqld]
        exprie_logs_days=8;
2)手工清理二进制日志:(注意:不能使用rm删除,会导致mysql数据库启动不了!!)
    purge binary logs before now() - interval 3 day; #清理3天前的所有二进制文件
    purge binary logs to 'mysql-bin.000001';        #清理指定二进制文件
    reset master;   #删除所有二进制日志文件,并从000001开始重新记录日志
故障模拟:
    假如不小心rm删除了二进制日志,如何恢复?
    1.修改my.cnf配置文件,关闭二进制日志,启动数据库
    2.关闭数据库,然后开启二进制日志,启动数据库

3)日志滚动
    1.flush logs;
    2.重启MySQL也会自动滚动一个新的二进制日志
    3.日志文件达到1G大小后,自动生成新的二进制日志文件;
        show variables like '%binlog_size%';
        max_binlog_size=1073741824
    4.备份文件是,加入参数也可以自动滚动日志

3. slowlog慢日志

1.作用:
    记录慢SQL语句的日志

2.开启慢日志:(默认未开启)
    vim /etc/my.cnf
        [mysqld]
        slow_query_log=1                            #开关
        slow_query_log_file=/data/mysql/slow.log      #文件位置及名字
        long_query_time=0.01                        #设定慢查询时间
        log_queries_not_using_indexes                #没走索引的语句也记录

3.慢日志分析处理工具:(一般先看次数,其次看时间)
    mysqldumpslow -s c -t 10 /data/mysql/slow.log
        -s:按照何种方式排序,加上a则倒叙
            c:记录次数
            t:时间
            l:查询时间
            r:返回的记录数
        -t:即top,返回前几条
        -g:加正则匹配,筛选语句用
例:
    mysqldumpslow -s r -t 10 /data/mysql/slow.log                   #得到返回记录及最多的10个查询
    mysqldumpslow -s t -t 10 -g "left join" /data/mysql/slow.log     #得到按时间排序最多的前10个左连接查询

最后更新: 2022-02-20 08:44:07