create database if not exists bilibili; #创建数据库bilibili use bilibili; #选择bilibili数据库,即可进行下面的代码演示 drop database if exists bilibili; #代码演示结束后删除bilibili数据库。这个小文件全部代码演示完再删 show databases; #查看是否删除完成

 

-- 准备数据

 

 

运维篇 日志 错误日志

 

错误日志 是MySQL中最重要的日志之一,它记录了当mysqld(mysql的守护进程)启动和停止时,以及服务器在运行过程中发生任何严重错误时 的相关信息。当数据库出现任何故障导致无法正常使用时,建议首先查看此日志

该日志是默认开启的,默认存放目录/var/log/,默认的日志文件名为mysqld.log。查看日志位置: show variables like '%log_error%';#其中就有log_error变量,log_error变量记录了错误日志关联的文件(/var/log/mysqld.log)

不登录进MySQL执行如下即可查看'mysqld.log错误日志文件'里面尾部的50条数据 tail -50 /var/log/mysqld.log;

 

当我们执行某条语句错误的时候,错误信息就会被记录到'mysqld.log文件里面。下面是模拟:

 

当我们想知道是什么错误导致的是,就可以去看mysqld.log文件,由于我们已经在另一个会话实时查看着了,所以直接切换到那个会话 我们会看到新多的一堆英文,只需要看有[error]的行即可,它会告诉我们具体原因,比如auto.cnf file is not a valid UUID,即无效的uuid 我们相对应的去修改即可恢复正常

 

再次重启就正常啦

 

查看log_error变量对应的日志路径

 

 

运维篇 日志 二进制日志

 

二进制日志

二进制日志(binlog)记录了所有的DDL(数据定义语言)语句和DML(数据操纵语言)语句,但不包括数据查询(select、show)语句

DDL语句的作用: 对数据库对象(数据库、表、列、索引等)进行创建、删除、修改 DML语句的作用: 用于添加、修改、删除和查询数据库记录,并检查数据完整性

 

二进制日志的作用

1、灾难时的数据恢复;

2、MySQL的主从复制。在MySQL8版本中,默认二进制日志是开启着的,涉及到的参数下面会详细讲

 

show variables like '%log_bin%';#查看二进制日志的参数,能查到6行2列的结果,前三行的作用如下

1、log_bin: 二进制文件状态,ON,也就是默认开启的

2、log_bin_basename: 最终生成的二进制文件,/var/lib/mysql/binlog,也就是在/var/lib/mysql/路径有很多binlog前缀的日志文件

3、log_bin_index: 日志的索引文件,/var/lib/mysql/binlog.index,binlog.index是索引文件记录了当前MySQL数据库关联的所有日志文件

 

查看二进制日志文件 cd /var/lib/mysql/ && ll; cat binlog.index;

 

日志格式 MySQL服务器中提供了多种格式来记录二进制日志,共有三个日志格式,对应的特点如下:

日志格式含义
statement基于SQL语句的日志记录,记录的是SQL语句,对数据进行修改的SQL都会记录在日志文件中
row基于行的日志记录,记录的是每一行的数据变更。(MySQL默认的日志格式。是可以修改为其他两种格式的,下面会讲)
mixed混合statement和row两种格式,默认采用statement,在某些特殊情况下会自动切换为row进行记录

日志查看: 由于二进制数据的日志不能直接读取,所以需要通过我们学过的二进制日志查询工具mysqlbinlog来查看,如下 mysqlbinlog [参数选项] 日志文件名;

 

参数选项如下

选项作用
-d指定数据库名称,只列出指定的数据库相关操作
-o忽略掉日志中的前n行命令
-v将基于行数据的日志数据重构为SQL语句
-w将基于行数据的日志数据重构为SQL语句,并输出注释信息

 

日志删除:对于比较繁忙的业务系统,每天生成的binlog前缀的日志文件是很多的,如果长时间不清理,将会占用大量磁盘空间。清理方式如下

1、reset master: 删除全部binlog日志,删除之后,日志编号,将从binlog.000001重新开始

2、purge master logs to 'binlog.**': 删除**编号之前的所有日志

3、purge master logs before 'yyyy-mm-dd hh24:mi:ss': 删除日志为'yyyy-mm-dd hh24:mi:ss'之前产生的所有日志

 

如果不想手动删除过久的二进制日志文件,我们也可以在mysql的配置文件中配置二进制日志的过期时间,然后二进制日志过期之后会自动删除

 

 

演示如下

 

row日志格式的日志文件,查看update行数据变更后的日志

首先执行一条update语句

查看MySQL默认的日志格式是哪个

 

举例: 当我们执行了一条update语句,这3个不同格式的日志会有什么区别呢

1、statement日志格式: 只记录这条update语句(下下面会单独讲,这里只讲下面那行的row格式的)

2、row日志格式: update这条语句能够影响的行,每一行都会被记录(变更之前+变更之后的数据都会被记录) 注意基于行的二进制日志文件,需要mysqlbinlog -v才能打开,不要漏了-v参数,因为我们打开的是行二进制日志文件 我们执行update语句的时候,就会在/var/lib/mysql生成基于行的二进制日志文件

 

