1,使用SQL最簡單備份,還原資料庫
1 /* 備份 */
2 backup database Test to disk=\'D:/Test.bak\'
3 /* 還原 */
4 restore database Test from disk=\'D:/Test.bak\'
2,為了友善以後的使用,開始對語句進行簡單的封裝->存儲過程
(1)備份
1 /*******************************************************
2 備份資料庫
3 *******************************************************/
4 if exists(select 1 from sys.procedures where name=\'sp_BackupDB\')
5 drop procedure sp_BackupDB
6 go
7 create procedure sp_BackupDB
8 @savePath nvarchar(4000) -- 備份資料庫儲存位置(目錄)
9 ,@dbName nvarchar(4000) -- 需要進行備份的資料庫
10 ,@bakName nvarchar(4000) -- 備份檔案的名稱(不含擴充名)
11 as begin
12 declare @sql nvarchar(4000)
13 /* 驗證路徑 */
14 if(charindex(\'/\',reverse(@savePath))!=1) begin
15 set @savePath=@savePath+\'/\'
16 end
17 /* 拼SQL并執行 */
18 set @sql=\'backup database \'+@dbName+\' to disk=\'\'\'+@savePath+@bakName+\'.bak\'\'\'
19 exec sp_executesql @sql
20
21 /* 傳回執行結果(1=成功,0=失敗) */
22 if(@@error=0) begin
23 return 1
24 end
25 return 0
26 end
(2)還原
1 /*******************************************************
2 還原資料庫
3 *******************************************************/
4 if exists(select 1 from sys.procedures where name=\'sp_RestoreDB\')
5 drop procedure sp_RestoreDB
6 go
7 create procedure sp_RestoreDB
8 /* 資料庫還原後的儲存位置(目錄)(使用系統預設儲存位置:-1) */
9 @savePath nvarchar(4000)
10 ,@backFile nvarchar(4000) -- 需要還原的資料庫備份檔案
11 ,@defaultName nvarchar(4000) -- 資料庫原始名稱(備份的原資料庫名稱)不包含擴充名
12 /* 為資料庫重命名(使用資料庫預設名稱:-1)不包含擴充名
13 如果目錄已存在該名稱的資料庫,将會被覆寫 */
14 ,@dbName nvarchar(4000)
15 as begin
16 declare @newName nvarchar(4000),@sql nvarchar(4000)
17 /* 擷取資料庫名稱 */
18 if(@dbName=\'-1\') begin
19 set @newName=@defaultName
20 end else begin
21 set @newName=@dbName
22 end
23 /* 結束所有對目前資料庫的連接配接 */
24 if exists(select 1 from sys.sysprocesses where dbid=db_id(@defaultName)) begin
25 declare #cs_spid cursor -- 聲明遊标
26 for
27 select #cs_spid=convert(varchar,spid) from sys.sysprocesses where dbid=db_id(@defaultName)
28 open #cs_spid
29 declare @spid varchar(20)
30 fetch next from #cs_spid into @spid -- 指派并前進到下一條
31 while(@@fetch_status=0) begin -- 在fetch失敗前執行
32 exec (\'kill \'+@spid) -- 結束對操作庫的連接配接(exec執行SQL語句1)
33 fetch next from #cs_spid into @spid
34 end
35 close #cs_spid
36 deallocate #cs_spid -- 釋放遊标
37 end
38 /* 建立執行語句 */
39 set @sql=\'restore database \'+@newName+\' from disk=\'\'\'+@backFile+\'\'\' with replace\'
40 if(@savePath!=\'-1\') begin
41 -- 驗證路徑
42 if(charindex(\'/\',reverse(@savePath))!=1) begin
43 set @savePath=@savePath+\'/\'
44 end
45 set @sql=@sql+\', move \'\'\'+@defaultName+\'\'\' to \'\'\'+@savePath+@newName+\'.mdf\'\'\'
46 set @sql=@sql+\', move \'\'\'+@defaultName+\'_log\'\' to \'\'\'+@savePath+@newName+\'_log.ldf\'\'\'
47 end
48 /* 執行操作 */
49 exec sp_executesql @sql -- (exec執行SQL語句2)
50 /* 傳回執行結果(1=成功,0=失敗) */
51 if(@@error=0) begin
52 return 1
53 end
54 return 0
55 end
MYSQL
1、使用mysqldump指令備份
mysqldump指令将資料庫中的資料備份成一個文本檔案。表的結構和表中的資料将存儲在生成的文本檔案中。
mysqldump指令的工作原理很簡單。它先查出需要備份的表的結構,再在文本檔案中生成一個CREATE語句。然後,将表中的所有記錄轉換成一條INSERT語句。然後通過這些語句,就能夠建立表并插入資料。
1、備份一個資料庫
mysqldump基本文法:
mysqldump -u username -p dbname table1 table2 ...-> BackupName.sql
其中:
- dbname參數表示資料庫的名稱;
- table1和table2參數表示需要備份的表的名稱,為空則整個資料庫備份;
- BackupName.sql參數表設計備份檔案的名稱,檔案名前面可以加上一個絕對路徑。通常将資料庫被分成一個字尾名為sql的檔案;
使用root使用者備份test資料庫下的person表
mysqldump -u root -p test person > D:\backup.sql
其生成的腳本如下:
檔案的開頭會記錄MySQL的版本、備份的主機名和資料庫名。
檔案中以“--”開頭的都是SQL語言的注釋,以"/*!40101"等形式開頭的是與MySQL有關的注釋。40101是MySQL資料庫的版本号,如果MySQL的版本比1.11高,則/*!40101和*/之間的内容就被當做SQL指令來執行,如果比4.1.1低就會被當做注釋。
2、備份多個資料庫
文法:
mysqldump -u username -p --databases dbname2 dbname2 > Backup.sql
加上了--databases選項,然後後面跟多個資料庫
mysqldump -u root -p --databases test mysql > D:\backup.sql
3、備份所有資料庫
mysqldump指令備份所有資料庫的文法如下:
mysqldump -u username -p -all-databases > BackupName.sql
示例:
mysqldump -u -root -p -all-databases > D:\all.sql
2、直接複制整個資料庫目錄
MySQL有一種非常簡單的備份方法,就是将MySQL中的資料庫檔案直接複制出來。這是最簡單,速度最快的方法。
不過在此之前,要先将伺服器停止,這樣才可以保證在複制期間資料庫的資料不會發生變化。如果在複制資料庫的過程中還有資料寫入,就會造成資料不一緻。這種情況在開發環境可以,但是在生産環境中很難允許備份伺服器。
注意:這種方法不适用于InnoDB存儲引擎的表,而對于MyISAM存儲引擎的表很友善。同時,還原時MySQL的版本最好相同。
3、使用mysqlhotcopy工具快速備份
一看名字就知道是熱備份。是以,mysqlhotcopy支援不停止MySQL伺服器備份。而且,mysqlhotcopy的備份方式比mysqldump快。mysqlhotcopy是一個perl腳本,主要在Linux系統下使用。其使用LOCK TABLES、FLUSH TABLES和cp來進行快速備份。
原理:先将需要備份的資料庫加上一個讀鎖,然後用FLUSH TABLES将記憶體中的資料寫回到硬碟上的資料庫,最後,把需要備份的資料庫檔案複制到目标目錄。
指令格式如下:
[root@localhost ~]# mysqlhotcopy [option] dbname1 dbname2 backupDir/
- dbname:資料庫名稱;
- backupDir:備份到哪個檔案夾下;
常用選項:
- --help:檢視mysqlhotcopy幫助;
- --allowold:如果備份目錄下存在相同的備份檔案,将舊的備份檔案加上_old;
- --keepold:如果備份目錄下存在相同的備份檔案,不删除舊的備份檔案,而是将舊的檔案更名;
- --flushlog:本次輩分之後,将對資料庫的更新記錄到日志中;
- --noindices:隻備份資料檔案,不備份索引檔案;
- --user=使用者名:用來指定使用者名,可以用-u代替;
- --password=密碼:用來指定密碼,可以用-p代替。使用-p時,密碼與-p之間沒有空格;
- --port=端口号:用來指定通路端口,可以用-P代替;
- --socket=socket檔案:用來指定socket檔案,可以用-S代替;
mysqlhotcopy并非mysql自帶,需要安裝Perl的資料庫接口包;下載下傳位址為:http://dev.mysql.com/downloads/dbi.html
目前,該工具也僅僅能夠備份MyISAM類型的表。
二、資料還原
1、還原使用mysqldump指令備份的資料庫的文法如下:
mysql -u root -p [dbname] < backup.sq
示例:
mysql -u root -p < C:\backup.sql
2、還原直接複制目錄的備份
通過這種方式還原時,必須保證兩個MySQL資料庫的版本号是相同的。MyISAM類型的表有效,對于InnoDB類型的表不可用,InnoDB表的表空間不能直接複制。