MySQL 中drop 等高危误操作后恢复方法

实验目的:

  • 本次实验以恢复drop操作为例,使用不同方法进行误操作的数据恢复.

方法:

2.本实验的前置条件:

  • 在drop前至少有一次全量备份
  • 从全备到drop操作时间点有全程binlog,并且binlog format='row'
    如果没有以上两个备份怎么办?见《无备份的误操作恢复方法》

3.模拟误操作

root@localhost [wenyz]>select count(*) from t2;
+----------+
| count(*) |
+----------+
| 163818 |
+----------+
1 row in set (0.12 sec) root@localhost [wenyz]>drop table t2;
Query OK, 0 rows affected (0.02 sec) root@localhost [wenyz]>show master status;
+------------------+-----------+--------------+------------------+------------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+-----------+--------------+------------------+------------------------------------------------+
| mysql-bin.000020 | 136445791 | | | 9e912d2b-92f6-11e8-9747-0050568be82c:1-9872111 |
+------------------+-----------+--------------+------------------+------------------------------------------------+
1 row in set (0.00 sec) root@localhost [wenyz]>flush logs;
Query OK, 0 rows affected (1.41 sec)

4.在实验不同方法之前先完成以下步骤:

  • 复制全备份和所有binlog文件到空闲服务器:db212上
  • 以全备恢复到一个临时新实例.

5.找到误操作的位置(GTID或binlog pos)


通过查找怀疑的binlog:
[root@db210_19:11:07 /data/57mysql/mysql3506/logs]
#ll
total 75564544
-rw-r----- 1 mysql mysql 177 Jul 29 14:14 mysql-bin.000001
...
-rw-r----- 1 mysql mysql 39336996 Jul 29 19:12 mysql-bin.000020
-rw-r----- 1 mysql mysql 13340 Jul 29 19:12 mysql-bin.index
[root@db210_19:12:48 /data/57mysql/mysql3506/logs] binlog文件导出命令:
#mysqlbinlog -v --base64-output=auto /data/57mysql/mysql3506/logs/mysql-bin.000020 >/data/backup/20.sql
binlog文件导出后查找:DROP TABLE `t2`: 在mysql-bin.000020中找到对应位置:
# at 97871478
#180731 19:33:29 server id 1853506 end_log_pos 97871543 CRC32 0x8cd4354d GTID last_committed=205567 sequence_number=205570 rbr_only=no original_committed_timestamp=0 immediate_commit_timestamp=0 transaction_length=0
# original_commit_timestamp=0 (1970-01-01 08:00:00.000000 CST)
# immediate_commit_timestamp=0 (1970-01-01 08:00:00.000000 CST)
/*!80001 SET @@session.original_commit_timestamp=0*//*!*/;
SET @@SESSION.GTID_NEXT= '9e912d2b-92f6-11e8-9747-0050568be82c:9791090'/*!*/;
# at 97871543
#180731 19:33:29 server id 1853506 end_log_pos 97871660 CRC32 0x974a86d8 Query thread_id=35 exec_time=0 error_code=0
use `wenyz`/*!*/;
SET TIMESTAMP=1533036809/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/;
DROP TABLE `t2` /* generated by server */
/*!*/;
# at 97871660
#180731 19:33:29 server id 1853506 end_log_pos 97871725 CRC32 0xb85257d6 GTID last_committed=205567 sequence_number=205571 rbr_only=yes original_committed_timestamp=0 immediate_commit_timestamp=0 transaction_length=0
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
# original_commit_timestamp=0 (1970-01-01 08:00:00.000000 CST)
# immediate_commit_timestamp=0 (1970-01-01 08:00:00.000000 CST)
/*!80001 SET @@session.original_commit_timestamp=0*//*!*/;
SET @@SESSION.GTID_NEXT= '9e912d2b-92f6-11e8-9747-0050568be82c:9791091'/*!*/;
# at 97871725

方法三:利用binlog直接改名为realy-log直接回放SQL到指定点:

  • 恢复全备到临时实例中(略),并在关闭状态下。
root@localhost [(none)]>shutdown;
Query OK, 0 rows affected (0.00 sec)
[1]- Done /usr/local/mysql57/bin/mysqld --defaults-file=/data/57mysql/mysql3506/my3506.cnf
[root@db211_16:40:49 /data/57mysql/mysql3506/logs]
  • 复制备份binlog文件,将文件重命名为relay-bin.0000*格式,并制作relay-bin.index
