標籤:style blog http color io 使用 ar strong 檔案
nohup ./command.sh > output 2>&1 &
SQL遷移到ORACLE執行個體
日常營運中,我們經常會有資料庫不同類型的遷移,比較多的就是從sql server遷移到oracle 的情況,前一階段正好有一個類似的項目進行,我將其中的一些注意事項記錄下來。
一、遷移的方案
之前也進行過sql -> oracle的遷移,使用過sql server的dts也單獨自己寫過sqlloader指令碼,但是兩種方案都不是很滿意,dts經常出錯,sqlldr的手工編輯很費勁,稍不注意就會寫錯。
這次參考了http://www.cnblogs.com/hiizsk/archive/2011/07/10/2102452.html
使用ORACLE SQL DEVELOPER進行了操作,效果不錯。
以下有幾個需要特別注意的事情,提前說,很重要的。
- ORACLE SQL DEVELOPER不是pl/sql developer,這個要注意啊
- ORACLE SQL DEVELOPER的版本問題,上面地址參考文檔或者從oracle官方網站下載的我都沒有實驗成功,反而到是一個比較老的版本3.0.04的版本實驗成功了,在文檔最後我提供了下載,這個版本是沒有jre的,對應的是6不是7啊,請自行安裝,在首次啟動並執行時候提示指定jre6的路徑,指定對了就可以正常運行了。
- 上面文檔中沒有提及怎麼匯入,這個是非常重要的,需要將匯出的文檔上傳到伺服器執行。
- 編碼,這個是折騰我最多的內容,因為sql server2008 R2不支援bcp的utf-8匯出,但是oracle 生產機現在基本都是al32utf8的,所以需要手工將匯出的data檔案夾的內容轉碼到utf-8.EditPlus有一個批量轉碼的功能,非常好用對小檔案大量操作很好,我的480多個檔案基本都是靠它完成的。對於大於100M以上的檔案editplus完全hang不住,只能使用ultraedit,我用它執行2G多的一個檔案,幾分鐘搞定。
二、實際步驟
此步驟很多參考絕殤 的內容啊,著作權是他的啊。我在其中補充和修正了一些內容。
- 第一部分:擷取工具
不建議去oracle官網下載,雖然支援到oracle 12C,反正我是沒用它弄好我的sql server 2008 R2到oracle 11G 的轉換,能使用的人如果成功告訴我下。
直接到文檔最後下載提供的內容即可,注意自行安裝jre6
2. 下載SQL SERVER的驅動程式
絕殤說的”點擊菜單協助,選擇檢查更新,彈出檢查更新嚮導視窗”我一直沒成功,我只好自己自行下載了jtds-1.2.2-dist,這個我也提供了下載。關聯方式如下
啟動develop -----工具-----喜好設定-------資料庫-----第三方jdbc驅動程式,添加條目選中jtds的檔案,然後重啟develop即可。
- 串連oracle和sql,建立賬戶
基本和文檔一樣(不清楚指令碼見http://www.cnblogs.com/hiizsk/archive/2011/07/10/2102452.html),這裡多說一句,預設新建立的使用者的預設資料表空間是user,我不建議這樣,建立立一個資料表空間,然後建立的MIGRATONS使用者的資料表空間使用建立的,盡量不要影響預設資料表空間。
另外後面指令碼執行完畢後,建立的表的預設空間也是user,這個時候匯入資料前建議在建立一個資料表空間,將這些表移動到新資料表空間如newtbs。
Select ‘alter table ‘||table_name||‘ move tablespace newtbs;‘ from user_all_tables;
3. 資料庫移植嚮導等
完全可按照文檔執行,最後一步也是離線即可。
(1)SqlServer中的架構到Oracle中的模式,名稱的處理
這部分不用這麼處理,後面我有更好的辦法,跳過
(2)轉移資料
從這部分後,文檔語焉不詳,其實這才是執行匯入容易出錯的地方。首先匯出資料執行unload_script [server] [username] [password]
這個執行可以在本機使用cmd執行,注意看下產生的目錄結構如下
匯出資料可以在2014-09-28_17-02-42下執行unload_script.bat
我的項目匯出10G左右大概在十幾分鐘即可。
接下來就是轉碼工作了,在的data目錄中,選中檔案使用editplus或者ultraedit就可以把檔案轉碼到utf8格式。
(3)匯入資料
把全部的檔案上傳到linux伺服器(你的oracle不會運行在windows下吧?)
(1) 修改shell檔案
修改dbo檔案下的oracle_ctl.sh檔案
增加
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
注意這裡的值是你目的oracle的nls值,可以自行查詢
如果您的檔案中有類似我的超過500M的大檔案,修改預設的sqlldr語句
預設:
sqlldr $1/$2 control=control/dbo_jzprod.uf_bud_payoutdetthird.ctl log=log/dbo_jzprod.uf_bud_payoutdetthird.log
在後面增加下面的語句採用平行append方式,跳過索引
direct=true parallel=true skip_index_maintenance=true
(2) 修改control檔案
如果你使用了上面的direct=true的資料,那對應的control檔案也需要修改,如上面的dbo_jzprod.uf_bud_payoutdetthird,control檔案在control目錄下,如:
load datainfile ‘data/dbo_jzprod.CARDCOMBINATIONDETAIL.dat‘ "str ‘<EORD>‘"into table dbo_jzprod.CARDCOMBINATIONDETAILfields terminated by ‘<EOFD>‘trailing nullcols
需要在into 之前增加APPEND
(3) 執行
執行shell,可能大家覺得非常簡單,但是也需要有些注意事項
./**.sh 沒問題,但是我們需要注意,我們需要執行dbo目錄下的shell
因為預設的developer給我們產生了很多層的sh,我們需要執行最內層的sh
3.1:^M的問題:
我們編輯的sh,執行會報錯,vi會發現內部的每行最後存在一個^M
使用如下代碼即可。
:1,$ s/^M//g
^M 輸入方法: ctrl+V ,ctrl+M
3.2:後台運行
直接運行shell需要時間比較長,我們採用nohup後台進程啟動並執行方式
nohup ./command.sh > output 2>&1 &
注意這裡斷行符號exit一直到退出此進程,然後重新啟動一個新進程
Tail –f output觀測實際的進展即可。
3.3 最後匯出成功後,需要重建索引並且遷移到單獨的資料表空間,對lob欄位單獨資料表空間儲存等
oracle sql developer:http://pan.baidu.com/s/1hq7oIUg
jtds:http://pan.baidu.com/s/1sjO7vop
SQL遷移到ORACLE執行個體