Advertisement
jnm2

Easy db backup and restore

Dec 20th, 2014
180
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 3.79 KB | None | 0 0
  1. declare @dbname nvarchar(max), @includeAllVersions bit, @includeOverwritten bit, @includeNonDisk bit;
  2.  
  3. -- Filter parameters
  4. set @dbname = ''
  5. set @includeAllVersions = 1;
  6. set @includeOverwritten = 1;
  7. set @includeNonDisk = 1;
  8.  
  9.  
  10. /*
  11.     [database_creation_version] is 0 for the current database guid (or most recent, if the db does not currently exist).
  12.     If you have backups from a previous database with the same name, the version will be negative.
  13.     If you have backups from a new database with the same name, the version will be positive.
  14.     Any backup with version 0 can be restored without REPLACE; any other backups will require it.
  15.  
  16.     [backup_overwritten] indicates that the same path was used for a later backup, so that backup is no longer available.
  17.  
  18.     [restore_script] contains the script SQL Server Management Studio would use to perform the restore.
  19.     If you want to restore to that point, copy and paste into a query window to execute it.
  20. */
  21.  
  22.  
  23. with family_order_lookup as (
  24.     select family_guid, database_name, row_number() over (partition by database_name order by min(database_creation_date)) as [version]
  25.     from (
  26.         select family_guid, database_name, database_creation_date as database_creation_date from msdb..backupset
  27.         union all -- in case the current database family does not have a backup
  28.         select family_guid, name, create_date from sys.databases join sys.database_recovery_status on database_recovery_status.database_id = databases.database_id
  29.     ) family_dates
  30.     group by family_guid, database_name
  31. )
  32. select
  33.     *,
  34.     case when backup_overwritten = 0 then
  35.         case when backup_device_type = 'disk' then
  36.             'use master;' + char(13)+char(10) +
  37.             'alter database ' + quotename(database_name) + ' set single_user with rollback immediate;' + char(13)+char(10) +
  38.             'restore database ' + quotename(database_name) + ' from disk = ' + quotename(backup_physical_device_name, '''') + case when database_creation_version = 0 then ';' else ' with replace;' end + char(12)+char(10) +
  39.             'alter database ' + quotename(database_name) + ' set multi_user;'
  40.         end
  41.     end as restore_script
  42. from (
  43.     select
  44.         backupset.database_name,
  45.         (select [version] from family_order_lookup where database_name = backupset.database_name and family_guid = backupset.family_guid) -
  46.         (select [version] from family_order_lookup where database_name = backupset.database_name and family_guid = database_recovery_status.family_guid) as database_creation_version,
  47.         cast(backupset.backup_start_date as datetime2(0)) as backup_start_date,
  48.         case backupset.[type]
  49.             when 'D' then 'database'
  50.             when 'I' then 'differential database'
  51.             when 'L' then 'log'
  52.             when 'F' then 'file or filegroup'
  53.             when 'G' then 'differential file'
  54.             when 'P' then 'partial'
  55.             when 'Q' then 'differential partial'
  56.         end as backup_type,
  57.         backupmediafamily.physical_device_name as backup_physical_device_name,
  58.         case backupmediafamily.device_type
  59.             when 2 then 'disk'
  60.             when 5 then 'tape'
  61.             when 7 then 'virtual device'
  62.             when 105 then 'a permanent backup device'
  63.         end as backup_device_type,
  64.         cast(case when row_number() over (partition by physical_device_name order by backupset.backup_start_date desc) = 1 then 0 else 1 end as bit) as backup_overwritten
  65.     from msdb..backupmediafamily
  66.     join msdb..backupset on backupset.media_set_id = backupmediafamily.media_set_id
  67.     join sys.databases on databases.name = backupset.database_name
  68.     join sys.database_recovery_status on database_recovery_status.database_id = databases.database_id
  69. ) backups
  70. where (coalesce(@dbname, '') = '' or database_name = @dbname)
  71.   and (coalesce(@includeAllVersions, 1) = 1 or database_creation_version = 0)
  72.   and (coalesce(@includeOverwritten, 1) = 1 or backup_overwritten = 0)
  73.   and (coalesce(@includeNonDisk, 1) = 1 or backup_device_type = 'disk')
  74. order by database_name, backup_start_date;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement