2012-05-09 278 views
32

我一直在試圖從Win2008服務器上的常規SQL Server移到Amazon AWS RDS上的SQL Server。遷移到Amazon SQL Server RDS

我認爲一個簡單的備份和恢復工作。儘管AWS RDS似乎無法訪問文件系統,因此sql腳本似乎都需要源服務器和目標服務器上的本地文件系統。我試圖使用以下腳本

exec sp_addlinkedserver @server='test.xxxx.us-east-1.rds.amazonaws.com' 

-- Verify that the servers were linked (lists linked servers) 
exec sp_linkedservers 

EXEC ('RESTORE DATABASE [orchard] FROM DISK = ''C:\Temp\orchard.bak'' WITH FILE = 1, NOUNLOAD, STATS = 10') 
AT [test.xxxx.us-east-1.rds.amazonaws.com] 

任何建議都會有幫助。

+0

你只是在傳輸數據庫模式,還是需要傳輸數據? – JeffO

+1

亞馬遜RDS的事實並不包含在內。您必須記住,無論您何時訪問本地文件系統,都與運行T-SQL的數據庫引擎有關。在這種情況下,您正嘗試從Amazon實例的C驅動器恢復文件。那個文件在那裏不存在。如果可能,請將文件以某種方式上傳到服務器上,然後通過UNC訪問它。但是,如果RDS無法實現這一點,我不會感到驚訝。 –

+0

Jeff O數據也是如此。 – darwindave

回答

51

下載免費從CodePlex 'SQL Azure遷移向導' - 我做了一個簡短blog/screencast這一點。務必將嚮導中的'TO'設置設爲AWS DNS名稱,然後使用'SQL Server 2008'和而不是'SQL Azure'

+0

謝謝林恩。下次我會記住這一點。 – darwindave

+3

我想亞馬遜不想鏈接到此自己的文檔,但是遠遠比他們有什麼建議遷移(我已經在前面浪費小時小時) – petenelson

+2

有人在引用在底部悄悄更簡單的方法這個論壇/投訴:https://forums.aws.amazon.com/message.jspa?messageID=442219#442219 – drzaus

3

在源數據庫的sql server management studio中使用導出嚮導。右鍵單擊數據庫>任務>導出數據。有一個嚮導會引導您將整個數據庫發送到遠程SQL服務器。

+0

這是一種痛苦,因爲默認選項沒有得到你的工作分貝。你至少需要進入短信工具 - >選項 - > SQL Server的對象Explorer的>腳本和你做出口前設置「的依賴對象生成腳本」和「腳本索引」爲真。 – jaminto

+0

另外,速度很慢。 –

8

我使用.bak文件遷移SQL數據庫時獲得AWS支持的官方詞語是它不受支持。所以沒有更多從.bak文件快速恢復。他們所提供的官方幫助這裏現有的數據庫遷移:

Official AWS database migration guide

而且也給了我一個眼色非官方的Azure數據庫遷移工具。只需使用它來生成您的架構和/或數據的腳本,並針對您的RDS實例執行它。它是一個很好的工具。您必須首先將.bak導入非RDS SQL服務器才能執行此操作。

SQL Azure migration tool

+0

您現在可以從一個.bak文件恢復到RDS - http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/SQLServer.Procedural.Importing.html – jaminto

6

我使用基於琳的截屏的SQL Azure遷移工具寫了一些一步一步的指示,how to restore a .bak file to RDS。這是一種比官方說明簡單得多的方法,對於我遷移的多個數據庫來說,它運行良好。

+0

實際上這是我去過的最好的方法之一遇到 - 亞馬遜不支持正確導入/導出壓縮的本地備份是非常大的恥辱。我們在亞馬遜的客戶經理很清楚這個問題的知道它真的尿尿人過 - 但我們沒有,如果/當它永遠不會支持一個清晰的思路:( – Kram

+0

我通過谷歌搜索碰到您的文章它的工作完美令人驚訝的是,謝謝! – David

4

您可能會發現Data-tier Applications BACPAC格式將爲您提供最方便的解決方案。您可以使用Export生成包含數據庫模式和數據的文件。 Import將創建一個新數據庫,該數據庫使用基於該文件的數據填充。

Backup and Restore操作不同,導出和導入不需要訪問數據庫服務器的文件系統。

您可以使用SQL Server Management Studio中BACPAC文件或通過在.NET中,PowerShell中的API,但MSBuild的等

Export Data-tier Application Dialog

注意是否有使用這種方法來導出,然後導入問題來自和到Amazon RDS。當在RDS上創建新數據庫時,會在其中創建以下兩個對象。

  • 具有db_owner角色成員身份的用戶。
  • 的rds_deny_backups_trigger觸發

The rds_deny_backups_trigger Trigger

在導入過程中,會有之間列入BACPAC文件,由RDS自動添加的那些對象的衝突。這些對象都存在於BACPAC文件中,並且在創建新數據庫時由RDS自動創建。

如果您有一個非RDS SQL Server實例,那麼您可以將BACPAC導入該實例,然後刪除上述對象,然後導出數據庫以創建新的BACPAC文件。當你將它恢復到RDS實例時,這個不會有任何衝突。

否則,可以使用以下步驟解決此問題。

  1. 編輯BACPAC文件中的model.xml文件(BACPAC只是zip文件)。
  2. 刪除其Type屬性中與以上列出的對象相關的以下值(由RDS自動添加的對象)中的元素。
    • SqlRoleMembership
    • SqlPermissionStatement
    • SqlLogin
    • SqlUser
    • SqlDatabaseDdlTrigger
  3. 生成使用的ComputeHash方法之一在SHA256的model.xml文件的修改版本的校驗類。
  4. 使用BitConverter.ToString()方法將散列轉換爲十六進制字符串(您將需要刪除分隔符)。
  5. 用新文件替換origin.xml文件中的Checksum元素(也包含在BACPAC文件中)中的現有散列。
  6. 通過將原始文件的內容壓縮並用新版本替換model.xml和origin.xml文件來創建新的BACPAC文件。不要爲此使用System.IO.Compression.ZipFile,因爲似乎與生成的zip文件有衝突 - 數據未包含在導入中。我用7Zip沒有任何問題。
  7. 導入新的BACPAC文件,並且不應與RDS自動生成的對象有任何衝突。

注:還有一種,與導入BACPAC到RDS使用SQL Server Management Studio中,我解釋here相關的問題。