簡(jiǎn)單情況下:進(jìn)入原來mysql安裝路徑下的data文件夾下,找到相應(yīng)的庫和ibdata1,進(jìn)行copy,就可回復(fù)原來的數(shù)據(jù)。
創(chuàng)新互聯(lián)公司長(zhǎng)期為近千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為龍泉驛企業(yè)提供專業(yè)的成都網(wǎng)站制作、成都網(wǎng)站建設(shè),龍泉驛網(wǎng)站改版等技術(shù)服務(wù)。擁有10年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
復(fù)雜情況下:
從另一臺(tái)機(jī)上把MySQL數(shù)據(jù)庫的mysql文件夾拷貝到本地機(jī)上,目的是恢復(fù)本地機(jī)對(duì)數(shù)據(jù)的訪問和操作。經(jīng)過如下幾種情況的操作。
1. 在本地重裝MySQL(安裝目錄D:\Program Files\MySQL\MySQL Server 5.0),直接把mysql文件夾拷貝至D:\Program Files\MySQL\MySQL Server 5.0\。結(jié)果,失?。簲?shù)據(jù)庫連接錯(cuò)誤。
2. 卸載后重裝MySQL,將D:\Program Files\MySQL\MySQL Server 5.0\下的數(shù)據(jù)備份,只把mysql\data文件夾全部?jī)?nèi)容拷貝到D:\Program Files\MySQL\MySQL Server 5.0\data下。結(jié)果,失敗:數(shù)據(jù)庫連接錯(cuò)誤。將備份的數(shù)據(jù)還完覆蓋。結(jié)果,失敗,還是連接不上數(shù)據(jù)庫。
3. 卸載后重裝MySQL,將mysql\data文件夾里的cf1,last文件夾(這兩個(gè)是原來MySQL里的數(shù)據(jù)庫)拷貝進(jìn)D:\Program Files\MySQL\MySQL Server 5.0\data。連接成功,在Navicat for MySQL里看到數(shù)據(jù)庫cf1和last,但是不能訪問,因?yàn)閿?shù)據(jù)全為零。明白了原來data里以數(shù)據(jù)庫命名的文件存儲(chǔ)的是數(shù)據(jù)庫的表結(jié)構(gòu),不是元數(shù)據(jù)。下一步,把data文件夾里的ibdata1文件(3.4G大,明顯存儲(chǔ)了元數(shù)據(jù))拷貝到D:\Program Files\MySQL\MySQL Server 5.0\data里,代替原來的ibdata1文件。重啟電腦,打開Navicat for MySQL,連接成功,數(shù)據(jù)可以訪問操作。
至此,操作終于成功。其實(shí)當(dāng)初在那臺(tái)機(jī)上把數(shù)據(jù)導(dǎo)出來,而不是現(xiàn)在直接把文件夾mysql復(fù)制過來會(huì)更容易恢復(fù)。但那臺(tái)機(jī)已經(jīng)重裝了系統(tǒng),也就是說MySQL失效了。
打開mysql的bin log功能:
對(duì)于mysql也是支持增量備份,但要打開mysql的bin log功能。
我們修改mysql的配置文件。linux是/etc/my.cnf,windows是mysql的安裝目錄/my.ini
我們?cè)赱mysqld]下面加上log-bin一行代碼,如下面。
[mysqld]
log-bin=mysql-bin
復(fù)制代碼
加完后重起mysql即可。
某客戶更新數(shù)據(jù)的時(shí)候,誤刪了數(shù)據(jù)庫的內(nèi)容,因?yàn)閿?shù)據(jù)庫做了主從,但是沒有做備份(備份很重要?。。┬液瞄_啟了bin-log,之后只好把整個(gè)日志的記錄拿回來本地進(jìn)行恢復(fù)。
之后自己也做了一個(gè)簡(jiǎn)單的測(cè)試,對(duì)數(shù)據(jù)進(jìn)行恢復(fù),具體如下:
1、新建一個(gè)表
CREATE TABLE `lynn`.`sn_test` ( `name` VARCHAR( 10 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL , `age` INT( 3 ) NOT NULL ) ENGINE = MYISAM;
2、插入多條數(shù)據(jù)
INSERT INTO `lynn`.`sn_test` (`name`, `age`) VALUES ('lynn1', '1');
INSERT INTO `lynn`.`sn_test` (`name`, `age`) VALUES ('lynn2', '2');
INSERT INTO `lynn`.`sn_test` (`name`, `age`) VALUES ('lynn3', '3');
INSERT INTO `lynn`.`sn_test` (`name`, `age`) VALUES ('lynn4', '4');
3、查看數(shù)據(jù)并刪除
mysql select * from sn_test;
+-------+-----+
| name | age |
+---------+---+
| lynn1 | 1 |
| lynn2 | 2 |
| lynn3 | 3 |
| lynn4 | 4 |
+---------+-----+
4 rows in set (0.00 sec)
mysql delete from sn_test;
Query OK, 4 rows affected (0.00 sec)
mysql select * from sn_test;
Empty set (0.00 sec)
4、mysqlbinlog恢復(fù)數(shù)據(jù)
mysqlbinlog mysql-bin.000006 1.sql
查看1.txt里面數(shù)據(jù)插入的紀(jì)錄,把刪除之前的數(shù)據(jù)進(jìn)行恢復(fù)
mysqlbinlog mysql-bin.000006 --start-position=2471 --stop-position=2876 | mysql -uroot -p123
重新登錄,查看數(shù)據(jù),OK,已經(jīng)成功恢復(fù)了
對(duì)于數(shù)據(jù)庫操作,應(yīng)該注意如下問題:
1、要常備份(全備,增量備份),出了問題可以最快恢復(fù)數(shù)據(jù);
2、操作數(shù)據(jù)庫前,要把需要操作的數(shù)據(jù)庫或者表dump出來;
3、需要把bin-log打開,就算沒有做上面的兩步,也可以通過日志恢復(fù)數(shù)據(jù)
如果你要恢復(fù)的數(shù)據(jù)庫是包含授權(quán)表的mysql數(shù)據(jù)庫,您將需要使用--skip贈(zèng)款-tables選項(xiàng)來運(yùn)行服務(wù)器恢復(fù)整個(gè)數(shù)據(jù)庫
- 首先,。否則,服務(wù)器會(huì)抱怨不能找到授權(quán)表。恢復(fù)表后,執(zhí)行mysqladmin沖水privileges告訴服務(wù)器裝載授權(quán)表,并用它們來啟動(dòng)。數(shù)據(jù)庫目錄到其他地方的原始內(nèi)容
復(fù)制。例如,您可以使用它們?cè)谝院蟮氖潞蠓治鰴z查表(驗(yàn)尸)的崩潰。
酒店與最新的數(shù)據(jù)庫備份文件重新加載。如果您打算使用mysqldump的所加載的文件,則需要輸入它們作為mysql的。如果您打算使用從數(shù)據(jù)庫文件直接拷貝(例如,使用tar或CP),它會(huì)復(fù)制他們直接回?cái)?shù)據(jù)庫目錄中。然而,在這種情況下,你應(yīng)該在關(guān)閉之前,該服務(wù)器復(fù)制這些文件,然后重新啟動(dòng)它。在備份過程中
重做日志,然后查詢更新數(shù)據(jù)庫表中。對(duì)于所有可用的更新日志,你可以使用它作為mysql的輸入。指定--one-database選項(xiàng),因此MySQL只是要還原的數(shù)據(jù)庫執(zhí)行查詢。如果你意識(shí)到有必要使用所有的更新日志文件,可以使用包含以下命令日志的目錄:
%LS-TRL更新(0-9)* | xargs的貓| mysql--。一個(gè)數(shù)據(jù)庫DB_NAME
ls命令生成一個(gè)單獨(dú)的日志文件更新列表,更新日志文件根據(jù)服務(wù)器(你知道,如果你其中的任何文件,排序順序生成的順序進(jìn)行排序會(huì)發(fā)生變化,這將導(dǎo)致在更新日志中以錯(cuò)誤的順序使用)。有限公司您可能需要使用一些更新日志。例如,如果日志,因?yàn)槊鹵pdate.392備份,pdate.393等產(chǎn)生的,可以在命令重新運(yùn)行它們:
%的mysql - 一個(gè)數(shù)據(jù)庫DB_NAME 錄入。 392
%的mysql - 一個(gè)數(shù)據(jù)庫DB_NAME updata.393 ...
如果您正在運(yùn)行的恢復(fù),并打算使用更新日志恢復(fù)由于失誤降數(shù)據(jù)的基礎(chǔ)上,DROPTABLE或DELETE語句和丟失的信息時(shí),一定要在開始更新日志刪除這些語句。
恢復(fù)單個(gè)表
恢復(fù)單個(gè)表是非常困難的。如果是的mysqldump備份文件生成的,它只是不包含數(shù)據(jù),您需要一個(gè)表,你需要提取的相關(guān)線路,并利用它們作為mysql的輸入,這部分比較容易。困難的是,提取在該表的更新日志中使用的片段。你會(huì)發(fā)現(xiàn):mysql_find_rows工具在這方面有所幫助,它可以提取多行從更新日志查詢。另一種可能性是使用另一臺(tái)服務(wù)器
恢復(fù)整個(gè)數(shù)據(jù)庫,然后將該文件復(fù)制到表的原始數(shù)據(jù)庫。這其實(shí)很容易!當(dāng)文件被復(fù)制回?cái)?shù)據(jù)庫目錄,確保原始數(shù)據(jù)庫服務(wù)器關(guān)閉。
1、找回表結(jié)構(gòu),如果表結(jié)構(gòu)沒有丟失直接到下一步\x0d\x0a\x0d\x0aa、先創(chuàng)建一個(gè)數(shù)據(jù)庫,這個(gè)數(shù)據(jù)庫必須是沒有表和任何操作的。\x0d\x0a\x0d\x0ab、創(chuàng)建一個(gè)表結(jié)構(gòu),和要恢復(fù)的表名是一樣的。表里的字段無所謂。一定要是innodb引擎的。CREATE TABLE `weibo_qq0`( `weiboid` bigint(20)) ENGINE=InnoDB DEFAULT CHARSET=utf8;\x0d\x0a\x0d\x0ac、關(guān)閉mysql, service mysqld stop;\x0d\x0a\x0d\x0ad、用需要恢復(fù)的frm文件覆蓋剛新建的frm文件;\x0d\x0a\x0d\x0ae、修改my.ini 里 innodb_force_recovery=1 , 如果不成修改為 2,3,4,5,6。\x0d\x0a\x0d\x0af、 啟動(dòng)mysql,service mysqld start;show create table weibo_qq0 就能li到表結(jié)構(gòu)信息了。\x0d\x0a\x0d\x0a2、找回?cái)?shù)據(jù)。記得上面把 innodb_force_recovery改掉了,需要注釋掉,不然恢復(fù)模式不好操作。 這里有個(gè)關(guān)鍵的問題,就是innodb里的任何數(shù)據(jù)操作都是一個(gè)日志的記錄點(diǎn)。也就是如果我們需要數(shù)據(jù)恢復(fù),必須把之前的表的數(shù)據(jù)的日志記錄點(diǎn)添加到一致。\x0d\x0a\x0d\x0aa、建立一個(gè)數(shù)據(jù)庫,根據(jù)上面導(dǎo)出的創(chuàng)建表的sql執(zhí)行創(chuàng)建表。\x0d\x0a\x0d\x0ab、找到記錄點(diǎn)。先要把當(dāng)前數(shù)據(jù)庫的表空間廢棄掉,使當(dāng)前ibd的數(shù)據(jù)文件和frm分離。 ALTER TABLE weibo_qq0 DISCARD TABLESPACE;\x0d\x0a\x0d\x0ac、把之前要恢復(fù)的 .ibd文件復(fù)制到新的表結(jié)構(gòu)文件夾下。 使當(dāng)前的ibd 和frm發(fā)生關(guān)系。ALTER TABLE weibo_qq0 IMPORT TABLESPACE; 結(jié)果不出意外肯定會(huì)報(bào)錯(cuò)。就和我們開展數(shù)據(jù)開始說的那樣,數(shù)據(jù)記錄點(diǎn)不一致。我們看看之前ibd記錄的點(diǎn)在什么位置。開始執(zhí)行 import tablespace,報(bào)錯(cuò) ERROR 1030 (HY000): Got error -1 from storage engine。找到mysql的錯(cuò)誤日志,InnoDB: Error: tablespace id in file ‘.testweibo_qq0.ibd’ is 112, but in the InnoDB InnoDB: data dictionary it is 1. 因?yàn)?weibo_qq0 之前的記錄點(diǎn)在112,當(dāng)前的表只創(chuàng)建一次,所以記錄點(diǎn)是1.\x0d\x0a\x0d\x0ad、那怎么從1記錄到112。for ($1=1; $i
回答于?2022-11-16