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里面就会包含进去。

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

正常停库,启库。

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

时间: 2024-07-31 23:36:38

MySQL句柄恢复的简单尝试的相关文章

MySQL 5.5复制升级到5.7的一点简单尝试

最近有个需求是升级MySQL 5.5到MySQL 5.7版本,为此我们想了一些方案,比如MySQL级联复制升级,这么考虑主要是基于版本的差异性,尽可能保持兼容. 还有逻辑备份恢复,物理备份恢复的方案,当然无论如何体现业务价值才能使得技术价值更有意义.所以我们希望通过升级版本来尽可能使得线上版本统一的同时,带给业务和DBA的几大福利就是online DDL,数据延迟降低,优化器的增强. 当然能不能升级也是拍脑袋想,原理上是可以的,但是实际上效果如何,没有验证心里还没有底.之前所做的比较多的是迁移式

MySQL断电恢复的一点简单分析

今天有个网友问我一个MySQL的恢复问题.提供的截图如下.    对于这个问题,在一些断电的场景下还是可能出现的.我首先是要确认是否为线上业务还是测试环境,线上业务来说这个影响还是很大的.如果数据库无法启动,首要任务还是把数据库启动,然后在这个基础上查看丢失的数据程度,安排数据修复的事宜.    当然从我的角度来说,怎么去快速复现这个问题呢.我用自己写的快速搭建测试主从环境的脚本(https://github.com/jeanron100/mysql_slaves,后期有一位大牛建议用Pytho

RDS中的MYSQL备份恢复

RDS使用mysqldump对 MySQL 数据库进行逻辑全量备份,使用开源软件Xtrabackup进行物理全量备份,是实例级别的备份. 用户登录RDS控制台,可以下载备份文件.按照 利用逻辑备份文件恢复到自建数据库-MySQL和利用物理备份文件恢复到自建数据库-MySQL中的操作步骤,实现数据的恢复. 本文主要从原理的角度来介绍MySQL数据库的备份和恢复,希望能让用户更加了解RDS的备份恢复机制.   一.备份类型介绍 1. 按备份操作方式:物理备份和逻辑备份 备份方式 优点 缺点 逻辑备份

php实现mysql备份恢复分卷处理的方法_php技巧

本文实例讲述了php实现mysql备份恢复分卷处理的方法.分享给大家供大家参考.具体分析如下: 分卷处理就是把握们要处理的数据分成一个个小文件进行处理了,这里我来给大家介绍一个php mysql备份恢复分卷处理类,实现mysql数据库分卷备份,选择表进行备份,实现单个sql文件及分卷sql导入. 分卷导入类及思路详解 数据库导入导出是一个后台必要拥有的功能,网上一搜,有很多关于数据库导入导出的,但基本上一个大的系统,包含了许多我们并不需要的,而且他们都是自己的后台的形式,我并不喜欢的是拿人家的东

php mysql备份恢复分卷处理(数据库导入导出)

分卷导入类及思路详解 数据库导入导出是一个后台必要拥有的功能,网上一搜,有很多关于数据库导入导出的,但基本上一个大的系统,包含了许多我们并不需要的,而且他们都是自己的后台的形式,我并不喜欢的是拿人家的东西整合到自己的后台,我需要的是自己东西.于是参照了很多,自己写了一个关于分卷导入类.以方便调用.欢迎大家拍砖. 这里针对分卷文件是以'_v1.sql'为结尾,实现单个sql文件及分卷sql导入,分卷导入可选择是否当前分卷导入余下分卷,我们只需要直接调用类即可完成 //分别是主机,用户名,密码,数据

mysql日志恢复数据方法介绍

mysql日志备份优缺点 优点:是想恢复到某个时间点,或某个操作sql语句 缺点:就产生庞大的日志文件 window中mysql日志恢复方法 1.开启mysql日志 在my.ini 文件里找到[mysqld],在其下面增加一行log-bin  代码如下 复制代码 [mysqld]  # The TCP/IP Port the MySQL Server will listen on  port=3306  log-bin  默认日志文件名字是以主机命名名字,如果想改为自己定义的名字  代码如下 复

mysql备份恢复中的常见错误

从A主机备份到B主机 mysqldump -uroot  -p vw>vw.sql 现备份数据库文件,需要恢复到目标机B,B的数据库版本为5.5.23,A机器的mysql版本为5.0.22 mysql>source /root/vw.sql; -------------------- Query OK, 6748 rows affected (0.13 sec) Records: 6748 Duplicates: 0 Warnings: 0 Query OK, 6807 rows affect

mysql主从复制(超简单)

mysql主从复制(超简单) 怎么安装mysql数据库,这里不说了,只说它的主从复制,步骤如下: 1.主从服务器分别作以下操作:1.1.版本一致1.2.初始化表,并在后台启动mysql1.3.修改root的密码 2.修改主服务器master: vi /etc/my.cnf [mysqld]log-bin=mysql-bin //[必须]启用二进制日志server-id=222 //[必须]服务器唯一ID,默认是1,一般取IP最后一段 3.修改从服务器slave: vi /etc/my.cnf [

MySQL中数据导入恢复的简单教程_Mysql

有两个简单的方法MySQL中的数据加载到MySQL数据库从先前备份的文件.LOAD DATA导入数据: MySQL提供了LOAD DATA语句,作为一个大容量数据加载.下面是一个例子声明中,读取一个文件dump.txt,,从当前目录加载到当前数据库中的表mytbl: mysql> LOAD DATA LOCAL INFILE 'dump.txt' INTO TABLE mytbl;     如果本地的关键字是不存在的,MySQL的外观使用绝对路径名寻找到完全指定位置的文件在服务器主机上的数据文件