Rau*_*DBA 0 backup stored-procedures tempdb sql-server-2014
下面我有一个代码来获取有关服务器中每个数据库的 t-log 备份的信息。我想从这个列表中排除 tempdb。
exec sp_MSforeachdb 'SELECT server_name, sysdb.name AS DatabaseName, bkup.user_name AS [User],
ceiling(bkup.backup_size /1048576) as ''Size Meg'' ,
cast((bkup.backup_size /1073741824) as decimal (9,2)) as ''Gig'',
bkup.backup_start_date AS [Backup Started],
bkup.backup_finish_date AS [Backup Finished (Last BackUp Time)],
CAST((CAST(DATEDIFF(s, bkup.backup_start_date, bkup.backup_finish_date) AS int))/3600 AS varchar) + '' hours, ''
+ CAST(DATEDIFF(mi, bkup.backup_start_date, bkup.backup_finish_date) - (DATEDIFF(mi, bkup.backup_start_date, bkup.backup_finish_date)/60)*60 AS varchar) + '' minutes, ''
+ CAST((CAST(DATEDIFF(s, bkup.backup_start_date, bkup.backup_finish_date) AS int))%60 AS varchar)+ '' seconds'' AS [Total Time]
,DATEDIFF(DAY,CONVERT(CHAR(8),backup_finish_date,112),CONVERT(CHAR(8),expiration_date,112)) AS expiration_days
,bms.description AS [Description]
,bkup.is_damaged AS isDamaged
,bms.is_compressed AS isCompressed
,bkup.is_copy_only AS isCopyOnly
,bkup.database_creation_date AS DatabaseCreationDate
,bmf.physical_device_name AS PhysicalDeviceName
,CASE WHEN (bkup.backup_start_date is NULL OR bkup.backup_start_date < DATEADD(dd,-1,GetDate()) ) THEN ''Yes'' ELSE ''No'' END AS isOlderThan24Hours
,bkup.database_backup_lsn
,bkup.differential_base_lsn
,bkup.first_lsn
,bkup.last_lsn
,bkup.fork_point_lsn
FROM master.dbo.sysdatabases sysdb
LEFT OUTER JOIN msdb.dbo.backupset bkup ON bkup.database_name = sysdb.name
INNER JOIN msdb.dbo.backupmediafamily AS bmf ON bkup.media_set_id = bmf.media_set_id
LEFT outer JOIN sys.backup_devices AS bd ON bmf.device_type = bd.type
LEFT outer JOIN msdb.dbo.backupmediaset AS bms ON bkup.media_set_id = bms.media_set_id
--WHERE backup_finish_date = (SELECT MAX(bkup.backup_finish_date) FROM msdb.dbo.backupset bkup WHERE sysdb.name = bkup.database_name) --Last backup
WHERE backup_finish_date > DATEADD(DAY, -1, (getdate())) -- Last 60 days
AND bkup.type=''L''
AND sysdb.name = ''?''
ORDER BY backup_start_date DESC, backup_finish_date';
Run Code Online (Sandbox Code Playgroud)
我尝试编写 'IF ''?'' NOT IN (''tempdb'') SELECT ......',但只有一个数据库的所有结果都相同。然后我尝试编写 AND sysdb.name <> ''tempdb'''' 但它给出了一个错误:
Msg 102, Level 15, State 1, Line 32
Incorrect syntax near 'DES'.
Msg 102, Level 15, State 1, Line 32
Incorrect syntax near 'DES'.
Msg 102, Level 15, State 1, Line 32
Incorrect syntax near 'DES'.
Msg 102, Level 15, State 1, Line 32
Incorrect syntax near 'DES'.
Msg 102, Level 15, State 1, Line 32
Incorrect syntax near 'DES'.
Msg 102, Level 15, State 1, Line 32
Incorrect syntax near 'DES'.
Msg 102, Level 15, State 1, Line 32
Incorrect syntax near 'DES'.
Msg 102, Level 15, State 1, Line 32
Incorrect syntax near 'DES'.
Msg 102, Level 15, State 1, Line 32
Incorrect syntax near 'DES'.
Msg 102, Level 15, State 1, Line 32
Incorrect syntax near 'DES'.
Msg 102, Level 15, State 1, Line 32
Incorrect syntax near 'DES'.
Msg 102, Level 15, State 1, Line 32
Incorrect syntax near 'DES'.
Msg 102, Level 15, State 1, Line 32
Incorrect syntax near 'DES'.
Msg 102, Level 15, State 1, Line 32
Incorrect syntax near 'DES'.
Msg 102, Level 15, State 1, Line 32
Incorrect syntax near 'DES'.
Msg 102, Level 15, State 1, Line 32
Incorrect syntax near 'DES'.
Msg 102, Level 15, State 1, Line 32
Incorrect syntax near 'DES'.
Msg 102, Level 15, State 1, Line 32
Incorrect syntax near 'DES'.
Msg 102, Level 15, State 1, Line 32
Incorrect syntax near 'DES'.
Run Code Online (Sandbox Code Playgroud)
一种可能性是检查 DB_Name = 'Tempdb',如果是 tempdb,则结束脚本。
这是我做的一个快速测试,它似乎有效:
EXEC sp_msforeachdb 'USE [?] IF DB_Name() = ''Tempdb''BEGIN RETURN END SELECT db_Name()'
Run Code Online (Sandbox Code Playgroud)
这将在每个 db 上运行代码,但如果它是 tempdb,它不会执行任何事情,因为它会返回。
众所周知,使用 sp_msforeachdb 并不总是最好的。Aaron 已经在博客中介绍了使用您可以使用的自制更换程序,您可能值得花时间去检查一下!打造更可靠和灵活的 spmsforeachdb
归档时间: |
|
查看次数: |
820 次 |
最近记录: |