前言最近公司服務器到期,需要進行數據遷移,而數據庫屬于多而繁瑣,通過圖形化界面一個一個備份所需時間成本很大,所以想著寫一個sql腳本來執行。
開始
- 數據庫單個備份
- 數據庫批量備份
- 數據庫還原
- 數據庫還原報錯問題記錄
- 總結
1.數據庫單個備份
圖形化界面備份這里就不展示了,可以自行百度,下面直接貼代碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
use master if exists ( select * from sysobjects where id = object_id(n '[backupdataproc]' ) and objectproperty(id, n 'isprocedure' ) = 1 ) drop procedure backupdataproc go create proc backupdataproc @fullname varchar (200) --入參(數據庫名) as begin declare @fileflag varchar (50) set @fileflag= 'c:\myfile\database\'+@fullname+' .bak' --備份到哪個路徑(c:\myfile\database\)根據自己需求來定 backup database @fullname to disk=@fileflag with init --核心代碼 end exec backupdataproc xxx |
執行成功后便會生成一個.bak文件到指定文件夾中,如圖
2.數據庫批量備份(時間有點長,請等待)
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
|
use master if exists( select * from sys.types where name = 'alldatabasesnametype' ) drop type alldatabasesnametype go create type alldatabasesnametype as table --自定義表類型用于存儲數據庫名稱 ( rownum int , name nvarchar(60), filename nvarchar(300) ) go if exists ( select * from sysobjects where id = object_id(n '[bachbackupdataproc]' ) and objectproperty(id, n 'isprocedure' ) = 1 ) drop procedure bachbackupdataproc go create proc bachbackupdataproc @filepath nvarchar(300) --入參,備份時的目標路徑 as begin declare @alldatabasesname as alldatabasesnametype --用于存儲系統中的數據庫名 declare @i int --循環變量 insert into @alldatabasesname( name ,filename,rownum) select name ,filename,row_number() over( order by name ) as rownum from sysdatabases where name not in ( 'master' , 'tempdb' , 'model' , 'msdb' ) --賦值 set @i =1 --循環備份數據庫 while @i <= ( select count (*) from @alldatabasesname) begin declare @fileflag varchar (500) declare @fullname varchar (50) select @fullname = name from @alldatabasesname where rownum = @i set @fileflag=@filepath+@fullname+ '.bak' backup database @fullname to disk=@fileflag with init set @i = @i + 1 end end exec bachbackupdataproc 'c:\myfile\ database \' |
執行結果效果如下圖:
3.數據庫還原
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
if exists ( select * from sysobjects where id = object_id(n '[reductionproc]' ) and objectproperty(id, n 'isprocedure' ) = 1 ) drop procedure reductionproc go create proc reductionproc @ name nvarchar(200) --入參 數據庫名稱 as begin declare @diskname nvarchar(500) declare @filelogname nvarchar(100) declare @fileflagdata nvarchar(500) declare @fileflaglog nvarchar(500) set @filelogname = @ name + '_log' set @diskname = 'c:\myfile\database\'+@name+' .bak ' ---(源)備份文件路徑 set @fileflagdata=' c:\program files\microsoft sql server\mssql15.mssqlserver\mssql\data\ '+@name+' .mdf '---(目標)指定數據文件路徑 set @fileflaglog=' c:\program files\microsoft sql server\mssql15.mssqlserver\mssql\data\ '+@filelogname+' .ldf' ---目標)指定日志文件路徑 restore database @ name --為待還原庫名 from disk = @diskname ---備份文件名 with move @ name to @fileflagdata, ---指定數據文件路徑 move @filelogname to @fileflaglog, ---指定日志文件路徑 stats = 10, replace end go exec reductionproc xxx |
執行后便能還原庫(我是拿這三個庫做測試,截的圖可能沒什么變化,你們可以嘗試下)
4.數據庫還原報錯問題記錄
當然還原的過程可能會遇到一些問題,比如:
1.版本不一樣
2.sql sql 邏輯文件'xxxxx ' 不是數據庫'yyy'的一部分。請使用 restore filelistonly 來列出邏輯文件名。
版本的話我試過了,高版本可以向下兼容,但是低版本不能向上兼容,可以統一版本來解決(如有更好的解決方案歡迎打擾)
第二個問題呢就是腳本中‘move' 他只能跟邏輯名,而有些數據庫的邏輯名并不是數據庫名稱,所以需要替換一下,
下面是查詢數據庫邏輯名的sql語句:
1
2
|
use master restore filelistonly from disk= 'd:\sql201database\sence.bak' --根據自己的需求要變更路徑 |
如圖,
對于這些邏輯名與數據庫名稱不一致的情況可以單獨拿出來重新執行一下即可:
1
2
3
4
5
6
7
|
use master --這里注意要使用master,以免出現待還原庫被占用的情況 restore database sence --為待還原庫名 from disk = 'd:\sql201database\sence.bak' ---備份文件名 with move 'sence_guangxi' to 'd:\database\data\sence.mdf' , ---指定數據文件路徑 move 'sence_guangxi_log' to 'd:\database\data\sence_log.ldf' , ---指定日志文件路徑 stats = 10, replace go |
5.總結
數據是無價的,對數據庫操作時備份是必須的。
數據是無價的,對數據庫操作時備份是必須的。
數據是無價的,對數據庫操作時備份是必須的。(重要的事說三遍)
到此這篇關于sql server2019數據庫備份與還原腳本,數據庫可批量備份的文章就介紹到這了,更多相關sql server2019數據庫備份與還原腳本,數據庫可批量備份內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://www.cnblogs.com/jierou/p/15569537.html