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下的句柄恢复情况很类似。
- android自定义listview实现header悬浮框效果
- 关于TCP 半连接队列和全连接队列
- 使用LogParser分析日志
- T-SQL基础--TOP
- 自创数据集,用TensorFlow预测股票教程 !(附代码)
- 介绍几个好用的android自定义控件
- T-SQL—理解CTEs
- SQL 扩展事件
- ShapeDrawable做放大镜效果
- android放大镜效果实现
- Android StringEntity() 和 UrlEncodedFormEntity() 的区别
- 如何根据日志查看删除的数据(转译)
- 具体问题解决:分离脚本
- 独家 | 手把手教你用Python 3创建用于机器学习开发的Linux虚拟机(附安装教程、代码)
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- C++核心准则T.20:避免定义没有明确语义的“概念”
- 机器学习之独热编码(One-Hot)详解(代码解释)
- TypeScript 实战算法系列(四):实现集合和各种集合运算
- 不知道怎么封装代码?看看这几种设计模式吧!
- 百分浏览器快捷键
- 深度神经网络权值初始化的几种方式及为什么不能初始化为零(1)
- Python_doc.1
- (24)Bash预定义变量
- 数组:每次遇到二分法,都是一看就会,一写就废
- OSPF 路由协议配置
- 项目实战 | 细节决定成败的渗透测试
- 构建Rasa低成本的Docker开发部署环境
- JsonPath实践(五)
- 项目实战 | 细节决定成败的渗透测试
- 工具的使用 | CobaltStrike证书修改躲避流量审查