• MySQL 日志


    错误日志(Error log)

    # 错误日志默认是关闭的
    # 默认路径是 $datadir/,默认的名字是'主机名.err'
    # 配置方式 
    [root@db02 ~]# vim /etc/my.cnf
    [mysqld]
    server_id=1
    basedir=/usr/local/mysql
    datadir=/usr/local/mysql/data
    port=3306
    socket=/tmp/mysql.sock
    skip-name-resolve
    log_err=/usr/local/mysql/data/mysql.err
    
    [mysql]
    socket=/tmp/mysql.sock
    
    # 查看方式
    [root@db02 ~]# mysql -e "show variables like '%log_err%'"
    +---------------------+---------------------------------+
    | Variable_name       | Value                           |
    +---------------------+---------------------------------+
    | log_error           | /usr/local/mysql/data/mysql.err |
    +---------------------+---------------------------------+
    

    一般日志(General log)

    开启 General log 将所有到达 MySQL Server 的 SQL语句 记录下来 。

    一般不会开启开功能,因为日志的量会非常庞大,个别情况下可能会临时的开一会 General log 以供排障使用 。

    # 默认是关闭的
    # 默认路径是 $datadir/,默认的名字是'主机名.log'
    # 配置方式
    [root@db02 ~]# vim /etc/my.cnf
    [mysqld]
    log_err=/usr/local/mysql/data/mysql.err
    general_log=on
    general_log_file=/usr/local/mysql/data/db02.log
    
    [mysql]
    socket=/tmp/mysql.sock
    
    # 查看方式
    mysql> show variables like '%general%';
    +------------------+--------------------------------+
    | Variable_name    | Value                          |
    +------------------+--------------------------------+
    | general_log      | OFF                            |
    | general_log_file | /usr/local/mysql/data/db02.log |
    +------------------+--------------------------------+
    2 rows in set (0.00 sec)
    

    二进制日志(Binlog)

    二进制日志用途:

    记录已提交的 DML 事务语句,并拆分为多个事件(Event)来进行记录

    记录所有 DDL、DCL 等语句

    可以用来做数据的备份恢复

    可以用来做数据库的复制

    Binlog 的配置

    # 注意:
    1)binlog生成默认大小是120
    2)binlog的大小也是 binlog 的当前位置点
    
    # 二进制日志默认是关闭的
    # 默认路径是 $datadir/,以'mysql-bin.000001...N 保存
    # 配置方式
    [root@db02 ~]# vim /etc/my.cnf
    [mysqld]
    server_id	# mysql5.7必须配置 server_id								 
    log_bin=/usr/local/mysql/data/mysql-bin			
    	
    # 查看方式
    mysql> show variables like '%log_bin%';
    

    Binlog 的位置

    # 物理查看
    [root@db02 data]# ll mysql-bin.*
    -rw-rw---- 1 mysql mysql     167 7月  14 18:22 mysql-bin.000001
    -rw-rw---- 1 mysql mysql    2636 7月  14 19:07 mysql-bin.000002
    
    # 数据库查看
    mysql> show binary logs;
    +------------------+-----------+
    | Log_name         | File_size |
    +------------------+-----------+
    | mysql-bin.000001 |       167 |
    | mysql-bin.000002 |      2636 |
    +------------------+-----------+
    
    # 查看binlog事件
    mysql> show binlog events in 'mysql-bin.000016';
    

    Binlog 的事件

    # 什么是事件(event)
    1)在binlog中最小的记录单元为 event
    2)一个事务会被拆分成多个事件(event)
    
    # 事件(event)的特性
    1)每个 event 都有一个开始位置(start position)和结束位置(stop position)
    2)所谓的位置就是event对整个二进制的文件的相对位置
    3)对于一个二进制日志中,前 120 个 position 是文件格式信息预留空间
    4)MySQL 第一个记录的事件,都是从 120 开始的
    

    刷新 Binlog

    # 刷新 binlog 命令
    mysql> flush logs;
    
    # 重启数据库时会刷新
    
    # 二进制日志大小的上限,默认 1G(配置 max_binlog_size)
    mysql> show variables like '%max_binlog_size%';
    +-----------------+------------+
    | Variable_name   | Value      |
    +-----------------+------------+
    | max_binlog_size | 1073741824 |
    +-----------------+------------+
    

    删除 Binlog

    注意:绝对不能使用 rm 命令删除 Binlog 日志

    1.根据存在时间删除日志
    # 临时生效
    SET GLOBAL expire_logs_days = 7;
    # 永久生效
    [root@db01 data]# vim /etc/my.cnf
    [mysqld]
    expire_logs_days = 7
    
    # 使用purge命令删除
    mysql> PURGE BINARY LOGS BEFORE now() - INTERVAL 3 day;
    
    # 根据文件名删除,以下例子会删除 000010 以前的所有 binlog 日志
    mysql> PURGE BINARY LOGS TO 'mysql-bin.000010';
    
    # 危险:会影响主从复制
    mysql> reset master; 
    

    二进制日志作用

    1.记录已提交的 DML 事务语句,并拆分为多个事件(event)来进行记录

    2.记录所有 DDL、DCL、DML 等语句,总之,二进制日志会记录所有对数据库发生修改的操作

    3.如果我拥有数据库搭建开始所有的二进制日志,那么我可以把数据恢复到任意时刻

    4.数据的备份与恢复

    5.数据的复制

    数据库的备份与恢复

    添加数据:

    # 添加数据
    mysql> create database binlog;
    Query OK, 1 row affected (0.00 sec)
    
    mysql> use binlog
    Database changed
    
    mysql> create table binlog(id int);
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> insert binlog values(1),(2),(3);
    Query OK, 3 rows affected (0.00 sec)
    Records: 3  Duplicates: 0  Warnings: 0
    
    mysql> insert binlog values(4);
    Query OK, 1 row affected (0.00 sec)
    
    mysql> insert binlog values(5);
    Query OK, 1 row affected (0.00 sec)
    

    删除数据:

    # 误删除两条数据
    mysql> delete from binlog where id=5;
    Query OK, 1 row affected (0.00 sec)
    
    mysql> delete from binlog where id=4;
    Query OK, 1 row affected (0.00 sec)
    

    想要恢复被删除的数据:

    # 通过 Binlog 恢复数据
    # 查看二进制日志找到位置点
    [root@db02 data]# mysqlbinlog mysql-bin.000002
    
    # 将位置点之间的数据取出
    [root@db02 data]# mysqlbinlog --start-position=631 --stop-position=978 mysql-bin.000002 > /tmp/recovery.sql
    
    # 将数据导入回去
    [root@db02 data]# mysql < /tmp/recovery.sql
    

    数据库的升级

    # 准备一台新的数据库,版本为5.6.38
    # 旧数据库备份数据
    [root@db03 ~]# mysqldump -uroot -p123 --triggers -R --master-data=2 -B ku linux9 myisam qiudao qiudaodsb tmp world xiangqing >/tmp/full.sql
    
    
    # 将备份的数据库传到新数据库
    [root@db03 ~]# scp /tmp/full.sql 172.16.1.52:/tmp/
    
    # 修改sql中的存储引擎
    [root@db02 data]# sed -i 's#MyISAM#InnoDB#g' /tmp/full.sql
    
    # 将修改后的sql文件导入新数据
    [root@db02 data]# mysql < /tmp/full.sql
    	
    # 将代码中的数据库地址修改为新的数据库地址
    # 通过 binlog 将数据迁移过程中新生成的数据取出
    [root@db03 data]# mysqlbinlog -uroot -p123 --start-position=120 --stop-position=465 mysql-bin.000014 > /tmp/recovery.sql
    
    [root@db03 data]# scp /tmp/bu.sql 172.16.1.52:/tmp/
    
    # 将新数据导入新库
    [root@db02 data]# mysql < /tmp/recovery.sql
    

    二进制日志工作模式

    工作模式种类

    • SBR(Statement-Based Replication),语句模式
    • RBR(Row-Based Replicaiton),行级模式
    • MBR(Mixed-Based Replication),混合模式

    查看工作模式

    mysql> show variables like '%binlog_format%';
    +---------------+-----------+
    | Variable_name | Value     |
    +---------------+-----------+
    | binlog_format | STATEMENT |
    +---------------+-----------+
    1 row in set (0.00 sec)
    

    Statement-Based Replication(SBR)语句模式

    # 语句模式,MySQL5.6 默认的模式
    记录数据库中操作过得所有sql语句
    
    # 查看
    [root@db03 data]# mysqlbinlog mysql-bin.000014
    
    # 优缺点
    1.易读
    2.不安全
    3.相对于行级模式占用磁盘空间小 
    

    Row-Based Replicaiton(RBR)行级模式

    # 行级模式,MySQL5.7 默认的模式
    记录的是数据的变化过程
    
    # 配置行级模式
    [root@db03 data]# vim /etc/my.cnf
    server_id = 1
    log_bin=/usr/local/mysql/data/mysql-bin
    binlog_format=row
    
    # 查看方式
    [root@db03 data]# mysqlbinlog --base64-output=decode-rows -vvv mysql-bin.000016
    
    #优缺点:
    1.安全
    2.不易读
    3.相对于语句模式占用磁盘大
    

    Mixed-Based Replication 混合模式(略)

    慢日志(Slow Log)

    Slow Log 慢日志将 MySQL 服务器中影响数据库性能的相关 SQL 语句记录到日志文件,通常需要对这些特殊的 SQL 语句分析、改进,以达到提高数据库性能的目的

    Slow Log 配置

    [root@db01 ~]# vim /etc/my.cnf
    [mysqld]
    # 指定是否开启慢查询日志
    slow_query_log = 1
    # 指定慢日志文件存放位置(默认在 $basedir/data )
    slow_query_log_file=/service/mysql/data/slow.log
    # 设定慢查询的阀值(默认10s)
    long_query_time=0.05
    # 不使用索引的 SQL 是否记录到日志
    log_queries_not_using_indexes
    # 查询检查返回少于该参数指定行的SQL不被记录到慢查询日志
    min_examined_row_limit=100(鸡肋)
    
    
    # 添加以下内容
    [root@db01 ~]# vim /etc/my.cnf
    slow_query_log = 1
    slow_query_log_file = /service/mysql/data/slow.log
    long_query_time = 3 
    # log_queries_not_using_indexes    不使用索引的所有 SQL 都会记录到慢日志,即使小于 long_query_time,为了测试,需要先关闭
    

    Slow Log 测试

    # 建表
    mysql> create table solwlog2 select * from city;
    Query OK, 4079 rows affected (0.07 sec)
    Records: 4079  Duplicates: 0  Warnings: 0
    
    # 反复插入
    mysql> insert solwlog select * from solwlog;
    Query OK, 2088448 rows affected (9.00 sec)
    Records: 2088448  Duplicates: 0  Warnings: 0
    
    # 查看慢日志
    [root@dbtest01 data]# less slow.log
    /usr/local/mysql/bin/mysqld, Version: 5.6.46-log (MySQL Community Server (GPL)). started with:
    Tcp port: 3306  Unix socket: /tmp/mysql.sock
    Time                 Id Command    Argument
    # Time: 200722 18:56:47
    # User@Host: root[root] @ localhost []  Id:     2
    # Query_time: 4.530273  Lock_time: 0.030911 Rows_sent: 1305280  Rows_examined: 1305280
    SET timestamp=1595415407;
    select * from world.slowlog;
    

    mysqldumpslow 命令分析慢日志

    # 输出记录次数最多的 10条 SQL语句
    [root@dbtest01 data]# mysqldumpslow -s c -t 10 /usr/local/mysql/data/slow.log
    
    Reading mysql slow query log from /usr/local/mysql/data/slow.log
    Count: 1  Time=4.50s (4s)  Lock=0.03s (0s)  Rows=1305280.0 (1305280), root[root]@localhost
      select * from world.slowlog
    
    Died at /usr/local/mysql/bin/mysqldumpslow line 167, <> chunk 1.
    
    
    
    # mysqldumpslow 命令选项
    -s	# 是表示按照何种方式排序,c、t、l、r分别是按照记录次数、时间、查询时间、返回的记录数来排序,ac、at、al、ar,表示相应的倒叙;
    -t	# 是top n的意思,即为返回前面多少条的数据;
    -g	# 后边可以写一个正则匹配模式,大小写不敏感的;
    
    # 例子:
    # 得到返回记录集最多的10个查询
    mysqldumpslow -s r -t 10 /database/mysql/slow-log
    
    # 得到按照时间排序的前10条里面含有左连接的查询语句
    mysqldumpslow -s t -t 10 -g "left join" /database/mysql/slow-log
    

    第三方工具分析慢日志

    第三方推荐:
    yum install -y percona-toolkit-3.0.11-1.el6.x86_64.rpm
    
    使用 percona 公司提供的 pt-query-digest 工具分析慢查询日志
    [root@mysql-db01 ~]# pt-query-digest /application/mysql/data/mysql-db01-slow.log
    
    记录成长过程
  • 相关阅读:
    H
    并查集
    H
    Supermarket (贪心 并查集)
    H
    M
    N-Find a way
    HDU 4035 Maze
    #386. 【UNR #3】鸽子固定器
    P4688 [Ynoi2016]掉进兔子洞
  • 原文地址:https://www.cnblogs.com/zzzwqh/p/13357097.html
Copyright © 2020-2023  润新知