1. 程式人生 > >使用 Navicat_premium 將 oracle 資料庫遷移到 mysql

使用 Navicat_premium 將 oracle 資料庫遷移到 mysql

   最近想把原來的資料庫從 Oracle 遷移到 MySQL, 主要方便於自己開發. 用到了 Navicat.  當然 Navicat 是收費的, 但是可以免費試用 14 天

需要準備的程式:Navicat. 這個是我的下載地址 http://pan.baidu.com/s/1hsuW1NI

裡面 包含了 怎麼破解的方法,自己下載並且安裝好。

一. 配置 OCI(安裝 Navicat 與 解壓 Instant Client 就不多說了)

oci.dll 是指oracle的客戶端的一個環境dll檔案。可以從oracle官網下載  32位地址: http://www.oracle.com/technetwork/topics/winsoft-085727.html
64位地址:http://www.oracle.com/technetwork/topics/winx64soft-089540.html 一般都是32位的地址,我就是用的32位的 開啟 Navicat , 選擇 工具 ---> 選項
重啟 Navicat

二.新增資料庫連線

  分別選擇需要遷移的資料庫型別. 我選擇的是 oracle 和 mysql , 這個只要正確填寫資料庫地址, 使用者名稱 和 密碼即可

三,建立資料傳輸

選擇 工具----> 資料傳輸, 按照提示操作即可.  有兩種方式: 一種是直接傳輸到資料庫, 一種是生成目標資料庫的 sql 檔案 我用第一種時沒有成功, 因為資料的原因. 所以採用了第二種方式
第一種:
第二種:  將生成的sql 檔案匯入到 mysql 中即可
  • 注意點:

1、由於MySQL的date型別只支援儲存日期,不能儲存時間,navicat在轉換時,如果是oracle的date,會自動轉成mysql的date,這樣會導致mysql的精度不夠而報錯,所以要提前將oracle的date型別轉換成timestamp型別。如果表的數量比較多,手工改太麻煩了,我這裡寫了個儲存過程,自動將oracle中所有表中的DATE型別轉換成TIMESTAMP型別:

  1. createorreplaceprocedure convert_date_to_timestamp  
  2. /**************************  
  3.   function: 將資料庫中所有的表中含DATE型別的欄位改為TIMESTAMP型別;  
  4.   需要建立下列型別表:  
  5.   createtable type_table_info (  
  6.     table_name varchar2(30),  
  7.     column_name varchar2(30),  
  8.     data_type varchar2(100)  
  9.   )    
  10. ***************************/  
  11. is
  12.   v_query_base_sql varchar2(100) := 'SELECT table_name, column_name, data_type FROM all_tab_cols WHERE table_name = ''';  
  13.   v_query_table_sql varchar2(150);  
  14.   v_alter_sql varchar2(100);  
  15.   type table_type istableof type_table_info%rowtype;  
  16.   table_array table_type;  
  17. begin
  18.   for c_tabs in (  
  19.        select table_name from user_tables where table_name <> 'type_table_info'
  20.     )  
  21.     loop  
  22.       v_query_table_sql := v_query_base_sql || c_tabs.table_name || '''';  
  23.       execute immediate v_query_table_sql bulk collect into table_array;  
  24.       for i in table_array.first .. table_array.last
  25.         loop  
  26.           --DBMS_OUTPUT.put_line(table_array(i).column_name || ':' || table_array(i).data_type);
  27.           if table_array(i).data_type = 'DATE'then
  28.             v_alter_sql := 'alter table ' || table_array(i).table_name || ' modify ' || table_array(i).column_name || ' timestamp';  
  29.             DBMS_OUTPUT.put_line(table_array(i).column_name || ': ' || v_alter_sql);  
  30.             execute immediate v_alter_sql;  
  31.           end if;  
  32.         end loop;  
  33.     end loop;  
  34. end convert_date_to_timestamp;  

2、異常資訊:Specified key was too long; max key length is 767 bytes 

這是因為索引欄位太長導致的,我這邊是通過修改mysql字符集解決的,改為utf8.如果還是不行找到對應的表看看索引欄位能不能調整小一點。

  • 轉換步驟:
工具-->資料傳輸,在“源”中選擇待複製的資料庫(oracle)資訊,選中所有表,在“目標”中選擇目標資料庫(mysql),然後點選“開始”,即可實現批量從oracle庫複製表到mysql庫了,在“資訊日誌”欄中可以檢視日誌資訊,如果有"unsuccessly"表示當前表未複製成功,可以檢視異常資訊作相應處理後再轉換。
由於語法差異,函式、檢視等不支援自動轉換,需要一個一個的複製修改了。 這裡簡單介紹下oracle與mysql的一些異同點,在轉換檢視、函式時會用到:

1、mysql查詢時,表名必須大寫(別名也區分大小寫);
2、mysql的使用函式時,函式名和括號之間不能有空格,>= 之間也不能有空格(如,> =會報錯);
3、mysql檢視中不支援子查詢,必須使用檢視巢狀;
4、mysql中的系統函式與oracle中的系統函式有很多差異,這裡需要特別注意下。