MySQL句柄恢复的简单尝试

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: 今天突然想起一个问题,那就是对于ibdata的恢复,如果我们简单模拟一下,就会发现还是蛮有意思的。 首先我们得到两个参数值,一个是刷脏页的指标,另外一个是数据文件的目录。

今天突然想起一个问题,那就是对于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里面就会包含进去。

commit
[root@grtest s1]#  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

正常停库,启库。

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


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
SQL 运维 关系型数据库
使用Binlog日志恢复误删的MySQL数据
今天文章的主题是如何使用Mysql内置的Binlog日志对误删的数据进行恢复,读完本文,你能够了解到: MySQL的binlog日志是什么?通常是用来干什么的? 模拟一次误删数据的操作,并且使用binlog日志恢复误删的数据。
898 1
|
存储 关系型数据库 MySQL
MySQL数据库系列(七)-------日志管理、备份与恢复
MySQL 的日志默认保存位置为/usr/local/mysql/data MySQL 的日志配置文件为 /etc/my.cnf,里面有个[mysqld]项。
187 0
MySQL数据库系列(七)-------日志管理、备份与恢复
|
存储 SQL 运维
大数据运维之MySQL备份及恢复
能够防止由于机械故障以及人为误操作带来的数据丢失,例如将数据库文件保存在了其它地方。 冗余: 数据有多份冗余,但不等备份,只能防止机械故障还来的数据丢失,例如主备模式、数据库集群。
286 0
大数据运维之MySQL备份及恢复
|
存储 SQL 安全
Mysql数据库的备份与恢复
Mysql数据库的备份与恢复
118 0
Mysql数据库的备份与恢复
|
关系型数据库 MySQL 数据库
MySQL数据库的备份与恢复(下)
一、数据备份的重要性 备份的主要目的是灾难恢复。 在生产环境中,数据的安全性至关重要。 任何数据的丢失都可能产生严重的后果。
154 0
|
安全 关系型数据库 MySQL
MySQL数据库的备份与恢复(中)
一、数据备份的重要性 备份的主要目的是灾难恢复。 在生产环境中,数据的安全性至关重要。 任何数据的丢失都可能产生严重的后果。
205 0
|
SQL 关系型数据库 MySQL
MySQL数据库的备份与恢复(上)
一、数据备份的重要性 备份的主要目的是灾难恢复。 在生产环境中,数据的安全性至关重要。 任何数据的丢失都可能产生严重的后果。
250 0
|
SQL 运维 关系型数据库
只有MYSQL数据目录如何挂载恢复
在使用云服务器的很多场景下,如遇一些linux系统级别问题,比如系统文件丢失,kernel panic等,无法正常在已有的主机系统上恢复系统启动,且也无之前系统正常时间创建的系统盘快照,需要通过初始化系统盘来恢复系统。 但是这样操作后系统可以恢复登录,但原有的系统盘内搭建的服务比如mysql等服务需要重新搭建,那么重新搭建的mysql如何指认原有的数据库目录,如何进行导出数据,本文将详细说明下操作恢复方法。
只有MYSQL数据目录如何挂载恢复
|
SQL 运维 关系型数据库
MySQL误删恢复方法2
实际工作中总会发生数据误删除的场景,在没有备份情况下,如何快速恢复误删数据就显得非常重要。 本文基于MySQL的binlog日志机制,当日志格式设置为“binlog_format=ROW”时,记录一步一步手动解析binlog、恢复误删数据的全过程,供大家参考使用。
143 0
|
SQL Oracle 关系型数据库
MySQL误删恢复方法1
MySQL不同于oracle,没有闪回查询这类概念,但网上流传几个闪回的开源工具如 binglog2sql、MyFlash,可以使用binglog日志进行误操作数据的恢复。
136 0