MySQL日志管理

一、数据库中数据丢失或被破坏可能原因

误删除数据库
数据库工作时,意外断电或程序意外终止
由于病毒造成的数据库损坏或丢失
文件系统损坏后,系统进行自检操作
升级数据库时,命令语句不严格
设备故障等等
自然灾害
盗窃

二、MySQL日志

日志类型

日志文件 记入文件中的信息类型
错误日志
记录启动、运行或停止时出现的问题。
查询日志
记录建立的客户端连接和执行的语句。
二进制日志
记录所有更改数据的语句。主要用于复制和即时点恢复。
慢日志
记录所有执行时间超过long_query_time秒的所有查询不使用索引的查询。
事务日志 记录Inno DB等支持事务的存储引擎执行事务时产生的日志。

在默认情况下,所有日志创建于mysql数据目录中。通过刷新日志,可以强制mysqld来关闭和重新打开日志文件(或者在某些情况下切换到一个新的日志)。当执行一个FLUSH LOGS语句或执行 mysqladmin flush-logs或mysqladmin refresh时,出现日志刷新。如果正使用MySQL复制功能,从 复制服务器将维护更多日志文件,被称为接替日志。

错误日志

错误日志主要记录如下几种日志:
        服务器启动和关闭过程中的信息
        服务器运行过程中的错误信息
        事件调度器运行一个时间是产生的信息
        在从服务器上启动从服务器进程是产生的信息
错误日志定义:
可以用 -- log - error [ = file_name ] 选项来指定 mysqld 保存错误日志文件的位置。如果没有给定
file_name 值, mysqld 使用错误日志名 host_name .err 并在数据目录中写入日志文件。如果你执行 FLUSH LOGS ,错误日志用 - old 重新命名后缀并且 mysqld 创建一个新的空日志文件。 ( 如果未给出 -- log - error 选 项,则不会重新命名)。
        查看当前错误日志配置
                mysql > SHOW GLOBAL VARIABLES LIKE '%log_error%' ;
        是否记录警告日志
                mysql > SHOW GLOBAL VARIABLES LIKE '%log_warnings%' ;

通用查询日志

启动开关: 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
看看上述几个值的默认配置:
        SHOW GLOBAL VARIABLES LIKE '%general_log%' ;
        mysql > SHOW GLOBAL VARIABLES LIKE '%log_output%' ;

慢查询日志

MySQL 如果启用了 slow_query_log = ON 选项,就会记录执行时间超过 long_query_time 的查询(初使表锁定的时间不算作执行时间)。日志记录文件slow_query_log_file [ = file_name ] ,如果没有给出file_name值, 默认为主机名,后缀为 - slow .log 。如果给出了文件名,但不是绝对路径名,文件则写入数据目录。
默认与慢查询相关变量:
        mysql > SHOW GLOBAL VARIABLES LIKE '%slow_query_log%' ;
默认没有启用慢查询,为了服务器调优,建议开启
开启方法:
        SET GLOBAL slow_query_log = ON ; 当前生效,永久有效配置文件中设置
使用 mysqldumpslow 命令获得日志中显示的查询摘要来处理慢查询日志
# mysqldumpslow slow.log
那么多久算是慢呢?
如果查询时长超过 long_query_time 的定义值(默认 10 秒),即为慢查询:
        mysql > SHOW GLOBAL VARIABLES LIKE 'long_query_time' ;

二进制日志

二进制日志启动开关: log - bin [ = file_name ]
5 .6 及以上版本一定要手动指定。 5 .6 以下版本默认 file_name $datadir/mysqld - binlog
查看二进制日志的工具为: mysqlbinlog
二进制日志包含了所有更新了数据或者已经潜在更新了数据(例如,没有匹配任何行的一个 DELETE )的所有语句
语句以 事件 的形式保存,它描述数据更改。二进制日志还包含关于每个更新数据库的语句的执行时间信息。
它不包含没有修改任何数据的语句。
二进制日志的主要目的是在数据库存在故障时,恢复时能够最大可能地更新数据库(即时点恢复),因为二进制日志包含备份后进行的所有更新。二进制日志还用于在主复制服务器上记录所有将发送给从服务器的语句。
二进制日志是记录执行的语句还是执行后的结果数据呢?
第一种情况:假如一个表有 10 万行数据,而现在要执行一个如下语句将 amount 字段的值全部在原来的基础上
增加 1000
UPDATE sales .january SET amount = amount + 1000
此时如果要记录执行后的结果数据的话,日志会非常大。
因此在这种情况下应记录执行语句。这种方式就是基于语句的二进制日志。
第二种情况:如果向某个字段插入的是当前的时间呢?如下:
INSERT INTO tb SET Birthdate = CURRENT_TIME () ;
此时就不能记录语句了,因为不同时间执行的结果是不一样的。这是应该记录这一行的值,这种就是基于行(row )的二进制日志。
在有些情况,可能会结合两种方式来记录,这种叫做混合方式的二进制日志。
二进制日志的管理
        日志滚动
my .cnf 中设定 max_binlog_size = 200 M ,表示限制二进制日志最大尺寸为 200M ,超过 200M 后进行滚
动。 MySQL 的滚动方式与其他日志不太一样,滚动时会创建一个新的编号大 1 的日志用于记录最新的日志,而原
日志名字不会被改变。
每次重启 MySQL 服务,日志都会自动滚动一次。
另外如果需要手动滚动,则使用命令 mysql > FLUSH LOGS ;
日志查看
查看有哪些二进制日志文件: mysql > SHOW BINARY LOGS ;
查看当前正在使用的是哪一个二进制日志文件: mysql > SHOW MASTER STATUS ;
查看二进制日志内容: mysql > SHOW BINLOG EVENTS IN 'mysqld-binlog.000002' ;
        ##该语句还可以加上 Position (位置),指定显示从哪个 Position (位置)开始:
        mysql > SHOW BINLOG EVENTS IN 'mysqld-binlog.000002' FROM 203 ;
使用命令 mysqlbinlog 查看二进制日志内容: mysqlbinlog [ options ] log - files
使用二进制日志还原数据:
        使用mysqlbinlog 读取需要的日志内容,使用标准输入重定向到一个 sql 文件,然后在 mysql 服务器上
导入即可,如下:
        [ root @localhost mysql ] # mysqlbinlog mysqld-binlog.000002
        >/root/temp_date.sql
删除二进制日志文件:
二进制日志文件不能直接删除的,如果使用 rm 等命令直接删除日志文件,可能导致数据库的崩溃。
必须使用命令 PURGE 删除日志,语法如下: PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr }
reset master 命令删除所有日志,新日志重新从 000001 开始编号
purge master logs to 'filename.******' 命令可以删除指定编号前的所有日志

你可能感兴趣的:(mysql,数据库)