我们可以通过Windows中的任务管理,结合VBSript和TSQL来达到在SQl Server 2005 Express 版本中自动备份系统和数据的目的。
问题提出
当越来越多的多商业应用采用SQl Server 2005 Express 版本作为后台数据库的时候,我们必须确保能顺利的备份系统以及运行在实例上的用户数据库。不幸的是,SQl Server 2005 Express 版本没有SQL代理,也就不能使用SQL代理来创建可以备份所有数据库的数据库维护计划。那么对于SQl Server 2005 Express 版本,我们如何像其它版本一样来备份系统和数据呢?
专家解答
我们可以通过Windows中的任务管理,结合VBSript和TSQL来达到在SQl Server 2005 Express 版本中自动备份系统和数据的目的。
注意:所有的文件都必须保存在如下文件夹:E:\SQL_Backup\scripts。这个目录可以改变。但在该例中设定的是这个目录。如果将文件保存到其它目录,必须相应的更新脚本中的目录设置。
第一步-创建TSQL脚本
以下的TSQL脚本将生成一个数据库备份文件,同时考虑到生成的日期和时间,其格式类似于数据库维护计划生成的备份文件。我们将之保存为后缀名.sql的文件:E:\SQL_Backup\scripts\backupDB.sql。该文件将在批处理命令文件中使用sqlcmd调用。
DECLARE @dateString CHAR(12), @dayStr CHAR(2), @monthStr CHAR(2), @hourStr CHAR(2), @minStr CHAR(2)
--month variable
IF (SELECT LEN(CAST(MONTH(GETDATE()) AS CHAR(2))))=2
SET @monthSTR=CAST(MONTH(GETDATE()) AS CHAR(2))
ELSE
SET @monthSTR= '0' + CAST(MONTH(GETDATE()) AS CHAR(2))
--day variable
IF (SELECT LEN(CAST(DAY(GETDATE()) AS CHAR(2))))=2
SET @daySTR=CAST(DAY(GETDATE()) AS CHAR(2))
ELSE
SET @daySTR='0' + CAST(DAY(GETDATE()) AS CHAR(2))
--hour variable
IF (SELECT LEN(DATEPART(hh, GETDATE())))=2
SET @hourStr=CAST(DATEPART(hh, GETDATE()) AS CHAR(2))
ELSE
SET @hourStr= '0' + CAST(DATEPART(hh, GETDATE()) AS CHAR(2))
--minute variable
IF (SELECT LEN(DATEPART(mi, GETDATE())))=2
SET @minStr=CAST(DATEPART(mi, GETDATE()) AS CHAR(2))
ELSE
SET @minStr= '0' + CAST(DATEPART(mi, GETDATE()) AS CHAR(2))
--name variable based on time stamp
SET @dateString=CAST(YEAR(GETDATE()) AS CHAR(4)) + @monthStr + @dayStr + @hourStr + @minStr
--=================================================================
DECLARE @IDENT INT, @sql VARCHAR(1000), @DBNAME VARCHAR(200)
SELECT @IDENT=MIN(database_id) FROM SYS.DATABASES WHERE [database_id] > 0 AND NAME NOT IN ('TEMPDB')
WHILE @IDENT IS NOT NULL
BEGIN
SELECT @DBNAME = NAME FROM SYS.DATABASES WHERE database_id = @IDENT
/*Change disk location here as required*/
SELECT @SQL = 'BACKUP DATABASE '+@DBNAME+' TO DISK = ''E:\SQL_Backup\'+@DBNAME+'_db_' + @dateString +'.BAK'' WITH INIT'
EXEC (@SQL)
SELECT @IDENT=MIN(database_id) FROM SYS.DATABASES WHERE [database_id] > 0 AND database_id>@IDENT AND NAME NOT IN ('TEMPDB')
END
上一篇 防止JAVA反编译的一些常用方法
下一篇 Oracle 11g数据库:数据库重放
阅读推荐
相关文章