Sql-Server-2014

通過連結伺服器的數據庫文件

  • December 21, 2017

有沒有另一種方法來創建一個腳本,我可以跨數據庫和跨伺服器查看所有數據庫文件及其磁碟空間詳細資訊?

我可以通過註冊伺服器做到這一點。

但我想知道我是否可以使用 1 個實例和所有伺服器的連結伺服器來做到這一點。我的想法是生成一個腳本,它將讀取每個連結伺服器的每個數據庫,然後當我擁有所有數據時,它現在可以傳遞給 SQL Server 作業。

謝謝。

Powershell就是這樣。而且它更容易,只需在您的一台管理伺服器上安裝 dbatools 並使用get-dbadiskspace

Get-DbaDiskSpace -ComputerName server1, server2, server3 -Unit GB

如果您有伺服器列表,那麼您可以使用

$servers = get-content "D:\serverlist.txt"
foreach ($server in $servers) {
 Get-DbaDiskSpace -ComputerName $server -Unit GB
}

您甚至可以使用invoke-sqlcmd2將上述資訊轉儲到中央數據庫中進行報告。

您可以從sys.servers視圖中獲取連結伺服器的列表。然後,您可以使用游標瀏覽列表並生成動態 sql以針對每個伺服器執行。

下面是一個從所有連結伺服器檢索多個數據庫屬性的範例。

declare @servername varchar(255)
declare @sql nvarchar(4000)

DECLARE c_databases CURSOR 
FOR    
SELECT  name FROM  sys.servers where is_linked = 1
-- Open the cursor.
OPEN c_databases 
-- Loop through the partitions.
WHILE (1=1) 
BEGIN    
       FETCH NEXT FROM c_databases        
       INTO @servername

       IF @@FETCH_STATUS < 0 
       BREAK 

               set @sql = N'
               select d.database_id,d.name as databasename,sp.name as owner,d.compatibility_level,cast(round(sum(mf.Size)/128,0) as float) as size,d.collation_name, d.user_access_desc,d.recovery_model_desc,d.is_read_only 
               From ['+@servername+'].master.sys.databases d
               inner join ['+@servername+'].master.sys.server_principals sp
               on d.owner_sid = sp.sid
               inner join ['+@servername+'].master.sys.master_files mf
               on d.database_id = mf.database_id
               where d.database_id <> 2
               group by d.database_id,d.name,sp.name,d.compatibility_level,d.collation_name, d.user_access_desc,d.recovery_model_desc,d.is_read_only,d.state'

               --print @sql
               EXEC sp_executesql @sql

END

CLOSE c_databases
DEALLOCATE c_databases 
GO

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