#cd data/
[root@db211_16:40:58 /data/57mysql/mysql3506/data]
#ll
total 409652
-rw-r----- 1 mysql mysql 56 Aug 1 16:36 auto.cnf
-rw-r----- 1 mysql mysql 8585 Aug 1 16:40 error.log
-rw-r----- 1 mysql mysql 364 Aug 1 16:40 ib_buffer_pool
-rw-r----- 1 mysql mysql 104857600 Aug 1 16:40 ibdata1
-rw-r----- 1 mysql mysql 104857600 Aug 1 16:40 ib_logfile0
-rw-r----- 1 mysql mysql 104857600 Aug 1 16:36 ib_logfile1
-rw-r----- 1 mysql mysql 104857600 Aug 1 16:36 ib_logfile2
drwxr-x--- 2 mysql mysql 4096 Aug 1 16:36 mysql
drwxr-x--- 2 mysql mysql 8192 Aug 1 16:36 performance_schema
-rw-r----- 1 mysql mysql 380 Aug 1 16:38 slow.log
drwxr-x--- 2 mysql mysql 8192 Aug 1 16:36 sys
[root@db211_16:40:59 /data/57mysql/mysql3506/data]
#cp /data/backup/3506binlogs/* .
[root@db211_16:41:30 /data/57mysql/mysql3506/data]
#rename mysql-bin relay-bin mysql-bin.0000* //重命名成relay-bin.0000*
[root@db211_16:45:50 /data/57mysql/mysql3506/data]
#ll
total 3283784
-rw-r----- 1 mysql mysql 56 Aug 1 16:36 auto.cnf
-rw-r----- 1 mysql mysql 8585 Aug 1 16:40 error.log
-rw-r----- 1 mysql mysql 364 Aug 1 16:40 ib_buffer_pool
-rw-r----- 1 mysql mysql 104857600 Aug 1 16:40 ibdata1
-rw-r----- 1 mysql mysql 104857600 Aug 1 16:40 ib_logfile0
-rw-r----- 1 mysql mysql 104857600 Aug 1 16:36 ib_logfile1
-rw-r----- 1 mysql mysql 104857600 Aug 1 16:36 ib_logfile2
drwxr-x--- 2 mysql mysql 4096 Aug 1 16:36 mysql
drwxr-x--- 2 mysql mysql 8192 Aug 1 16:36 performance_schema
-rw-r----- 1 root root 268435555 Aug 1 16:41 relay-bin.000010
-rw-r----- 1 root root 268442595 Aug 1 16:41 relay-bin.000011
-rw-r----- 1 root root 268442419 Aug 1 16:41 relay-bin.000012
-rw-r----- 1 root root 268437857 Aug 1 16:41 relay-bin.000013
-rw-r----- 1 root root 268438414 Aug 1 16:41 relay-bin.000014
-rw-r----- 1 root root 268437131 Aug 1 16:41 relay-bin.000015
-rw-r----- 1 root root 268436889 Aug 1 16:41 relay-bin.000016
-rw-r----- 1 root root 268437011 Aug 1 16:41 relay-bin.000017
-rw-r----- 1 root root 268441823 Aug 1 16:41 relay-bin.000018
-rw-r----- 1 root root 268439288 Aug 1 16:41 relay-bin.000019
-rw-r----- 1 root root 258700685 Aug 1 16:41 relay-bin.000020
-rw-r----- 1 mysql mysql 380 Aug 1 16:38 slow.log
drwxr-x--- 2 mysql mysql 8192 Aug 1 16:36 sys
[root@db211_16:45:52 /data/57mysql/mysql3506/data]
#ls ./relay-bin.0000*>relay-bin.index //create relay-bin.index
[root@db211_16:46:24 /data/57mysql/mysql3506/data]
#cat relay-bin.index
./relay-bin.000010
./relay-bin.000011
./relay-bin.000012
./relay-bin.000013
./relay-bin.000014
./relay-bin.000015
./relay-bin.000016
./relay-bin.000017
./relay-bin.000018
./relay-bin.000019
./relay-bin.000020
[root@db211_16:46:31 /data/57mysql/mysql3506/data]
#chown mysql:mysql relay-bin.* //修改relay-bin权限为mysql:mysql
[root@db211_16:47:10 /data/57mysql/mysql3506/data]
#ll
total 3283788
-rw-r----- 1 mysql mysql 56 Aug 1 16:36 auto.cnf
-rw-r----- 1 mysql mysql 8585 Aug 1 16:40 error.log
-rw-r----- 1 mysql mysql 364 Aug 1 16:40 ib_buffer_pool
-rw-r----- 1 mysql mysql 104857600 Aug 1 16:40 ibdata1
-rw-r----- 1 mysql mysql 104857600 Aug 1 16:40 ib_logfile0
-rw-r----- 1 mysql mysql 104857600 Aug 1 16:36 ib_logfile1
-rw-r----- 1 mysql mysql 104857600 Aug 1 16:36 ib_logfile2
drwxr-x--- 2 mysql mysql 4096 Aug 1 16:36 mysql
drwxr-x--- 2 mysql mysql 8192 Aug 1 16:36 performance_schema
-rw-r----- 1 mysql mysql 268435555 Aug 1 16:41 relay-bin.000010
-rw-r----- 1 mysql mysql 268442595 Aug 1 16:41 relay-bin.000011
-rw-r----- 1 mysql mysql 268442419 Aug 1 16:41 relay-bin.000012
-rw-r----- 1 mysql mysql 268437857 Aug 1 16:41 relay-bin.000013
-rw-r----- 1 mysql mysql 268438414 Aug 1 16:41 relay-bin.000014
-rw-r----- 1 mysql mysql 268437131 Aug 1 16:41 relay-bin.000015
-rw-r----- 1 mysql mysql 268436889 Aug 1 16:41 relay-bin.000016
-rw-r----- 1 mysql mysql 268437011 Aug 1 16:41 relay-bin.000017
-rw-r----- 1 mysql mysql 268441823 Aug 1 16:41 relay-bin.000018
-rw-r----- 1 mysql mysql 268439288 Aug 1 16:41 relay-bin.000019
-rw-r----- 1 mysql mysql 258700685 Aug 1 16:41 relay-bin.000020
-rw-r--r-- 1 mysql mysql 209 Aug 1 16:46 relay-bin.index
-rw-r----- 1 mysql mysql 380 Aug 1 16:38 slow.log
drwxr-x--- 2 mysql mysql 8192 Aug 1 16:36 sys
[root@db211_16:47:13 /data/57mysql/mysql3506/data]
  • 如果relay-bin的目录中有relay-log.info文件,一定得删掉该文件.

  • 启动mysqld 设置相关参数

