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. 从MySQL全备文件中恢复单个库或者单个表

    从MySQL全备文件中恢复单个库或者单个表 提取建库语句 sed -n '/^-- Current Database: db_cms/,/^-- Current Database: `/p' back ...

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

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

随机推荐

  1. Zabbix Server 自带模板监控有密码MySQL数据库

    Zabbix Server 自带模板监控有密码MySQL数据库 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.  一.Zabbix-agent端的配置 1>.为数据库设置密码 ...

  2. nfs环境搭建报错clnt_create: RPC: Program not registered

    有时候搭建完成后,使用showmount -e ip检测服务端服务器情况的是,会出现clnt_create: RPC: Program not registered 这个错误,表示rpc程序为注册成功 ...

  3. 面向对象【林老师版】:面向过程vs面向对象(一)

    一.面向过程 1.引子 面向过程:核心是过程二字,过程指的是解决问题的步骤,设计一条流水线,机械式的思维方式优点:复杂的问题流程化,进而简单化缺点:可扩展性差 2.验证代码 import json i ...

  4. java io系列03之 ByteArrayOutputStream的简介,源码分析和示例(包括OutputStream)

    前面学习ByteArrayInputStream,了解了“输入流”.接下来,我们学习与ByteArrayInputStream相对应的输出流,即ByteArrayOutputStream.本章,我们会 ...

  5. Windows 运行库

    Microsoft Visual C++ 2005 Redistributable - 8.0.61001http://download.microsoft.com/download/8/B/4/8B ...

  6. Sqlserver中的储存过程

    一.什么是存储过程(Stored Procedure) 存储过程是一段存储在数据库的“子程序”,本质是一个可重复使用的SQL代码块,可以理解为数据库端的“方法”. 存储过程的好处: ①提高性能:由于数 ...

  7. inux进程/线程调度策略与 进程优先级

    目的: 系统性的认识linux的调度策略(SCHED_OTHER.SCHED_FIFO.SCHED_RR): 实时调度?分时调度? 混搭系统(实时任务+分时任务),怎样调度. linux的调度策略 l ...

  8. canvas加载图片需要二次刷新的问题

    如题:此问题我也经在百度问问上进行了解答.https://zhidao.baidu.com/question/1048045241465845579.html 好吧,难怪现在百度那么坑人,理论水军专家 ...

  9. spring MVC页面的重定向

    如图,一个jsp页面跳转到下一个jsp页面通常需要上一个页面发出带有参数得请求,我们都知道spring MVC是不能直接跳页面的. 需要配置视图解析器,通过返回视图名再跳转到相应得JSP页面. 即使这 ...

  10. HTTP Method小记

    HTTP 0.9 这个版本只有GET方法 HTTP 1.0 这个版本有GET HEAD POST这3个方法 HTTP 1.1 这个版本是当前版本,包含GET HEAD POST OPTIONS PUT ...