MySQL日志管理及二进制备份

🎯 本文专栏:MySQL深入浅出
🚀 作者主页:小度爱学习

在这里插入图片描述

MySQL日志管理

在数据库保存数据时,有时候不可避免会出现数据丢失或者被破坏,这样情况下,我们必须保证数据的安全性和完整性,就需要使用日志来查看或者恢复数据了。

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

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

MySQL日志类型

MySQL有几个不同的日志文件,可以帮助你找出mysqld内部发生的事情:

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

image-20211203202747146

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

在mysql中,执行SQL语句:

FLUSH LOGS

在shell中,通过mysqladmin命令执行日志刷新:

mysqladmin flush-logs
mysqladmin refresh

错误日志

错误日志主要记录如下几种日志:

  • 服务器启动和关闭过程中的信息
  • 服务器运行过程中的错误信息
  • 事件调度器运行一个时间是产生的信息
  • 在从服务器上启动从服务器进程是产生的信息

错误日志定义:

可以用–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。

看看上述几个值的默认配置:

mysql> 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

注意:在最新的8版本中,默认开启了二进制日志!!!

二进制日志包含了所有更新了数据或者已经潜在更新了数据(例如,没有匹配任何行的一个DELETE)的所有
语句。

语句以“事件”的形式保存,它描述数据更改。二进制日志还包含关于每个更新数据库的语句的执行时间信息。
它不包含没有修改任何数据的语句。

二进制日志的主要目的是在数据库存在故障时,恢复时能够最大可能地更新数据库(即时点恢复),因为二进
制日志包含备份后进行的所有更新。二进制日志还用于在主复制服务器上记录所有将发送给从服务器的语句。

二进制日志是记录执行的语句还是执行后的结果数据呢?分为三种情况:

  1. 假如一个表有10万行数据,而现在要执行一个如下语句将amount字段的值全部在原来的基础上增加1000:

    UPDATE sales.january SET amount=amount+1000 ;
    

    此时如果要记录执行后的结果数据的话,日志会非常大。因此在这种情况下应记录执行语句。这种方式就是基于语句的二进制日志。

  2. 如果向某个字段插入的是当前的时间呢?如下:

    INSERT INTO tb SET Birthdate=CURRENT_TIME();
    

    此时就不能记录语句了,因为不同时间执行的结果是不一样的。这是应该记录这一行的值,这种就是基于行(row)的二进制日志。

  3. 在有些情况,可能会结合两种方式来记录,这种叫做混合方式的二进制日志

二进制日志的管理

日志滚动。在my.cnf中设定max_binlog_size = 200M,表示限制二进制日志最大尺寸为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服务器上导入即可,如下:

mysqlbinlog mysqld-binlog.000002 >/root/temp_date.sql

如果报编码错误:mysqlbinlog: [ERROR] unknown variable 'default-character-set

image-20210426173932718

原因:mysqlbinlog这个工具无法识别binlog中的配置中的default-character-set=utf8mb4这个指令。

有两种方式解决:

  1. 添加 --no-defaults 参数

    mysqlbinlog --no-defaults binlog.000069 >c:/a.sql # 注意需要指定binlog的位置,如果是当前路径,则可以直接使用名称即可。

  2. 修改配置文件my.cnf

    default-character-set=utf8mb4 修改为 character-set-server = utf8mb4,但是需要重启MySQL服务。

删除二进制日志文件:

二进制日志文件不能直接删除的,如果使用rm等命令直接删除日志文件,可能导致数据库的崩溃。必须使用命令 PURGE 删除日志,语法如下:

PURGE { BINARY | MASTER } LOGS { TO 'log_name' |BEFORE datetime_expr }

注意:如果数据库使用的编码是utf8mb4编码,mysqlbinlog命令可能不能解析这种编码,提供两种方案:

  1. 在MySQL的配置/etc/my.cnf中将**default-character-set=utf8mb4 **修改为 character-set-server = utf8,但是这需要重启MySQL服务,如果你的MySQL服务正在忙,那这样的代价会比较大。

  2. 用mysqlbinlog –no-defaults mysql-bin.000004 命令打开。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值