通过日志 binlog 日志进行数据恢复 相关案例
1 数据库数据异常恢复(简单情况)
在实际生成环境中,可以利用binlog日志记录的信息截取,实现数据库异常情况下的数据信息恢复功能;
数据库异常恢复情况环境准备:
# 切换新的binlog日志文件做模拟数据恢复
mysql> flush logs;
Query OK, 0 rows affected (0.03 sec)
mysql> show master status;
+------------------+------------+------------------+-----------------------+-------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+------------+------------------+-----------------------+-------------------------+
| binlog.000003 | 156 | | | |
+------------------+------------+------------------+-----------------------+-------------------------+
1 row in set (0.01 sec)
-- 确认已经刷新生成了新的binlog日志文件;
# 进行基本的数据库SQL语句操作:
mysql> create database bindb;
mysql> use bindb;
mysql> create table t1 (id int);
mysql> begin;
mysql> insert into t1 values(1);
-- 在没有进行事务提交前,操作的事务事件信息,是不会出现在binlog事件日志中的
mysql> commit;
-- 对于数据库的binlog日志,只会记录事务已经提交的DML语句信息,没有提交的DML语句是不会进行记录的;
-- 在日志中变化的DML语句信息是无法识别的,因为记录DML操作的语句默认是以ROW模式记录的;
数据库二进制日志信息查看方法:
[root@xiaoq ~]# mysqlbinlog /data/3306/data/binlog.000003
-- 对于数据库binlog日志信息,是无法直接查看内容信息,需要利用相关命令工具进行查看
binlog日志内容中主要关注的信息:
通过日志信息查看DDL操作语句信息(记录方式 SBR)
通过日志信息查看DML操作语句信息(记录方式 RBR)
以上ROW模式记录的信息是加密显示,无法直接查看的,可以使用下面命令参数进行获取详细信息:
[root@xiaoq ~]# mysqlbinlog --base64-output=decode-rows -vvv /data/3306/data/binlog.000003
-- 以上添加的参数信息,表示将DML的ROW格式语句信息,进行格式化处理输出;
# at 739
#221121 13:17:45 server id 1 end_log_pos 779 CRC32 0xb468b459 Write_rows: table id 101 flags: STMT_END_F
### INSERT INTO `bindb`.`t1`
-- 利用DML语句做的插入语句信息就显示出来了
### SET
### @1=1 /* INT meta=0 nullable=1 is_null=0 */
-- 以上日志记录的信息,可以用命令实现,如下:
mysql > insert into t1 set id=1;
等价于
mysql > insert into t1 values(1);
数据库模拟异常情况破坏操作:
mysql> drop database bindb;
-- 模拟破坏性操作,删除数据库
数据库异常情况数据恢复操作:
# 需要恢复建库开始,删除之前的所有操作(即所有binlog日志信息),实现日志信息的截取
mysql> show binlog events in 'binlog.000002';
-- 查看截取日志信息事件区域范围
[root@oldboyxiaoq ~]# mysqlbinlog --start-position=233 --stop-position=1162 /data/3306/data/binlog.000003 >/tmp/bin.sql
-- 依据binlog日志的position号码,即可获取到想要恢复数据信息;
# 根据截取的日志信息,进行数据库服务数据恢复
mysql> set sql_log_bin=0;
-- 建议在进行数据日志恢复数据时,将数据恢复时执行的SQL语句信息,不做binlog日志记录;
mysql> source /tmp/bin.sql
# 查看确认数据信息是否恢复
mysql> use bindb;
mysql> show tables;
mysql> select * from t1;
欢迎来撩 : 汇总all