標籤:SQL SERVER/MSSQL SERVER/數據庫/DBA/xp_cmdshell/備份壓縮shell
當備份空間不是很充裕的狀況下須要找方法將備份文件拷貝到專用的備份機器上去,特別是存儲空間不夠優越的企業更是如此,接下來就分享兩種遷移備份文件的方法。數據庫
目錄安全
使用xp_cmdshell方法以前必須先開啓對應的服務器配置選項,查詢系統中每一個服務器範圍的配置選項值使用如下語句。服務器
--系統中每一個服務器範圍的配置選項值對應一行 SELECT * FROM sys.configurations ORDER BY name DESC GO
---開啓xp_cmdshell sp_configure 'show advanced options', 1;--開啓sp_configure系統存儲過程高級選項,默認爲0 go reconfigure;---指定若是配置設置不須要服務器中止並從新啓動,則更新當前運行的值.RECONFIGURE 還會檢查新的配置值中是否有無效值(若是是RECONFIGURE WITH OVERRIDE則會跳過錯誤檢查) go sp_configure 'xp_cmdshell', 1; go reconfigure; go sp_configure 'show advanced options', 0; go
在服務器範圍的配置裏面若是‘allow updates’的vlues值是‘1’的話,會阻止對系統表的更新,即上面開啓xp_cmdshell會被阻止,因此必須先開啓allow updatesspa
----開啓容許更新系統表功能(當更改系統配置選項時提示不運行對系統目錄即時更新時須要開啓改功能) sp_configure 'show advanced options', 1; GO sp_configure 'allow updates',0 ---開啓容許更新系統表 go sp_configure 'show advanced options', 0; go ----關閉更新系統表功能 sp_configure 'show advanced options', 1; GO sp_configure 'allow updates',1 go sp_configure 'show advanced options', 0; go
先創建一個備份數據庫的存儲過程,而後經過做業調用存儲過程執行備份。code
USE [master] GO CREATE PROCEDURE [dbo].[SP_bakupDataBase] (@dbname nvarchar(50) ) as Declare @strCmdShell varchar(300) Declare @FullFileName Varchar(200) Declare @strPath NVARCHAR(200) Declare @ToFileName varchar(200) Declare @SQLStr varchar(500) Declare @SQLStr2 varchar(500) Declare @FlagDel INT declare @backupSetId as int SET @strPath = convert(NVARCHAR(19),getdate(),120) SET @strPath = REPLACE(REPLACE(convert(NVARCHAR(19),getdate(),120), ':' , ''),' ','_') SET @FullFileName='E:\'+@dbname+'\'+@dbname+'_backup_'+@strPath+'.bak' SET @ToFileName='\\192.168.1.1\E$\備份' SET @FlagDel=1 SET @SQLStr='copy '+@FullFileName+' '+@ToFileName SET @SQLStr2='del ' +@FullFileName BackUp DataBase @dbname To Disk= @FullFileName WITH NOINIT , NOUNLOAD , NOSKIP, NOFORMAT , STATS = 10,CHECKSUM,CONTINUE_AFTER_ERROR ---驗證備份集是否有效 select @backupSetId = position from msdb..backupset where database_name=@dbname and backup_set_id=(select max(backup_set_id) from msdb..backupset where database_name=@dbname ) IF @backupSetId is null begin raiserror(N'驗證失敗。找不到數據庫數據庫的備份信息。', 16, 1) end RESTORE VERIFYONLY FROM DISK = @FullFileName WITH FILE = @backupSetId, NOUNLOAD, NOREWIND EXEC master.dbo.xp_cmdshell 'net use \\192.168.1.1\E$ 123456 /user:192.168.1.1\user' EXEC Master..xp_cmdshell @SQLStr IF (@FlagDel =1) BEGIN EXEC master.. xp_cmdshell @SQLStr2 END
---圖片解釋blog
USE [master] EXEC sp_bakupDataBase 'AdventureWorks2008R2'
若是遠程備份空間不夠充足,須要將備份的數據庫進行壓縮後再拷貝,先經過正常的備份將數據庫備份到本地,而後使用RAR.EXE壓縮軟件,壓縮並拷貝到遠程電腦,將下面的批處理保存成bat後綴格式,而後能夠經過任務計劃調用批處理進行定時操做。圖片
@echo off rem 爲註釋語法 timeout 爲window 2003版本纔有的指定 xp不兼容 setlocal enabledelayedexpansion set /a t=0*3600 :start for /f "delims=" %%a in ("dir /b 'D:\DataBase\person\person*'") do ( "c:\Program Files\WinRAR\winrar.exe" a -as -r -EP1 -ibck -df "\\192.168.1.1\DataBase\person\person_.rar" -m3 -agyyyymmddhhmmss "D:\DataBase\person\p*" rem del /q /f "D:\DataBase\person\p*" ) rem timeout /t %t% /nobreak rem goto :start
---圖片解釋rem
凡事都有利有弊,對於第一種方案開啓XP_cmdshell存在必定的安全風險,當你的服務啓動帳戶的權限太高的話別人就能夠經過XP_cmdshell來進行不少危險的操做,包括新增帳戶、新建文件夾、刪除文件等,因此在使用完以後建議關閉 XP_cmdshell。若是備份空間足夠充裕不須要這麼麻煩,第二種方法對服務器的壓力比較大並且遷移時間也很長,不建議使用。get
備註: 做者:pursuer.chen 博客:http://www.cnblogs.com/chenmh 本站點全部隨筆都是原創,歡迎你們轉載;但轉載時必須註明文章來源,且在文章開頭明顯處給明連接,不然保留追究責任的權利。 《歡迎交流討論》 |