这几填捣鼓了一下Oracle及mysql平面文件导入导出的一些问题,简单做一个记录。

常见的有以下几种情况:

1、从Oracle导出数据到excel(csv)
2、导入excel(csv)数据到Oracle
3、从Oracle导出数据(csv、sql),导入到mysql(迁移Oracle数据到mysql)
4、从mysql导出数据为excel(csv)
5、导入excel(csv)数据到mysql
6、mysql导出数据,导入到Oracle(迁移mysql数据到Oracle)
7、不同mysql版本之间sql导出导入

根据以上几种情况,分别进行处理

1、从Oracle导出数据到excel(csv) 小批量数据使用PL/SQL DEV或者Oracle SQL Developer导出即可, 对于大批量的数据,如大几十万及百万以上,使用sqluldr2linux64进行导出,但是需要注意字符集和串行的问题;

字符集:通过指定charset=ZHS16GBK

串行:串行问题一般是因为表列数据中存在与分隔符相同的情况,默认分隔符是英文的逗号(,),但是列数据中存在逗号,因此就会出现串行,解决办法就是将英文的逗号转换为其他符号,比如使用replace进行替换(select  col1 A,replace(col1, ',', ) B, col2 C,replace(col2,',',',') D from t17 a ;)

2、导入excel(csv)数据到Oracle

这里使用的Oracle提供的工具sqlldr,需要建立好表,配置好控制文件,控制文件如下所示:

$ more cx-1.ctl

load data

characterset zhs16gbk

infile '01.csv'

into table t_07

fields terminated by ","

optionally enclosed by '"'

trailing nullcols

(

col1,

col2,

col3,

col4,

col5,

col6,

col7,

col8,

col9,

col10 date "yyyy/mm/dd HH24:MI:SS",

col11 date "yyyy/mm/dd HH24:MI:SS"

)

需要注意的是,对于时间及日期字段,要加上对应的列类型,否则会导入失败

导入语句:

sqlldr userid=user/passwd control=import.ctl

3、从Oracle导出数据(csv、sql文本),导入到mysql(迁移Oracle数据到mysql)

这个份两种情况,如果Oracle所在服务器和mysql所在服务器可以通信,那么使用datax是最方便的;

否则就需要分两步走:首先从Oracle中使用sqluldr2linux64导出,注意不要指定charset=ZHS16GBK  head=yes,省去一些麻烦,然后使用mysqlimport或者load data导入进mysql(需要配置secure_file_priv),如果没有对应的权限,也可以使用诸如mysql workbench或DBeaver(推荐使用该工具)导入进mysql(注意:如果是从Oracle导出的csv,确保其编码为utf-8,否则包含中文的数据导进去之后会乱码)。

或者将其直接导出至同网段的mysql中(使用datax),然后从mysql中使用mysqldump将其导出再导入到目标mysql数据库即可。

4、从mysql导出数据为excel(csv)

DBeaver是个比较好用的工具,测试之后还不错,大数据量没有出现卡死的情况;

使用mysqldump导出(需要配置secure_file_priv);

5、导入excel(csv)数据到mysql

这类和3中类似,可以参考3,使用客户端工具DBeaver或者mysqlimport(原理和load data相同)

6、mysql导出数据,导入到Oracle(迁移mysql数据到Oracle)

和3类似,如果之间可以通信,那么配置使用datax无疑最方便,无需落地,省去不少时间、空间。

使用DBeaver或者mysqldump导出,使用sqlldr导入即可;

7、不同mysql版本不同平台之间sql导出导入

这个目前还没测试,主要是高版本到低版本和低版本到高版本之间sql文件的导入,下次测试。