标签: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 本站点全部随笔都是原创,欢迎你们转载;但转载时必须注明文章来源,且在文章开头明显处给明连接,不然保留追究责任的权利。 《欢迎交流讨论》 |