將表從一台伺服器複製到另一台伺服器,包括鍵和索引
我已經在一個小項目上工作了大約兩個星期。
我們希望整合來自多個遠端伺服器數據庫的一些表,以便在獨立於實時數據庫的情況下執行查詢和報告……有點像 DIY 迷你數據倉庫。
我們有三台 SQL Server 2008 遠端伺服器,我正在將數據編譯到一臺本地伺服器上,該伺服器執行三個單獨的 SQL Server Express 2017 實例。
SQL Server Express 數據庫都已設置完畢,我已經成功測試了使用幾種不同方法複製所需的表,包括:
- SSMS 導入/導出嚮導
- 以及使用新數據庫中的連結伺服器編寫腳本:
INSERT INTO dbo.table SELECT * FROM remoteserver.remotedatabase.dbo.remotetable
這兩個都成功複製了表和數據,但不是鍵、索引和其他約束。
我最近才在數據庫中工作,所以我自己也不知所措,Google提出了上述複製建議,但在伺服器之間傳輸表時,我找不到任何包含鍵、索引和其他約束的東西。
由於您想選擇性地編寫某些表的腳本,您可以使用dbatools 以程式方式編寫表、觸發器等,使用
Export-DbaScript
.或者,您也可以嘗試
Export-DbaDacPackage
使用 -table
參數。由於您使用的是連結伺服器,我的回答是哪個更有效:從連結伺服器中選擇還是插入連結伺服器?也會有所幫助。
我在我的一個站點也有類似的需求:我需要在維護期間每晚從生產環境中創建一個報告數據庫。我沒有使用連結伺服器,但方法應該是一樣的,假設您在遠端伺服器上有權限來添加索引和主鍵。在數據載入步驟之後,如果索引不存在,則執行您的創建索引和主鍵命令。
-- do the data loading INSERT INTO dbo.table SELECT * FROM remoteserver.remotedatabase.dbo.remotetable; -- create the indexes if they do not exist if NOT exists ( select * FROM [remoteserver].[remotedatabase].[dbo].[sysindexes] where name = 'pk_remotetable' ) ALTER TABLE [remoteserver].[remotedatabase].[dbo].[remotetable] ADD CONSTRAINT [pk_remotetable] PRIMARY KEY CLUSTERED ( [remotetable_ID] ASC ); go if NOT exists ( select * FROM [remoteserver].[remotedatabase].[dbo].[sysindexes] where name = 'nc_index1' ) CREATE NONCLUSTERED INDEX [nc_index1] ON [remoteserver].[remotedatabase].[dbo].[remotetable] ( [col1] ASC) INCLUDE ( [col2], [col3]) go
您可能想要試驗數據載入時間,以及是否更快地刪除索引、執行數據載入、然後重新創建它們 - 或 - 在數據載入之前創建索引。我相信您會發現在沒有索引的情況下數據載入速度更快,但事後創建索引仍然需要時間。
例如你可以試試這個
if exists ( select * FROM [remoteserver].[remotedatabase].[dbo].[sysindexes] where name = 'pk_remotetable' ) ALTER TABLE [remoteserver].[remotedatabase].[dbo].[remotetable] DROP CONSTRAINT [pk_remotetable] go if exists ( select * FROM [remoteserver].[remotedatabase].[dbo].[sysindexes] where name = 'nc_index1' ) DROP INDEX IX_index1 ON [remoteserver].[remotedatabase].[dbo].[remotetable] go
然後進行數據載入,然後如上所述創建 pk 和 nc 索引。
注意:我的回答有點理論,因為在我的情況下,我的數據載入是通過恢復 prod 的備份(而不是通過連結伺服器)完成的,但是在我的 SQL 代理工作中,我做了很多 OLTP 數據庫所需的索引刪除在生產中,但在報告中鋪墊,然後創建與報告相關的索引並幫助報告執行得更快。換句話說,我會在源數據庫中自動重新創建相同的索引,但我會在目標中創建專門用於報告需求而非 OLTP 需求的新索引。