[root@db210_00:29:29 /data/57mysql/mysql3507/logs]
#/usr/local/mysql57/bin/mysqld --defaults-file=/data/57mysql/mysql3507/my3506.cnf&
[2] 19942
[root@db210_00:29:35 /data/57mysql/mysql3507/logs]
#mysql -S /tmp/mysql3507.sock -pxxxx
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.23-log MySQL Community Server (GPL) Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
root@localhost [(none)]>reset master;
root@localhost [(none)]>change master to relay_log_file='relay-bin.000014',relay_log_pos=251246776,master_host='xxx';
root@localhost [(none)]>start slave sql_thread until sql_before_gtids='9e912d2b-92f6-11e8-9747-0050568be82c:9791090';
  • 等待sql_thread 停在9791089时就可以查看恢复数据了.
root@localhost [(none)]>show slave status\G;
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: xxx
Master_User:
Master_Port: 3306
Connect_Retry: 60
Master_Log_File:
Read_Master_Log_Pos: 4
Relay_Log_File: relay-bin.000020
Relay_Log_Pos: 97871478
Relay_Master_Log_File: mysql-bin.000020
Slave_IO_Running: No
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 97871478
Relay_Log_Space: 258700839
Until_Condition: SQL_BEFORE_GTIDS
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 0
Master_UUID:
Master_Info_File: /data/57mysql/mysql3506/data/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State:
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set: 9e912d2b-92f6-11e8-9747-0050568be82c:1-9791089
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec) ERROR:
No query specified root@localhost [(none)]>
root@localhost [(none)]>select count(*) from wenyz.t2;
+----------+
| count(*) |
+----------+
| 163818 |
+----------+
1 row in set (0.11 sec) root@localhost [(none)]>
  • 至此数据已经回来了.导入master的工作就不在重复,参照方法一中.

转自

通过全备+relaylog同步恢复被drop的库或表 - 2森林 - 博客园 https://www.cnblogs.com/2woods/p/9394646.html

