专栏首页杨建荣的学习笔记MySQL句柄恢复文件的简单尝试

MySQL句柄恢复文件的简单尝试

今天突然想起一个问题,那就是对于ibdata的恢复,如果我们简单模拟一下,就会发现还是蛮有意思的。

首先我们得到两个参数值,一个是刷脏页的指标,另外一个是数据文件的目录。

mysql> show variables like '%pct%'; +------------------------------------------+-----------+ | Variable_name | Value | +------------------------------------------+-----------+ | innodb_buffer_pool_dump_pct | 25 | | innodb_compression_failure_threshold_pct | 5 | | innodb_compression_pad_pct_max | 50 | | innodb_max_dirty_pages_pct | 75.000000 | | innodb_max_dirty_pages_pct_lwm | 0.000000 | | innodb_old_blocks_pct | 37 | +------------------------------------------+-----------+ 6 rows in set (0.01 sec) mysql> show variables like 'datadir'; +---------------+----------------+ | Variable_name | Value | +---------------+----------------+ | datadir | /home/data/s1/ | +---------------+----------------+ 1 row in set (0.00 sec)

这个时候的文件是下面的几个:

[root@grtest s1]# ll ib* -rw-r----- 1 mysql mysql 413 Jun 20 14:01 ib_buffer_pool -rw-r----- 1 mysql mysql 12582912 Jun 20 14:01 ibdata1 -rw-r----- 1 mysql mysql 50331648 Jun 20 14:01 ib_logfile0 -rw-r----- 1 mysql mysql 50331648 Jun 20 14:01 ib_logfile1 -rw-r----- 1 mysql mysql 12582912 Jun 20 14:02 ibtmp1

其中,ib_buffer_pool是5.7的新特性,暂时没有用到,两个redo日志,一个临时文件。

我们可以测试一下破坏的情况,同时和事务结合起来。

mysql> create database test; Query OK, 1 row affected (0.00 sec) mysql> use test Database changed mysql> create table test(id int); Query OK, 0 rows affected (0.01 sec)

手工开启一个事务,但是不提交。

mysql> start transaction; Query OK, 0 rows affected (0.00 sec) mysql> insert into test values(1000); Query OK, 1 row affected (0.01 sec)

这个时候没有commit,所以查看binlog里面目前是没有匹配记录的。

# mysqlbinlog -vv binlog.000001 |grep -i INSERT

而一旦提交之后,binlog里面就会包含进去。

SQL>commit # mysqlbinlog -vv binlog.000001 |grep -i -a5 INSERT BINLOG ' UZNjWRPhYAAAKwAAABIHAAAAANsAAAAAAAEABHRlc3QABHRlc3QAAQMAAQ== UZNjWR7hYAAAJAAAADYHAAAAANsAAAAAAAEAAgAB//7oAwAA '/*!*/; ### INSERT INTO `test`.`test` ### SET ### @1=1000 /* INT meta=0 nullable=1 is_null=0 */ # at 1846 #170710 22:47:11 server id 24801 end_log_pos 1873 Xid = 477 COMMIT/*!*/;

我们来验证一下这种破坏场景下的数据情况,插入一条记录,不提交,然后破坏文件,查看恢复的情况。

mysql> start transaction; Query OK, 0 rows affected (0.00 sec) mysql> insert into test values(2000); Query OK, 1 row affected (0.00 sec)

我们就把这些ib_字样的文件删除了。

查看mysqld的pid,发现测试环境中有大量的同类服务。

# pidof mysqld 30518 29944 29698 29401 15307 10659

所以我们换一个姿势。# netstat -nltp|grep mysqld|grep 24801 tcp 0 0 :::24801 :::* LISTEN 29401/mysqld

在系统目录下,按照规律会发现下面的文件。

