And*_*ies 9 sql-server-2008 sql-server backup
我在 SQL 2008 中有一份工作,它运行一个存储过程来备份所有数据库。这通过 sql server 代理作业每天运行。
它每天都成功退出,但有时只有在备份了几个数据库后才成功退出。每次可以是不同数量的数据库。大多数情况下,它会成功备份所有数据库,但有时会成功备份 2 次,有时会成功备份 5 次,等等。
我在作业历史记录、事件查看器或 sql server 日志中没有看到任何错误。
备份是在本地磁盘上进行的,尽管该文件夹是可扩展存储卷上文件夹的“连接点”。
操作系统是 Windows 2003 64 位运行 Sql Server 2008 网络版 64 位作为在 Vmware ESXi 5 主机上运行的虚拟机。
存储过程:
ALTER PROCEDURE [dbo].[backup_all_databases]
@path VARCHAR(255)='c:\backups\'
AS
DECLARE @name VARCHAR(50) -- database name
DECLARE @fileName VARCHAR(256) -- filename for backup
DECLARE @fileDate VARCHAR(20) -- used for file name
DECLARE @dbIsReadOnly sql_variant -- is database read_only?
DECLARE @dbIsOffline sql_variant -- is database offline?
DECLARE db_cursor CURSOR FOR
SELECT name
FROM master.dbo.sysdatabases
WHERE name NOT IN ('tempdb')
AND version > 0 AND version IS NOT NULL
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
SET @fileName = @path + @name + '.bak'
SET @dbIsReadOnly = (SELECT DATABASEPROPERTY(@name, 'IsReadOnly')) -- 1 = Read Only
SET @dbIsOffline = (SELECT DATABASEPROPERTY(@name, 'IsOffline')) -- 1 = Offline
IF (@dbIsReadOnly = 0 OR @dbIsReadOnly IS NULL) AND @dbIsOffline =0
BEGIN
BACKUP DATABASE @name TO DISK = @fileName WITH INIT
WAITFOR DELAY '00:00:20'
END
FETCH NEXT FROM db_cursor INTO @name
END
CLOSE db_cursor
DEALLOCATE db_cursor
Run Code Online (Sandbox Code Playgroud)
请问有什么建议吗?
我会添加 TRY/CATCH 块来处理错误并记录它们。数据库可以是单个用户,正在恢复或其他。
没有这个,错误可以以不记录错误的方式中止(语句、批处理、范围、连接等)
使用 TRY/CATCH 那么除了编译或连接中止错误之外的所有内容都会被记录?但我怀疑情况是否如此。
我还会使用sys.databases替换 sysdatabases 并读取更多标志:
-- declares etc
BEGIN TRY
DECLARE db_cursor CURSOR FOR
SELECT name, state, user_access
FROM sys.databases
WHERE name NOT IN ('tempdb')
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @name, @state, @user_access
WHILE @@FETCH_STATUS = 0
BEGIN
SET @fileName = @path + @name + '.bak'
IF @state = 0 AND user_access = 0
BEGIN
BEGIN TRY
BACKUP DATABASE @name TO DISK = @fileName WITH INIT
END TRY
BEGIN CATCH
-- log but do not rethrow so loop continues
END CATCH
WAITFOR DELAY '00:00:20'
END
ELSE
--log user and/or state issues
FETCH NEXT FROM db_cursor INTO @name
END
CLOSE db_cursor
DEALLOCATE db_cursor
END TRY
BEGIN CATCH
-- some useful stuff here
END CATCH
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1165 次 |
最近记录: |