天天看點

備份和還原資料庫

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表的表空間不能直接複制。

備份和還原資料庫