mysql誤刪資料庫表結構恢復,mysql誤刪表怎麼恢復

本文目錄一覽:

MySQL刪除表怎麼恢復?

情況1、如果你有該庫的整體備份或對這個表的單獨備份,那麼也許可以恢復。可以將最新的備份恢復到一個備用的伺服器上,導出那表的內容,完成恢復

情況2、如果沒有任何備份,那就基本沒戲了。一般刪除表的操作是drop table,日誌中不會記錄刪除具體行數的記錄。表所對應目錄下的文件已經被刪除(innodb獨立表空間,單表歸為一文件)。同樣的情況適用於myisam資料庫引擎,對應的myd/myi/frm文件均被刪除。這不像windows還有垃圾箱,是不可逆的操作

mysql的數據刪除後怎麼恢復

如果你要恢復的資料庫是包含授權表的mysql資料庫,您將需要使用–skip贈款-tables選項來運行伺服器恢復整個資料庫

– 首先,。否則,伺服器會抱怨不能找到授權表。恢復表後,執行mysqladmin沖水privileges告訴伺服器裝載授權表,並用它們來啟動。資料庫目錄到其他地方的原始內容

複製。例如,您可以使用它們在以後的事後分析檢查表(驗屍)的崩潰。

酒店與最新的資料庫備份文件重新載入。如果您打算使用mysqldump的所載入的文件,則需要輸入它們作為mysql的。如果您打算使用從資料庫文件直接拷貝(例如,使用tar或CP),它會複製他們直接回資料庫目錄中。然而,在這種情況下,你應該在關閉之前,該伺服器複製這些文件,然後重新啟動它。在備份過程中

重做日誌,然後查詢更新資料庫表中。對於所有可用的更新日誌,你可以使用它作為mysql的輸入。指定–one-database選項,因此MySQL只是要還原的資料庫執行查詢。如果你意識到有必要使用所有的更新日誌文件,可以使用包含以下命令日誌的目錄:

%LS-TRL更新(0-9)* | xargs的貓| mysql–。一個資料庫DB_NAME

ls命令生成一個單獨的日誌文件更新列表,更新日誌文件根據伺服器(你知道,如果你其中的任何文件,排序順序生成的順序進行排序會發生變化,這將導致在更新日誌中以錯誤的順序使用)。有限公司您可能需要使用一些更新日誌。例如,如果日誌,因為命名update.392備份,pdate.393等產生的,可以在命令重新運行它們:

%的mysql – 一個資料庫DB_NAME 錄入。 392

%的mysql – 一個資料庫DB_NAME updata.393 …

如果您正在運行的恢復,並打算使用更新日誌恢復由於失誤降數據的基礎上,DROPTABLE或DELETE語句和丟失的信息時,一定要在開始更新日誌刪除這些語句。

恢復單個表

恢復單個表是非常困難的。如果是的mysqldump備份文件生成的,它只是不包含數據,您需要一個表,你需要提取的相關線路,並利用它們作為mysql的輸入,這部分比較容易。困難的是,提取在該表的更新日誌中使用的片段。你會發現:mysql_find_rows工具在這方面有所幫助,它可以提取多行從更新日誌查詢。另一種可能性是使用另一台伺服器

恢復整個資料庫,然後將該文件複製到表的原始資料庫。這其實很容易!當文件被複制回資料庫目錄,確保原始資料庫伺服器關閉。

如何恢復資料庫表刪除數據 mysql

以下情況可以恢複數據:

1 innodb引擎表開啟了事務,執行dml語句,比如delete、update、insert之類,並且沒有提交即commit操作的話,可以執行rollback進行回滾恢復。如果是ddl操作,如drop、create、alter之類的操作時無效的

2 在進行刪除操作之前有備份,比如mysqldump,物理備份數據文件之類的操作,那麼可以恢復到刪除前的數據

3 如果你的刪除操作是直接對data下的文件進行刪除,注意,不是粉碎文件操作,那麼你可以嘗試用磁碟恢復軟體來找回被誤刪的數據文件;

除以上情況,其他真的是沒法恢復了,不過貌似很多公司號稱能夠恢復,要收費,具體他們怎麼恢復我就不曉得了。