# ll /proc/29401/fd|grep ib_*|grep delete lrwx------ 1 root root 64 Jul 10 22:49 10 -> /home/data/s1/ib_logfile1 (deleted) lrwx------ 1 root root 64 Jul 10 22:49 11 -> /home/data/s1/ibtmp1 (deleted) lrwx------ 1 root root 64 Jul 10 22:49 12 -> /tmp/ibHcflkp (deleted) lrwx------ 1 root root 64 Jul 10 22:49 4 -> /home/data/s1/ibdata1 (deleted) lrwx------ 1 root root 64 Jul 10 22:49 5 -> /tmp/ibq7lvQK (deleted) lrwx------ 1 root root 64 Jul 10 22:49 6 -> /tmp/ib59bGj5 (deleted) lrwx------ 1 root root 64 Jul 10 22:49 7 -> /tmp/ibYubRMp (deleted) lrwx------ 1 root root 64 Jul 10 22:49 8 -> /tmp/ib8LAUL4 (deleted) lrwx------ 1 root root 64 Jul 10 22:49 9 -> /home/data/s1/ib_logfile0 (deleted)

我们做两件事情,一件是给当前的环境上锁,然后进行文件的拷贝。

[root@grtest s1]# chown mysql:mysql xxxx [root@grtest s1]# mv 10 /home/data/s1/ib_logfile1 [root@grtest s1]# mv 11 /home/data/s1/ibtmp1 [root@grtest s1]# mv 9 /home/data/s1/ib_logfile0 [root@grtest s1]# mv 4 /home/data/s1/ibdata1

正常停库,启库。

这个时候验证数据就会发现,之前的那个事务已经做了回滚。

mysql> select *from test; +------+ | id | +------+ | 1000 | +------+ 1 row in set (0.01 sec)

所以这一点上,句柄层级的恢复和之前自己在oracle下的句柄恢复情况很类似。

本文分享自微信公众号 - 杨建荣的学习笔记(jianrong-notes),作者:r13笔记第20天

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-07-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Linux中的configure,make,make install到底在做些什么

    在Linux下经常要安装部署一些软件包或者工具,拿到安装包之后一看,简单,configure,make, make install即可搞定。 有时...

    jeanron100
  • 设计模式之工厂方法(r4笔记第89天)

    设计模式中,工厂方法模式的使用还是很频繁的,但是似乎在工作中没有留意或者重视。 在各大网站中对于工厂方法模式的例子一般都是举女娲造人的例子,我就不做重复工作了,...

    jeanron100
  • MySQL中如何得到权限信息

    最近在做一次MySQL数据迁移的时候,突然发现自己遗漏了一个地方,那就是权限信息没有导出,如果我们使用mysqldump --all-databases...

    jeanron100
  • 关于MySql报1130错误码解决方法

    晚上本地连接MySql报1130错误码! 1130 - Host '59.55.*.*' is not allowed to connect to this M...

    小柒吃地瓜
  • 9.深入k8s:调度器及其源码分析

    这次讲解的是k8s的调度器部分的代码,相对来说比较复杂,慢慢的梳理清楚逻辑花费了不少的时间,不过在梳理过程中也对k8s有了一个更深刻的理解。

    luozhiyun
  • 【开源】gnet: 一个轻量级且高性能的 Golang 网络库

    gnet 是一个基于 Event-Loop 事件驱动的高性能和轻量级网络库。这个库直接使用 epoll 和 kqueue 系统调用而非标准 Golang 网络包...

    潘少
  • FireFox下Canvas使用图像合成绘制SVG的Bug

    所有的事情都会有一个起因。 最近产品上需要做一个这样的功能:给一些图形进行染色处理。想想这还不是顺手拈来的事情,早就研究过图形染色的技术。于是我把之前写好的两种...

    用户3158888
  • FireFox下Canvas使用图像合成绘制SVG的Bug

    所有的事情都会有一个起因。 最近产品上需要做一个这样的功能:给一些图形进行染色处理。想想这还不是顺手拈来的事情,早就研究过图形染色的技术。于是我把之前写好的两种...

    用户3158888
  • 斯坦福CS224W 图与机器学习5】Spectral Clustering

    第五节主要介绍了谱聚类,也可用于上一节提到的社区划分,另外还扩展了基于motif的谱聚类,主要分成两个部分:

    Houye
  • Python基础知识3:re正则表达式

    正则表达式(或RE)是一种小型的、高度专业化的编程语言,内嵌在Python中,仅做字符的匹配。 1、字符类型: 普通字符和元字符; 1)普通字符:大多数的字符和...

    企鹅号小编

扫码关注云+社区

领取腾讯云代金券