浅谈exp/imp(下) (r5笔记第84天)

相关链接:浅谈exp/imp(上) (r5笔记第81天)

你可能 不了解的dump文件

在工作中,dump文件对于dba而言是再平常不过的文件了。不过因为dump文件是二进制文件,所以大家可能在平时使用中也不太关注,不过尽管如此,在导入dump文件的时候还是有很多的细节和技巧值得注意,可以避免一些不必要的问题。 如何查看dump文件的一些基本信息 当你拿到一个dump文件的时候,不能盲目导入,我们可以基于当前的dump文件作一些基本的检查。 比如我们可以查到dump文件导出的版本,时间,导出的用户。 尽管dump文件是二进制文件,但是我们还是可以使用strings来得到一些信息。

$ strings test.dmp|head -10 
iEXPORT:V11.02.00 
RUSERS 
8192 
Sun Dec 28 6:54:27 2014test.dmp 
#G#G 
#G#G 
-08:00 
BYTE 
UNUSED 
INTERPRETED 

根据上面的命令输出,我们得到了一些dump的基本信息,可以从第一行看出exp是基于11.2版本,第2行可以看出是基于用户模式导出的dump,如果是全库模式会显示为RENTIRE,表模式则为RTABLES,从第4行可以看出dump生成的时间戳等等。

如何得到dump中的表信息 对于dump文件,我们可以解析出含有的表名,可以尝试使用如下的方式来实现,使用strings,awk,sed结合可以很方便的完成这个功能。

$ strings test.dmp |grep "CREATE TABLE "|awk '{print $3}'|sed 's/"//g' 
BALL_DATA 
BIG_INSERT 
CLOB_TEST 
COUNTRY_LST 
CTEST 
DATA 
DATA2

对于数据量小的dump文件,这个方法非常有效,如果dump非常大,解析会稍稍有些慢,不过相比使用perl等方式解析,速度还是要快得多。 如何解析dump文件生成parfile

在上面的基础上,如果我们需要根据dump生成对应的parfile来做数据导入导出,可以使用如下的命令来解析dump生成parfile。

$ strings n1_ddl.dmp|grep "CREATE TABLE"|awk '{print $3}'|sed 's/"//g'|awk '{ if(FNR==1) print "tables="$1 ; else print ","$1}'
tables=BIG_INSERT
,CLOB_TEST
,DATA
,NEW_DATA
,OLD_DATA
,PAR_DATA
,RATED_EVENT
,SMALL_INSERT

parfile对于使用exp/imp如虎添翼,可以使数据导入导出更加规范,很多细节都可以在parfile中灵活定义,可以使得exp/imp可读性更强。

数据导入导出中的盲点

盲点1:需要考虑的外键影响 在导入dump文件的时候,外键也是一个很重要的因素,可能dump中含有一些表,有些表中存在外键,在数据迁移之类的项目中是很让人头疼的,你得基于外键考虑表的导入顺序,有些表得先导入,要不在数据插入的时候会报外键相关的ORA问题。 可以使用如下的脚本来做一个基本过滤,可以考虑在过滤条件中嵌入一个dump中表的清单,可以更加精准的处理相关的外键。可以使用如下的脚本来动态生成对应的脚本来禁用外键。

SELECT
      'ALTER TABLE '||TABLE_NAME||' DISABLE  CONSTRAINT '|| CONSTRAINT_NAME||';' FROM USER_CONSTRAINTS WHERE
       CONSTRAINT_TYPE='R' UNION SELECT 'ALTER TABLE '||UCA.TABLE_NAME||' DISABLE  CONSTRAINT '|| UCA.CONSTRAINT_NAME||';'
FROM
       USER_CONSTRAINTS UCA ,
       (SELECT  CONSTRAINT_NAME
          FROM  USER_CONSTRAINTS
          WHERE CONSTRAINT_TYPE IN ('P','U')
) tmp
WHERE UCA.CONSTRAINT_TYPE = 'R'
  AND tmp.constraint_name = UCA.R_CONSTRAINT_NAME ;

生成的语句类似这样的形式。

