900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > Oracle11g导入DMP文件并导出为CSV文件过程全纪录

Oracle11g导入DMP文件并导出为CSV文件过程全纪录

时间:2022-06-30 23:08:30

相关推荐

Oracle11g导入DMP文件并导出为CSV文件过程全纪录

最近课题组在和某航务管理局合作完成一个模拟仿真项目,对方发来某地一年的AIS数据,以DMP格式呈现,大小足有100多G。对于这批数据的处理首先需将其还原至数据库中,并以CSV文件格式导出,此项任务最终分配给了笔者。在笔者着手完成的过程中,几天几夜,着实踩过不少坑。因此在此记录全过程以方便后来者。

众所周知,DMP文件(.dmp)通常来源于Oracle数据库,属于一种备份文件存储格式。询问合作方了解到这批数据产自Oracle 11g,对此笔者也是第一次接触。故而只得是走一步踩一步的坑。

1.安装阶段

第一阶段主要是安装Oracle11g以及操作客户端pl/sql developer,年少无知的我安装在了个人PC机(4G内存)。参照网上的安装步骤介绍一步步操作,在Oracle11g安装的最后一步通常教程会指示你修改口令设置,对sys、system、scott的密码进行修改。随后在打开pl/sql developer时就是用此时设置的系统管理员(sys/system)密码登录的。

2.导入阶段初踩坑

第一次尝试导入我的脑海中并没有系统管理员身份和用户身份的概念,因为原先使用MySQL都是一锅端使用root,故而最初阶段使用system导入出了很多问题。参考网上的博客,我打算使用pl/sql developer的Import Tables功能导入。界面如下:

From User和To User都好填,下方的DMP文件选择也没问题,点击Import后在Log中提示缓冲区大小不够。

经过多次加大缓冲区大小数值,总算是没问题了,但随即提示缺少表空间VMS。何为表空间?我的理解就是存储数据库的空间,需要预先在硬盘中开辟。于是我上网搜了一下,原来除了创建表空间外还需创建用户。

有趣的是我一开始是将表空间的创建位置设定在磁盘的一个任意位置,故而当我再次尝试导入时报了一堆错误。于是我开始认为pl/sql developer的导入可能有问题,开始尝试用命令行的方式导入。

按照网上说的步骤和命令一步步下来还是报了很多奇怪的错误。这时我已几近崩溃。回归pl/sql developer,当我删除重新创建表空间,创建用户时,这次放在了正确的位置,此时终于是没有问题了。但显然导入DMP文件的速度异常缓慢,整个电脑卡死,如瘫痪一般,这时我意识到个人PC机根本带不动Oracle。

3.导入阶段再踩坑

课题组为了完成这项导入导出工作专门安排在服务器配置了Windows Server操作系统,其内存,硬盘容量都是绰绰有余。于是我再次在服务器安装Oracle11g和pl/sql developer。这里顺便提一下,因为现在是疫情期间,因此只能用远程控制软件向日葵来远程操作服务器,我们无法直接将本机的安装包和数据传到服务器,因此不得不选择借助百度网盘上传再下载传输。Windows Server因为是新装,IE浏览器非常多的问题,竟无法下载。多次查询后才发现是Windows Defender以及IE的下载功能未开启,相比Chrome,IE真的坑的一批。

安装完成后,使用pl/sql developer进行导入,立即给我来了个闪退问题。当我点击Import时,出现进程命令行一闪而过,查看Log则提示finish。我简直不敢相信自己的眼睛,竟然这么快。我以为我成功了,查看Tables时发现里面有一大堆表,也不知哪个是数据表。这里需要说明,我这次登录是使用我创建的用户,同时数据库用的是orcl,模式是Normal(后来用SYSDBA一个样)。第二天我打电话问合作方的工程师了解到数据表的名称为AISDYNAMIC,然而我并不能找到这张表,瞬间懵逼。

当我上网查询为什么会闪退时,大佬们给了一些解决方法,但我只记得了一句话:这些都是pl/sql developer的灵异问题,建议改用命令行。搞了半天还是要用命令行。

使用命令行首先需要设置表空间的自动增长,这就需要使用alter命令。但我运行时每每都会报错,查询之下才发现,这篇博客忽略了告诉读者需要给用户赋予DBA权限,使用grant命令即可。修改完成后即可用imp导入,接下来问题就来了。

首先抛出我最后调试完毕的完整imp命令:

imp lhp/1234 file=D:\BaiduNetdiskDownload\04\AISDYNAMICCLOG0402.dmp full=y ignore=y buffer=100000000

在这条命令中,full=y ignore=y缺一不可,每缺一个都会报一种错误。buffer即缓冲区大小,设置的越大越好,默认单位并不是MB。

即便以上问题全部解决了,但运行上述命令还是会报一个什么分区导入的错误,网上也没有给出解释。正当我绝望时,打开pl/sql developer(以创建的用户,databases为空,模式为Normal)意外的发现Tables中出现了我想要的那张表,而且只有这一张。终于,我成功了!

4.最后的坑

走通了导入的流程,接下来就是导出了。由于我要导出为CSV文件,网上的指示是用pl/sql developer打开表到点击导出按钮,选择CSV文件即可。也就是说我需要用命令行导入,再到pl/sql developer打开导入的表导出。虽然比较麻烦但也能接受吧。接下来问题又来了。我发现合作方给予的数据都是由同一张表导出的,因此我导入时也是都以追加的方式集中在了一张表。而且,每个DMP文件都包含430万条左右的记录,导入和导出都需要4分钟左右的时间,一年的数据即365张表,这大大增加了我的时间成本。

和师兄商量之后决定先将全部DMP导入到一张表,再导出到一个文件,等导出后我们再细分。然而,在我操作时却发现表容量有限,大约导入到第三个月的数据时就再也导不进去,开始报错了。因此我只得选择以月为单位进行一个月数据的导入和导出。并且,每完成一个月的数据工作,都需将表删除。每月DMP文件的导入通过批处理命令服务器自动运行。

最后,经过两天的服务器不间断不工作总算完成了全部DMP文件的导入和导出,心累啊!

由于笔者也是第一次接触Oracle数据库,操作中难免有舍近求远之处,谨在此记录交流遇到的这些问题,欢迎批评指正!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。