Oracle使用expdp/impdp实现全库导入导出的整体流程

简介: Oracle的全库导入,首先一点必须先创建数据库,创建了数据库,才能往该数据库导入所有数据。相对来说,使用Oracle进行数据导入导出还很有些“麻烦”的,大多数资料上来就是......

Oracle的全库导入,首先一点必须先创建数据库,创建了数据库,才能往该数据库导入所有数据。

相对来说,使用Oracle进行数据导入导出还很有些“麻烦”的,大多数资料上来就是一堆命令或者命令的介绍,相关的、冗余的都杂糅在一起,看着往往让人越来越不清晰(深入熟悉了解Oracle架构、PL/SQL的大神除外)。

因此,对使用 expdp/impdp 命令工具对全库导出和导入的整体操作流程和主要步骤进行介绍和记录,最后,关于全库迁移的处理,还是推荐使用 rman 工具(一个看起来和使用起来似乎更加麻烦的工具,但功能应该很强)。

数据库导出

创建导出文件的目录directory

登陆数据库。

创建directory,名称为DUMP_DIR,用于在导出时指定导出到的目录:

create directory DUMP_DIR as 'D:\OracleExpdp';
注意,(路径)要用单引号,双引号会报错。

查看directory:

select * from dba_directories;    --查看directory

数据泵将数据库全部导出

如下,为 expdp 导出数据库全部数据的命令。

记得修改正确的username/password,数据库服务名SIDdumpfile为导出的数据文件名,默认名为expdat.dmp,逗号分割可以指定导出到多个文件,logfile为导出的日志文件名,若不指定,默认生成名为export.log的日志文件。

expdp username/password@SID directory=DUMP_DIR dumpfile=文件名.dmp logfile=文件名.log full=y

FULL表示导出整个数据库,默认N。

注:用户需要授权导出的权限,若是系统认证,或system/sys高级用户,则不需要。

授予用户导入导出操作相关的权限:

grant read,write on directory DUMP_DIR to username;
grant exp_full_database to username;

数据库导入

创建文件的目录directory

登陆数据库。同样创建directory,指定导入时文件所在的路径:

create directory DUMP_DIR as 'D:\OracleExpdp';
DUMP_DIR 指向 dmp 导出的数据文件所在路径。

导入全部数据

impdp username/password@SID directory=DUMP_DIR dumpfile=文件名.dmp logfile=文件名.log full=y

同样,用户要有足够的权限

使用系统认证(或系统用户)进行数据库导出和导入

使用系统认证(sysdba角色)登陆数据库,免除用户权限的问题,可以更方便的直接执行导出或导入。

  • 创建目录DUMP_DIR
create directory DUMP_DIR as 'D:\OracleExpdp';
  • 全部导出
expdp '/@SID as sysdba' directory=DUMP_DIR dumpfile=文件名.dmp logfile=文件名.log full=y
如果报错,则使用 "'/@SID as sysdba'"【实际使用没问题】形式,或 \'/@SID as sysdba\'

sys 用户

expdp 'sys/admin@SID as sysdba' directory=DUMP_DIR dumpfile=文件名.dmp logfile=文件名.log full=y
"'sys/admin@SID as sysdba'"
  • 全部导入
impdp '/@SID as sysdba' directory=DUMP_DIR dumpfile=文件名.dmp logfile=文件名.log full=y
"'/@SID as sysdba'"

或sys用户

impdp 'sys/admin@SID as sysdba' directory=DUMP_DIR dumpfile=文件名.dmp logfile=文件名.log full=y
"'sys/admin@SID as sysdba'"

expdp报错UDE-00014: invalid value for parameter, ‘attach’

这个原因在于@SID位置放置不正确。密码password@SID之前不能有空格,并且要紧挨着。也就是上面所示的写法。系统认证的/也要写成/@SID

参考UDE-00014: invalid value for parameter, ‘attach’终极解决方案之一

保证源和目标数据库的字符集一致

select userenv('language') from dual;查看数据库的字符集。

通常字符集在创建数据库时指定好,创建后则不应该修改。

如果导入导出时不一致,推荐的做法是,删除目标数据库,重新创建与源库字符集一样的数据库,而不是直接进行字符集的修改。

具体参见:修改oracle数据库字符集编码

expdp/impdp相比exp/imp的优点

imp 需要先建立表空间、用户等再导入。impdp则不需要。

expdp/impdp 支持全库导入导出;效率相对更高。

