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语句
DDL、DCL的记录方式:SQL语句直接记录下来
DML的记录方式:已经commit的DML语句
记录格式:
statement:-->5.6默认,只记录语句
特点:可读性较高,日志量较少,但是恢复数据时可能是错误数据
例:insert into t1(stime) values(now());
row: -->5.7默认,记录数据行变化
特点:可读性较差,日志量较大,但是数据够精确
mixed: 不用
4.event:二进制日志的最小记录单元
对于DDL、DCL:一个语句就是一个event
对于DML:
例如以下例子,分成4个event
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