数据库管理是企业信息化建设中重要的组成部分,MySQL作为一种常用的关系型数据库管理系统,由于其操作简单、性能稳定等优点,在各种实际应用场合中受到广泛的使用。不过,就算是更好的数据库管理者也难免会在操作中不小心删除了一些重要的数据,这时候怎么办呢?本文就为大家介绍在MySQL中如何找回误删的数据。
一、误删数据的原因和影响
在操作MySQL数据库时,误删数据的原因主要有以下几点:
1.误操作:在数据操作中,如果手误或者操作流程不当,就很容易将需要的数据误删。
2.程序错误:由于MySQL是开源的,所以很容易在程序开发过程中出现错误,数据因该方面的错误被误删。
3.Hacker攻击:MySQL服务器可能遭受黑客攻击,导致数据丢失。
误删数据会对企业数据的完整性造成直接影响,因为误删的数据可能是企业非常重要的数据,一旦丢失,企业的正常运营和决策都会受到影响。
二、误删数据后的备份
MySQL支持多种备份方式,包括完全备份、增量备份以及点备份等,因此,在企业使用MySQL数据库时,一定要重视备份操作,以防止误删数据后无法恢复的情况。
在进行完整备份或增量备份操作时,更好使用压缩技术,以便节约存储空间。此外,企业还可以选择将备份数据存储在远程硬件设备或云端存储中,以保障数据安全。
三、使用MySQL内置的工具恢复误删数据
MySQL提供了多种数据恢复方式,如数据回滚、日志文件恢复等。下面将介绍几种简单易行的数据恢复方法。
1.使用MySQL的恢复工具innodb_ruby
innodb_ruby是MySQL提供的一个数据恢复工具,它通过读取指定文件中的二进制日志,将一系列操作转换成SQL语句,从而来恢复误删的数据。从命令行中启动innodb_ruby程序即可。innodb_ruby需要指定恢复数据的时间点及表名等,具体操作步骤如下:
1.打开一个终端窗口并以管理员身份登录MySQL服务器。
2.在终端窗口中输入以下命令,启动innodb_ruby程序:
innodb_ruby
3.按下Ctrl+C组合键,退出innodb_ruby程序。
4.进入MySQL命令行环境,输入以下命令,查看需要恢复的库和表的信息:
SHOW DATABASES;
USE DATABASE_NAME;
SHOW TABLES;
5.在innodb_ruby启动后输出的日志信息中,找到删掉行的 ID 和类型。
6.在 MySQL 中执行 innodb_ruby 生成的语句恢复数据。
2.使用MySQL的binlog恢复误删数据
binlog是MySQL提供的日志文件,记录了数据库中的所有操作。可以使用binlog来恢复误删的数据。binlog的恢复方式需要经过以下步骤:
1.进入MySQL命令行环境中,输入如下命令,查找要恢复的数据库和表的名称和误删的时间点。可以使用SHOW TABLE和SHOW BINLOG EVENTS命令来实现。
2.使用mysqlbinlog工具读取binlog文件生成SQL脚本。
3.创建恢复表。
4.将binlog文件中误删除的记录插入新创建的恢复表。
5.使用SELECT语句确保插入正确的记录。
四、预防误删数据的方法
数据备份和数据恢复是在误删数据后的救援方法,对于企业来说,更重要的是如何预防误删数据的发生。下面介绍几种预防误删数据的方法。
1.开启MySQL的交易日志功能,记录操作日志,以便在误删数据后可以更好的恢复数据。
2.在进行重要的操作时,进行业务和操作草图的验证,核对计划,确保操作正确性。
3.对于非常重要的数据,要进行多种备份,以防数据遗失。
4.设置权限和用户账户,以便限制用户对数据的操作。
5.定期对数据库进行维护,避免数据库出现严重问题。
本文主要介绍了在MySQL中找回误删数据的方法,包括使用MySQL内置的工具进行恢复,以及如何预防误删除数据的发生。企业在使用MySQL数据库时,应该时刻准备进行数据库备份,定期进行维护和升级,以确保数据库的正常运营。
相关问题拓展阅读:
- mysql 数据被删除能恢复吗
mysql 数据被删除能恢复吗
1 找个别的机器安装个同版本的mysql或从已安装同版本的其他机器上(非同版本的也可以试下):
拷贝 mysql/data/mysql 目录到你的mysql/data/ 下吧
2 试着启动mysql服务,如果能启动了,理论上应该丢失的只有用户、授权等一些系统掘槐信息,不影响你的使用的数据;
如果不能启动,看错误日志,争取启动了。
3 赶紧把数据备份一份出来,重新把判渗友所有喊兄库(只是你后来创建的业务相关的库,不包括mysql库)都删了,重新导入一遍。理论上不这样也可以,但只是非生产重要的环境下。
4 重新做用户授权。
每个 DBA 是不是粗皮都有过删库的经历?删库了没有备份怎么办?备份恢复后无法启动服务什么情况?表定义损坏数据无法读取怎么办?逗凳液
我曾遇到某初创互联网企业,因维护人员不规范的备份恢复操作,导致系统表空间文件被初始化,上万张表无法读取,花了数小时才抢救回来。
当你发现数据无法读取时,也许并非数据丢失了,可能是 DBMS 找不到描述数据的信息。
背景
先来了解下几张关键的 InnoDB 数据字典表,它们保存了部分表定义信息,在我们恢复表结构时需要用到。
SYS_TABLES 描述 InnoDB 表信息CREATE TABLE `SYS_TABLES` (`NAME` varchar(255) NOT NULL DEFAULT ”, 表名`ID` bigint(20) unsigned NOT NULL DEFAULT ‘0’, 表id`N_COLS` int(10) DEFAULT NULL,`TYPE` int(10) unsigned DEFAULT NULL,`MIX_ID` bigint(20) unsigned DEFAULT NULL,`MIX_LEN` int(10) unsigned DEFAULT NULL,`CLUSTER_NAME` varchar(255) DEFAULT NULL,`SPACE` int(10) unsigned DEFAULT NULL, 表空间idPRIMARY KEY (`NAME`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;SYS_INDEXES 描述 InnoDB 索引信息CREATE TABLE `SYS_INDEXES` ( `TABLE_ID` bigint(20) unsigned NOT NULL DEFAULT ‘0’, 与sys_tables的id对应山物 `ID` bigint(20) unsigned NOT NULL DEFAULT ‘0’, 索引id `NAME` varchar(120) DEFAULT NULL,索引名称 `N_FIELDS` int(10) unsigned DEFAULT NULL, 索引包含字段的个数 `TYPE` int(10) unsigned DEFAULT NULL, `SPACE` int(10) unsigned DEFAULT NULL, 存储索引的表空间id `PAGE_NO` int(10) unsigned DEFAULT NULL, 索引的root page id PRIMARY KEY (`TABLE_ID`,`ID`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;SYS_COLUMNS 描述 InnoDB 表的字段信息CREATE TABLE `SYS_COLUMNS` ( `TABLE_ID` bigint(20) unsigned NOT NULL, 与sys_tables的id对应 `POS` int(10) unsigned NOT NULL, 字段相对位置 `NAME` varchar(255) DEFAULT NULL, 字段名称 `MTYPE` int(10) unsigned DEFAULT NULL, 字段编码 `PRTYPE` int(10) unsigned DEFAULT NULL, 字段校验类型 `LEN` int(10) unsigned DEFAULT NULL, 字段字节长度 `PREC` int(10) unsigned DEFAULT NULL, 字段精度 PRIMARY KEY (`TABLE_ID`,`POS`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;SYS_FIELDS 描述全部索引的字段列CREATE TABLE `SYS_FIELDS` ( `INDEX_ID` bigint(20) unsigned NOT NULL, `POS` int(10) unsigned NOT NULL, `COL_NAME` varchar(255) DEFAULT NULL, PRIMARY KEY (`INDEX_ID`,`POS`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;./storage/innobase/include/dict0boot.h 文件定义了每个字典表的 index id,对应 id 的 page 中存储着字典表的数据。
这里我们需要借助 undrop-for-innodb 工具恢复数据,它能读取表空间信息得到 page,将数据从 page 中提取出来。
# wget yum install -y gcc flex bison# make# make sys_parser
# ./sys_parser 读取表结构信息
sys_parser databases/table
stream_parser 读取 InnoDB page 从 ibdata1 或 ibd 或分区表
# ./stream_parserYou must specify file with -f optionUsage: ./stream_parser -f Where: -hPrint this help -V or -g – Print debug information -s size – Amount of memory used for disk cache (allowed examples 1G 10M). Default 100M -Tretrieves only pages with index id = NM (N – high word, M – low word of id) -t size – Size of InnoDB tablespace to scan. Use it only if the parser can’t determine it by himself.
c_parser 从 innodb page 中读取记录保存到文件
# ./c_parserError: Usage: ./c_parser -4|-5|-6 -f -t table.sql Where -f — InnoDB page or directory with pages(all pages should have same index_id) -t — CREATE statement of a table -o — Save dump in this file. Otherwise print to stdout -l — Save SQL statements in this file. Otherwise print to stderr -h — Print this help -d — Process only those pages which potentially could have deleted records (default = NO) -D — Recover deleted rows only (default = NO) -U — Recover UNdeleted rows only (default = YES) -V — Verbose mode (lots of debug information)innodb_datafile is in REDUNDANT formatinnodb_datafile is in COMPACT formatinnodb_datafile is in MySQL 5.6 format -T — retrieves only pages with index id = NM (N – high word, M – low word of id) -b — Directory where external pages can be found. Usually it is pages-XXX/FIL_PAGE_TYPE_BLOB/ -i — Read external pages at their offsets from . -p prefix — Use prefix for a directory name in LOAD DATA INFILE command
接下来,我们演示场景的几种数据恢复场景。
场景1:drop table
是否启用了 innodb_file_per_table 其恢复方法有所差异,当发生误删表时,应尽快停止MySQL服务,不要启动。若 innodb_file_per_table=ON,更好只读方式重新挂载文件系统,防止其他进程写入数据覆盖之前块设备的数据。
如果评估记录是否被覆盖,可以表中某些记录的作为关键字看是否能从 ibdata1 中筛选出。
# grep WOODYHOFFMAN ibdata1
Binary file ibdata1 matches
也可以使用 bvi(适用于较小文件)或 hexdump -C(适用于较大文件)工具
以表 sakila.actor 为例CREATE TABLE `actor` (`actor_id` allint(5) unsigned NOT NULL AUTO_INCREMENT,`first_name` varchar(45) NOT NULL,`last_name` varchar(45) NOT NULL,`last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (`actor_id`),KEY `idx_actor_last_name` (`last_name`)) ENGINE=InnoDB AUTO_INCREMENT=201 DEFAULT CHARSET=utf8
首先恢复表结构信息1. 解析系统表空间获取 page 信息
./stream_parser -f /var/lib/mysql/ibdata1
2. 新建一个 schema,把系统字典表的 DDL 导入
cat dictionary/SYS_* | mysql recovered
3. 创建恢复目录
mkdir -p dumps/default
4. 解析系统表空间包含的字典表信息,
./c_parser -4f pages-ibdata1/FIL_PAGE_INDEX/01.page -t dictionary/SYS_TABLES.sql > dumps/default/SYS_TABLES 2> dumps/default/SYS_TABLES.sql./c_parser -4f pages-ibdata1/FIL_PAGE_INDEX/02.page -t dictionary/SYS_COLUMNS.sql > dumps/default/SYS_COLUMNS 2> dumps/default/SYS_COLUMNS.sql./c_parser -4f pages-ibdata1/FIL_PAGE_INDEX/03.page -t dictionary/SYS_INDEXES.sql > dumps/default/SYS_INDEXES 2> dumps/default/SYS_INDEXES.sql./c_parser -4f pages-ibdata1/FIL_PAGE_INDEX/04.page -t dictionary/SYS_FIELDS.sql > dumps/default/SYS_FIELDS 2> dumps/default/SYS_FIELDS.sql
5. 导入恢复的数据字典
cat dumps/default/*.sql | mysql recovered
6. 读取恢复后的表结构信息
./sys_parser -pmsandbox -d recovered sakila/actor
由于 5.x 版本 innodb 引擎并非完整记录表结构信息,会丢失 AUTO_INCREMENT 属性、二级索引和外键约束, DECIMAL 精度等信息。
若是 mysql 5.5 版本 frm 文件被从系统删除,在原目录下 touch 与原表名相同的 frm 文件,还能读取表结构信息和数据。若只有 frm 文件,想要获得表结构信息,可使用 mysqlfrm –diagnostic /path/to/xxx.frm,连接 mysql 会显示字符集信息。
innodb_file_per_table=OFF
因为是共享表空间模式,数据页都存储在 ibdata1,可以从 ibdata1 文件中提取数据。
1. 获取表的 table id,sys_table 存有表的 table id,sys_table 表 index id 是1,所以从01.page 获取表 id./c_parser -4Df pages-ibdata1/FIL_PAGE_INDEX/01.page -t dictionary/SYS_TABLES.sql | grep sakila/actorB28 2AD4D SYS_TABLES “sakila/actor” 0 “”B28 2AD4D SYS_TABLES “sakila/actor” 0 “” 0
2. 利用 table id 获取表的主键 id,sys_indexes 存有表索引信息,innodb 索引组织表,找到主键 id 即找到数据,sys_indexes 的 index id 是3,所以从03.page 获取主键 id
./c_parser -4Df pages-ibdata1/FIL_PAGE_INDEX/03.page -t dictionary/SYS_INDEXES.sql | grepBABCA SYS_INDEXES”PRIMARY”BAC3C SYS_INDEXES”idx_actor_last_name”BABCA SYS_INDEXES”PRIMARY”BAC3C SYS_INDEXES”idx_actor_last_name”
3. 知道了主键 id,就可以从对应 page 中提取表数据,并生成 sql 文件。
./c_parser -4f pages-ibdata1/FIL_PAGE_INDEX/76.page -t sakila/actor.sql > dumps/default/actor 2> dumps/default/actor_load.sql
4. 最后导入恢复的数据
cat dumps/default/*.sql | mysql sakila
更多详细情况点击
网页链接
关于mysql 找回删除的数据的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。