绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
expdp与impdp迁移数据---通过逻辑导出导入Schema我们需要做哪些准备工作
2020-08-12 00:00:06

     今天下班有点晚,因为工作的一个失误,看错数据库,还好操作错误提示可以避免进一步犯错,也没有对生产数据和用户做任何操作。虽然被领导批评,还是庆幸没有动生成数据,也没有影响业务用户。似乎成了魔咒,每个DBA都要犯几次错误,好吧。我们暂且放下,来讨论数据泵迁移为。

   需求是将一个用户迁移到另一个数据库,也就是迁移一个schema.我们在学习Oracle的数据库时,对schema的定义是数据库对象的集合,这个集合包括:表,索引,约束,触发器,存储过程,视图等对象,也就我们通过dba_obects可以查到的对象类型,下面我们查询看一下:

SYS@orcl1>select distinct object_type from dba_objects;

OBJECT_TYPE
-------------------
EDITION
INDEX PARTITION
TABLE SUBPARTITION
CONSUMER GROUP
SEQUENCE
TABLE PARTITION
SCHEDULE
QUEUE
RULE
PROCEDURE

.....

在我的11.2.0.4版本数据库中,有37中对象类型,下面我们查询一个用户和索引的定义

DBMS_METADATA.GET_DDL('INDEX','PK_EMP','SCOTT')
--------------------------------------------------------------------------------

CREATE UNIQUE INDEX "SCOTT"."PK_EMP" ON "SCOTT"."EMP" ("EMPNO")
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS"

这是一个索引的定义,我们看到的是一个定义语句,其实对于这个对象,Oracle在逻辑导出时,就是将这些语句导出,然后根据对象定义顺序依次再导入数据库,执行这些语句。

下面是表的定义

CREATE TABLE "SCOTT"."EMP"
( "EMPNO" NUMBER(4,0),
"ENAME" VARCHAR2(10),
"JOB" VARCHAR2(9),
"??MGR" NUMBER(4,0),
"HIREDATE" DATE,
"SAL" NUMBER(7,2),
"COMM" NUMBER(7,2),
"DEPTNO" NUMBER(2,0),
CONSTRAINT "PK_EMP" PRIMARY KEY ("EMPNO")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS" ENABLE,
CONSTRAINT "FK_DEPTNO" FOREIGN KEY ("DEPTNO")
REFERENCES "SCOTT"."DEPT" ("DEPTNO") ENABLE
) SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS"

表这个表定义很复杂,其实有很多参数是默认行为,这是Oracle在导出整个对象定义时,要完全导出,那么我们用如下语句导出一个用户的数据

[oracle@p1]$expdp 'userid="/ as sysdba"' directory=DIR schemas=scott dumpfile=scott%U.dmp parallel=8;

Connected to: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
Starting "SYS"."SYS_EXPORT_SCHEMA_04": userid="/******** AS SYSDBA" directory=DMPDIR schemas=pay dumpfile=pay%U.dmp parallel=8
Processing object type SCHEMA_EXPORT/USER
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/SEQUENCE/SEQUENCE
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/COMMENT
Processing object type SCHEMA_EXPORT/PROCEDURE/PROCEDURE
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
Processing object type SCHEMA_EXPORT/STATISTICS/MARKER
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/JOB
Processing object type SCHEMA_EXPORT/PROCEDURE/ALTER_PROCEDURE
. . exported "SCOTT"."EMP1" 2.124 GB 5936487 rows

...

注意,这一部分就是在导出用户定义,权限,对象定义如触发器,存储过程,索引,约束,序列号以及相关对的统计信息

那么如果我们要讲该用户导入另个一数据库,我的问题是我们需要做哪些工作,比如需要提前建用户吗,需要提前给用户根据生产库的权限授权吗,需要提前建好表空间?

其实,从上面的逻辑定义就知道,我们不必给出用户定义,也没有必要比对源库做授权,我们需要的仅仅是创建同名的表空间,保证这个空间足够即可(生产库往往需要某个用户对应一个具体表空间)其他信息逻辑导出的文件中都已经包含

在提前创建了足够表空间大小的前提下,我们使用如下方式导入数据。

[oracle@w]$impdp 'userid="/ as sysdba"' directory=DIR schemas=scott dumpfile=scott%U.dmp parallel=8;
Connected to: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
Master table "SYS"."SYS_IMPORT_SCHEMA_01" successfully loaded/unloaded
Starting "SYS"."SYS_IMPORT_SCHEMA_01": userid="/******** AS SYSDBA" directory=DIR schemas=scott dumpfile=scott%U.dmp parallel=8
Processing object type SCHEMA_EXPORT/USER
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/SEQUENCE/SEQUENCE
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
. . imported "SCOTT"."T1" 0 KB 0 rows

.......

这里继续导入表数据

下面是创建对象对象,这个过程有点慢(相比前面操作)

Processing object type SCHEMA_EXPORT/TABLE/COMMENT
Processing object type SCHEMA_EXPORT/PROCEDURE/PROCEDURE
Processing object type SCHEMA_EXPORT/PROCEDURE/ALTER_PROCEDURE
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type SCHEMA_EXPORT/STATISTICS/MARKER
Processing object type SCHEMA_EXPORT/JOB
我们在早导入导出中,使用了并行,这是我们必须指定dumpfile=scott%U.dmp 否则不会开启并行导出,导入时对使用dumpfile=scott%U.dmp 开启并行。

导入完毕,我们还需要验证是否有对象,比如存储过程失效,此时需要重新编译,这里就不演示了,

select object_name,object_type,status from dba_objects where owner='SCOTT';

比如存储过程失效可以如下编译即可

alter procedure p1 compile

总结:数据泵迁移一个用户,目标库只需要创建表空间,且大小足够即可,为了加速迁移可以通过并行解决,同时对于小文件网络传输效率更高,我就遇到通过SecureFX传输大文件速度极慢

后改并行使用小文件。

看看时间已经11:59 赶紧发布今天的文章吧




分享好友

分享这个小栈给你的朋友们,一起进步吧。

Oracle运维新鲜事-技术与管理各占半边天
创建时间:2020-08-04 11:34:57
本技术栈旨在分享技术心得,运维趣事,故障处理经验,调优案例,故障处理涉及集群,DG,OGG,大家生产中遇到的问题基本都会囊括了,我会发布生产库遇到的故障,希望在交流中互助互益,共同提高,也希望大家讨论,如果您有生产中遇到的集群问题,也可以在这里提出来,一起讨论,现实中也帮助不少同学解决了生产库的故障。
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

栈主、嘉宾

查看更多
  • Abraham林老师
    栈主
  • 小雨滴
    嘉宾
  • hawkliu
    嘉宾
  • u_97a59a25246404
    嘉宾

小栈成员

查看更多
  • 栈栈
  • dapan
  • 小菜鸟___
  • hwayw
戳我,来吐槽~