不同的数据库有不同的恢复方式。
Oracle 11g之后有闪存回归机制,在一定的时间内可以从闪存中恢复数据。
MySQL数据库则在开启了binlog日志的情况下,可以通过binlog日志恢复被删除的数据。
通过数据库备份跟binlog日志记录,可能恢复原来的数据
恢复步骤
a)创建新的数据库 create database rollback_db;
b)将数据库备份倒入新创建的rollback_db中
c)找到数据库备份的最后时间点,并将mysqlbinlog中该时间点之后的命令 *** 作记录通过mysqlbinlog工具保存为sql命令文本
d)将sql命令文本倒入数据库,可能rollback_db就是需要恢复的db了
3mysqlbinlog介绍
binlog基本定义:二进制日志,也成为二进制日志,记录对数据发生或潜在发生更改的SQL语句,并以二进制的形式保存在磁盘中;
作用:MySQL的作用类似于Oracle的归档日志,可以用来查看数据库的变更历史(具体的时间点所有的SQL *** 作)、数据库增量备份和恢复(增量备份和基于时间点的恢复)、Mysql的复制(主主数据库的复制、主从数据库的复制)
二进制日志的信息:
文件位置:默认存放位置为数据库文件所在目录下
文件的命名方式: 名称为hostname-binxxxxx (重启mysql一次将会自动生成一个新的binlog)
状态的查看:mysql> show variables like '%log_bin%';
4利用bin_log恢复数据
a)最长用的就是回复指定数据端的数据了,可以直接恢复到数据库中: mysqlbinlog --start-date="2012-10-15 16:30:00" --stop-date="2012-10-15 17:00:00" mysql_bin000001 |mysql -uroot -p123456 亦可导出为sql文件,再导入至数据库中: mysqlbinlog --start-date="2012-10-15 16:30:00" --stop-date="2012-10-15 17:00:00" mysql_bin000001 >d:\1sql source d:\1sql b)指定开始\结束位置,从上面的查看产生的binary log我们可以知道某个log的开始到结束的位置,可以在恢复的过程中指定回复从A位置到B位置的log需要用下面两个参数来指定: --start-positon="50" //指定从50位置开始 --stop-postion="100"//指定到100位置结束
mysql binlog没有开启数据恢复
mysql 不小心误删了一个数据表的数据,通过delete,没有开启binlog,如何才可以恢复数据。MYI MYD文件还是原大小。
SQL code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
MariaDB [(none)]> show variables like '%bin%';
+-----------------------------------------+----------------------+
| Variable_name | Value |
+-----------------------------------------+----------------------+
| binlog_annotate_row_events | OFF |
| binlog_cache_size | 32768 |
| binlog_checksum | NONE |
| binlog_direct_non_transactional_updates | OFF |
| binlog_format | STATEMENT |
| binlog_optimize_thread_scheduling | ON |
| binlog_stmt_cache_size | 32768 |
| innodb_locks_unsafe_for_binlog | OFF |
| log_bin | OFF |
| log_bin_trust_function_creators | OFF |
| max_binlog_cache_size | 18446744073709547520 |
| max_binlog_size | 1073741824 |
| max_binlog_stmt_cache_size | 18446744073709547520 |
| sql_log_bin | ON |
| sync_binlog | 0 |
+-----------------------------------------+----------------------+
15 rows in set (000 sec)
如何恢复,数据库还未重启。
SQL code
1
2
3
4
5
6
7
8
9
10
11
[root@flxx dada002]# ll
total 512332
drwxr-xr-x 2 dada002 root 4096 Dec 22 23:10 bak
-rw-r----- 1 root root 13880 Mar 13 11:52 gk_info_infofrmbak
-rw-r----- 1 root root 485853324 Mar 13 11:51 gk_info_infoMYDbak
-rw-r----- 1 root root 9374720 Mar 13 11:51 gk_info_infoMYIbak
-rw-r----- 1 root root 18874368 Mar 13 12:02 ibdata1
-rw-r----- 1 root root 5242880 Mar 13 12:02 ib_logfile0
-rw-r----- 1 root root 5242880 Mar 13 12:02 ib_logfile1
drwxrwxrwx 2 dada002 root 12288 Mar 9 14:25 logs
drwxr-xr-x 16 dada002 root 4096 Mar 8 15:10 >
误删数据的几种 *** 作
如何事前预防误删数据?
误删行数据恢复
误删行数据恢复可以使用 Flashback工具 。
Flashback恢复数据的原理是通过修改binlog内容,拿回原库进行回放,前提是 binlog_format=row和binlog_row_image=FULL 。
在使用Flashback进行恢复的时候, 不建议在主库上进行 *** 作 ,比较安全的做法是恢复出一个备份,或者找一个从库作为临时库,在这个临时库上执行 *** 作,然后再将确认过的临时库的数据恢复到主库。
误删库/表
drop table或者truncate table误删数据表 无法通过Flashback工具恢复 ,因为binlog_format的格式即使是ROW模式,在binlog中记录的也只是一条drop table或者truncate语句,因此无法进行恢复。
此时恢复的方式需要 全量备份加增量日志的方式进行恢复 ,因此要求数据有定期的全量备份,并且实时备份binlog。
假如某人在中午12点误删除了一个库里的某张表,恢复数据的流程如下:
mysqlbinlog恢复数据慢的原因?
如何更快的恢复误删的表?
在用备份恢复出临时实例以后,将这个临时实例设置成线上备库的从库:
假设此时备库的binlog已经被删除,那么需要去binlog备份系统找到删掉的日志文件拷贝到日志目录下,假设文件名是master000001,打开日志目录下的binlog的index文件,在开头加入master000001,让备库重新识别此日志文件
延迟复制备库
以上恢复都具有时间不可控性,如果采用上述步骤进行恢复,建议开发成工具(甚至可以做自己的DBA自动化平台),并大量测试后进行使用,避免手动误 *** 作带来更大的问题。
一般的主备复制存在的问题是,假设主库上的表被删除,这个命令很快会被发给所有从库,进而导致从库的数据表也被一起误删除。
延迟复制备库 是可以持续保持与主库有N秒延迟的备库 。
假设这里N=3600,那么表示只要在1个小时以内发现了误删除,就可以的到备库上执行stop slave,再通过之前讲到的方法,跳过误 *** 作的命令(比如将误删除的GTID加到实例集合中),就可以恢复出需要的数据。
rm误删
只要你的集群是高可用,如果rm删除了某个节点(只要不是恶意删除所有节点),HA系统会自动开始工作,选出一个新的主库,从而保证集群工作。
看到一个这样的解决方式不知道能不能帮助你:
phpmyadmin的后台数据库是mysql,下面或许有用。
《mysql数据恢复工具-mysqlbinlog 使用说明》
要使用此功能,首先必须确保mysql配置文件“Myini”中的
[mysqld] log-bin=log_name #开启二进制日志(其中log_name自己定义)
开启的作用就是开启mysql的二进制日志,然后才可以使用mysqlbinlog工具恢复数据,
开启之后通过在mysql中运行:
SHOW BINLOG EVENTS
来确认二进制日志的开启情况
mysqlbinlog有两种方式来恢复数据:(Mysqldatalogexe在“MySql\bin\”目录下)
1通过指定时间:
Mysqldatalog> mysqlbinlog --start-date="2009-11-27 14:01:00" --stop-date="2009-11-27 14:59:59" log_name000001 > D:\01txt
2通过指定位置:
参数说明:
•–start-position=N 从二进制日志中第1个位置等于N参量时的事件开始读。
•–stop-position=N 从二进制日志中第1个位置等于和大于N参量时的事件起停止读。
Mysqldatalog> mysqlbinlog --start-position=123 --end-position=456 log_name000001 > D:\01txt
关于position的说明:position可以通过执行SHOW BINLOG EVENTS命令来查看 然后进入mysql中执行source 命令 mysql>source D:\01txt 恢复数据完成。
最后说明:mysqlbinlog工具虽然很强大,但是为保数据不丢失最好还是跟备份数据同步使用。这样恢复数据就可以仅从最后一次备份开始到事故发生时间。
个人现在备份数据库都是采用“多备份”的多云盘自动备份,在怎么误删除也可以找的回来,有个好工具还是需要的
创建临时数据库,把备份导入进去进行 恢复单独的数据库 ,
mysqlbinlog 有一个 --databases 参数可以指定解析出指定db相关的sql ,你可以更加这个sql来恢复数据。
能不能建立多个二进制日志文件,使每个数据库对应自己的二进制日志文件?
mysql 下 无此功能,mysqlbinlog 记录的是整个mysql 实例的变化记录,不能针对单独的db 记录日志。
希望可以帮到您,谢谢!
以上就是关于在sql里面把数据库删除了怎么恢复全部的内容,包括:在sql里面把数据库删除了怎么恢复、excle中怎么将log值变回原来的数据库、mysql binlog没有开启数据怎么恢复等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)