資料遷移常用方法
SQL SERVER幾種資料遷移/匯出匯入的實踐
SQLServer提供了多種資料匯出匯入的工具和方法,在此,分享我實踐的經驗(只涉及資料庫與Excel、資料庫與文字檔案、資料庫與資料庫之間的匯出匯入)。
(一)資料庫與Excel
方法1:
使用資料庫客戶端(SSMS)的介面工具。右鍵選擇要匯出資料的資料庫,選擇“任務”——“匯出資料”,下圖1,按照嚮導一步一步操作即可。而匯入則相反,匯入時,SQLServer會預設建立一張新表,欄位名也預設跟匯入的Excel標題一樣,並且會預設欄位資料型別等。當然在可以在嚮導進行修改。需要注意的是如果標題不是英文而是中文,預設建立欄位名也是中文,這將給後面資料更新操作帶來麻煩,所以最好還是以有意義的英文欄位名。把資料匯入後,再通過執行語句,把資料插入/更新到業務表。
figure-1:任務——匯出資料
方法2:
從SQLServer2005開始,可以直接在SSMS上查詢出來的結果複製,然後貼上到Excel上,對於少量資料來說,是非常快速方便的,需要注意的是長數字可能會變成科學記數法的形式,提前在Excel上指定列的格式為文字即可。
匯入的話,ctrl + c 複製Excel上的資料,然後在選擇相關表,編輯資料,把資料直接貼上上去即可。但是不建議直接貼上到業務表(如果表是空白沒有資料,並且欄位順序對應,可以這樣操作),而是建議先貼上到一個新建的中間表中,然後再通過語句,把資料插入/更新到業務表。
這種方法的匯出匯入,適合於少量的資料,如5000行以內的記錄,大於5000行以上就不建議了,速度較慢,如果資料過大,還一定成功。
(二)資料庫與文字檔案、資料庫與資料庫
資料庫之間的資料遷移或匯出匯入其實是比較方便的,比如備份資料庫後,在新的機器上做恢復。但是需要注意的是SQL2008之前的版本的備份無法在SQL2012或以上版本上直接恢復的,而是通過中間的SQL2008做一個過渡,把舊版本的資料庫恢復到SQL2008,然後做備份,最後在SQL2012上恢復。
如果是新版本(下面以SQL2012為例)的備份檔案恢復到舊版本(以SQL2008為例)上就比較麻煩了,一般是不支援新版本備份檔案在舊版本中恢復的。只能通過編寫指令碼,把新版本的資料匯入到舊版本中。
方法1:
首先推薦使用的是資料不落地的“連結伺服器”。使用SQL2012的SSMS,同時連線到SQL2012和SQL2008的例項,通過編寫指令碼把SQL2012的資料匯入到SQL2008中。兩個例項的可以通過連結伺服器來連線。以下是設定步驟。
figure-2:新建連結伺服器
figure-3:連結伺服器和資料來源
figure-4:認證
figure-5:建立成功後,可以直接瀏覽連結伺服器的目錄,也可以使用語句查詢了。
也可以使用指令碼來建立連結伺服器。
--建立連結伺服器 EXEC sp_addlinkedserver @server='LINKED_SERVER_TEST2',--被訪問的伺服器別名 @srvproduct='', @provider='SQLOLEDB', @datasrc='192.168.88.6,11433'--資料來源 GO --建立登入名和密碼 EXEC sys.sp_addlinkedsrvlogin @rmtsrvname = 'LINKED_SERVER_TEST2', -- 被訪問的伺服器別名 @useself = 'false', @locallogin = NULL, @rmtuser = 'sa', -- 資料來源登入名 @rmtpassword = 'psd123456' -- 資料來源登入密碼 GO --設定資料可以訪問 EXEC sys.sp_serveroption @server = 'LINKED_SERVER_TEST2', @optname = 'data access', @optvalue = N'true' GO
code-1:建立連結伺服器的指令碼
建立成功後,可以直接查詢資料。
figure-6:查詢連結伺服器的資料
通過檢視sys.servers可以查詢所有伺服器及相關的屬性。
figure-7:查詢所有連結伺服器
在SSMS上或執行以下指令碼可以刪除指定的連結伺服器。
--刪除連結伺服器及所有登入 EXEC sys.sp_dropserver @server = 'LINKED_SERVER_TEST2', @droplogins = 'droplogins' GO
code-2:刪除連結伺服器及所有登入
詳細請參考:https://technet.microsoft.com/zh-cn/library/ff772782%28v=sql.105%29.aspx
方法2:
如果兩個例項不能連線,只能在SQL2012上匯出資料,再到SQL2008上匯入。SQLServer提供生成包含資料的指令碼工具,下圖2。在第三步的“高階”選項裡有一項“Types of data to scripts”有三個選擇:Data only,Schema and data,Schema only,分別是隻生成資料、生成表(物件)和資料,表(物件)。還有生成指令碼的版本“Script for Server Version”,下圖3。其他選項,按實際需要選擇。
figure-8:任務——生成指令碼
figure-9:生成指令碼的高階選項
也可以使用儲存過程生成包含資料的指令碼。這裡介紹一個別人已經做寫好儲存過程:sp_generate_inserts。執行之後,會按表每條記錄生成一條insert的語句
View Code
code-3:sp_generate_inserts指令碼原始碼
在我的實際使用中,只有兩三個引數比較常用,分別是@table_name、@from和@owner,如果表的架構使用預設的dbo,則可以省略。以下是一個使用的例子:
figure-10:使用sp_generate_inserts的一個例子
其他引數的用法,這裡就不一一解釋了。我經常使用這個儲存過程做一些簡單而少量(如數萬行記錄以內)的資料匯出匯入,比前面介紹的方法方便快捷許多。但這個儲存過程支援處理一般常用的資料型別,像XML這種型別則不支援。還有,如果生成的資料太多太大,SSMS返回資料會很慢,甚至SSMS會掛了,這時還是使用SSMS自帶的匯出指令碼到檔案穩妥些。如果使用生成的資料指令碼檔案很大,幾百MB甚至上GB,在匯入時,就不能直接使用SSMS直接開啟來執行了。可以使用SQLCMD實用工具來在執行指令碼。如下面的一個例子,在D盤下有一個指令碼1.sql,內容為:
USE AdventureWorks2008R2 GO SELECT * FROM Person.CountryRegion; GO
code-4:SQLMCD的測試指令碼
在執行下輸入CMD,輸入:
sqlcmd -S localhost -d AdventureWorks2008R2 -i D:\1.sql
code-5:SQLMCD的命令
回車執行後如下圖,SQLCMD的詳細用法,請參考:https://msdn.microsoft.com/zh-cn/library/ms180944.aspx
和 https://msdn.microsoft.com/zh-cn/library/ms162773%28v=sql.105%29.aspx
figure-11:SQLCMD的測試例子
方法3:
使用BCP匯出匯入大容量資料