您好,欢迎访问一九零五行业门户网

SQL Server 批量完整备份

一.本文所涉及的内容(contents)本文所涉及的内容(contents)背景(contexts)实现代码(sqlcodes)实现方式一(one)实现方式二(two)实现方式三(three)参
一.本文所涉及的内容(contents)参考文献(references)
二.背景(contexts)三.实现代码(sql codes)下面是实现批量备份数据库的3种方式,大家可以细细体会其中的差别:
1) 实现方式1:使用游标
2) 实现方式2:使用拼凑sql的方式
3) 实现方式3:使用存储过程sp_msforeachdb_filter(以sp_msforeachdb为基础)
(一)实现方式1:使用游标
执行下面的sql脚本就可以备份当前数据库实例的所有数据库(除了系统数据库);
-- =============================================-- author:-- blog:-- create date: -- description: -- =============================================declare@filename varchar(200),@currenttime varchar(50),@dbname varchar(100),@sql varchar(1000)set @currenttime = convert(char(8),getdate(),112) + cast(datepart(hh, getdate()) as varchar) + cast(datepart(mi, getdate()) as varchar)declare curdbname cursor forselect name from master..sysdatabases where dbid>4open curdbnamefetch next from curdbname into @dbnamewhile @@fetch_status = 0begin--execute backupset @filename = 'e:\dbbackup\' + @dbname + '_' + @currenttimeset @sql = 'backup database ['+ @dbname +'] to disk = ''' + @filename + '.bak' +''' with noinit, nounload, name = n''' + @dbname + '_backup'', noskip, stats = 10, noformat'exec(@sql)--get next databasefetch next from curdbname into @dbnameendclose curdbnamedeallocate curdbname
执行完上面的sql脚本,会在e:\dbbackup的目录下生成类似下图的备份文件:
(figure1:数据库备份文件)
(二)实现方式2:使用拼凑sql的方式
--使用拼凑sql的方式declare @sql varchar(max)select @sql = coalesce(@sql,'') + 'backup database '+ quotename(name,'[]')+ ' to disk = ''e:\dbbackup\'+ name + '_' + convert(char(8),getdate(),112) + cast(datepart(hh, getdate()) as varchar) + cast(datepart(mi, getdate()) as varchar) + '.bak'+ ''' with noinit, nounload, name = n''' + name + '_backup'', noskip, stats = 10, noformat'from sys.databases where database_id >4 and name like '%%' and state =0print(@sql)execute(@sql)
生成的脚本如figure2所示,如果想脚本更加美观,可以加上go语句,如figure3所示:
(figure2:生成的t-sql脚本)
(figure3:生成的t-sql脚本)
(三)实现方式3:使用存储过程sp_msforeachdb_filter(以sp_msforeachdb为基础)
通过查看系统存储过程sp_msforeachdb的t-sql源代码可以发现是没有提供@whereand参数可以过滤数据库的,参考系统存储过程sp_msforeachtable后,,在sp_msforeachdb的基础上创建带@whereand参数的存储过程sp_msforeachdb_filter,这样你就可以让sql在指定的数据库上执行;
-- =============================================-- author:-- blog:-- create date: -- description: -- =============================================use [master]goset ansi_nulls ongoset quoted_identifier offgocreate proc [dbo].[sp_msforeachdb_filter]@command1 nvarchar(2000), @replacechar nchar(1) = n'?', @command2 nvarchar(2000) = null, @command3 nvarchar(2000) = null,@whereand nvarchar(2000) = null,@precommand nvarchar(2000) = null, @postcommand nvarchar(2000) = nullasset deadlock_priority low/* this proc returns one or more rows for each accessible db, with each db defaulting to its own result set *//* @precommand and @postcommand may be used to force a single result set via a temp table. *//* preprocessor won't replace within quotes so have to use str(). */declare @inaccessible nvarchar(12), @invalidlogin nvarchar(12), @dbinaccessible nvarchar(12)select @inaccessible = ltrim(str(convert(int, 0x03e0), 11))select @invalidlogin = ltrim(str(convert(int, 0x40000000), 11))select @dbinaccessible = n'0x80000000'/* sqldmodbuserprof_inaccessibledb; the negative number doesn't work in convert() */if (@precommand is not null)exec(@precommand)declare @origdb nvarchar(128)select @origdb = db_name()/* if it's a single user db and there's an entry for it in sysprocesses who isn't us, we can't use it. */ /* create the select */exec(n'declare hcforeachdatabase cursor global for select name from master.dbo.sysdatabases d ' +n' where (d.status & ' + @inaccessible + n' = 0)' +n' and (databaseproperty(d.name, ''issingleuser'') = 0 and (has_dbaccess(d.name) = 1))' + @whereand)declare @retval intselect @retval = @@errorif (@retval = 0)exec @retval = sys.sp_msforeach_worker @command1, @replacechar, @command2, @command3, 1if (@retval = 0 and @postcommand is not null)exec(@postcommand)declare @tempdb nvarchar(258) select @tempdb = replace(@origdb, n']', n']]') exec (n'use ' + n'[' + @tempdb + n']')return @retval
上面的存储过程sp_msforeachdb_filter与sp_msforeachdb的区别有以下两点:
(figure4:添加内容1)
(figure5:添加内容2)
其它类似信息

推荐信息