DB太大?一鍵幫你收縮所有DB文件大小(Shrink Files for All Databases in SQL Server)

来源:http://www.cnblogs.com/lavender000/archive/2017/05/20/6882741.html
-Advertisement-
Play Games

本文介紹一個簡單的SQL腳本,實現收縮整個Microsoft SQL Server實例所有非系統DB文件大小的功能。 作為一個與SQL天天打交道的程式猿,經常會遇到DB文件太大,把空間占滿的情況: 而對於開發測試人員來說,如果DB數據不是特別重要的話,不會特意擴大磁碟空間,而是直接利用SQL的Shr ...


本文介紹一個簡單的SQL腳本,實現收縮整個Microsoft SQL Server實例所有非系統DB文件大小的功能。

 

作為一個與SQL天天打交道的程式猿,經常會遇到DB文件太大,把空間占滿的情況:

而對於開發測試人員來說,如果DB數據不是特別重要的話,不會特意擴大磁碟空間,而是直接利用SQL的Shrink File功能縮小DB文件大小,詳見:https://docs.microsoft.com/en-us/sql/relational-databases/databases/shrink-a-file

 

這裡介紹一個腳本,支持一鍵收縮整個SQL Server實例上所有非系統DB文件大小。

腳本支持功能和相關邏輯如下:

  • 五個系統DB(master、model、msdb、tempdb、Resource)不會執行Shrink File操作;
  • 如果DB的Recovery Model是FULL或者BULK_LOGGED,會自動改成SIMPLE,Shrink File操作後再改回原來的;
  • 只會對DB狀態為ONLINE的DB進行Shrink File操作;
  • DB的所有文件,包括數據文件和日誌文件都會被執行收縮操作;
  • 執行SQL腳本的用戶需要有sysadmin或者相關資料庫的DBO許可權。

腳本如下:

 1 -- Created by Bob from http://www.cnblogs.com/lavender000/
 2 use master
 3 DECLARE dbCursor CURSOR for select name from [master].[sys].[databases] where state = 0 and is_in_standby = 0;
 4 DECLARE @dbname NVARCHAR(255)
 5 DECLARE @recoveryModel NVARCHAR(255)
 6 DECLARE @tempTSQL NVARCHAR(255)
 7 DECLARE @dbFilesCursor CURSOR
 8 DECLARE @dbFile NVARCHAR(255)
 9 DECLARE @flag BIT