表空间块大小与配置大小不一致导致导入时无法创建表空间的问题

impdp导入是会创建表空间、用户等,但是,如果表空间大小与配置的不一样就会报错ORA-29339

ORA-29339: 表空间块大小 16384 与配置的块大小不匹配

通常在直接用plsql创建表空间时,也有可能出现这个错误。这是由于创建表空间时指定的块大小与系统设置的块大小不一致。

解决办法通常是修改db_Nk_cache_size的大小。但是,有些块大小是和系统存储的块大小一致的,不允许修改。

如下为自己测试,有些能够修改,并且提示“已更改”,但是查看仍然没有变化。

SQL> alter system set db_4k_cache_size=8m;

系统已更改。

SQL> show parameter 4k;

NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------
db_4k_cache_size                     big integer            32M

最终也是没有解决。

【其原因应该是源库没有使用默认的块大小(block_size)】

最开始的表空间导入失败,导致后面剩余的数据或信息的导入都失败。

正确的处理,应该是创建表空间,然后在依次执行用户、表、数据的导入,而不能直接进行整库的导入。

具体通过各个部分进行导出导入,参见参考文章。

附:expdp help=y查看expdp的帮助信息

附:关于grants=Y参数

在ORA-39083 - During Impdp中看到有使用grants=Y参数。其具体作用和使用暂时不清楚。

exp username/password tables=(mytables, moretables) file=mytable.dmp lpg=mytable.log  grants=Y

imp username/password tables=(mytables, moretables) file=mytable.dmp log=myimport.log grants=Y

附:全库(整体数据库)备份迁移推荐使用rman

全库或整体数据库的迁移,通常还是推荐使用 rman 工具。

附:expimp的示例

exp "'/@SID as sysdba'" file=D:\dumpfile.dmp full=y


imp "'/@SID as sysdba'" file=D:\dumpfile.dmp full=y

imp "'/@SID as sysdba'" file=D:\dumpfile.dmp full=y ignore=y
exp "'/ as sysdba'"@SID file=D:\dumpfile.dmp full=y


imp "'/ as sysdba'"@SID file=D:\dumpfile.dmp full=y

## imp "'/ as sysdba'"@SID file=D:\dumpfile.dmp full=y ignore=y

参考

其他

12c向19c迁移:使用数据泵(impdp)+dblink做全量迁移

相关文章
|
Oracle 关系型数据库 流计算
Flink CDC不支持直接连接到Oracle ADG备库进行数据同步
Flink CDC不支持直接连接到Oracle ADG备库进行数据同步
307 1
|
6月前
|
SQL Oracle 关系型数据库
实时计算 Flink版产品使用合集之和Oracle数据同步必须是使用主库吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
实时计算 Flink版产品使用合集之和Oracle数据同步必须是使用主库吗
|
1月前
|
Oracle 关系型数据库 MySQL
shell获取多个oracle库mysql库所有的表
请注意,此脚本假设你有足够的权限访问所有提到的数据库。在实际部署前,请确保对脚本中的数据库凭据、主机名和端口进行适当的修改和验证。此外,处理数据库操作时,务必谨慎操作,避免因错误的脚本执行造成数据损坏或服务中断。
39 0
|
4月前
|
Oracle 关系型数据库 Linux
讲解linux下的Qt如何编译oracle的驱动库libqsqloci.so
通过这一连串的步骤,可以专业且有效地在Linux下为Qt编译Oracle驱动库 `libqsqloci.so`,使得Qt应用能够通过OCI与Oracle数据库进行交互。这些步骤适用于具备一定Linux和Qt经验的开发者,并且能够为需要使用Qt开发数据库应用的专业人士提供指导。
145 1
讲解linux下的Qt如何编译oracle的驱动库libqsqloci.so
|
6月前
|
Oracle Java 关系型数据库
实时计算 Flink版产品使用合集之支持 Oracle 整库同步吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
6月前
|
SQL 消息中间件 Oracle
实时计算 Flink版产品使用合集之怎么同步Oracle备库
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
Oracle 关系型数据库 数据库
Flink CDC中oracle dataguard模式下,有没有cdc备库的方案?
Flink CDC中oracle dataguard模式下,有没有cdc备库的方案?
185 1
|
Oracle 关系型数据库 Apache
一键实现 Oracle 数据整库同步至 Apache Doris
极大降低数据同步门槛,使数据同步变得更加简单高效
一键实现 Oracle 数据整库同步至 Apache Doris