前言:在数据库保存数据时,有时候不可避免会出现数据丢失或者被破坏,这样情况下,我们必须保证数据的安全性和完整性,就需要使用日志来查看或者恢复数据了。
目录
1、MySQL日志类型
1)错误日志
记录启动、运行或停止时出现的问题
错误日志主要记录如下几种日志:
服务器启动和关闭过程中的信息
服务器运行过程中的错误信息
事件调度器运行一个时间是产生的信息
在从服务器上启动从服务器进程是产生的信息
查看当前错误日志配置:
SHOW GLOBAL VARIABLES LIKE '%log_error%';
是否记录警告日志:
mysql> SHOW GLOBAL VARIABLES LIKE '%log_warnings%';
2)查询日志
记录建立的客户端连接和执行的语句
mysql> show global variables like '%general_log%';
+------------------+--------+
| Variable_name | Value |
+------------------+--------+
| general_log | OFF |
| general_log_file | ZX.log |
+------------------+--------+
2 rows in set, 1 warning (0.02 sec)
mysql> show global variables like '%log_output%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output | FILE |
+---------------+-------+
启动开关: general_log={ON|OFF}
日志文件变量:general_log_file[=/PATH/TO/file]
全局日志开关:log={ON|OFF} 该开关打开后,所有日志都会被启用
记录类型: log_output={TABLE|FILE|NONE}:
因此,要启用通用查询日志,需要至少配置general_log=ON,log_output={TABLE|FILE}。而general_log_file如果没有指定,默认名是host_name.log。
3)二进制日志
记录所有更改数据的语句。主要用于复制和即时点恢复
二进制日志启动开关:log-bin [= file_name]
查看有哪些二进制日志文件:mysql> show binary logs;
查看当前正在使用的是哪一个二进制日志文件:mysql> show master status;
查看二进制日志内容:mysql> SHOW BINLOG EVENTS IN 'mysqld-binlog.000002'; # Log_name
##该语句还可以加上Position(位置),指定显示从哪个Position(位置)开始:
mysql> SHOW BINLOG EVENTS IN 'mysqld-binlog.000002' FROM 203;
使用命令mysqlbinlog查看二进制日志内容:mysqlbinlog [options] log-files
语句以“事件”的形式保存,它描述数据更改。二进制日志还包含关于每个更新数据库的语句的执行时间信息。
它不包含没有修改任何数据的语句。
二进制日志的主要目的是在数据库存在故障时,恢复时能够最大可能地更新数据库(即时点恢复),因为二进
制日志包含备份后进行的所有更新。二进制日志还用于在主复制服务器上记录所有将发送给从服务器的语句。
日志滚动。在my.cnf中设定max_binlog_size = 200M,表示限制二进制日志最大尺寸为200M,超过200M后进行滚动。MySQL的滚动方式与其他日志不太一样,滚动时会创建一个新的编号大1的日志用于记录最新的日志,而 原日志名字不会被改变。每次重启MySQL服务,日志都会自动滚动一次。
另外如果需要手动滚动,则使用命令
mysql> FLUSH LOGS ;
- STATEMENT:基于SQL语句记录二进制日志,写入和恢复速度较快,在高并发的情况可能会出SQL语句顺序记录偏差导致恢复时数据丢失。(老版本的默认模式)
- ROW:基于行记录二进制日志,写入和恢复速度较STATEMENT慢些,日志文件占用空间也较大,但是准确性较高。(5.7的默认模式)
基于行记录的二进制日志:
ROW1 @1=1 @2='zhangsan' @3=18 @4='男'
ROW2 @1=3 @2='wangwu' @3=18 @4='男'
- MIXED:混合模式,平时负载压力较小时使用SQL语句记录二进制日志,在高并发的情况会切换成基于行记录二进制日志。
4)慢日志
记录所有执行时间超过long_query_time秒的所有查询或不使用索引的查询
# 默认没有启用慢查询,为了服务器调优,建议开启
mysql> SHOW GLOBAL VARIABLES LIKE '%slow_query_log%';
+---------------------+-------------+
| Variable_name | Value |
+---------------------+-------------+
| slow_query_log | ON |
| slow_query_log_file | ZX-slow.log |
+---------------------+-------------+
# 开启方法,当前生效,永久有效配置文件中设置
SET GLOBAL slow_query_log=ON;
# 使用 mysqldumpslow 命令获得日志中显示的查询摘要来处理慢查询日志
# mysqldumpslow slow.log
# 那么多久算是慢呢?
# 如果查询时长超过long_query_time的定义值(默认10秒),即为慢查询:
mysql> SHOW GLOBAL VARIABLES LIKE 'long_query_time';
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
MySQL如果启用了 slow_query_log=ON 选项,就会记录执行时间超过long_query_time的查询(初使表锁定的时间不算作执行时间)。日志记录文件为slow_query_log_file[=file_name],如果没有给出file_name值, 默认为主机名,后缀为-slow.log。如果给出了文件名,但不是绝对路径名,文件则写入数据目录。
5)事务日志
记录InnoDB等支持事务的存储引擎执行事务时产生的日志
2、刷新日志语句
默认情况下,所有日志创建于mysqld数据目录中。
通过刷新日志,可以强制 mysqld来关闭和重新打开日志文件(或者在某些情况下切换到一个新的日志)。
当执行一个FLUSH LOGS语句或执行mysqladmin flush-logs或mysqladmin refresh时,出现日志刷新。
MySQL:
FLUSH LOGS
Shell:
mysqladmin flush-logs
mysqladmin refresh
如果正使用MySQL复制功能,从复制服务器将维护更多日志文件,被称为接替日志。