mysql 資料庫表誤刪除了 能恢復嗎

每個 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 [-h] [-u] [-p] [-d] databases/table

stream_parser 讀取 InnoDB page 從 ibdata1 或 ibd 或分區表

# ./stream_parserYou must specify file with -f optionUsage: ./stream_parser -f innodb_datafile [-T N:M] [-s size] [-t size] [-V|-g]  Where:    -h         – Print this help    -V or -g   – Print debug information    -s size    – Amount of memory used for disk cache (allowed examples 1G 10M). Default 100M    -T         – retrieves 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 [-dDV] -f InnoDB page or dir -t table.sql [-T N:M] [-b external pages directory]  Where    -f InnoDB page(s) — InnoDB page or directory with pages(all pages should have same index_id)    -t table.sql — CREATE statement of a table    -o file — Save dump in this file. Otherwise print to stdout    -l file — 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)    -4  — innodb_datafile is in REDUNDANT format    -5  — innodb_datafile is in COMPACT format    -6  — innodb_datafile is in MySQL 5.6 format    -T  — retrieves only pages with index id = NM (N – high word, M – low word of id)    -b dir — Directory where external pages can be found. Usually it is pages-XXX/FIL_PAGE_TYPE_BLOB/    -i file — Read external pages at their offsets from file.    -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` smallint(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/0000000000000001.page -t dictionary/SYS_TABLES.sql dumps/default/SYS_TABLES 2 dumps/default/SYS_TABLES.sql./c_parser -4f pages-ibdata1/FIL_PAGE_INDEX/0000000000000002.page -t dictionary/SYS_COLUMNS.sql dumps/default/SYS_COLUMNS 2 dumps/default/SYS_COLUMNS.sql./c_parser -4f pages-ibdata1/FIL_PAGE_INDEX/0000000000000003.page -t dictionary/SYS_INDEXES.sql dumps/default/SYS_INDEXES 2 dumps/default/SYS_INDEXES.sql./c_parser -4f pages-ibdata1/FIL_PAGE_INDEX/0000000000000004.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,所以從0000000000000001.page 獲取表 id./c_parser -4Df pages-ibdata1/FIL_PAGE_INDEX/0000000000000001.page -t dictionary/SYS_TABLES.sql | grep sakila/actor000000000B28  2A000001430D4D  SYS_TABLES  “sakila/actor”  158  4  1 0   0   “”  0000000000B28  2A000001430D4D  SYS_TABLES  “sakila/actor”  158  4  1 0   0   “”  0

2. 利用 table id 獲取表的主鍵 id,sys_indexes 存有表索引信息,innodb 索引組織表,找到主鍵 id 即找到數據,sys_indexes 的 index id 是3,所以從0000000000000003.page 獲取主鍵 id

./c_parser -4Df pages-ibdata1/FIL_PAGE_INDEX/0000000000000003.page -t dictionary/SYS_INDEXES.sql | grep 158000000000B28    2A000001430BCA  SYS_INDEXES     158     376     “PRIMARY”       1       3       0       4294967295000000000B28    2A000001430C3C  SYS_INDEXES     158     377     “idx_actor_last_name”        1       0       0       4294967295000000000B28    2A000001430BCA  SYS_INDEXES     158     376     “PRIMARY”       1       3       0       4294967295000000000B28    2A000001430C3C  SYS_INDEXES     158     377     “idx_actor_last_name”        1       0       0       4294967295

3. 知道了主鍵 id,就可以從對應 page 中提取表數據,並生成 sql 文件。

./c_parser -4f pages-ibdata1/FIL_PAGE_INDEX/0000000000000376.page -t sakila/actor.sql dumps/default/actor 2 dumps/default/actor_load.sql

4. 最後導入恢復的數據