10 
11 OPEN dbCursor
12 FETCH NEXT FROM dbCursor INTO @dbname
13 
14 WHILE @@FETCH_STATUS = 0
15 BEGIN
16     if((@dbname <> 'master') and (@dbname <> 'model') and (@dbname <> 'msdb') and (@dbname <> 'tempdb') and (@dbname <> 'Resource'))
17     begin
18         print('')
19         print('Database [' + @dbname + '] will be shrinked log...')
20         SET @flag = 1
21         SET @recoveryModel = (SELECT recovery_model_desc FROM sys.databases WHERE name = @dbname)
22         if((@recoveryModel = 'FULL') or (@recoveryModel = 'BULK_LOGGED'))
23         begin
24             SET @tempTSQL = (select CONCAT('ALTER DATABASE [', @dbname, '] SET RECOVERY SIMPLE with no_wait'))
25             EXEC sp_executesql @tempTSQL
26             if (@@ERROR = 0)
27             begin
28                 print('    Database [' + @dbname + '] recovery model has been changed to ''SIMPLE''.')
29                 SET @flag = 1
30             end
31             else
32             begin
33                 print('Database [' + @dbname + '] recovery model failed to be changed to ''SIMPLE''.')
34                 SET @flag = 0
35             end
36         end
37 
38         if(@flag = 1)
39         begin
40             SET @tempTSQL = (select CONCAT('use [', @dbname, ']'))
41             EXEC sp_executesql @tempTSQL            
42             SET @dbFilesCursor = CURSOR for select sys.master_files.name from sys.master_files, [master].[sys].[databases] where databases.name = @dbname and databases.database_id = sys.master_files.database_id
43             open @dbFilesCursor
44             FETCH NEXT FROM @dbFilesCursor INTO @dbFile
45             WHILE @@FETCH_STATUS = 0
46             BEGIN
47                 SET @tempTSQL = (select CONCAT('use [', @dbname, '] DBCC SHRINKFILE (N''', @dbFile, ''') with NO_INFOMSGS'))
48                 EXEC sp_executesql @tempTSQL
49                 if(@@ERROR = 0)    print('        Database file [' + @dbFile + '] has been shrinked log successfully.')
50                 FETCH NEXT FROM @dbFilesCursor INTO @dbFile
51             END
52             CLOSE @dbFilesCursor
53             DEALLOCATE @dbFilesCursor
54 
55             if(@recoveryModel <> 'SIMPLE')
56             begin
57                 -- Finally changed back
58                 SET @tempTSQL = (select CONCAT('ALTER DATABASE [', @dbname, '] SET RECOVERY ', @recoveryModel, ' with no_wait'))
59                 EXEC sp_executesql @tempTSQL
60                 if (@@ERROR = 0)
61                 begin
62                     print('    Database [' + @dbname + '] recovery model has been changed back to ''' + @recoveryModel + '''')
63                 end
64                 else 
65                 begin
66                     print('    Database [' + @dbname + '] recovery model failed to be changed back to ''' + @recoveryModel + '''')
67                 end
68             end
69         end
70     end
71 FETCH NEXT FROM dbCursor INTO @dbname
72 END
73 
74 CLOSE dbCursor
75 DEALLOCATE dbCursor

執行完效果如下:

 

Note:

  • 如果不放心使用,可提前備份相關資料庫;
  • 使用前請仔細閱讀腳本支持功能和相關邏輯,如與自己需求不符,請不要使用該腳本,或者請根據自己需求自行修改腳本;
  • 腳本為簡易腳本,僅用於測試學習,可能有BUG,不可生產環境使用,如有錯誤,請留言。

 

[原創文章,轉載請註明出處,僅供學習研究之用,如有錯誤請留言,謝謝支持]

[原站點:http://www.cnblogs.com/lavender000/p/6882741.html,來自永遠薰薰]


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 背景描述 重裝的Mac系統,一切開發相關的配置從零開始。 描述文件 初始狀態 從開發者賬號上下載開發所需要的描述文件之後,提示如下 它提示4個要點的信息缺少了2個,點擊紅框部分,提示如下 它提示現在使用的描述文件中的證書是缺乏與其相對的私鑰的,私鑰是從當前設備製作的,之後還需要上傳到開發者賬號進行重 ...
  • 在String.xml中添加: ...
  • 一直以來,做 Java web 開發都是用 eclipse , 可是到 eclipse 官網一看,我的天 http://www.eclipse.org/downloads/eclipse-packages/ 那麼多應該下載哪一個?這是一個問題? 其實 eclipse 為每一種開發者,都提供了不同的版 ...
  • 1.MongoDB簡介 MongoDB介紹 MongoDB是面向文檔的非關係型資料庫,不是現在使用最普遍的關係型資料庫,其放棄關係模型的原因就是為了獲得更加方便的擴展、穩定容錯等特性。面向文檔的基本思路就是:將關係模型中的“行”的概念換成“文檔(document)”模型。面向文檔的模型可以將文檔和數 ...
  • 一般namenode只格式化一次,重新格式化不僅會導致之前的數據都不可用,而且datanode也會無法啟動。在datanode日誌中會有類似如下的報錯信息: java.io.IOException: Incompatible clusterIDs in /tmp/hadoop-root/dfs/da ...
  • 0x00 背景 這兩天處於轉牛角尖的狀態,非常不好。但是上一篇的中提到的問題總算是總結了些東西。 傳送門:疑問點0x02(4) 0x01 測試過程 (1)測試環境情況:創建瞭如下測試表test, mysql> select * from test;+ + + +| user_id | user | ...
  • 【1. 問題描述】 【2. 查找原因】 【3. 解決問題】 本文網址[tom-and-jerry發佈於2017-05-20 18:46] http://www.cnblogs.com/tom-and-jerry/p/6882857.html ...
  • 如何用VBA操作MySQL資料庫?如何直接使用Excel操作MySQL資料庫? ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...