通过全备+relaylog同步恢复被drop的库或表【转】的更多相关文章

  1. 通过全备+relaylog同步恢复被drop的库或表

    MySQL 中drop 等高危误操作后恢复方法 实验目的: 本次实验以恢复drop操作为例,使用不同方法进行误操作的数据恢复. 方法: 利用master同步 伪master+Binlog+同步 利用b ...

  2. 通过全备+主从同步恢复被drop的库或表

    MySQL 中drop 等高危误操作后恢复方法 实验目的: 本次实验以恢复drop操作为例,使用不同方法进行误操作的数据恢复. 方法: 利用master同步(本文)] 伪master+Binlog+同 ...

  3. 通过全备+binlog_server同步恢复被drop的库或表

    MySQL 中drop 等高危误操作后恢复方法 实验目的: 本次实验以恢复drop操作为例,使用不同方法进行误操作的数据恢复. 方法: 利用master同步 :伪master+Binlog+同步(本文 ...

  4. mysql如何从全备文件中恢复单个库或者单个表

    mysql如何从全备文件中恢复单个库或者单个表 在mysql dba的日常实际工作中,一个实例下有多个库,而我们常见的备份就是全库备份.那么问题就来了,如果需要恢复单个库或者单个表,怎么办了,网上有很 ...

  5. MySQL没有备份怎么恢复被drop的表(利用undrop-for-innodb)

    介绍:     也许大家都难以理解,这么重要的数据为啥不备份(或者备份不可用)?而且还任性的drop table了.显然有备份是最好的,但是它们并不总是可用的.这种情况令人恐惧,但并非毫无希望.在许多 ...

  6. 没有备份怎么恢复被drop的表(利用undrop-for-innodb)

    介绍:     也许大家都难以理解,这么重要的数据为啥不备份(或者备份不可用)?而且还任性的drop table了.显然有备份是最好的,但是它们并不总是可用的.这种情况令人恐惧,但并非毫无希望.在许多 ...

  7. 使用全备+binlog日志恢复数据库

    1.binlog日志类型 Statement 只记录执行的sql语句,磁盘占用少,但是恢复的时候容易出问题.InodeDB不能使用Statement . Row 记录修改后的具体数据,磁盘占用较多 M ...

  8. 如何恢复oracle中已删除的表

    在9i中Oracle引入了flashback的概念,可以将数据返回到某个时间点,但对于诸如drop/truncate等DDL语句却尚不支持.进入Oracle10g,这一缺陷得到了弥补.可以将丢失掉的表 ...

  9. SQL基本操作——DROP撤销索引、表以及数据库

    DROP撤销索引.表以及数据库 --DROP INDEX 命令删除表格中的索引 DROP INDEX table_name.index_name --DROP TABLE 语句删除表(表的结构.属性以 ...

随机推荐

  1. SecureCRT在远程主机和本地之间传输文件

    概述 Linux系统不像Window系统有清晰的操作页面,数据能Copy下来,远程Linux的数据,就牵扯到本地数据与远程服务器数据交换的问题.Linux远程攻击SecureCrt提供了2种方式,可以 ...

  2. 读《高性能javascript》笔记(一)

    第一章加载与执行:1,js脚本会阻塞页面渲染,<script>尽可能放到<body>标签的底部2, 合并脚本,页面中的<script>标签越少:HTTP请求带来的额 ...

  3. iOS 底层框架的浅析

    1.简介 IOS是由苹果公司为iPhone.iPod touch和iPad等设备开发的操作系统. 2.知识点 iPhone OS(现在叫iOS)是iPhone, iPod touch 和 iPad 设 ...

  4. Java特性-动态代理

    代理在开发中无处不在: 我们完成一个接口开发A,接口下有很多个实现类,这些类有些共同要处理的部分,比如每一个类都定义了接口A中的方法getXX(String name).我现在想把每次调用某个实现类的 ...

  5. discuz /faq.php SQL Injection Vul

    catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 . 通过获取管理员密码 . 对管理员密码进行破解.通过在cmd5.com ...

  6. java:异常处理

    异常:编译正常,但运行出错,会中断正常指令流 RuntimeException:运行时异常 分为:uncheck exception.和check exception(除了RuntimeExcepti ...

  7. html5学习笔记——2016/4

    HTML5新增的结构元素: section     article     aside     header     hgroup     footer     nav     figure HTML ...

  8. 实现自己的脚本语言ngscript之四:代码生成

    最近的进度 ngscript测试代码 function c1(a, b, c, d) { this.a = 1; this.b = new array(); this.b[0] = 1; this.b ...

  9. SpringMvc MultipartFile 图片文件上传

    spring-servlet.xml <!-- SpringMVC上传文件时,需要配置MultipartResolver处理器 --> <bean id="multipar ...

  10. wow.js让css3动画变动更有趣(滚动页面动画模拟懒加载特效)

    CSS3的出现给网站页面增加了活力,网站增色不少,有这么小小的一款插件就能做出很多动画效果. 最重要的是它:简单易用.轻量级.无需 jQuery......他就是wow.js 地址:https://d ...