最近處理一個需求,使用腳本方式將mysql里的數據遷移到oracle中。處理思路主要是利用mysqldump導出的insert dump文件,oracle中建立相同表結構執行insert。記錄本次操作中遇到的問題與處理方式:
1、超4000字節字符串導入
問題描述
oracle varchar2是不能插入超4000字節的字符串的。但是mysql中并沒有限制。此類字段數據無法導入。
處理方式
開始將字段轉換為clob字段。但目標端oracle數據庫部分業務使用dblink連接。dblink是不支持使用lob字段的。目標端oracle版本為12.2。oracle 12c版本已擴展最大值支持到32767。調整數據庫支持32k修改如下:
ALTER SYSTEM SET MAX_STRING_SIZE = EXTENDED SCOPE=SPFILE;
shutodnw immediate;
startup upgrade;
@$ORACLE_HOME/rdbms/admin/utl32k ;
shut immediate;
startup;
再將導入列屬性改為需求大小導入成功。但是還有一個問題,dblink不支持clob字段,但是超4000字節的字符串同樣不支持。分析主要是select查詢業務,業務的sql語句中改為substr取4000字節即可。
2、日期字段修改
問題描述
mysql dump方式導出的insert語句中,關于日期部分,目標oracle端建立date屬性列無法識別導入。
處理方式
oracle建立表結構時先使用varchar導入。導入后再進行手工準換。
alter table test add col_name_t date; --添加一個date中間列
update test set col_name_t = TO_DATE(col_name,'yyyy-mm-dd hh24:mi:ss');
commit;
alter table test drop column old_col_name; --刪除舊的列
alter table xxx rename column col_name_t to col_name; --轉換中間列
3、目標oracle端數據與mysql時間相差8小時
問題描述
數據導入后,業務查詢發現oracle端日期比mysql庫晚8小時。這主要是時區導致。數據庫采用北京時間東八區,mysqldump默認使用–tz-utc參數是0時區。導致導出文件中的timestamp時間值相對于數據庫查詢顯示的時間倒退了8個小時。
處理方式
mysqldump加入 --skip-tz-utc參數