Mysql----阿里数据库(mysql)误删除后的数据恢复

注意:本案例适用于人为SQL语句造成的误操作或者没有主从复制等的热备情况宕机时的修复

思路:

  1. 利用全备的sql文件中记录的CHANGE MASTER语句,binlog文件及其位置点信息,找出binlog文件中增量的那部分
  2. 用mysqlbinlog 命令将上述的binlog 文件导出为sql文件,并剔除其中的drop语句
  3. 通过全备文件和增量binlog文件的导出sql文件,就可以恢复到完整的数据

详细模拟操作如下:

一. 创建数据库,表,插入模拟数据

开启 binlog日志功能
/etc/my.cnf文件里的[mysqld]区块添加:<code>log-bin=mysql-bin</code> 重启服务

use test;

CREATE TABLE IF NOT EXISTS recover_table(
    id mediumint unsigned NOT NULL AUTO_INCREMENT,
    name varchar(32) NOT NULL,  
    age int unsigned NOT NULL,
    PRIMARY KEY(id)
)ENGINE=innoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 COMMENT 'recover_table';


insert into recover_table values(null, 'tom', 20);
insert into recover_table values(null, 'jack', 22);
insert into recover_table values(null, 'rose', 23);
insert into recover_table values(null, 'json', 23);


mysql> select * from recover_table;
+----+------+-----+
| id | name | age |
+----+------+-----+
|  1 | tom  |  20 |
|  2 | jack |  22 |
|  3 | rose |  23 |
|  4 | json |  22 |
+----+------+-----+
4 rows in set (0.00 sec)

二. 进行全文件备份

参数说明:
-B:指定数据库
-F:刷新日志
-R:备份存储过程等
-x:锁表
--master-data:在备份语句里添加CHANGE MASTER语句以及binlog文件及位置点信息
test 为数据库名

[root@iZ95i72m2pc9 backup]# mysqldump -uroot -p -B -F -R -x --master-data=2 test|gzip >/test/backup/test_$(date +%F).sql.gz
Enter password: 

mysql> select * from recover_table;
+----+------+-----+
| id | name | age |
+----+------+-----+
|  1 | tom  |  20 |
|  2 | jack |  22 |
|  3 | rose |  23 |
|  4 | json |  22 |
+----+------+-----+
4 rows in set (0.00 sec)

三. 再插入模拟数据, 删除数据库

insert into recover_table values(null, 'sam', 25);
insert into recover_table values(null, 'jare', 26);

mysql> select * from recover_table;
+----+------+-----+
| id | name | age |
+----+------+-----+
|  1 | tom  |  20 |
|  2 | jack |  22 |
|  3 | rose |  23 |
|  4 | json |  22 |
|  5 | sam  |  25 |
|  6 | jare |  26 |
+----+------+-----+
6 rows in set (0.00 sec)

drop database test;

四. 查看全备之后新增的binlog文件

[root@iZ95i72m2pc9 backup]# ll
-rw-r--r-- 1 root root 936 Oct 17 10:40 test_2017-10-17.sql.gz

[root@iZ95i72m2pc9 backup]# gzip -d test_2017-10-17.sql.gz 
[root@iZ95i72m2pc9 backup]# ll
-rw-r--r-- 1 root root 2397 Oct 17 10:40 test_2017-10-17.sql

[root@iZ95i72m2pc9 backup]# grep CHANGE test_2017-10-17.sql 
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=120;

说明:mysql-bin.000002的120行,在该文件之前的binlog文件中的数据都已经包含在这个全备的sql文件中了(增量)

五. 查看并切换到mysql 数据存放目录, 转sql 格式

[root@iZ95i72m2pc9 backup]# ps -ef|grep mysql
root      4411  4376  0 10:13 pts/0    00:00:00 mysql -uroot -p
root      4458  4421  0 10:45 pts/1    00:00:00 grep mysql
root     13046     1  0 Apr12 ?        00:00:00 /bin/sh /alidata/server/mysql/bin/mysqld_safe --datadir=/alidata/server/mysql/data --pid-file=/alidata/server/mysql/data/iZ95i72m2pc9.pid
mysql    13347 13046  0 Apr12 ?        02:03:40 /alidata/server/mysql/bin/mysqld --basedir=/alidata/server/mysql --datadir=/alidata/server/mysql/data --plugin-dir=/alidata/server/mysql/lib/plugin --user=mysql --log-error=/alidata/log/mysql/error.log --pid-file=/alidata/server/mysql/data/iZ95i72m2pc9.pid --socket=/tmp/mysql.sock --port=3306
[root@iZ95i72m2pc9 backup]# cd /alidata/server/mysql/data

备份日志数据到指定目录,避免数据混乱的问题

[root@iZ95i72m2pc9 mysql]# cp ./data/mysql-bin.000004 /opt/backup/
[root@iZ95i72m2pc9 backup]# cd /opt/backup/
[root@iZ95i72m2pc9 backup]# ll
-rw-r----- 1 root root  743 Oct 17 10:52 mysql-bin.000004
-rw-r--r-- 1 root root 2397 Oct 17 10:40 test_2017-10-17.sql

转为sql 格式

[root@iZ95i72m2pc9 backup]# mysqlbinlog -d test mysql-bin.000004 >00004bin.sql

删除里面的drop 语句(或误操作的语句)

六. 开始恢复数据,先恢复备份文件,再恢复增加文件

[root@iZ95i72m2pc9 backup]# mysql -uroot -p < test_2017-10-17.sql 
Enter password: 

mysql> select * from recover_table;
+----+------+-----+
| id | name | age |
+----+------+-----+
|  1 | tom  |  20 |
|  2 | jack |  22 |
|  3 | rose |  23 |
|  4 | json |  22 |
+----+------+-----+
4 rows in set (0.00 sec)

[root@iZ95i72m2pc9 backup]# mysql -uroot -p < 00004bin.sql 
Enter password: 

mysql> select * from recover_table;
+----+------+-----+
| id | name | age |
+----+------+-----+
|  1 | tom  |  20 |
|  2 | jack |  22 |
|  3 | rose |  23 |
|  4 | json |  22 |
|  5 | sam  |  25 |
|  6 | jare |  26 |
+----+------+-----+
6 rows in set (0.00 sec)

总结:

  1. 恢复条件为mysql要开启binlog日志功能,并且要全备和增量的所有数据
  2. 恢复时建议对外停止更新,即禁止更新数据库
  3. 先恢复全量,然后把全备时刻点以后的增量日志,按顺序恢复成SQL文件,然后把文件中有问题的SQL语句删除(也可通过时间和位置点),再恢复到数据库
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容