查看二进制日志里面到底记录了什么数据,例如查看binlog.000002二进制日志文件

#如何查看你binglog后面最大的尾缀: 先cd /var/lib/mysql && ll; 找出binlog.xxxx数字最大的文件,就是目前最新的二进制日志文件 #里面记录的才有我们刚刚执行的update语句产生的日志数据

 

statement日志格式的日志文件,查看update行数据变更后的日志

首先执行一条update语句

如何把默认的日志格式row修改为statement或mixed。需要在配置文件里面才能改,如下

进去编辑页面之后,在最末尾行添加如下

保存退出之后,重启mysql即可生效

#然后cd /var/lib/mysql && ll; 找出binlog.xxxx数字最大的文件,就是目前最新的二进制日志文件,例如binlog.000003 #里面记录的才有我们刚刚执行的update语句产生的日志数据

 

查看二进制日志里面到底记录了什么数据,例如查看binlog.000003二进制日志文件

#不需要加-v参数,原因:statement日志格式的日志文件记录的就是SQL,也就是我们能读懂的 #如果是row日志格式的日志文件,就需要加-v参数(我们上上面演示过),因为它记录的是基于行的数据,我们读不懂

 

注意只有update、insert、create、delete语句的操作才会被记录到二进制日志中,select语句是不会被记录的 原因:二进制文件只记录DDL和DML语句

 

 

日志删除

 

 

运维篇 日志 查询日志

 

查询日志

上节课的二进制日志是不包含查询数据的SQL语句,那么我们的查询语句被什么日志记录着呢,这节课的'查询日志'就是记录了客 户端的所有操作语句,其中就包含查询语句。

由于查询日志记录的日志信息比较多,所以默认情况下,查询日志是未开启的 show variables like '%general%';#general_log查询日志默认是OFF

 

开启查询日志 #修改MySQL的配置文件 /etc/my.cnf 文件

#把下面那两行粘贴到my.cnf文件里面的末尾行,然后保存退出,表示开启查询日志。0代表关闭,1代表开启

重启mysql服务

查看'查询日志'文件

 

新开一个会话,方便实时查看'查询日志'文件尾部的内容,-f参数表示实时刷新,tail表示查看文件的尾部内容

 

去mysql执行一些SQL操作

 

去那个'查询日志'的会话,可以发现记录了我们所有的SQL语句(只记录原本的SQL语句,不记录数据变化) 只要你执行了SQL语句就会被记录,所以该查询日志占用会挺大,因为是条SQL语句就会被记录。当我们 在业务中如果暂时用不上该查询日志文件,那么就不要开启,保持默认关闭就行

开启也没什么事,它能记录所有的SQL语句,用来监控挺不错

 

 

运维篇 日志

 

慢查询日志(前面a_53_0的性能分析里学过一部分) 当某条SQL语句的执行时间超过我们指定的时间,就称这条语句为慢查询语句,该语句就会被记录在慢查询日志,方便我 们后续对这条语句进行优化

慢查询日志记录了所以执行时间超过参数long_query_time设置值,并且扫描记录数不小于min_examined_row_limit的 所有的SQL语句的日志,默认未开启。long_query_time默认为10秒,最小为0,精度可以到微秒

 

long_query_time默认是10秒,当某条SQL语句的执行时间超过10秒就会被记录到慢查询日志。这个10秒是可以修改的, 我们需要去该mysql的配置文件,如下

#编辑my.cnf配置文件

把下面的4行复制粘贴到上面my.cnf的末尾行,并保存退出

 

重启mysql服务

 

 

验证如下

 

需要导入前面导过很多次的200万数据表,分两步导入,先导入表结构,再导入表数据

 

表结构

 

表数据

 

准备好200万数据的tb_sku表后,就有了慢查询的环境啦,看查询语句会不会被记录到慢查询日志 #查看'慢查询日志'文件,找一下有没有localhost-slow.log文件

#新开一个会话,方便实时查看'查询日志'文件尾部的内容,-f参数表示实时刷新,tail表示查看文件的尾部内容

 

 

localhost-slow.log慢查询日志文件里记录了什么信息 什么时间点、哪个用户、哪个主机、执行了什么SQL语句、执行耗时

 

下面的也是慢查询日志的笔记,是前面没有讲过的,认真学

默认情况下,不会记录管理语句,也不会记录不使用索引进行查找的查询。解决如下

#修改MySQL的配置文件 /etc/my.cnf 文件

#把下面那四行行粘贴到my.cnf文件里面的末尾行,然后保存退出,表示开启查询日志。0代表关闭,1代表开启

 

如果你不想你的慢查询日志太乱,那么建议还是把上面两个1改为0,等什么时候有业务需求的时候,再设置为1

重启mysql服务

 

现在你的慢查询日志就非常强大了,只要是查询效率比较低,耗费时间>2秒的,都会被记录

删除tb_sku表