cat dumps/default/*.sql | mysql sakila

更多詳細情況點擊網頁鏈接

請點擊輸入圖片描述

mysql整個資料庫被刪除了怎麼恢復

1 找個別的機器安裝個同版本的mysql或從已安裝同版本的其他機器上(非同版本的也可以試下):

拷貝 mysql/data/mysql 目錄到你的mysql/data/ 下吧

2 試著啟動mysql服務,如果能啟動了,理論上應該丟失的只有用戶、授權等一些系統信息,不影響你的使用的數據;

如果不能啟動,看錯誤日誌,爭取啟動了。

3 趕緊把數據備份一份出來,重新把所有庫(只是你後來創建的業務相關的庫,不包括mysql庫)都刪了,重新導入一遍。理論上不這樣也可以,但只是非生產重要的環境下。

4 重新做用戶授權。

SQL資料庫里的表誤刪除要怎麼恢復?

1、實現運行Recovery for SQL Server操作如下。

2、點擊:Next Next–》進入 Recovery Configuration 界面–》選擇了Custom才可以選擇從日誌中恢復誤刪除的數據的操作如下。

3、Next 進入 Recovery options 窗口–》選中 Search for deleted records,並選擇要恢復的資料庫的日誌文件路徑log file path操作如下。

4、實現點擊next-》開始恢復操作如下。

5、點擊:Next選擇被恢複數據存放的目標資料庫。

6、點擊:Finish然後就完成數據的恢複數據的操作如下。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/239013.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:14
下一篇 2024-12-12 12:14

相關推薦

  • 如何修改mysql的埠號

    本文將介紹如何修改mysql的埠號,方便開發者根據實際需求配置對應埠號。 一、為什麼需要修改mysql埠號 默認情況下,mysql使用的埠號是3306。在某些情況下,我們需…

    編程 2025-04-29
  • Python 常用資料庫有哪些?

    在Python編程中,資料庫是不可或缺的一部分。隨著互聯網應用的不斷擴大,處理海量數據已成為一種趨勢。Python有許多成熟的資料庫管理系統,接下來我們將從多個方面介紹Python…

    編程 2025-04-29
  • openeuler安裝資料庫方案

    本文將介紹在openeuler操作系統中安裝資料庫的方案,並提供代碼示例。 一、安裝MariaDB 下面介紹如何在openeuler中安裝MariaDB。 1、更新軟體源 sudo…

    編程 2025-04-29
  • Python操作MySQL

    本文將從以下幾個方面對Python操作MySQL進行詳細闡述: 一、連接MySQL資料庫 在使用Python操作MySQL之前,我們需要先連接MySQL資料庫。在Python中,我…

    編程 2025-04-29
  • Vue TS工程結構用法介紹

    在本篇文章中,我們將從多個方面對Vue TS工程結構進行詳細的闡述,涵蓋文件結構、路由配置、組件間通訊、狀態管理等內容,並給出對應的代碼示例。 一、文件結構 一個好的文件結構可以極…

    編程 2025-04-29
  • 資料庫第三範式會有刪除插入異常

    如果沒有正確設計資料庫,第三範式可能導致刪除和插入異常。以下是詳細解釋: 一、什麼是第三範式和範式理論? 範式理論是關係資料庫中的一個規範化過程。第三範式是範式理論中的一種常見形式…

    編程 2025-04-29
  • Python程序的三種基本控制結構

    控制結構是編程語言中非常重要的一部分,它們指導著程序如何在不同的情況下執行相應的指令。Python作為一種高級編程語言,也擁有三種基本的控制結構:順序結構、選擇結構和循環結構。 一…

    編程 2025-04-29
  • MySQL遞歸函數的用法

    本文將從多個方面對MySQL遞歸函數的用法做詳細的闡述,包括函數的定義、使用方法、示例及注意事項。 一、遞歸函數的定義 遞歸函數是指在函數內部調用自身的函數。MySQL提供了CRE…

    編程 2025-04-29
  • leveldb和unqlite:兩個高性能的資料庫存儲引擎

    本文將介紹兩款高性能的資料庫存儲引擎:leveldb和unqlite,並從多個方面對它們進行詳細的闡述。 一、leveldb:輕量級的鍵值存儲引擎 1、leveldb概述: lev…

    編程 2025-04-28
  • Python怎麼導入資料庫

    Python是一種高級編程語言。它具有簡單、易讀的語法和廣泛的庫,讓它成為一個靈活和強大的工具。Python的資料庫連接類型可以多種多樣,其中包括MySQL、Oracle、Post…

    編程 2025-04-28

發表回復

登錄後才能評論