新聞中心
在如今的互聯(lián)網(wǎng)時代,數(shù)據(jù)庫已經(jīng)成為了大量數(shù)據(jù)存儲的主要方式。數(shù)據(jù)庫的好處是可以快速地存儲和管理大量數(shù)據(jù),并且易于訪問和處理數(shù)據(jù),但數(shù)據(jù)庫也常常面臨數(shù)據(jù)損壞或丟失的風(fēng)險。其中,數(shù)據(jù)庫記錄的誤刪是一個常見的問題,有些用戶因為疏忽或不小心誤刪了數(shù)據(jù)庫中的記錄,造成了無法挽回的數(shù)據(jù)損失,這時候就需要知道如何進行數(shù)據(jù)庫記錄的恢復(fù)。

創(chuàng)新互聯(lián)是專業(yè)的平遙網(wǎng)站建設(shè)公司,平遙接單;提供成都做網(wǎng)站、網(wǎng)站建設(shè),網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進行平遙網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
一、誤刪數(shù)據(jù)庫記錄的原因和危害
誤刪數(shù)據(jù)庫記錄的原因主要是人為因素。比如說管理員不小心誤刪了一個重要的數(shù)據(jù)記錄,或者是多個用戶同時修改了同一條數(shù)據(jù)記錄時出現(xiàn)了誤操作。無論什么原因,這些誤刪除操作都會給數(shù)據(jù)庫帶來很大的危害。
誤刪數(shù)據(jù)庫記錄的危害主要體現(xiàn)在以下三個方面:
1、影響數(shù)據(jù)的完整性,降低數(shù)據(jù)可靠性。數(shù)據(jù)庫記錄是數(shù)據(jù)庫中存儲的數(shù)據(jù)的基本單元,是數(shù)據(jù)的基礎(chǔ)支撐,如果誤刪了一條記錄,就可能導(dǎo)致其他記錄連接不起來,影響數(shù)據(jù)的完整性和可靠性。
2、造成企業(yè)經(jīng)濟損失。在數(shù)據(jù)庫中存儲的可能是企業(yè)的銷售數(shù)據(jù)、客戶信息、供應(yīng)商列表、財務(wù)報表等重要數(shù)據(jù)。如果誤刪,就會導(dǎo)致企業(yè)無法順利完成業(yè)務(wù)工作,造成經(jīng)濟損失。
3、影響企業(yè)聲譽。數(shù)據(jù)是企業(yè)的關(guān)鍵資產(chǎn),誤刪可能導(dǎo)致數(shù)據(jù)不完整、不準(zhǔn)確,進而影響企業(yè)的聲譽和信譽。
二、誤刪數(shù)據(jù)庫記錄的恢復(fù)方法
1、備份恢復(fù):備份恢復(fù)是最簡易的數(shù)據(jù)恢復(fù)方法之一,這種方法適用于在誤刪記錄前已經(jīng)備份了庫的用戶。可以將已經(jīng)備份的數(shù)據(jù)庫恢復(fù)到誤刪前的狀態(tài),并從中恢復(fù)待找回的記錄。
2、SQL命令:對于數(shù)據(jù)未進行物理刪除的情況,可以通過SQL命令找回誤刪的記錄。根據(jù)記錄的更新時間或記錄唯一的主鍵值,利用select語句進行查找,找回誤刪記錄或之前版本的記錄。
3、使用工具恢復(fù):如果誤刪的記錄已經(jīng)進行了物理刪除,可以通過專業(yè)數(shù)據(jù)恢復(fù)工具來進行數(shù)據(jù)查找和恢復(fù)。這種方法需要合適的工具和較長時間,也可能只能恢復(fù)部分數(shù)據(jù)記錄,但可以挽回誤刪前的數(shù)據(jù)。
三、如何防止誤刪數(shù)據(jù)庫記錄
1、制定操作規(guī)范:需要在操作數(shù)據(jù)庫時制定明確的規(guī)范,并加強對用戶的培訓(xùn)和維護,減少誤操作的發(fā)生。
2、備份要備好:需要注意數(shù)據(jù)庫備份的頻率、方式與備份文件的存放位置。時時保持備份,以防誤刪記錄無法恢復(fù)。
3、限制權(quán)限:對于不必要的用戶和權(quán)限,建議限制其操作權(quán)限。比如一些業(yè)務(wù)數(shù)據(jù)只有管理員才能進行操作,普通操作人員無權(quán)進行修改等操作。
通過備份恢復(fù)、SQL命令和專業(yè)工具恢復(fù)等多重方法,誤刪的數(shù)據(jù)庫記錄可以被找回。同時,在平時的操作過程中,需要注意規(guī)范、備份和權(quán)限等方面,以提高數(shù)據(jù)管理的安全性和有效性。如此一來,我們就可以在誤刪時給數(shù)據(jù)恢復(fù)留下一線生機。
相關(guān)問題拓展閱讀:
- mysql數(shù)據(jù)庫被刪除后怎么恢復(fù)
mysql數(shù)據(jù)庫被刪除后怎么恢復(fù)
每個 DBA 是不是粗皮都有過刪庫的經(jīng)歷?刪庫了沒有備份怎么辦?備份恢復(fù)后無法啟動服務(wù)什么情況?表定義損壞數(shù)據(jù)無法讀取怎么辦?逗凳液
我曾遇到某初創(chuàng)互聯(lián)網(wǎng)企業(yè),因維護人員不規(guī)范的備份恢復(fù)操作,導(dǎo)致系統(tǒng)表空間文件被初始化,上萬張表無法讀取,花了數(shù)小時才搶救回來。
當(dāng)你發(fā)現(xiàn)數(shù)據(jù)無法讀取時,也許并非數(shù)據(jù)丟失了,可能是 DBMS 找不到描述數(shù)據(jù)的信息。
背景
先來了解下幾張關(guān)鍵的 InnoDB 數(shù)據(jù)字典表,它們保存了部分表定義信息,在我們恢復(fù)表結(jié)構(gòu)時需要用到。
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對應(yīng)山物 `ID` bigint(20) unsigned NOT NULL DEFAULT ‘0’, 索引id `NAME` varchar(120) DEFAULT NULL,索引名稱 `N_FIELDS` int(10) unsigned DEFAULT NULL, 索引包含字段的個數(shù) `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對應(yīng) `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, 字段字節(jié)長度 `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,對應(yīng) id 的 page 中存儲著字典表的數(shù)據(jù)。
這里我們需要借助 undrop-for-innodb 工具恢復(fù)數(shù)據(jù),它能讀取表空間信息得到 page,將數(shù)據(jù)從 page 中提取出來。
# wget yum install -y gcc flex bison# make# make sys_parser
# ./sys_parser 讀取表結(jié)構(gòu)信息
sys_parser databases/table
stream_parser 讀取 InnoDB page 從 ibdata1 或 ibd 或分區(qū)表
# ./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
接下來,我們演示場景的幾種數(shù)據(jù)恢復(fù)場景。
場景1:drop table
是否啟用了 innodb_file_per_table 其恢復(fù)方法有所差異,當(dāng)發(fā)生誤刪表時,應(yīng)盡快停止MySQL服務(wù),不要啟動。若 innodb_file_per_table=ON,更好只讀方式重新掛載文件系統(tǒng),防止其他進程寫入數(shù)據(jù)覆蓋之前塊設(shè)備的數(shù)據(jù)。
如果評估記錄是否被覆蓋,可以表中某些記錄的作為關(guān)鍵字看是否能從 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
首先恢復(fù)表結(jié)構(gòu)信息1. 解析系統(tǒng)表空間獲取 page 信息
./stream_parser -f /var/lib/mysql/ibdata1
2. 新建一個 schema,把系統(tǒng)字典表的 DDL 導(dǎo)入
cat dictionary/SYS_* | mysql recovered
3. 創(chuàng)建恢復(fù)目錄
mkdir -p dumps/default
4. 解析系統(tǒng)表空間包含的字典表信息,
./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. 導(dǎo)入恢復(fù)的數(shù)據(jù)字典
cat dumps/default/*.sql | mysql recovered
6. 讀取恢復(fù)后的表結(jié)構(gòu)信息
./sys_parser -pmsandbox -d recovered sakila/actor
由于 5.x 版本 innodb 引擎并非完整記錄表結(jié)構(gòu)信息,會丟失 AUTO_INCREMENT 屬性、二級索引和外鍵約束, DECIMAL 精度等信息。
若是 mysql 5.5 版本 frm 文件被從系統(tǒng)刪除,在原目錄下 touch 與原表名相同的 frm 文件,還能讀取表結(jié)構(gòu)信息和數(shù)據(jù)。若只有 frm 文件,想要獲得表結(jié)構(gòu)信息,可使用 mysqlfrm –diagnostic /path/to/xxx.frm,連接 mysql 會顯示字符集信息。
innodb_file_per_table=OFF
因為是共享表空間模式,數(shù)據(jù)頁都存儲在 ibdata1,可以從 ibdata1 文件中提取數(shù)據(jù)。
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 即找到數(shù)據(jù),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,就可以從對應(yīng) page 中提取表數(shù)據(jù),并生成 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. 最后導(dǎo)入恢復(fù)的數(shù)據(jù)
cat dumps/default/*.sql | mysql sakila
更多詳細情況點擊
網(wǎng)頁鏈接
網(wǎng)頁鏈接
請點擊輸入圖片描述
使用mysql中的日志功能。首先:將最近的二進制類型的日志文件存成笑碼文本文件導(dǎo)出,命令如下:
mysqlbinlog F:/wamp/mysql-bin.> F:/test.txt
其次:打開保存的txt文件,文件格式如下:
其中at 1099代表第1099個命令(姑且這么記),查詢這些命令,看看需要回復(fù)的命令在什么地方,然后執(zhí)行命令。
最后:執(zhí)行回復(fù)命令,穗早如下:
mysqlbinlog –start-position=”123″ –stop-position=”531″ F:/wamp/mysql-bin.F:/test.txt | mysql -uroot -p
關(guān)于如何恢復(fù)被刪除記錄數(shù)據(jù)庫的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
成都創(chuàng)新互聯(lián)建站主營:成都網(wǎng)站建設(shè)、網(wǎng)站維護、網(wǎng)站改版的網(wǎng)站建設(shè)公司,提供成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、成都網(wǎng)站推廣、成都網(wǎng)站優(yōu)化seo、響應(yīng)式移動網(wǎng)站開發(fā)制作等網(wǎng)站服務(wù)。
分享題目:數(shù)據(jù)庫記錄刪除后如何恢復(fù)?(如何恢復(fù)被刪除記錄數(shù)據(jù)庫)
文章出自:http://fisionsoft.com.cn/article/djeogsh.html


咨詢
建站咨詢
