• 第十一章 MySQL日志详解


    一、错误日志

    1.错误日志默认是开启的
    2.默认存储 $datadir 下面,默认的名字是 '主机名'.err
    3.查看错误日志
    	[root@db01 ~]# mysql -uroot -p -e "show variables like 'log_error'"
    4.配置错误日志
    	[root@db01 ~]# vim /etc/my.cnf
    	[mysqld]
    	log_error=/usr/local/mysql/data/mysql.err
    

    二、一般查询日志

    1.一般查询日志默认是关闭的
    2.默认存储 $datadir 下面,默认的名字是 '主机名'.log
    3.查看一般查询日志
    	[root@db01 ~]# mysql -uroot -p -e "show variables like 'general%'"
    4.配置一般查询日志
    	[root@db01 ~]# vim /etc/my.cnf
    	general_log=on
    	general_log_file=/usr/local/mysql/data/db01.log
    

    三、二进制日志

    1.二进制日志管理

    1)开启二进制日志

    [root@db01 ~]# vim /etc/my.cnf
    [mysqld]
    server_id=1				#mysql5.6中可以不加,但是mysql5.7中必须加
    log_bin=mysql-bin		#mysql5.6中可以写log-bin和log_bin,但是mysql5.7只能写log_bin
    

    2)查看二进制日志

    #物理查看
    [root@db01 ~]# ll /usr/local/mysql/data/
    -rw-rw---- 1 mysql mysql      665 10月 30 20:14 mysql-bin.000001
    -rw-rw---- 1 mysql mysql       19 10月 30 20:07 mysql-bin.index
    
    #数据命令查看
    [root@db01 ~]# mysql -uroot -p -e "show variables like 'log_bin'"
    [root@db01 ~]# mysql -uroot -p -e "show binary logs"
    Enter password: 
    +------------------+-----------+
    | Log_name         | File_size |
    +------------------+-----------+
    | mysql-bin.000001 |       665 |
    +------------------+-----------+
    

    3)生成新的binlog

    1.重启数据库
    2.刷新binlog  flush logs
    3.二进制日志达到1G,默认会生成新的binlog
    	[root@db01 ~]# mysql -uroot -p123 -e "show variables like '%binlog_size%'"
    	+-----------------+------------+
    	| Variable_name   | Value      |
    	+-----------------+------------+
    	| max_binlog_size | 1073741824 |
    	+-----------------+------------+
    

    4)删除binlog

    1.原则:
    	1)在存储能力范围内,能多保留则多保留
    	2)基于上一次全备前的可以选择删除
    
    2.删除七天前的数据
    	1)临时生效
    	SET GLOBAL expire_logs_days = 7;
    	2)永久生效
    	[root@db01 data]# vim /etc/my.cnf
    	[mysqld]
    	expire_logs_days = 7
    	
    3.只保留三天的binlog
    	PURGE BINARY LOGS BEFORE now() - INTERVAL 3 day;
    
    3.删除指定binlog之前的所有binlog
    	PURGE BINARY LOGS TO 'mysql-bin.000010';
    
    4.使用reset master,重置binlog
    	mysql> reset master; 
    

    2.二进制日志的作用

    1.记录已提交的DML事务语句,并拆分为多个事件(event)来进行记录
    2.记录所有DDL、DCL等语句
    3.总之,二进制日志会记录所有对数据库发生修改的操作
    
    #作用:
    1.数据库备份
    2.数据库恢复
    3.数据库复制
    
    #如果我拥有数据库搭建开始所有的二进制日志,那么我可以把数据恢复到任意时刻
    

    1)事件的介绍

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

    3.二进制日志数据恢复操作

    1)创建原始数据

    #1.查看binlog信息
    mysql> show master status;
    
    #2.创建库
    mysql> create database binlog;
    
    #3.创建表
    mysql> use binlog;
    mysql> create table binlog(id int);
    
    #4.插入数据
    mysql> insert binlog values(1),(2),(3);
    
    #5.查看数据
    mysql> select * from binlog;
    

    2)误删除数据库

    #删除数据库
    mysql> drop database binlog;
    

    3)恢复数据

    #1.查看binlog找到起始位置点和结束位置点
    [root@db01 ~]# mysqlbinlog /usr/local/mysql/data/mysql-bin.000002
    
    #2.取出位置点之间的语句导出sql
    [root@db01 ~]# mysqlbinlog --start-position=120 --stop-position=548 /usr/local/mysql/data/mysql-bin.000002 > /tmp/binlog.sql
    
    #3.将数据重新倒回数据库
    [root@db01 ~]# mysql -uroot -p < /tmp/binlog.sql
    Enter password: 123
    
    #4.回到数据库查看数据
    

    4.二进制日志的工作模式

    1)查看二进制日志工作模式

    #查看
    [root@db01 ~]# mysql -uroot -p -e "show variables like 'binlog_format'"
    Enter password: 
    +---------------+-----------+
    | Variable_name | Value     |
    +---------------+-----------+
    | binlog_format | STATEMENT |
    +---------------+-----------+
    
    #工作模式:
    1.STATEMENT  语句模式
    2.row		行级模式		#企业推荐模式
    3.混合模式
    

    2)STATEMENT 语句模式

    STATEMENT 语句模式 mysql5.6 默认的模式
    
    [root@db01 ~]# mysqlbinlog /usr/local/mysql/data/mysql-bin.000002
    ... ...
    create database binlog
    /*!*/;
    # at 220
    ... ...
    create table binlog(id int)
    /*!*/;
    # at 325
    ... ...
    BEGIN
    /*!*/;
    # at 408
    ... ...
    insert binlog values(1),(2),(3)
    /*!*/;
    # at 517
    ... ...
    COMMIT/*!*/;
    # at 548
    ... ...
    drop database binlog
    ... ...
    
    #优缺点:
    	1.不严谨,不安全
    	2.语句容易理解
    	3.日志文件相较于row模式比较小,不会占用太多的磁盘空间
    

    3)行级模式 row模式

    行级模式 row模式 mysql5.7 默认的模式
    
    #1.配置数据库binlog为row模式
    [root@db01 ~]# vim /etc/my.cnf
    [mysqld]
    server_id=1
    log_bin=mysql-bin
    binlog_format=row
    
    [root@db01 ~]# mysqlbinlog /usr/local/mysql/data/mysql-bin.000003 
    # at 120
    ... ...
    create database row
    /*!*/;
    # at 211
    ... ...
    use `row`/*!*/;
    ... ...
    create table row(id int)
    # at 307
    ... ...
    BEGIN
    # at 378
    ... ...
    # at 423
    ... ...
    BINLOG '
    YGKfXxMBAAAALQAAAKcBAAAAAEYAAAAAAAEAA3JvdwADcm93AAEDAAEhwVV2
    YGKfXx4BAAAAMgAAANkBAAAAAEYAAAAAAAEAAgAB//4BAAAA/gIAAAD+AwAAADOknRQ=
    '/*!*/;
    # at 473
    ... ...
    COMMIT/*!*/;
    ... ...
    
    #查看row模式的binlog命令
    [root@db01 ~]# mysqlbinlog --base64-output=decode-rows -vvv /usr/local/mysql/data/mysql-bin.000003
    ... ...
    BEGIN
    /*!*/;
    # at 378
    #201102  9:35:28 server id 1  end_log_pos 423 CRC32 0x7655c121 	Table_map: `row`.`row` mapped to number 70
    # at 423
    #201102  9:35:28 server id 1  end_log_pos 473 CRC32 0x149da433 	Write_rows: table id 70 flags: STMT_END_F
    ### INSERT INTO `row`.`row`
    ### SET
    ###   @1=1 /* INT meta=0 nullable=1 is_null=0 */
    ### INSERT INTO `row`.`row`
    ### SET
    ###   @1=2 /* INT meta=0 nullable=1 is_null=0 */
    ### INSERT INTO `row`.`row`
    ### SET
    ###   @1=3 /* INT meta=0 nullable=1 is_null=0 */
    # at 473
    #201102  9:35:28 server id 1  end_log_pos 504 CRC32 0xc25f74b1 	Xid = 16
    COMMIT/*!*/;
    ... ...
    
    #分析
    update binlog.binlog_table
    set
    @1=22 --------->@1表示binlog_table中的第一列,集合表结构就是id=22
    where
    @1=2  --------->@1表示binlog_table中的第一列,集合表结构就是id=2
    
    #优缺点:
    	1.严谨,安全
    	2.语句不容易理解
    	3.日志文件相较于STATEMENT模式比较大,比较占用磁盘空间
    

    5.数据库数据恢复

    #日常全备
    [root@db01 ~]# mysqldump -uroot -p123 -A > /tmp/full.sql
    
    #新的一天写入数据
    [root@db01 ~]# mysql -uroot -p123
    mysql> use row
    mysql> insert row values(5);
    mysql> insert row values(6);
    mysql> insert row values(7);
    mysql> update row set id=100 where id=3;
    mysql> select * from row;
    +------+
    | id   |
    +------+
    |    1 |
    |    2 |
    |  100 |
    |    5 |
    |    6 |
    |    7 |
    +------+
    6 rows in set (0.00 sec)
    
    #删库
    mysql> drop database row;
    
    #先查找新一天binlog的起始位置点和结束位置点
    [root@db01 ~]# mysql -uroot -p123 -e "show binlog events in 'mysql-bin.000003'" | grep drop
    [root@db01 ~]# mysql -uroot -p123 -e "show binlog events in 'mysql-bin.000003'" | grep 'create table'
    [root@db01 ~]# mysqlbinlog --start-position=307 --stop-position=504 /usr/local/mysql/data/mysql-bin.000003 > /tmp/huifu.sql
    [root@db01 ~]# mysqlbinlog --start-position=785 --stop-position=1539 /usr/local/mysql/data/mysql-bin.000003 > /tmp/huifu2.sql
    
    #数据恢复
    [root@db01 ~]# mysql -u root -p < /tmp/full.sql 
    Enter password:
    [root@db01 ~]# mysql -uroot -p < /tmp/huifu.sql 
    Enter password: 
    [root@db01 ~]# mysql -uroot -p < /tmp/huifu2.sql 
    Enter password:
    
    #查看数据
    

    四、结合binlog进行数据库升级

    #1.准备一台新机器搭建数据库,同步binlog模式
    [root@db02 ~]# vim /etc/my.cnf
    [mysqld]
    binlog_format=row
    [root@db02 ~]# systemctl start mysqld
    #2.将旧的数据库数据导出
    [root@db01 ~]# mysqldump -uroot -p -B mysql > /tmp/mysql.sql
    Enter password: 
    [root@db01 ~]# mysqldump -uroot -p -B binlog events row world --master-data=2 > /tmp/full.sql
    Enter password:
    #3.将旧库导出的sql传输到新库
    [root@db01 ~]# scp /tmp/mysql.sql 172.16.1.52:/tmp/
    [root@db01 ~]# scp /tmp/full.sql 172.16.1.52:/tmp/
    #4.模拟新数据写入旧库
    mysql> use binlog;
    mysql> insert binlog values(1000);
    #5.新库导入数据
    [root@db02 ~]# mysql < /tmp/mysql.sql
    [root@db02 ~]# mysql -e "flush privileges"
    [root@db02 ~]# sed -i s#MyISAM#InnoDB#g /tmp/full.sql
    [root@db02 ~]# mysql -uroot -p < /tmp/full.sql
    #6.查看新库数据
    mysql> use binlog;
    mysql> select * from binlog;
    #7.把业务切换到新库
    #8.导出切换过程中新产生的数据
    [root@db01 ~]# mysqlbinlog --start-position=316 --stop-position=1100 /usr/local/mysql/data/mysql-bin.000001 > /tmp/new.sql
    #9.将新数据的sql推送到新库
    [root@db01 ~]# scp /tmp/new.sql 172.16.1.52:/tmp
    #10.将新数据导入新库
    [root@db02 ~]# mysql -uroot -p123 < /tmp/new.sql
    

    五、慢查询日志(慢日志)

    1.慢日志的作用

    1.是将mysql服务器中影响数据库性能的相关SQL语句记录到日志文件
    2.通过对这些特殊的SQL语句分析,改进以达到提高数据库性能的目的
    

    2.配置慢日志

    [root@db01 ~]# vim /etc/my.cnf
    [mysqld]
    #指定是否开启慢查询日志
    slow_query_log = 1
    #指定慢日志文件存放位置(默认在data)
    slow_query_log_file=/usr/local/mysql/data/slow.log
    #设定慢查询的阀值(默认10s)
    long_query_time=5
    
    #不使用索引的慢查询是否记录到日志
    log_queries_not_using_indexes
    #查询检查返回少于该参数指定行的SQL不被记录到慢查询日志
    min_examined_row_limit=100(鸡肋)
    

    3.测试慢查询日志

    #复制创建一个新表
    mysql> use world;
    mysql> create table t1 select * from city;
    
    #反复插入数据
    mysql> insert t1 select * from t1;
    mysql> insert t1 select * from t1;
    mysql> insert t1 select * from t1;
    mysql> insert t1 select * from t1;
    mysql> insert t1 select * from t1;
    
    #查看慢日志
    [root@db01 ~]# less /usr/local/mysql/data/slow.log 
    [root@db01 ~]# mysqldumpslow -s c -t 10 /usr/local/mysql/data/slow.log
    -s: 是表示按照何种方式排序,c、t、l、r分别是按照记录次数、时间、查询时间、返回的记录数来排序,ac、at、al、ar,表示相应的倒叙;
    -t: 是top n的意思,即为返回前面多少条的数据;
    -g: 后边可以写一个正则匹配模式,大小写不敏感的;
    

  • 相关阅读:
    linux权限补充:rwt rwT rws rwS 特殊权限
    关于Linux操作系统下文件特殊权限的解释
    Java学习笔记——Java程序运行超时后退出或进行其他操作的实现
    Java实现 蓝桥杯 算法提高 判断名次
    Java实现 蓝桥杯 算法提高 判断名次
    Java实现 蓝桥杯 算法提高 日期计算
    Java实现 蓝桥杯 算法提高 日期计算
    Java实现 蓝桥杯 算法提高 概率计算
    Java实现 蓝桥杯 算法提高 概率计算
    Java实现 蓝桥杯 算法提高 复数四则运算
  • 原文地址:https://www.cnblogs.com/jhno1/p/13933904.html
Copyright © 2020-2023  润新知