Sql-Server

分離 Devops 實例硬碟

  • June 18, 2018

我們目前在同一個虛擬機上擁有 SQL Server Dev、QA 和 StagingUAT 實例。產品駐留在自己的伺服器中。

問題是,如果 Dev 上的一個數據庫 MDF 或 TransactionLog 突然佔用太多空間,它會清除所有其他 Devops 實例的硬碟空間。它們都共享相同的驅動器。這是單點故障。我繼承了這個遺留系統。

目前****Dev、QA 和 StagingUAT 數據庫 MDF具有相同 的G:\ 驅動器。

開發數據庫:在 G:\Dev

G:\QA 上的 QA 數據庫

在 G:\Staging 上暫存數據庫

事務日誌開啟:

開發數據庫:在 H:\Dev

H:\QA 上的 QA 數據庫

在 H:\Staging 上暫存數據庫

防止一個實例的問題突然佔用太多空間的最佳方法是什麼?

方法 1: 我建議每個 Devops 實例都有自己的驅動器。

中密度纖維板數據庫:

開發數據庫:在 A:\Dev

B:\QA 上的 QA 數據庫

在 D:\Staging 上暫存數據庫(跳過 C:)

交易記錄:

開發數據庫:在 E:\Dev

F:\QA 上的 QA 數據庫

在 G:\Staging 上暫存數據庫

方法二:

讓每個子文件夾都有它可以消耗的最大硬碟空間。G:\Dev 最多只能佔用 10 GB。

G:\QA 最多只能佔用 10 GB。

G:\Staging 最多只能佔用 10 GB。

我們有目前規則,同一個 Devops 實例上的數據庫應該在同一個驅動器上。目前我們只能為這些 devops 實例配置 1 個 VM。

只是好奇解決此問題的最佳方法。創建 Devops 實例時,每個實例是否應該與其他實例分開?

對於每個數據庫,您可以設置每個文件的最大大小。 關於設置增長和文件大小的文章

這是微軟關於 alter file 命令的詳細資訊

這樣做的好處是您可以將每個數據庫設置為具有不同的文件大小,並且您不必費心創建新驅動器和移動每個數據庫。

您可以通過點擊每個數據庫的文件部分中的操作來設置每個文件的最大文件大小。

或者,您可以通過在 sys.files 表上進行選擇並建構一些字元串來編寫語句。

declare @usage table(Fileid int, FileGroup int, TotalExtents float, UsedExtents float, Name sysname, FileName nchar(520))
insert  @usage exec('dbcc showfilestats');
select [name], ((totalextents * cast(64 as float))/1024) [total]
,((usedextents * cast(64 as float))/1024) [used]
,((totalextents * cast(64 as float))/1024) - ((usedextents * cast(64 as float))/1024) [free]
, ((totalextents * cast(64 as float))/1024) - (((totalextents * cast(64 as float))/1024) - ((usedextents * cast(64 as float))/1024)) + ( (((totalextents * cast(64 as float))/1024) - ((usedextents * cast(64 as float))/1024)) * .3  ) [reduce]
,(1-(((usedextents * cast(64 as float))/1024) / ((totalextents * cast(64 as float))/1024))) [free %]
, 'alter database ' + DB_NAME() + ' modify file (name=' + rtrim([name]) + ', MAXSIZE = 50MB);' [Set Max File]
,'DBCC shrinkfile ([' + [name] + '],' + 
   cast(
       cast((((usedextents * cast(64 as float))/1024) + ( (((totalextents * cast(64 as float))/1024) - ((usedextents * cast(64 as float))/1024)) * .3  ))
       as int)
    as varchar)
+ ');' [shrink]
, len(substring([name], 1, 36))
--, (select gender + ' ' + sport from v_sportseason where id = substring([name], 1, 36))
, [filename]
, 'alter database ' + DB_NAME() + ' modify file (name=' + rtrim([name]) + ', filename=''' + rtrim([filename]) +''');' [Move File]
from @usage

引用自:https://dba.stackexchange.com/questions/209330