Advertisement
Guest User

Untitled

a guest
Feb 6th, 2016
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.42 KB | None | 0 0
  1. SET ANSI_NULLS ON
  2. GO
  3.  
  4. SET QUOTED_IDENTIFIER ON
  5. GO
  6.  
  7. CREATE PROC [dbo].[ns_shrink_db_log]
  8.  
  9. @db_name SYSNAME = NULL
  10. , @target_size_mb INT = 2
  11. , @backup_location NVARCHAR(200) = NULL
  12. , @backup_file_name NVARCHAR(200) = NULL
  13. , @maximum_attempts INT = 10
  14.  
  15. /* Shrinks the log file of @db_name to the @target_size_mb
  16. *
  17. exec [dbo].[ns_shrink_db_log] 'scratch', 2, 'c:\temp\'
  18. , 'scratch_shirnk_backup', 4
  19. ************************************************************/
  20. AS
  21.  
  22. SET NOCOUNT ON
  23.  
  24. SELECT @db_name = COALESCE(@db_name, DB_NAME())
  25.  
  26. DECLARE @logical_log_file_name SYSNAME,
  27. @backup_log_sql NVARCHAR(MAX),
  28. @shrink_sql NVARCHAR(MAX),
  29. @checkpoint_sql NVARCHAR(MAX),
  30. @db_id INT = DB_ID (@db_name),
  31. @start_size_mb INT,
  32. @final_size_mb INT,
  33. @attempts INT = 0,
  34. @recovery_model INT,
  35. @recovery_model_desc SYSNAME,
  36. @rc INT = 0 -- return code
  37.  
  38. SELECT @logical_log_file_name = name,
  39. @start_size_mb = size / 128
  40. FROM MASTER..sysaltfiles
  41. WHERE dbid=@db_id AND fileid=2
  42.  
  43. SELECT @recovery_model = recovery_model
  44. , @recovery_model_desc = recovery_model_desc
  45. FROM sys.databases
  46. WHERE database_id=@db_id
  47.  
  48. PRINT 'Starting size of [' + @db_name + '].['
  49. + @logical_log_file_name
  50. + '] is '
  51. + CONVERT(VARCHAR(20), @start_size_mb) + ' MB '
  52. + ' recovery model = ' + @recovery_model_desc
  53.  
  54. IF @start_size_mb <= @target_size_mb BEGIN
  55. PRINT '['+@db_name+'] does not need shrinking'
  56. END
  57.  
  58. ELSE BEGIN
  59.  
  60.  
  61. IF @recovery_model != 3
  62. AND (@backup_file_name IS NULL OR @backup_location IS NULL) BEGIN
  63. RAISERROR ('Null backup file location or name. aborting.', 16, 1)
  64. SET @rc = 50000
  65. GOTO get_out
  66. END
  67.  
  68. WHILE @attempts < @maximum_attempts
  69. AND @target_size_mb < (SELECT CONVERT(INT, size/128) FROM MASTER..sysaltfiles
  70. WHERE dbid = @db_id AND
  71. name = @logical_log_file_name) -- not target
  72. BEGIN
  73.  
  74. SET @attempts = @attempts + 1
  75.  
  76. IF @recovery_model= 3 BEGIN
  77. SET @checkpoint_sql = 'use ['+@db_name+']; '
  78. + 'checkpoint'
  79. PRINT @checkpoint_sql
  80. EXEC (@checkpoint_sql)
  81. END
  82. ELSE BEGIN
  83. SET @backup_log_sql = 'BACKUP LOG ['+ @db_name + '] '
  84. + ' to disk = ''' + @backup_location
  85. + CASE WHEN RIGHT(RTRIM(@backup_location), 1)='\'
  86. THEN '' ELSE '\' END
  87. + @backup_file_name
  88. + CONVERT(VARCHAR(10), @attempts)
  89. + '.trn'''
  90. PRINT @backup_log_sql
  91.  
  92. EXEC (@backup_log_sql) -- See if a trunc of the log shrinks it.
  93. END
  94.  
  95. SET @shrink_sql = 'use ['+@db_name+'];'
  96. + 'dbcc shrinkfile (['+@logical_log_file_name+'], '
  97. + CONVERT(VARCHAR(20), @target_size_mb) + ')'
  98. EXEC (@shrink_sql)
  99. END
  100. END
  101.  
  102. SELECT @final_size_mb = size/128
  103. FROM MASTER..sysaltfiles
  104. WHERE dbid = @db_id AND name = @logical_log_file_name
  105.  
  106. PRINT 'Final size of [' + @db_name + '].['
  107. + @logical_log_file_name
  108. + '] is ' +
  109. CONVERT(VARCHAR(20),@final_size_mb)
  110. + ' MB'
  111.  
  112. get_out:
  113. RETURN @rc
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement