重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
情況1、如果你有該庫的整體備份或對這個表的單獨備份,那么也許可以恢復。可以將最新的備份恢復到一個備用的服務器上,導出那表的內容,完成恢復
成都創新互聯公司從2013年開始,先為界首等服務建站,界首等地企業,進行企業商務咨詢服務。為界首企業網站制作PC+手機+微官網三網同步一站式服務解決您的所有建站問題。
情況2、如果沒有任何備份,那就基本沒戲了。一般刪除表的操作是drop table,日志中不會記錄刪除具體行數的記錄。表所對應目錄下的文件已經被刪除(innodb獨立表空間,單表歸為一文件)。同樣的情況適用于myisam數據庫引擎,對應的myd/myi/frm文件均被刪除。這不像windows還有垃圾箱,是不可逆的操作
1、第一步,查詢語句:select*fromtable_name;或select*fromtable_namewhere[條件]
2、第二步,增加語句或插入數據insertintotable_name(clus...)values(values...)實例如圖:
3、修改數據:updatetablenamesetxx=xx,xxx=xxwherexxx=xxxandxxx=xxx;
4、第四步,刪除語句deletetable_namewhere條件實例如圖:
1、找回表結構,如果表結構沒有丟失直接到下一步\x0d\x0a\x0d\x0aa、先創建一個數據庫,這個數據庫必須是沒有表和任何操作的。\x0d\x0a\x0d\x0ab、創建一個表結構,和要恢復的表名是一樣的。表里的字段無所謂。一定要是innodb引擎的。CREATE TABLE `weibo_qq0`( `weiboid` bigint(20)) ENGINE=InnoDB DEFAULT CHARSET=utf8;\x0d\x0a\x0d\x0ac、關閉mysql, service mysqld stop;\x0d\x0a\x0d\x0ad、用需要恢復的frm文件覆蓋剛新建的frm文件;\x0d\x0a\x0d\x0ae、修改my.ini 里 innodb_force_recovery=1 , 如果不成修改為 2,3,4,5,6。\x0d\x0a\x0d\x0af、 啟動mysql,service mysqld start;show create table weibo_qq0 就能li到表結構信息了。\x0d\x0a\x0d\x0a2、找回數據。記得上面把 innodb_force_recovery改掉了,需要注釋掉,不然恢復模式不好操作。 這里有個關鍵的問題,就是innodb里的任何數據操作都是一個日志的記錄點。也就是如果我們需要數據恢復,必須把之前的表的數據的日志記錄點添加到一致。\x0d\x0a\x0d\x0aa、建立一個數據庫,根據上面導出的創建表的sql執行創建表。\x0d\x0a\x0d\x0ab、找到記錄點。先要把當前數據庫的表空間廢棄掉,使當前ibd的數據文件和frm分離。 ALTER TABLE weibo_qq0 DISCARD TABLESPACE;\x0d\x0a\x0d\x0ac、把之前要恢復的 .ibd文件復制到新的表結構文件夾下。 使當前的ibd 和frm發生關系。ALTER TABLE weibo_qq0 IMPORT TABLESPACE; 結果不出意外肯定會報錯。就和我們開展數據開始說的那樣,數據記錄點不一致。我們看看之前ibd記錄的點在什么位置。開始執行 import tablespace,報錯 ERROR 1030 (HY000): Got error -1 from storage engine。找到mysql的錯誤日志,InnoDB: Error: tablespace id in file ‘.testweibo_qq0.ibd’ is 112, but in the InnoDB InnoDB: data dictionary it is 1. 因為 weibo_qq0 之前的記錄點在112,當前的表只創建一次,所以記錄點是1.\x0d\x0a\x0d\x0ad、那怎么從1記錄到112。for ($1=1; $i
回答于?2022-11-16
在實際工作中,一個MySQL實例中可能有多個database。而我們備份時,通常采用完全備份,將所有database都備份到一個文件中。
但是,偶爾會遇到只恢復一個database或者一個表的情況。怎么解決呢?科多大數據帶你來看看。
一、利用全備恢復一個庫 (database) 的數據
案例:朋友在群里問, MySQL全庫備份。如何只恢復一個庫?
1、采用–one-database 選項。不建議使用該方式,經常出現問題。
# mysql -uroot -pxx -D db1 -o
2、從全備份文件中將需要的庫的建表語句和INSERT數據拿出來,然后再導入
# sed -n '/^-- Current Database: `db1`/,/^-- Current Database: `/p' all.dmp db1.sql
# mysql -uroot -pxx -D db1
二、利用全備恢復一張表 (table) 的數據
生產中遇到開發同事更新表時未加上where條件,造稱 order_status 列所有數據都被更新為0.
通常,mysqldump對全庫進行備份。恢復時如果恢復全庫,太耗時間又沒有必要。所以,我們只恢復想要的表即可。
mysqldump備份中,既有表結構,又有INSERT INTO語句包含數據。所以獲得者兩部分內容即可。
1、獲得表結構
# sed -e'/./{H;$!d;}' -e 'x;/CREATE TABLE `ecs_ugo_order_info`/!d;q' mysqldump_2017-05-23.sql
2、獲得INSERT INTO 語句,用于數據的恢復
# grep -i 'INSERT INTO `ecs_ugo_order_info`' mysqldump_2017-05-23.sql data.sql
3、根據得到的表結構創建表,并導入數據
mysql -uroot -pxxx xx
4、拼接update語句
mysql select concat('update xx.ecs_ugo_order_info set order_status=',order_status,' where order_id=',order_id,';') from ecs_ugo_order_info into outfile '/tmp/ecs_ugo_order_info_rercovery.sql';
結果如下:
1.update xx.ecs_ugo_order_info set order_status=6 where order_id=3254778;
2.update xx.ecs_ugo_order_info set order_status=6 where order_id=3254824;
3.update xx.ecs_ugo_order_info set order_status=6 where order_id=3254870;
5、在生產庫中將order_status恢復成正常值
# mysql -uroot -pxxx xx /tmp/ecs_ugo_order_info_rercovery.sql