oracle数据库郭斌_mysql到oracle数据库迁移中常见问题及解决方法 作者/常雨骁

有时根据需要,我们可能会对数据库进行改造迁移,本文记录了一次mysql数据库到oracle数据库的库表和数据迁移过程中遇到的问题及解决方法。

1、在安装oracle client环境的linux服务器上,注意当前用户的环境变量设置,~/.profile下增加

export NLS_LANG=AMERICAN_AMERICA.AL32UTF8

因为数据通过sqlldr远程导入数据库的时候,字符集设置是依赖本地的配置,不加此配置会导致导入>的中文乱码。

2、oracle建表的时候字段,长度要注意,假如mysql中字段类型为varchar(10)并且该字段有中文,则oracle建的字段的长度要乘以3倍,即varchar2(30),或者varchar2(30 char),因为oracle中有char_length和data_length来描述字段长度,默认不加char的长度指的是data_length,而一般utf8编码的>中文字符,一个字符平均要占3个data_length,这点与mysql很不同,可以理解为mysql的varchar2(10)可以容纳10个中文字符,而oracle的varchar2(10)只能容纳3个中文,所以一般要么乘以3倍,要么长度后加上char。

3、sqlldr用到的ctl文件中一般不用指定字段类型,但是一些特定字段的类型需要指定,比如日期等>,还有就是clob类型的字段需要指定缓冲区大小,否则导入数据时可能会报 field in data file exceeds maximum length错误

4、sqlldr导入过程中,累计出现51条错误记录,就会终止当前表的导入,在导入完后要第一时间查看bad文件以及log文件

5、mysql导出的数据会对斜杠转义,\被转义为\\,这样在一些存储json的字段中,如果本来是{\"key\":\"value\"}形式,导出后变为

{\\"key\\":\\"value\\"},这会导致后续的json解析出错,另外换行符也会严重影响导出txt的内容>,所以导出后一定要第一时间比对txt文件行数和mysql数据库表记录count数是否一致

6、扩字段可以用oracle的select语句拼接出alter语句,一个例子如下

SELECT 'ALTER TABLE ' || OWNER || '.' || TABLE_NAME || ' MODIFY (' ||

COLUMN_NAME || ' ' || DATA_TYPE || '(' || CEIL(DATA_LENGTH * 3) ||

'));'

FROM DBA_TAB_COLUMNS

WHERE OWNER = 'TESTUSR'

AND DATA_TYPE IN ('CHAR', 'VARCHAR2', 'NCHAR', 'NVARCHAR2')

AND TABLE_NAME like 'T_%';

7、oracle如下错误

ORA-12899:value too large for column xxxx (actual:139,maximum:64)

其中的maximum:64指的是字段的data_length而不是char_length,建表时默认设置的是data_length一般是char_length的4倍。

sqlplus连数据库时,如果密码中有!,需要转义,如假如密码是aaa!!123,则要用如下方式连接 sqlplus aaa/aaa\!\!123@TEST

9、beyond compare是个好东西,用来比对两个文件或目录的差别。

要注意mysql导出的txt数据文件的编码,应该保证是utf8编码。

Mysql和oracle数据库的DDL语法有区别,oracle中没有自增字段的概念,取而代之的是sequence,所以需要改造mysql中涉及到自增的字段,oracle建表语句以及后续对自增字段的使用方式需要重新设计。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值