mysql數(shù)據(jù)庫恢復(fù)方法:
專注于為中小企業(yè)提供網(wǎng)站建設(shè)、成都做網(wǎng)站服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)任縣免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了成百上千家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
方法一:
命令恢復(fù)數(shù)據(jù)庫:
mysql -u root –password=root密碼 數(shù)據(jù)庫名 備份文件.sql
方法二:
第一步:用管理員權(quán)限登錄并進(jìn)入后臺管理界面,點(diǎn)“數(shù)據(jù)庫-資料恢復(fù)”。
第二步:在數(shù)據(jù)恢復(fù)設(shè)置中選擇“從本地文件”進(jìn)行恢復(fù),然后通過右邊的“瀏覽”按鈕找到之前保存下來的.sql文件。
第三步:點(diǎn)“提交”按鈕后將出現(xiàn)詢問“分卷數(shù)據(jù)成功導(dǎo)入數(shù)據(jù)庫,需要自動導(dǎo)入本次其他的備份嗎?”一般繼續(xù)點(diǎn)“確定”按鈕即可。之后的數(shù)據(jù)庫文件就完全導(dǎo)入到當(dāng)前網(wǎng)站了。這時出現(xiàn)再次要求輸入管理員帳號的提示。訪問網(wǎng)站地址時也會看到所有信息都恢復(fù)到備份數(shù)據(jù)庫時的內(nèi)容了。
小提示:
不管采取哪種方式備份和恢復(fù)數(shù)據(jù)庫,一定要注意備份和恢復(fù)時使用的版本要相同,甚至是語言種類也要一致,否則會存在亂碼的問題。
簡單情況下:進(jìn)入原來mysql安裝路徑下的data文件夾下,找到相應(yīng)的庫和ibdata1,進(jìn)行copy,就可回復(fù)原來的數(shù)據(jù)。
復(fù)雜情況下:
從另一臺機(jī)上把MySQL數(shù)據(jù)庫的mysql文件夾拷貝到本地機(jī)上,目的是恢復(fù)本地機(jī)對數(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ù)庫連接錯誤。
2. 卸載后重裝MySQL,將D:\Program Files\MySQL\MySQL Server 5.0\下的數(shù)據(jù)備份,只把mysql\data文件夾全部內(nèi)容拷貝到D:\Program Files\MySQL\MySQL Server 5.0\data下。結(jié)果,失?。簲?shù)據(jù)庫連接錯誤。將備份的數(shù)據(jù)還完覆蓋。結(jié)果,失敗,還是連接不上數(shù)據(jù)庫。
3. 卸載后重裝MySQL,將mysql\data文件夾里的cf1,last文件夾(這兩個是原來MySQL里的數(shù)據(jù)庫)拷貝進(jìn)D:\Program Files\MySQL\MySQL Server 5.0\data。連接成功,在Navicat for MySQL里看到數(shù)據(jù)庫cf1和last,但是不能訪問,因為數(shù)據(jù)全為零。明白了原來data里以數(shù)據(jù)庫命名的文件存儲的是數(shù)據(jù)庫的表結(jié)構(gòu),不是元數(shù)據(jù)。下一步,把data文件夾里的ibdata1文件(3.4G大,明顯存儲了元數(shù)據(jù))拷貝到D:\Program Files\MySQL\MySQL Server 5.0\data里,代替原來的ibdata1文件。重啟電腦,打開Navicat for MySQL,連接成功,數(shù)據(jù)可以訪問操作。
至此,操作終于成功。其實(shí)當(dāng)初在那臺機(jī)上把數(shù)據(jù)導(dǎo)出來,而不是現(xiàn)在直接把文件夾mysql復(fù)制過來會更容易恢復(fù)。但那臺機(jī)已經(jīng)重裝了系統(tǒng),也就是說MySQL失效了。
一、開啟binlog。
首先查看binlog是否開啟
?
1
2
3
4
5
6
7
mysql show variables like "log_bin";
+---------------+-------+
|Variable_name | Value
+---------------+-------+
| log_bin OFF
+---------------+-------+
1 row in set (0.00 sec)
值為OFF,需開啟,開啟binlog方式如下:
?
1
#vim /etc/my.cnf
在[mysqld]中加入
?
1
2
log-bin = mysql-bin
log-bin = /usr/local/mysql/log/mysql-bin.log
重啟mysql服務(wù)
?
1
2
#service mysqld stop
#service mysqld start
二、模擬數(shù)據(jù)寫入
建庫
?
1
create database backup;
建表
?
1
2
3
4
5
CREATE TABLE `number` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '編號',
`updatetime` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
寫入數(shù)據(jù)
程序2-1
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#coding:utf8
#python2.7
import MySQLdb
import time
def connect_mysql(db_host="192.168.11.169",user="martin",passwd="martin",db="backup",charset="utf8"):
conn = MySQLdb.connect(host=db_host,user=user,passwd=passwd,db=db,charset=charset)
conn.autocommit(True)
return conn.cursor()
#數(shù)據(jù)插入
for i in range(0,10):
#time=time.strftime("%Y-%m-%d %H:%M:%S")
sql = 'insert into number(updatetime) values(%s)'
values = [(time.strftime("%Y-%m-%d %H:%M:%S"))]
db1 = connect_mysql()
print db1.executemany(sql,values)
查詢數(shù)據(jù)
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql select * from number;
+-------+------------------------+
| id | updatetime
+--------------------------------+
| 1 | 2016-06-29 23:27:15 |
| 2 | 2016-06-29 23:27:15 |
| 3 | 2016-06-29 23:27:15 |
| 4 | 2016-06-29 23:27:15 |
| 5 | 2016-06-29 23:27:15 |
| 6 | 2016-06-29 23:27:15 |
| 7 | 2016-06-29 23:27:15 |
| 8 | 2016-06-29 23:27:15 |
| 9 | 2016-06-29 23:27:15 |
| 10 | 2016-06-29 23:27:15 |
+-------+------------------------+
10 rows in set (0.00 sec)
三、全量備份
?
1
mysqldump -uroot -p -F --master-data=2 backup |gzip /martin/data/backup_$(date +%F).sql.gz
注:加-F能刷新binlog,方便恢復(fù)時操作。
四、模擬寫入增量數(shù)據(jù)
繼續(xù)執(zhí)行程序2-1。
查詢數(shù)據(jù)
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
mysql select * from number;
+----+---------------------------+
| id | updatetime |
+----+---------------------------+
| 1 | 2016-06-29 23:27:15 |
| 2 | 2016-06-29 23:27:15 |
| 3 | 2016-06-29 23:27:15 |
| 4 | 2016-06-29 23:27:15 |
| 5 | 2016-06-29 23:27:15 |
| 6 | 2016-06-29 23:27:15 |
| 7 | 2016-06-29 23:27:15 |
| 8 | 2016-06-29 23:27:15 |
| 9 | 2016-06-29 23:27:15 |
| 10 | 2016-06-29 23:27:15 |
| 11 | 2016-06-29 23:31:03 |
| 12 | 2016-06-29 23:31:03 |
| 13 | 2016-06-29 23:31:03 |
| 14 | 2016-06-29 23:31:03 |
| 15 | 2016-06-29 23:31:03 |
| 16 | 2016-06-29 23:31:03 |
| 17 | 2016-06-29 23:31:03 |
| 18 | 2016-06-29 23:31:03 |
| 19 | 2016-06-29 23:31:03 |
| 20 | 2016-06-29 23:31:03 |
+-------+---------------------+
20 rows in set (0.00 sec)
五、增量備份
保留mysql-bin.000002及之后的binlog即可。
六、模擬誤操作
?
1
delete from number;
七、再次寫入增量數(shù)據(jù)
執(zhí)行程序2-1
select * from bumber;
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
+------+------------------------+
| id | updatetime |
+------+------------------------+
| 21 | 2016-06-29 23:41:06 |
| 22 | 2016-06-29 23:41:06 |
| 23 | 2016-06-29 23:41:06 |
| 24 | 2016-06-29 23:41:06 |
| 25 | 2016-06-29 23:41:06 |
| 26 | 2016-06-29 23:41:06 |
| 27 | 2016-06-29 23:41:06 |
| 28 | 2016-06-29 23:41:06 |
| 29 | 2016-06-29 23:41:06 |
| 30 | 2016-06-29 23:41:06 |
+------+------------------------+
10 rows in set (0.00 sec)
八、恢復(fù)
此時發(fā)現(xiàn)之前的delete操作為誤操作,急需恢復(fù),恢復(fù)過程如下
給該表加上讀鎖
?
1
lock table number read;
將全量備份的數(shù)據(jù)導(dǎo)入
?
1
2
3
4
#cd /martin/data/
#gzip -d number_2016-06-29.sql.gz
#grep -i "change" *.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=107;
刷新日志
?
1
2
3
4
5
6
#mysqladmin -uroot -p'martin' flush-logs
#cd /usr/local/mysql/log
#ls|grep mysql-bin|grep -v index
mysql-bin.000001
mysql-bin.000002
mysql-bin.000003
可確定mysql-bin.000002為增量數(shù)據(jù)binlog
導(dǎo)入全量備份
?
1
2
3
4
5
#cd /martin/data/
#mysql -uroot -p backup number_2016-06-29.sql
#cp /usr/local/mysql/log/mysql-bin.000002 /martin/data/
#mysqlbinlog mysql-bin.000002 bin.sql
#vim bin.sql
在bin.sql找到之前的delete語句,刪除
?
1
mysql -uroot -p bin.sql
九、確認(rèn)已恢復(fù)數(shù)據(jù)
登錄mysql
?
1
2
#mysql -uroot -p'martin' backup
select * from number;
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
+----+---------------------+
| id | updatetime |
+----+---------------------+
| 1 | 2016-06-29 23:27:15 |
| 2 | 2016-06-29 23:27:15 |
| 3 | 2016-06-29 23:27:15 |
| 4 | 2016-06-29 23:27:15 |
| 5 | 2016-06-29 23:27:15 |
| 6 | 2016-06-29 23:27:15 |
| 7 | 2016-06-29 23:27:15 |
| 8 | 2016-06-29 23:27:15 |
| 9 | 2016-06-29 23:27:15 |
| 10 | 2016-06-29 23:27:15 |
| 11 | 2016-06-29 23:31:03 |
| 12 | 2016-06-29 23:31:03 |
| 13 | 2016-06-29 23:31:03 |
| 14 | 2016-06-29 23:31:03 |
| 15 | 2016-06-29 23:31:03 |
| 16 | 2016-06-29 23:31:03 |
| 17 | 2016-06-29 23:31:03 |
| 18 | 2016-06-29 23:31:03 |
| 19 | 2016-06-29 23:31:03 |
| 20 | 2016-06-29 23:31:03 |
| 21 | 2016-06-29 23:41:06 |
| 22 | 2016-06-29 23:41:06 |
| 23 | 2016-06-29 23:41:06 |
| 24 | 2016-06-29 23:41:06 |
| 25 | 2016-06-29 23:41:06 |
| 26 | 2016-06-29 23:41:06 |
| 27 | 2016-06-29 23:41:06 |
| 28 | 2016-06-29 23:41:06 |
| 29 | 2016-06-29 23:41:06 |
| 30 | 2016-06-29 23:41:06 |
+----+---------------------+
30 rows in set (0.00 sec)
恢復(fù)完成
如果你要恢復(fù)的數(shù)據(jù)庫是包含授權(quán)表的mysql數(shù)據(jù)庫,您將需要使用--skip贈款-tables選項來運(yùn)行服務(wù)器恢復(fù)整個數(shù)據(jù)庫-否則,服務(wù)器會抱怨不能找到授權(quán)表。
恢復(fù)表后,執(zhí)行mysqladmin沖水privileges告訴服務(wù)器裝載授權(quán)表,并用它們來啟動。
數(shù)據(jù)庫目錄到其他地方的原始內(nèi)容復(fù)制。