使用手工轉換SQL腳本的方式進行數據庫的遷移,其間過程至關繁瑣,特別是標識符長度的限制讓我焦頭爛額,由於咱們的系統中長標識符真是多如繁星,另外,表結構建好以後,數據的遷移又是一個至關複雜的過程,由於修改了很多的表名,須要把導出的數據和表一一對應上。 html
可是,除了手工的方式以外,其實咱們還有更爲簡便和自動化的解決方案,那就是ORACLE官方提供的Sql Developer自帶的Oracle Migration Workbench。 java
什麼是Oracle SQL Developer?在官方頁面上,是這樣介紹它的: sql
Oracle SQL Developer is a free and fully supported graphical tool for database development. With SQL Developer, you can browse database objects, run SQL statements and SQL scripts, and edit and debug PL/SQL statements. You can also run any number of provided reports, as well as create and save your own. SQL Developer enhances productivity and simplifies your database development tasks . 數據庫
另外,經過第三方驅動包,該工具還支持鏈接和管理各類主流數據庫服務器。 服務器
下面就把我使用這個工具遷移Microsoft SQL Server 2008數據庫到Oracle 11G的過程記錄下來,爲了積累也爲分享。 session
第一部分:獲取工具 架構
第二部分:創建資料檔案庫(Migration Repository) oracle
第三部分:數據庫移植嚮導 ide
第四部分:SqlServer中的架構到Oracle中的模式,名稱的處理 函數
第六部分:存儲過程和函數
首先,固然是得到工具,該工具在Oracle Sql Developer官方下載頁面裏面能夠直接下載到。Windows 32位直連地址:Windows 32bit Sql Developer。Oracle Sql Developer須要JDK的支持,在下載頁面中提供了包含JDK的下載包,還有支持各類操做系統的下載選項。
下載後,解壓到任意位置。直接運行程序。第一次運行,須要指定JDK的目錄。
啓動後,咱們要作的第一件事,不幹別的,先下載SQL SERVER的驅動程序。點擊菜單幫助,選擇檢查更新,彈出檢查更新嚮導窗口,第一頁通常是廢話,直接下一步,等更新中心列表加載完畢後,只選擇「Third Party SQL Developer extensions」,點擊下一步,等待更新搜索完畢後,中列表中找到並選中 JTDS JDBC Driver,以下圖:
下一步,在許可協議頁面,點擊「我贊成」按鈕後再點下一步,等下載完畢後關閉窗口,彈出提示須要重啓程序才能完成更新,點擊「是」。等程序重啓完畢。
環境準備完畢,開始進入到正題移植數據庫。
創建資料檔案庫(Migration Repository)
1、鏈接到Oracle
在程序左邊的鏈接窗口中,點擊加號按鈕,添加一個到Oracle數據庫的dba鏈接,以下圖:
配置完成後,點擊鏈接按鈕,鏈接到數據庫。
二,創建用戶
打開到Oracle數據的鏈接,新建一個用戶,咱們要在該用戶的模式中創建所謂的「資料檔案庫」,並使用該用戶去創建SQL Server移植後的用戶名,以及作其它的一些工做。按照幫助中的說明,這個用戶最少須要如下權限和角色:
Roles
CONNECT WITH ADMIN OPTION,RESOURCE WITH ADMIN OPTIONPrivileges
ALTER ANY ROLE,ALTER ANY SEQUENCE,ALTER ANY TABLE,ALTER TABLESPACE,ALTER ANY TRIGGER,COMMENT ANY TABLE,CREATE ANY SEQUENCE,CREATE ANY TABLE,CREATE ANY TRIGGER,CREATE VIEW WITH ADMIN OPTION,CREATE PUBLIC SYNONYM WITH ADMIN OPTION,CREATE ROLE
CREATE USER,DROP ANY SEQUENCE,DROP ANY TABLE,DROP ANY TRIGGER,DROP USER,DROP ANY ROLE,GRANT ANY ROLE,INSERT ANY TABLE,SELECT ANY TABLE,UPDATE ANY TABLE
如下語句直接創建一個名爲migrations的用戶:
-- Create the user
create user MIGRATIONSidentified by MIGRATIONS
default tablespace USERS
temporary tablespace TEMP
profile DEFAULT;
-- Grant/Revoke role privileges
grant connect to MIGRATIONS with admin option;
grant resource to MIGRATIONS with admin option;
-- Grant/Revoke system privileges
grant alter any role to MIGRATIONS;
grant alter any sequence to MIGRATIONS;
grant alter any table to MIGRATIONS;
grant alter any trigger to MIGRATIONS;
grant alter tablespace to MIGRATIONS;
grant comment any table to MIGRATIONS;
grant create any sequence to MIGRATIONS;
grant create any table to MIGRATIONS;
grant create any trigger to MIGRATIONS;
grant create any view to MIGRATIONS;
grant create materialized view to MIGRATIONS with admin option;
grant create public synonym to MIGRATIONS with admin option;
grant create role to MIGRATIONS;
grant create session to MIGRATIONS with admin option;
grant create synonym to MIGRATIONS with admin option;
grant create tablespace to MIGRATIONS;
grant create user to MIGRATIONS;
grant create view to MIGRATIONS with admin option;
grant drop any role to MIGRATIONS;
grant drop any sequence to MIGRATIONS;
grant drop any table to MIGRATIONS;
grant drop any trigger to MIGRATIONS;
grant drop tablespace to MIGRATIONS;
grant drop user to MIGRATIONS;
grant grant any role to MIGRATIONS;
grant insert any table to MIGRATIONS;
grant select any table to MIGRATIONS;
grant unlimited tablespace to MIGRATIONS with admin option;
grant update any table to MIGRATIONS;
再次點擊鏈接中的加號按鈕,添加一個使用剛剛新創建的用戶的鏈接。
鏈接後,在該鏈接上點擊右鍵,選擇移植資料檔案庫-關聯移植資料檔案庫,程序會在該用戶下創建移植資料檔案庫所須要的表、存儲過程等等,彈出一個對話框顯示當前創建的進度,稍等片刻即創建完畢。
數據庫移植嚮導
一,創建到源SqlServer數據庫的鏈接
在鏈接窗口中,點擊綠色加號按鈕,打開鏈接配置窗口,按下圖創建到SqlServer的鏈接:
由於動態商品的使用,使得原來SqlServer配置頁中默認的1433每每沒有辦法鏈接到SqlServer2008數據庫,修改成1434便可。
2、啓動數據庫移植嚮導
創建到SqlServer的鏈接後,開始對數據庫進行移植。有兩個地方能夠啓動數據庫移植嚮導,一個是在新建的SqlServer鏈接上點擊右鍵,選擇移植到Oracle,另外一個是在菜單工具-移植-移植,啓動向導後,第一頁固然是嚮導的簡介,經過簡介,咱們能夠知道整個移植過程有7步,而且有兩個先決條件,以下圖:
直接點擊下一步。
3、選擇資料檔案庫
在這個頁面中,咱們也能夠去創建鏈接和資料檔案庫,也就是前一部分中咱們所作的工做在這裏也能夠進行。固然選擇咱們剛剛創建的migrations鏈接,以下圖:
這裏截斷的意思是將資料檔案庫清空,咱們創建一個移植項目後,全部抓取的數據庫結構信息、統計信息還有轉換記錄等都保存在這個資料檔案庫中,只要項目名稱不一樣,即便不清空資料檔案庫也不會影響到移植工做。固然,若是但願更「清爽」一點,也能夠勾選。這是後話。
4、爲轉換項目命名
選擇好資料檔案庫後,點擊下一步,爲咱們的轉換項目輸入名稱和備註,以便識別。另外,還須要指定腳本生成目錄,用於存放嚮導執行過程當中生成的腳本。
5、選擇源數據庫鏈接
而後繼續下一步,選擇源數據庫,在這裏有聯機和離線兩種模式,聯機便是直接鏈接到源數據進行抓取,而離線則是在SqlDeveloper不直接鏈接到源數據庫的狀況下,經過SqlDeveloper提供的腳本預先捕獲數據庫,獲得數據庫結構文件後,經過嚮導導入。
這裏固然是選擇咱們剛纔創建的SqlServer鏈接。
6、選擇捕獲源數據庫
在這一步中,顯示爲兩個多選框,左邊列出Sql Server中全部可選的數據庫,經過中間的按鈕將數據庫移動到右邊的已選數據庫中。以下圖:
7、數據類型轉換選項
在這一頁中,列出了全部系統內置的數據類型轉換對應關係。能夠其進行修改,通常不做修改直接下一步。以下圖:
8、選擇目標數據庫
與源數據庫的選擇同樣,目標數據庫的選擇一樣也有聯機和離線兩種方式。仍舊選擇聯機。選擇orcl(migrations)鏈接。
9、移動數據選項
這個頁面中,也提供了聯機或離線兩種方式進行數據移動。所謂聯機雖然「聽說」能夠直接以聯機的方式從源數據庫中移動數據到Oracle中,可我試過幾回沒有成功,緣由不明。最終我選擇了離線的方式進行數據移動。所謂離線移動數據,是在咱們指定的腳本存放目錄中生成「數據移動」腳本,分別在源數據庫中卸載數據(即導出)和在目標數據庫中加載數據。選擇好後,點擊下一步。
10、選項完畢,開始執行
在嚮導的最後,是一個用於確認的「概要」頁面。確認無誤後,點擊完成。移植將會開始執行。
SqlServer中的架構到Oracle中的模式,名稱的處理
經過執行移植嚮導,若是沒有錯誤的話,那麼表結構基本上都會創建起來了,在鏈接中打開orcl(migrations)鏈接,找到最下面的其它用戶,假設你的表都在dbo架構下,那麼找到dbo_源數據庫名,展開它,能夠看到在表中已經有原數據庫中的全部表。可是,爲何會顯示爲dbo_源數據庫名呢?我很不喜歡這樣的用戶名。我但願它顯示爲源數據庫名,要怎樣作呢?
在程序的左下角,是移植項目窗格,在裏面能夠看到咱們剛纔創建的移植項目名。展開它,會顯示咱們執行過嚮導的日期和時間,繼續展開,能夠看到兩個節點,叫做捕獲的數據庫對象和轉換的數據庫對象,以下圖:
在捕獲的數據庫對象上點擊右鍵,選擇轉換,再次打開數據移植嚮導。點擊下一步,會直接跳轉到轉換頁,這一次的轉換頁面與前一部分的轉換頁稍有不一樣。不一樣之處在於多出了一個選項卡,叫對象命名,選擇它打開,以下圖所示:
在這個頁面中,顯示了一個數據列表,列出了源數據庫的表名、字段名、約束名、視圖名、架構名等等全部的標識符的原始標識符、新建標識符、是否通過轉換、原始限定名、標識符類型等信息。由於Oracle中不支持30個字符以上的標識符,因此當碰到原始標識符超過30個字符時,移植嚮導會自動將之截斷,若是有重名,則會加上_1之類的後綴。
很明顯,在這裏,它把咱們原來的dbo架構名轉換成了dbo_數據庫名,咱們只要找到它,將新標識符改成數據名,便可實現咱們這部分的需求。
修改完成後,點擊下一步,接着按以前的設置完成整個嚮導,將修改提交到資料檔案庫中。注意,此次的嚮導並無去幫我創建新用戶和表結構等等,還須要進一步操做。
在主界面中的移植項目窗格,在轉換的數據庫對象上點擊右鍵,選擇生成目標,再次打開移植嚮導,又一次按以前咱們的選擇完成整個嚮導,這一次,纔是真正創建了咱們想要的用戶名。
而後,把自動生成的老用戶名和模式都刪除掉吧。具體操做就不細說啦。
轉移數據
上一部分說了移植嚮導在Oracle數據庫中自動生成了咱們所須要的表結構,可是並無幫我把數據成功導入過去。因而咱們採用了生成離線數據移動腳本的方式來導數據。
在移植嚮導中的項目頁中,咱們選擇了腳本生成的目錄,打開該目錄,能夠看到一個名爲「數據移動\項目名稱\日期時間\」的子目錄,其中包含了以下圖所示的文件:
看以看到其中包含了4個腳本文件,兩個是用於Windows的,另兩個是用於*nix的。名爲unload_script的是數據導出腳本,用於從源數據庫中生成數據導出文件,名爲oracle_ctl的是數據導入腳本。
打開cmd,瀏覽到當前目錄,執行如下命令以導出數據:
>unload_script [server] [username] [password]
其中的server是源數據庫服務器,username和password是能訪問到源數據庫的用戶名密碼。稍等一會,提示導出完成後,接着執行下面命令以導入數據:
>oracle_ctl [oracleusername] [password]
在這裏不須要指定數據庫名之類的,由於在腳本中已經指定了。
等待片刻導入完畢後便可。蠻簡單的。不明白爲何聯機就是不能成功,作的難道不是同樣的工做嘛。