2016-09-23 165 views
0

我們有多個SQL Server,其中大多數都是獨立的。我需要創建一個存儲過程/視圖,將所有數據庫名稱插入到所有服務器的表中。從多個服務器獲取所有數據庫名稱

有沒有辦法通過存儲過程或視圖來做到這一點?我沒有任何PowerShell或.Net的經驗。

這是我到目前爲止。我只是無法弄清楚如何從服務器跳轉到服務器,並將所有結果添加到真實的表格中。

CREATE TABLE ##temp 
(
DATABASE_NAME VARCHAR(100), 
DATABASE_SIZE INT, 
REMARKS VARCHAR(500) 
) 


INSERT into ##temp 
EXEC [sp_databases] 

--doing this to also get ServerName along with the db name. 
--When I insert into a real table, I'll seperate it into two columns plus remove "@[email protected]" 
update ##temp 
set DATABASE_NAME = (select @@SERVERNAME) + '@[email protected] ' + DATABASE_NAME 
where DATABASE_NAME not like '%@[email protected]%' 

select DATABASE_NAME from ##temp 
+0

你可以通過'Registered Servers'窗口對多個服務器執行查詢 –

回答

1

對於這種事情,至少有一臺服務器與所有需要信息的服務器有鏈接連接是很好的。如果你這樣做,那麼你可以使用我寫的這個小腳本:

-- (1) Create global temp table used to store results 
IF OBJECT_ID('tempdb..##databases') IS NOT NULL DROP TABLE ##databases; 
CREATE TABLE ##databases 
(
    serverDBID int identity, 
    serverName varchar(100), 
    databaseName varchar(100), 
    databaseSize decimal(20,6) 
); 

-- (2) Create and populate table variable used to collect server names 
DECLARE @servers TABLE(id int identity, serverName varchar(100)); 
INSERT @servers(serverName) 
SELECT name FROM sys.servers; 

-- (3) loop through each DB and collect database names into ##databases 
DECLARE @i int = 1, @serverName varchar(100), @db varchar(100), @sql varchar(8000); 
WHILE @i <= (SELECT COUNT(*) FROM @servers) 
BEGIN 
    SELECT @serverName = serverName FROM @servers WHERE id = @i; 

    SET @sql = 'INSERT ##databases(serverName, databaseName) SELECT '''[email protected]+ 
      ''', name FROM master.sys.databases'; 
    EXEC (@sql); 

    SET @i += 1; 
END; 

-- (4) Collect database sizes 
SET @i = 1; -- reset/re-use @i; 
WHILE @i <= (SELECT COUNT(*) FROM ##databases) 
BEGIN 
    SELECT @serverName = serverName, @db = databaseName 
    FROM ##databases 
    WHERE serverDBID = @i; 

    SET @sql = 
    'UPDATE ##databases 
    SET databaseSize = 
    (SELECT sum(size)/128. FROM ['[email protected]+'].['[email protected]+'].sys.database_files) 
    WHERE serverDBID = '+CAST(@i AS varchar(4))+';' 

    BEGIN TRY 
    EXEC (@sql); 
    END TRY 
    BEGIN CATCH 
    PRINT 'There was an error getting dbsize info for '[email protected]+' > '[email protected]; 
    END CATCH; 

    SET @i += 1; 
END; 

-- Final Output 
SELECT * FROM ##databases; 
2

SQL Server Management Studio允許您使用Registered Servers功能執行query against multiple servers。這是添加在SQL Server 2008 as this tutorial shows,所以你不應該擔心兼容性。

運行多臺服務器的查詢很簡單:

  1. View菜單中,選擇'註冊的服務器。這將打開一個類似於顯示單個服務器的對象的對象資源管理器的新窗口。
  2. 將所有服務器連接的詳細信息將連接添加在Local Server Groups文件夾的本地服務器組文件夾
  3. 右鍵單擊並選擇New Query。您在此處輸入的查詢將運行所有註冊的服務器。
  4. 要查找所有數據庫運行select * from sys.databases或只是sp_databases

SSMS將收集來自所有服務器的結果,並在網格中顯示它們。如果您希望結果轉到單個服務器的表中,則必須將目標服務器作爲鏈接服務器添加到所有其他服務器,並使用四部分名稱來定位目標表,例如INSERT INTO myManagementServer.MyDb.dbo.ThatTable...

SQL服務器具有更強大的管理多臺服務器的功能。您可以通過Central Management Server管理多臺服務器,並通過策略將設置應用於多臺服務器。這個功能也被加入2008年

在SQL Server 2008 R2的SQL Server Utility其中加入了去,甚至更遠,並在管理倉庫的報告收集診斷指標,從多臺服務器,並將其存儲性能數據。想象一下,能夠看到例如多個服務器的存儲和查詢性能,或者過去X個月的可用空間趨勢。

缺點是歷史數據需要空間。收集它也需要向所有受監視的服務器添加一些存儲過程,儘管這是自動完成的。

相關問題