ALTER TABLE ADD_TARGET DISABLE  CONSTRAINT ADD_TARGET_1FK;

务必注意在disable constraint,在完成数据导入后,需要enable constraint的操作,就是把上面脚本中的disable改为enable即可。

盲点2:需要考虑的触发器影响 触发器在数据导入或者数据迁移中都会存在潜在的问题,如果你不了解应用中的触发器处理细节,就会发现在数据导入或者数据迁移的过程中,会莫名其妙多出来一部分数据,或者有些数据发生了变化。 一般来说,可以和开发做简单的确认,大多数的情况下都是需要把触发器做disable操作,然后在数据导入之后再启用。

可以采用如下的脚本:

SELECT
      'ALTER TRIGGER ' ||TRIGGER_NAME||' DISABLE ;'
FROM
       USER_TRIGGERS; 

个人在使用trigger的过程中碰到过一些问题,就是因为没有注意到trigger的影响,结果本来表中含有100万数据,需要导入20万,结果导入后,发现总数据条数为130万了,那多出来的10万数据就是触发器中的相关逻辑插入的数据。

盲点3:buffer size的影响 buffer size的设置在数据导入中也是很重要的,如果dump存在一个较大的分区表,很可能导入的过程中就会跑出buffer size不够的错误,给你的导入工作带来很多影响。 一般可以把buffer size设置的大一些,比如4M,9M都是不错的选择。

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2015-06-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杨建荣的学习笔记

迁移式升级的测试(三)(r10笔记第36天)

还是继续昨天的任务。 前面的内容可以参见:迁移式升级的一点思考 (r10笔记第27天)、迁移式升级的新方案测试 (r10笔记第30天)、迁移式升级的测试(二)(...

3605
来自专栏沃趣科技

MVCC原理探究及MySQL源码实现分析

目录预览 数据库多版本读场景 MVCC实现原理 1、通过DB_ROLL_PT 回溯查找数据历史版本 2、通过read view判断行...

6168
来自专栏用户画像

mysql 模拟试题一

  3.SQL语言的数据操纵语句包括 SELECT,INSERT,UPDATE和 DELETE, 最重要的,也是使用最频繁的语句是__A__。 

1394
来自专栏企鹅号快讯

从商用到开源:15个维度,全面剖析DB2与MySQL数据库的差异

编辑手记 MySQL是目前最流行的开源数据库,由于其部署方便,运维简单,被广泛用于互联网的各个领域。随着整体IT架构的变更,传统的金融,电信业务,也逐渐走上从商...

2419
来自专栏企鹅号快讯

带你认识一下mysql中数据库information

information_schema 大家在安装或使用MYSQL时,会发现除了自己安装的数据库以外,还有一个information_schema数据库。 inf...

2208
来自专栏Aloys的开发之路

Oracle系统表整理+常用SQL语句收集

-- DBA/ALL/USER/V_$/GV_$/SESSION/INDEX开头的绝大部分都是视图 -- DBA_TABLES意为DBA拥有的或可以访问的所有...

25610
来自专栏杨建荣的学习笔记

关于导入dump(r3笔记第98天)

在工作中,dump文件对于dba而言是再平常不过的文件了。 不过在导入dump文件的时候还是有很多的细节可以注意,可以避免一些不必要的问题。 exp/imp是比...

29210
来自专栏运维

zabbix2.4.5迁移到zabbix3.0

http://qicheng0211.blog.51cto.com/3958621/1744603

2433
来自专栏数据和云

从商用到开源:15个维度,全面剖析DB2与MySQL数据库的差异

编辑手记 MySQL是目前最流行的开源数据库,由于其部署方便,运维简单,被广泛用于互联网的各个领域。随着整体IT架构的变更,传统的金融,电信业务,也逐渐走上从商...

6597
来自专栏数据和云

专家出诊:SQL Server 高CPU系列之索引诊断

作者题记:CPU高使用率往往会导致SQL Server服务响应缓慢,查询超时,甚至服务挂起僵死,可以说CPU高使用率是数据库这种后台进程服务的第一大杀手。引发C...

4514

扫码关注云+社区

领取腾讯云代金券