數據庫:跨數據庫,服務器數據遷移

注意點:mysql

一、因爲mysql的date類型只支持存儲日期,不能存儲時間,navicat在轉換時,若是是oracle的date,會自動轉成mysql的date,這樣會致使mysql的精度不夠而報錯,因此要提早將oracle的date類型轉換成timestamp類型。若是表的數量比較多,手工改太麻煩了,這裏寫了個存儲過程,自動將oracle中全部表中的DATE類型轉換成TIMESTAMP類型:sql

  1. create or replace procedure convert_date_to_timestamp  
  2. /**************************  
  3.   function: 將數據庫中全部的表中含DATE類型的字段改成TIMESTAMP類型;  
  4.   須要創建下列類型表:  
  5.   create table 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.   
  16.   type table_type is table of type_table_info%rowtype;  
  17.   table_array table_type;  
  18.   
  19. begin  
  20.   for c_tabs in (  
  21.        select table_name from user_tables where table_name <> 'type_table_info'   
  22.     )  
  23.     loop  
  24.       v_query_table_sql := v_query_base_sql || c_tabs.table_name || '''';  
  25.       execute immediate v_query_table_sql bulk collect into table_array;  
  26.       for i in table_array.first .. table_array.last  
  27.         loop  
  28.           --DBMS_OUTPUT.put_line(table_array(i).column_name || ':' || table_array(i).data_type);  
  29.           if table_array(i).data_type = 'DATE' then  
  30.             v_alter_sql := 'alter table ' || table_array(i).table_name || ' modify ' || table_array(i).column_name || ' timestamp';  
  31.             DBMS_OUTPUT.put_line(table_array(i).column_name || ': ' || v_alter_sql);  
  32.             execute immediate v_alter_sql;  
  33.           end if;  
  34.             
  35.         end loop;  
  36.     end loop;  
  37. end convert_date_to_timestamp;

二、異常信息:Specified key was too long; max key length is 767 bytes數據庫

我這邊是經過修改mysql字符集解決的,改成utf8oracle

  • 轉換步驟:
工具-->數據傳輸,在「源」中選擇待複製的數據庫(oracle)信息,選中全部表,在「目標」中選擇目標數據庫(mysql),而後點擊「開始」,便可實現批量從oracle庫複製表到mysql庫了,在「信息日誌」欄中能夠查看日誌信息,若是有"unsuccessly"表示當前表未複製成功,能夠查看異常信息做相應處理後再轉換。
因爲語法差別,函數、視圖等不支持自動轉換,須要一個一個的複製修改了。
這裏簡單介紹下oracle與mysql的一些異同點,在轉換視圖、函數時會用到:

一、mysql查詢時,表名必須大寫(別名也區分大小寫);
二、mysql的使用函數時,函數名和括號之間不能有空格,>= 之間也不能有空格(如,> =會報錯);
三、mysql視圖中不支持子查詢,必須使用視圖嵌套;
四、mysql中的系統函數與oracle中的系統函數有不少差別,這裏須要特別注意下。函數

另外一種方法:工具

1.從源數據庫導出數據:

語法:oop

exp user1/pwd1@test1 file='E:test.dmp';
  • 1

示例:spa




exp tianzhi_smart/tianzhi_smart@192.168.56.60:1521/orcl file='E:\tianzhi_smart.dmp';

2.向目標數據庫導入數據:

語法:日誌

imp user2/pwd@test2 file='E:test.dmp' full=y;
  • 1

示例:code

imp tianzhi_smart/tianzhi_smart@192.168.10.129:1521/orcl file='E:\tianzhi_smart.dmp' full=y;
相關文章
相關標籤/搜索