使用 Navicat_premium 將 oracle 資料庫遷移到 mysql
阿新 • • 發佈:2019-02-10
最近想把原來的資料庫從 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重啟 Navicat
二.新增資料庫連線
分別選擇需要遷移的資料庫型別. 我選擇的是 oracle 和 mysql , 這個只要正確填寫資料庫地址, 使用者名稱 和 密碼即可三,建立資料傳輸
選擇 工具----> 資料傳輸, 按照提示操作即可. 有兩種方式: 一種是直接傳輸到資料庫, 一種是生成目標資料庫的 sql 檔案 我用第一種時沒有成功, 因為資料的原因. 所以採用了第二種方式第二種: 將生成的sql 檔案匯入到 mysql 中即可
- 注意點:
1、由於MySQL的date型別只支援儲存日期,不能儲存時間,navicat在轉換時,如果是oracle的date,會自動轉成mysql的date,這樣會導致mysql的精度不夠而報錯,所以要提前將oracle的date型別轉換成timestamp型別。如果表的數量比較多,手工改太麻煩了,我這裡寫了個儲存過程,自動將oracle中所有表中的DATE型別轉換成TIMESTAMP型別:
-
createorreplaceprocedure convert_date_to_timestamp
- /**************************
- function: 將資料庫中所有的表中含DATE型別的欄位改為TIMESTAMP型別;
- 需要建立下列型別表:
- createtable type_table_info (
- table_name varchar2(30),
- column_name varchar2(30),
- data_type varchar2(100)
- )
- ***************************/
- is
- v_query_base_sql varchar2(100) := 'SELECT table_name, column_name, data_type FROM all_tab_cols WHERE table_name = ''';
- v_query_table_sql varchar2(150);
- v_alter_sql varchar2(100);
- type table_type istableof type_table_info%rowtype;
- table_array table_type;
- begin
- for c_tabs in (
- select table_name from user_tables where table_name <> 'type_table_info'
- )
- loop
- v_query_table_sql := v_query_base_sql || c_tabs.table_name || '''';
- execute immediate v_query_table_sql bulk collect into table_array;
- for i in table_array.first .. table_array.last
- loop
- --DBMS_OUTPUT.put_line(table_array(i).column_name || ':' || table_array(i).data_type);
- if table_array(i).data_type = 'DATE'then
- v_alter_sql := 'alter table ' || table_array(i).table_name || ' modify ' || table_array(i).column_name || ' timestamp';
- DBMS_OUTPUT.put_line(table_array(i).column_name || ': ' || v_alter_sql);
- execute immediate v_alter_sql;
- end if;
- end loop;
- end loop;
- end convert_date_to_timestamp;
2、異常資訊:Specified key was too long; max key length is 767 bytes
這是因為索引欄位太長導致的,我這邊是通過修改mysql字符集解決的,改為utf8.如果還是不行找到對應的表看看索引欄位能不能調整小一點。
- 轉換步驟:
- 附
1、mysql查詢時,表名必須大寫(別名也區分大小寫);
2、mysql的使用函式時,函式名和括號之間不能有空格,>= 之間也不能有空格(如,> =會報錯);
3、mysql檢視中不支援子查詢,必須使用檢視巢狀;
4、mysql中的系統函式與oracle中的系統函式有很多差異,這裡需要特別注意下。