问题:从oracle备份的sql文件中有一个字段的值很大,在oracle中该字段的类型是CLOB,通过navicat还原,以及命令还原这些sql文件到oracle的时候,凡是这个字段的值的长度大的都还原不了,导致还原后的数据是少的。

 

原因:通过百度查询等发现是oracle在导入CLOB类型的数据的时候,会将字段先转化为VARCHAR2类型,VARCHAR2类型的最大长度是4000,当我们想把这个字段对应长度调整为比4000大的时候,oracle是不允许的。

 

最终的解决办法:将我备份的5G左右大小的sql文件用EmEditor软件打开,然后将5G左右的文件以表为单位分成好几份。然后对分成的这几部分数据分别进行处理。把有数据的表的sql剪切出来形成一个个的表sql文件,然后将这些sql文件转化成mysql的sql语句文件,导入到mysql中。目前发现有10几个元数据表存在字段值太大的问题,接下来在本地写java程序,把mysql中的数据读出,然后写入oracle对应的表即可。等有问题的10几张表的数据都通过程序导入oracle之后,检车oracle表中的数据是否和mysql中的一致以及和那个5G大小的sql文件中的各个表的数据条数是否一致,一致后,将本地oracle中的数据备份成DMP格式,然后通过命令将dmp覆盖式导入业务库中,导入完成后,打开jcms后台,检查各个功能是否合适,这时会发现有些元数据栏目不能在后台新增数据,经过检查发现是对应元数据表没有创建触发器导致的,创建后,新增数据正常。

 

EmEditor软件在此次解决该问题中帮助很大,首先它可以打开很大的文件,打开后,可以进行快速查找和到对应位置。便于我将大文件分成几个相对小的文件。

由于oracle不支持直接将拥有很大值的sql导入数据库,但是mysql支持,所以采用了先导入mysql然后通过程序将mysql的数据写入oracle的方式。

java 插入字段长度超过数据库设置长度会报什么错 数据库字段太长_mysql

 

EmEditor软件就长这样

 

将导出的DMP导入业务库的时候,需要覆盖式的方式,需要在导入命令上加如下一段命令:

table_exists_action=replace 标识不删除原表直接覆盖。

完整的导入命令如下,对应的路径是默认路径,也就是把dmp文件放在默认路径下,然后执行如下命令即可。

impdp jcms2711/jcms2020 dumpfile=PCYWK202007072.DMP table_exists_action=replace

 

当然这里涉及程序,把数据从mysql导入oracle,所以需要开发的配合。

 

注意做完之后,要检查系统的功能是否合适。

 

我也是无意间发现通过程序可以将很大的值写入oracle,但是至于原理我是不知道的。