100天精通Oracle-实战系列(第22天)Oracle 数据泵全库导出导入
Posted Lucifer三思而后行
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了100天精通Oracle-实战系列(第22天)Oracle 数据泵全库导出导入相关的知识,希望对你有一定的参考价值。
Oracle 数据泵脚本备份数据库用户
介绍
在工作中正常只需要导应用用户,全库导出导入的方式一般不太常用,本文仅做介绍演示。
通过设置参数 full=y
可以执行全库导出导入操作,必须使用拥有 DBA
权限或者 DATAPUMP_EXP_FULL_DATABASE
角色的用户才能执行该操作:
expdp system/oracle directory=expdp_dir dumpfile=full.dmp logfile=full_exp.log full=y
impdp system/oracle directory=expdp_dir dumpfile=full.dmp logfile=full_imp.log full=y
全库导出一般很少用于数据库迁移/升级/备份,不可控且容易造成时间空间的浪费,更适用于小容量、重要等级低的数据库(个人愚见,不喜勿喷)。
视频点我跳转 ,直接观看视频教程!
📢 本文用到的所有安装介质和 PDF 版都会打包上传到百度网盘供大家下载,前提是大家先订阅本专栏,然后添加我的微信:
Lucifer-4622
。
资料点我跳转,关注我的公众号,回复:100天实战,即可领取课程全套资料包!
创建文件导出路径(源端/目标端)
有条件的话,可以nfs在目标端和源端挂载同一个盘,这样可以省去拷贝文件的时间。
## root 下
mkdir /expdp
chown oracle:oinstall /expdp
su - oracle
sqlplus / as sysdba
select * from dba_directories;
create directory expdp_dir as '/expdp';
grant read,write on directory expdp_dir to system;
全库导出
全库导出会导出以下信息:
- 用于重建表空间,用户,表,索引,约束,触发器,序列,以及存储的 PL/SQL 脚本等元素的所有 DDL 语句;
- 除去 SYS 用户下的所有表中的数据
拼接系统用户:
select listagg('\\''' || username || '\\''',',') within group(order by username) from dba_users where created < (select created from v$database);
正常使用全库导出时,可以排除掉数据库的原始用户数据,只导出应用用户数据(使用exclude参数):
-- 排除系统用户
expdp system/oracle directory=expdp_dir full=y exclude=schema:\\"IN \\(\\'ANONYMOUS\\',\\'APEX_030200\\',\\'APEX_PUBLIC_USER\\',\\'APPQOSSYS\\',\\'CTXSYS\\',\\'DBSNMP\\',\\'DIP\\',\\'EXFSYS\\',\\'FLOWS_FILES\\',\\'MDDATA\\',\\'MDSYS\\',\\'MGMT_VIEW\\',\\'OLAPSYS\\',\\'ORACLE_OCM\\',\\'ORDDATA\\',\\'ORDPLUGINS\\',\\'ORDSYS\\',\\'OUTLN\\',\\'OWBSYS\\',\\'OWBSYS_AUDIT\\',\\'SCOTT\\',\\'SI_INFORMTN_SCHEMA\\',\\'SPATIAL_CSW_ADMIN_USR\\',\\'SPATIAL_WFS_ADMIN_USR\\',\\'SYS\\',\\'SYSMAN\\',\\'SYSTEM\\',\\'WMSYS\\',\\'XDB\\',\\'XS$NULL\\'\\)\\" dumpfile=full.dmp logfile=full_exp.log
不要使用 include 参数。
执行导出前,为了保持数据静止,建议关闭job,关闭监听,重启数据库(如果是rac,建议只保留一个节点开启):
lsnrctl stop
sqlplus / as sysdba
alter system set job_queue_processes=0 sid='*';
shu immediate
startup
记录当前数据库的无效对象:
select owner,object_name,object_type from dba_objects where status='IVALID';
在 oracle 用户下执行导出命令,可以根据实际情况开启并行度以及压缩等参数(如果是RAC,加上cluster=N):
expdp system/oracle directory=expdp_dir full=y exclude=schema:\\"IN \\(\\'ANONYMOUS\\',\\'APEX_030200\\',\\'APEX_PUBLIC_USER\\',\\'APPQOSSYS\\',\\'CTXSYS\\',\\'DBSNMP\\',\\'DIP\\',\\'EXFSYS\\',\\'FLOWS_FILES\\',\\'MDDATA\\',\\'MDSYS\\',\\'MGMT_VIEW\\',\\'OLAPSYS\\',\\'ORACLE_OCM\\',\\'ORDDATA\\',\\'ORDPLUGINS\\',\\'ORDSYS\\',\\'OUTLN\\',\\'OWBSYS\\',\\'OWBSYS_AUDIT\\',\\'SCOTT\\',\\'SI_INFORMTN_SCHEMA\\',\\'SPATIAL_CSW_ADMIN_USR\\',\\'SPATIAL_WFS_ADMIN_USR\\',\\'SYS\\',\\'SYSMAN\\',\\'SYSTEM\\',\\'WMSYS\\',\\'XDB\\',\\'XS$NULL\\'\\)\\" dumpfile=full.dmp logfile=full_exp.log compression=all parallel=8
导出时间依赖于数据库的大小以及磁盘的IO性能,导出完成后查看日志是否存在错误。
全库导入
需要注意的点:
- 确保目标端字符集与源端保持一致,否则可能导致乱码。
- 确保存放数据文件的磁盘空间足够。
- 确保源端数据文件路径在目标端存在或者目标端配置OMF参数(手工创建表空间也可以)。
- 目标端存在数据的话,需要加上table_exists_action参数。
执行导入前,同样建议关闭job,关闭监听,重启数据库(如果是rac,建议只保留一个节点开启):
lsnrctl stop
sqlplus / as sysdba
-- 设置OMF
alter system set db_create_file_dest='/oradata' sid='*';
-- 关闭job
alter system set job_queue_processes=0 sid='*';
-- 重启数据库
shu immediate
startup
在 oracle 用户下执行导入(如果是RAC,加上cluster=N,导入时可以选择全库导入,也可以导出指定用户):
-- 全库导入
impdp system/oracle directory=expdp_dir dumpfile=full.dmp logfile=full_imp.log full=y parallel=8 table_exists_action=truncate
如果导入过程中出现 ORA-31684
错误,代表目标库已存在,可以忽略这个错误。
收尾
当导入完成后,目标端执行无效对象重编译后,与源端进行比较:
sqlplus / as sysdba @?/rdbms/admin/utlrp.sql
打开监听,重启数据库,打开job:
lsnrctl start
sqlplus / as sysdba
shu immediate
startup
alter system set job_queue_processes=1000 sid='*';
至此,全库导出导入完成。
💻 视频教程
如此保姆级的教程文章如果还不会的话,那就再给大家来一个视频教程吧!觉得不错的点个关注,三连投币一波!
创作不易,还请多多支持,点点订阅,鼓励一下博主!
附:返回总目录的传送门如下
以上是关于100天精通Oracle-实战系列(第22天)Oracle 数据泵全库导出导入的主要内容,如果未能解决你的问题,请参考以下文章
100天精通Oracle-实战系列(第22天)Oracle 数据泵全库导出导入
100天精通Oracle-实战系列(第22天)Oracle 数据泵全库导出导入
100天精通Oracle-实战系列(第1天)保姆级 VirtualBox 虚拟机安装 Linux 系统
100天精通Oracle-实战系列(第11天)Oracle RMAN 基础配置和常用命令