Sql-Server-2014
通過連結伺服器的數據庫文件
有沒有另一種方法來創建一個腳本,我可以跨數據庫和跨伺服器查看所有數據庫文件及其磁碟空間詳細資訊?
我可以通過註冊伺服器做到這一點。
但我想知道我是否可以使用 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