Oracle Database 10g 引入了最新的数据泵(Data Dump)技术,数据泵导出导入
(EXPDP 和 IMPDP)的作用:
1)实现逻辑备份和逻辑恢复.
2)在数据库用户之间移动对象.
3)在数据库之间移动对象
4)实现表空间搬移.
在 10g 之前,传统的导出和导入分别使用 exp 工具和 imp 工具,从 10g 开始,不仅保留了原有的exp和imp工具,还提供了数据泵导出导入工具expdp和impdp.使用expdp和 impdp 时应该注意的事项:
1)exp 和 imp 是客户端工具程序,它们既可以在可以客户端使用,也可以在服务端使用。
2)expdp 和 impdp 是服务端的工具程序,他们只能在 oracle 服务端使用,不能在客户端使用。
3)imp 只适用于 exp 导出文件,不适用于 expdp 导出文件;impdp 只适用于 expdp导出文件,而不适用于 exp 导出文件。
数据泵导出包括导出表,导出方案,导出表空间,导出数据库 4 种方式.
oracle 数据泵的工作流程如下:
1、在命令行执行命令
2、expdp/impdp 命令调用 dbms_datapump pl/sql 包。 这个 api 提供高速的导出导入功能。
3、当 data 移动的时候, data pump 会自动选择 direct path 或者 external table mechanism 或者 两种结合的方式。当 metadata(对象定义) 移动的时候,data pump 会使用 dbms_metadata pl/sql包。 metadata api 将 metadata(对象定义)存储在 xml 里。
所有的进程都能 load 和 unload 这些 metadata. 因为 data pump 调用的是服务端的 api, 所以当一个任务被调度或执行,客户端就可以退出连接,任务 job 会在 server端继续执行,随后通过客户端实用程序从任何地方检查任务的状态和进行修改
参考链接:https://www.linuxidc.com/Linux/2017-09/146764.htm
https://www.cnblogs.com/jyzhao/p/4522868.html
(1)关键字 说明 (默认)
ATTACH 连接到现有作业, 例如 ATTACH [=作业名]。
COMPRESSION 减小转储文件内容的大小, 其中有效关键字 值为: ALL, (METADATA_ONLY), DATA_ONLY和NONE。
CONTENT 指定要卸载的数据, 其中有效关键字 值为: (ALL), DATA_ONLY 和 METADATA_ONLY。
DATA_OPTIONS 数据层标记, 其中唯一有效的值为: 使用CLOB格式的 XML_CLOBS-write XML 数据类型。
DIRECTORY 供转储文件和日志文件使用的目录对象,即逻辑目录。
DUMPFILE 目标转储文件 (expdp.dmp) 的列表,例如 DUMPFILE=expdp1.dmp, expdp2.dmp。
ENCRYPTION 加密部分或全部转储文件, 其中有效关键字值为: ALL, DATA_ONLY, METADATA_ONLY,ENCRYPTED_COLUMNS_ONLY 或 NONE。
ENCRYPTION_ALGORITHM 指定应如何完成加密, 其中有效关键字值为: (AES128), AES192 和 AES256。
ENCRYPTION_MODE 生成加密密钥的方法, 其中有效关键字值为: DUAL, PASSWORD 和 (TRANSPARENT)。
ENCRYPTION_PASSWORD 用于创建加密列数据的口令关键字。
ESTIMATE 计算作业估计值, 其中有效关键字值为: (BLOCKS) 和 STATISTICS。
ESTIMATE_ONLY 在不执行导出的情况下计算作业估计值。
EXCLUDE 排除特定的对象类型, 例如 EXCLUDE=TABLE:EMP。例:EXCLUDE=[object_type]:[name_clause],[object_type]:[name_clause] 。
FILESIZE 以字节为单位指定每个转储文件的大小。
FLASHBACK_SCN 用于将会话快照设置回以前状态的 SCN。 -- 指定导出特定SCN时刻的表数据。
FLASHBACK_TIME 用于获取最接近指定时间的 SCN 的时间。-- 定导出特定时间点的表数据,注意FLASHBACK_SCN和FLASHBACK_TIME不能同时使用。
FULL 导出整个数据库 (N)。
HELP 显示帮助消息 (N)。
INCLUDE 包括特定的对象类型, 例如 INCLUDE=TABLE_DATA。
JOB_NAME 要创建的导出作业的名称。
LOGFILE 日志文件名 (export.log)。
NETWORK_LINK 链接到源系统的远程数据库的名称。
NOLOGFILE 不写入日志文件 (N)。
PARALLEL 更改当前作业的活动 worker 的数目。
PARFILE 指定参数文件。
QUERY 用于导出表的子集的谓词子句。--QUERY = [schema.][table_name:] query_clause。
REMAP_DATA 指定数据转换函数,例如 REMAP_DATA=EMP.EMPNO:REMAPPKG.EMPNO。
REUSE_DUMPFILES 覆盖目标转储文件 (如果文件存在) (N)。
SAMPLE 要导出的数据的百分比。
SCHEMAS 要导出的方案的列表 (登录方案)。
STATUS 在默认值 (0) 将显示可用时的新状态的情况下,要监视的频率 (以秒计) 作业状态。
TABLES 标识要导出的表的列表 - 只有一个方案。-[schema_name.]table_name[:partition_name][,…]
TABLESPACES 标识要导出的表空间的列表。
TRANSPORTABLE 指定是否可以使用可传输方法, 其中有效关键字值为: ALWAYS, (NEVER)。
TRANSPORT_FULL_CHECK 验证所有表的存储段 (N)。
TRANSPORT_TABLESPACES 要从中卸载元数据的表空间的列表。
VERSION 要导出的对象的版本, 其中有效关键字为:(COMPATIBLE), LATEST 或任何有效的数据库版本。
ADD_FILE 向转储文件集中添加转储文件。
CONTINUE_CLIENT 返回到记录模式。如果处于空闲状态, 将重新启动作业。
EXIT_CLIENT 退出客户机会话并使作业处于运行状态。
FILESIZE 后续 ADD_FILE 命令的默认文件大小 (字节)。
HELP 总结交互命令。
KILL_JOB 分离和删除作业。
PARALLEL 更改当前作业的活动 worker 的数目。PARALLEL=<worker 的数目>。
_DUMPFILES 覆盖目标转储文件 (如果文件存在) (N)。
START_JOB 启动/恢复当前作业。
STATUS 在默认值 (0) 将显示可用时的新状态的情况下,要监视的频率 (以秒计) 作业状态。STATUS[=interval]。
STOP_JOB 顺序关闭执行的作业并退出客户机。STOP_JOB=IMMEDIATE 将立即关闭数据泵作业。
(1). ATTACH
该选项用于在客户会话与已存在导出作用之间建立关联.语法如下
ATTACH=[schema_name.]job_name
Schema_name 用于指定方案名,job_name 用于指定导出作业名.注意,如果使用 ATTACH 选项,在命令行除了连接字符串和 ATTACH 选项外,不能指定任何其他选项,示例如下:
Expdp scott/tiger ATTACH=scott.export_job
(2). CONTENT
该选项用于指定要导出的内容.默认值为 ALL
CONTENT={ALL | DATA_ONLY | METADATA_ONLY}当设置 CONTENT 为 ALL 时,将导出对象定义及其所有数据.为 DATA_ONLY 时,只导出对象数据,为METADATA_ONLY 时,只导出对象定义。
Expdp scott/tiger DIRECTORY=dump DUMPFILE=a.dump CONTENT=METADATA_ONLY
(3) DIRECTORY
指定转储文件和日志文件所在的目录,DIRECTORY=directory_object
Directory_object 用于指定目录对象名称.需要注意,目录对象是使用 CREATE DIRECTORY 语句建立的 对象,而不是 OS 目录。
Expdp scott/tiger DIRECTORY=dump DUMPFILE=a.dump
先在对应的位置创建物理文件夹,如 D:/backup
建立目录:
create or replace directory backup as '/opt/oracle/utl_file'
SQL>CREATE DIRECTORY backup as ‘d:/backup’;
SQL>grant read,write on directory backup to SYSTEM;
查询创建了那些子目录:
SELECT * FROM dba_directories;
(4). DUMPFILE
用于指定转储文件的名称,默认名称为 expdat.dmp
DUMPFILE=[directory_object:]file_name [,….]
Directory_object 用于指定目录对象名,file_name 用于指定转储文件名.需要注意,如果不指定
directory_object,导出工具会自动使用 DIRECTORY 选项指定的目录对象:
Expdp scott/tiger DIRECTORY=dump1 DUMPFILE=dump2:a.dmp
(5). ESTIMATE
指定估算被导出表所占用磁盘空间分方法.默认值是 BLOCKS。
EXTIMATE={BLOCKS | STATISTICS}
设置为 BLOCKS 时,oracle 会按照目标对象所占用的数据块个数乘以数据块尺寸估算对象占用的空间,
设置为 STATISTICS 时,根据最近统计值估算对象占用空间 :
Expdp scott/tiger TABLES=emp ESTIMATE=STATISTICS DIRECTORY=dump DUMPFILE=a.dump
(6). EXTIMATE_ONLY
指定是否只估算导出作业所占用的磁盘空间,默认值为 N
EXTIMATE_ONLY={Y | N}
设置为 Y 时,导出作用只估算对象所占用的磁盘空间,而不会执行导出作业,为 N 时,不仅估算对象所占用的磁盘空间,还会执行导出操作.
Expdp scott/tiger ESTIMATE_ONLY=y NOLOGFILE=y
(7). EXCLUDE
该选项用于指定执行操作时释放要排除对象类型或相关对象
EXCLUDE=object_type[:name_clause] [,….]
Object_type 用于指定要排除的对象类型,name_clause 用于指定要排除的具体对象.EXCLUDE 和INCLUDE 不能同时使用。
Expdp scott/tiger DIRECTORY=dump DUMPFILE=a.dup EXCLUDE=VIEW
(8). FILESIZE
指定导出文件的最大尺寸,默认为0,(表示文件尺寸没有限制)
(9). FLASHBACK_SCN
指定导出特定 SCN 时刻的表数据。FLASHBACK_SCN=scn_value
Scn_value 用于标识 SCN 值.FLASHBACK_SCN 和 FLASHBACK_TIME 不能同时使用:
Expdp scott/tiger DIRECTORY=dump DUMPFILE=a.dmp FLASHBACK_SCN=358523
(10). FLASHBACK_TIME
指定导出特定时间点的表数据 FLASHBACK_TIME=”TO_TIMESTAMP(time_value)”
Expdp scott/tiger DIRECTORY=dump DUMPFILE=a.dmp FLASHBACK_TIME=“TO_TIMESTAMP(’25-08-2004 14:35:00’,’DD-MM-YYYY HH24:MI:SS’)”
(11). FULL
指定数据库模式导出,默认为 N。 FULL={Y | N} 。为 Y 时,标识执行数据库导出.
(12). HELP
指定是否显示 EXPDP 命令行选项的帮助信息,默认为 N。当设置为 Y 时,会显示导出选项的帮助信息.
Expdp help=y
(13). INCLUDE
指定导出时要包含的对象类型及相关对象。INCLUDE = object_type[:name_clause] [,… ]
(14). JOB_NAME
指定要导出作用的名称,默认为 SYS_XXX 。JOB_NAME=jobname_string
(15). LOGFILE
指定导出日志文件文件的名称,默认名称为 export.log
LOGFILE=[directory_object:]file_name
Directory_object 用于指定目录对象名称,file_name 用于指定导出日志文件名.如果不指定
directory_object.导出作用会自动使用 DIRECTORY 的相应选项值.
Expdp scott/tiger DIRECTORY=dump DUMPFILE=a.dmp logfile=a.log
(16). NETWORK_LINK
指定数据库链接名,如果要将远程数据库对象导出到本地例程的转储文件中,必须设置该选项.
(17). NOLOGFILE
该选项用于指定禁止生成导出日志文件,默认值为 N.
(18). PARALLEL
指定执行导出操作的并行进程个数,默认值为1
(19). PARFILE
指定导出参数文件的名称。PARFILE=[directory_path] file_name
(20). QUERY
用于指定过滤导出数据的 where 条件QUERY=[schema.] [table_name:] query_clause Schema 用于指定方案名,table_name 用于指定表名,query_clause 用于指定条件限制子句.QUERY 选项 不能与 CONNECT=METADATA_ONLY,EXTIMATE_ONLY,TRANSPORT_TABLESPACES 等选项同时使用.
Expdp scott/tiger directory=dump dumpfiel=a.dmp Tables=emp query=’WHERE deptno=20’
(21). SCHEMAS
该方案用于指定执行方案模式导出,默认为当前用户方案.
(22). STATUS
指定显示导出作用进程的详细状态,默认值为0
(23). TABLES
指定表模式导出
TABLES=[schema_name.]table_name[:partition_name][,…]
Schema_name 用于指定方案名,table_name 用于指定导出的表名,partition_name 用于指定要导出的 分区名.
(24). TABLESPACES
指定要导出表空间列表
(25). TRANSPORT_FULL_CHECK
该选项用于指定被搬移表空间和未搬移表空间关联关系的检查方式,默认为 N. 当设置为 Y 时,导出作用会检查表空间直接的完整关联关系,如果表空间所在表空间或其索引所在的表空间只有一个表空间 被搬移,将显示错误信息.当设置为 N 时,导出作用只检查单端依赖,如果搬移索引所在表空间,但未搬移表所在表空间,将显示出错信息,如果搬移表所在表空间,未搬移索引所在表空间,则不会显示错误信息.
(26). TRANSPORT_TABLESPACES
指定执行表空间模式导出
(27). VERSION
指定被导出对象的数据库版本,默认值为 COMPATIBLE.
VERSION={COMPATIBLE | LATEST | version_string}
为 COMPATIBLE 时,会根据初始化参数 COMPATIBLE 生成对象元数据;为 LATEST 时,会根据数据库的实际 版本生成对象元数据.version_string 用于指定数据库版本字符串.
使用 EXPDP 工具时,其转储文件只能被存放在 DIRECTORY 对象对应的 OS 目录中,而不能直接指定转储文件所在的 OS 目录.因此,使用 EXPDP 工具时,必须首先建立 DIRECTORY 对象.并且需要为数据库用户授予使用 DIRECTORY 对象权限.
首先创建相应的 directory:
CREATE DIRECTORY dump_dir AS ‘D:/DUMP’;
GRANT READ, WIRTE ON DIRECTORY dump_dir TO scott;
(1)导出表
Expdp scott/tiger DIRECTORY=dump_dir DUMPFILE=tab.dmp TABLES=dept,emp logfile=exp.log;
(2)导出方案 (schema,与用户对应)
Expdp scott/tiger DIRECTORY=dump_dir DUMPFILE=schema.dmp SCHEMAS=system,scott
logfile=/exp.log;
(3)导出表空间
Expdp system/manager DIRECTORY=dump_dir DUMPFILE=tablespace.dmp TABLESPACES=user01,user02
logfile=/exp.log;
(4)导出数据库
Expdp system/manager DIRECTORY=dump_dir DUMPFILE=full.dmp FULL=Y logfile=/exp.log;
ATTACH 连接到现有作业, 例如 ATTACH [=作业名]。
CONTENT 指定要卸载的数据, 其中有效关键字 值为: (ALL), DATA_ONLY 和 METADATA_ONLY。
DATA_OPTIONS 数据层标记,其中唯一有效的值为:SKIP_CONSTRAINT_ERRORS-约束条件错误不严重。
DIRECTORY 供转储文件,日志文件和sql文件使用的目录对象,即逻辑目录。
DUMPFILE 要从(expdp.dmp)中导入的转储文件的列表,例如 DUMPFILE=expdp1.dmp, expdp2.dmp。
ENCRYPTION_PASSWORD 用于访问加密列数据的口令关键字。此参数对网络导入作业无效。
ESTIMATE 计算作业估计值, 其中有效关键字为:(BLOCKS)和STATISTICS。
EXCLUDE 排除特定的对象类型, 例如 EXCLUDE=TABLE:EMP。
FLASHBACK_SCN 用于将会话快照设置回以前状态的 SCN。
FLASHBACK_TIME 用于获取最接近指定时间的 SCN 的时间。
FULL 从源导入全部对象(Y)。
HELP 显示帮助消息(N)。
INCLUDE 包括特定的对象类型, 例如 INCLUDE=TABLE_DATA。
JOB_NAME 要创建的导入作业的名称。
LOGFILE 日志文件名(import.log)。
NETWORK_LINK 链接到源系统的远程数据库的名称。
NOLOGFILE 不写入日志文件。
PARALLEL 更改当前作业的活动worker的数目。
PARFILE 指定参数文件。
PARTITION_OPTIONS 指定应如何转换分区,其中有效关键字为:DEPARTITION,MERGE和(NONE)。
QUERY 用于导入表的子集的谓词子句。
REMAP_DATA 指定数据转换函数,例如REMAP_DATA=EMP.EMPNO:REMAPPKG.EMPNO。
REMAP_DATAFILE 在所有DDL语句中重新定义数据文件引用。
REMAP_SCHEMA 将一个方案中的对象加载到另一个方案。
REMAP_TABLE 表名重新映射到另一个表,例如 REMAP_TABLE=EMP.EMPNO:REMAPPKG.EMPNO。
REMAP_TABLESPACE 将表空间对象重新映射到另一个表空间。
REUSE_DATAFILES 如果表空间已存在, 则将其初始化 (N)。
SCHEMAS 要导入的方案的列表。
SKIP_UNUSABLE_INDEXES 跳过设置为无用索引状态的索引。
SQLFILE 将所有的 SQL DDL 写入指定的文件。
STATUS 在默认值(0)将显示可用时的新状态的情况下,要监视的频率(以秒计)作业状态。
STREAMS_CONFIGURATION 启用流元数据的加载。
TABLE_EXISTS_ACTION 导入对象已存在时执行的操作。有效关键字:(SKIP),APPEND,REPLACE和TRUNCATE。
TABLES 标识要导入的表的列表。
TABLESPACES 标识要导入的表空间的列表。
TRANSFORM 要应用于适用对象的元数据转换。有效转换关键字为:SEGMENT_ATTRIBUTES,STORAGE,OID和PCTSPACE。
TRANSPORTABLE 用于选择可传输数据移动的选项。有效关键字为: ALWAYS 和 (NEVER)。仅在 NETWORK_LINK 模式导入操作中有效。
TRANSPORT_DATAFILES 按可传输模式导入的数据文件的列表。
TRANSPORT_FULL_CHECK 验证所有表的存储段 (N)。
TRANSPORT_TABLESPACES 要从中加载元数据的表空间的列表。仅在 NETWORK_LINK 模式导入操作中有效。
VERSION 要导出的对象的版本, 其中有效关键字为:(COMPATIBLE), LATEST 或任何有效的数据库版本。仅对 NETWORK_LINK 和 SQLFILE 有效。
(2)命令 说明
CONTINUE_CLIENT 返回到记录模式。如果处于空闲状态, 将重新启动作业。
EXIT_CLIENT 退出客户机会话并使作业处于运行状态。
HELP 总结交互命令。
KILL_JOB 分离和删除作业。
PARALLEL 更改当前作业的活动 worker 的数目。PARALLEL=<worker 的数目>。
START_JOB 启动/恢复当前作业。START_JOB=SKIP_CURRENT 在开始作业之前将跳过作业停止时执行的任意操作。
STATUS 在默认值 (0) 将显示可用时的新状态的情况下,要监视的频率 (以秒计) 作业状态。STATUS[=interval]。
STOP_JOB 顺序关闭执行的作业并退出客户机。STOP_JOB=IMMEDIATE 将立即关闭数据泵作业。
其实 IMPDP 命令行选项与 EXPDP 有很多相同的,下面我们只介绍不同的部分:
(1)REMAP_DATAFILE
该选项用于将源数据文件名转变为目标数据文件名,在不同平台之间搬移表空间时可能需要该选项.
REMAP_DATAFIEL=source_datafie:target_datafile
(2)REMAP_SCHEMA
该选项用于将源方案的所有对象装载到目标方案中.
REMAP_SCHEMA=source_schema:target_schema
(3)REMAP_TABLESPACE
将源表空间的所有对象导入到目标表空间中
REMAP_TABLESPACE=source_tablespace:target_tablespace
(4)REUSE_DATAFILES
该选项指定建立表空间时是否覆盖已存在的数据文件.默认为 N。
REUSE_DATAFIELS={Y | N}
(5)SKIP_UNUSABLE_INDEXES
指定导入是是否跳过不可使用的索引,默认为 N
(6)SQLFILE
指定将导入要指定的索引 DDL 操作写入到 SQL 脚本中。
SQLFILE=[directory_object:]file_name
Impdp scott/tiger DIRECTORY=dump DUMPFILE=tab.dmp SQLFILE=a.sql
(7)STREAMS_CONFIGURATION
指定是否导入流元数据(Stream Matadata),默认值为 Y.
(8)TABLE_EXISTS_ACTION
该选项用于指定当表已经存在时导入作业要执行的操作,默认为 SKIP
TABBLE_EXISTS_ACTION={SKIP | APPEND | TRUNCATE | FRPLACE }
当设置该选项为 SKIP 时,导入作业会跳过已存在表处理下一个对象;当设置为 APPEND 时,会追加数据, 为 TRUNCATE 时,导入作业会截断表,然后为其追加新数据;当设置为 REPLACE 时,导入作业会删除已存在表,重建表并追加数据,注意,TRUNCATE 选项不适用与簇表和 NETWORK_LINK 选项
(9)TRANSFORM
该选项用于指定是否修改建立对象的 DDL 语句
TRANSFORM=transform_name:value[:object_type]
Transform_name 用于指定转换名,其中 SEGMENT_ATTRIBUTES 用于标识段属性(物理属性,存储属性,表 空间,日志等息),STORAGE 用于标识段存储属性,VALUE 用于指定是否包含段属性或段存储属 性,object_type 用于指定对象类型.
Impdp scott/tiger directory=dump dumpfile=tab.dmp Transform=segment_attributes:n:table
(10)TRANSPORT_DATAFILES
该选项用于指定搬移空间时要被导入到目标数据库的数据文件。
TRANSPORT_DATAFILE=datafile_name
Datafile_name 用于指定被复制到目标数据库的数据文件
Impdp system/manager DIRECTORY=dump DUMPFILE=tts.dmp TRANSPORT_DATAFILES=’/user01/data/tbs1.f’
使用 impdp 工具时,如果数据库中不存在相应的 DIRECTORY,必须首先建立 DIRECTORY 对象.并且需要
为数据库用户授予使用 DIRECTORY 对象权限.
首先创建相应的 directory:
CREATE DIRECTORY dump_dir AS ‘D:/DUMP’;
GRANT READ, WIRTE ON DIRECTORY dump_dir TO scott;
(1)导入表
Impdp scott/tiger DIRECTORY=dump_dir DUMPFILE=tab.dmp TABLES=dept,emp logfile=/exp.log;
--将 DEPT 和 EMP 表导入到 SCOTT 方案中
Impdp system/manage DIRECTORY=dump_dir DUMPFILE=tab.dmp TABLES=scott.dept,scott.emp REMAP_SCHEMA=SCOTT:SYSTEM logfile=/exp.log;
-- 将 DEPT 和 EMP 表导入的 SYSTEM 方案中.
(2)导入方案
Impdp scott/tiger DIRECTORY=dump_dir DUMPFILE=schema.dmp SCHEMAS=scott logfile=/exp.log;
Impdp system/manager DIRECTORY=dump_dir DUMPFILE=schema.dmp
SCHEMAS=scott REMAP_SCHEMA=scott:system logfile=/exp.log;
(3)导入表空间
Impdp system/manager DIRECTORY=dump_dir DUMPFILE=tablespace.dmp TABLESPACES=user01
logfile=/exp.log;
(4)导入数据库
Impdp system/manager DIRECTORY=dump_dir DUMPFILE=full.dmp FULL=y logfile=/exp.log;
使用 expdp 工具时,其转储文件只能被存放在 directory 对象对应的 os 目录中,而不能直接指定转储文件所在的 os 目录.因此,使用 expdp 工具时,必须首先建立 directory对象.并且需要为数据库用户授予使用 directory 对象权限.
## 创建 directory
select * from dba_directories;
create directory data as '/data/dpdata';
--drop directory data
--create or replace directory dpdata as '/data/dpdata/'; (更改路径)
grant read,write on directory data to system;
grant read,write on directory itpuxbak_dir to itpux01;
--01)导出整个数据库
expdp system/oracle directory=datadumpfile=expdp_full_db01.dmp logfile=expdp_full_db01.log full=y
expdp system/oracle directory=itpuxbak_dir dumpfile=expdp_full_db01_%U.dmp logfile=expdp_full_db01.log full=y parallel=4 (如果使用并行参数,需要修改一下dumpfile 格式,parallel 使用cpu 的倍数)
--02)导出方案-schema 用户
expdp system/oracle directory=data dumpfile=expdp_u_itpux01.dmp logfile=expdp_u_itpux01.log schemas=itpux01,itpux02
--03)导出表空间
expdp system/oracle directory=data dumpfile=expdp_ts_itpux01.dmp logfile=expdp_ts_itpux01.log
tablespaces=itpux01,itpux02
--04)导出表
expdp system/oracle directory=data dumpfile=expdp_tb_itpux01.dmp logfile=expdp_tb_itpux01.log
tables=itpux01,itpux02
expdp itpux01/itpux01 directory=data dumpfile=expdp_tb_itpux01.dmp logfile=expdp_tb_itpux01.log tables=itpux01
--05)按表查询条件导出
expdp system/oracle directory=data dumpfile=expdp_q_itpux01.dmp logfile=expdp_q_itpux01.log tables=itpux01 query='where id=5'
expdp system/oracle directory=data dumpfile=expdp_q_itpux01.dmp logfile=expdp_q_itpux01.log
QUERY=employees:"WHERE department_id > 10" --employees 这里表示的是一张表
使用 impdp 工具时,如果数据库中不存在相应的 directory,必须首先建立 directory
对象.并且需要为数据库用户授予使用 directory 对象权限
## 创建 directory
select * from dba_directories;
create directory data as '/data/dpdata';
--drop directory data
--create or replace directory dpdata as '/data/dpdata/'; (更改路径)
grant read,write on directory data to system;
grant read,write on directory itpuxbak_dir to itpux01;
--01)导入整个数据库
impdp system/oracle directory=data dumpfile=expdp_full_db01.dmp logfile=impdp_full_db01.log full=y
impdp system/oracle directory=data dumpfile=expdp_full_db01_%U.dmp logfile=impdp_full_db01.log full=y parallel=4
--02)导入方案-schema-用户
impdp system/oracle directory=data dumpfile=expdp_u_itpux01.dmp logfile=impdp_u_itpux01.log
schemas=itpux01,itpux02
impdp system/oracle directory=data dumpfile=expdp_u_itpux01.dmp logfile=impdp_u_itpux01.log
schemas=itpux01,itpux02 remap_schema=itpux02:itpux002
--03)导入表空间
impdp system/oracle directory=data dumpfile=expdp_ts_itpux01.dmp logfile=impdp_ts_itpux01.log
tablespaces=itpux01,itpux02
--04)导入表
impdp system/oracle directory=data dumpfile=expdp_tb_itpux01.dmp logfile=impdp_tb_itpux01.log
tables=itpux01,itpux02
impdp system/oracle directory=data dumpfile=expdp_tb_itpux01.dmp logfile=impdp_tb_itpux01.log
tables=itpux01,itpux02 remap_schema=system:itpux
impdp itpux01/itpux01 directory=data dumpfile=expdp_tb_itpux01.dmp logfile=impdp_tb_itpux01.log
tables=itpux01
impdp system/oracle directory=data dumpfile=expdp_tb_itpux01.dmp logfile=impdp_tb_itpux01.log
TABLES=HR.EMPLOYEES,SH.SALES:SALES_1995
--05)按表查询条件导入
impdp system/oracle directory=datadumpfile=expdp_tb_itpux01.dmp logfile=impdp_tb_itpux01.log
tables=itpux01,itpux02 query='where id=5'
impdp system/oracle directory=data dumpfile=expdp_tb_itpux01.dmp logfile=impdp_tb_itpux01.log
tables=itpux01,itpux02 remap_schema=system:itpux query='where id=5'
impdp itpux01/itpux01 directory=data dumpfile=expdp_tb_itpux01.dmp logfile=impdp_tb_itpux01.log
tables=itpux01 query='where id=5'
impdp system/oracle directory=data dumpfile=expdp_tb_itpux01.dmp logfile=impdp_tb_itpux01.log
TABLES=HR.EMPLOYEES,SH.SALES:SALES_1995 QUERY=HR.EMPLOYEES:"WHERE department_id > 10"
--01)directory
create directory data as '/backup';
--drop directory itpuxbak_dir
select * from dba_directories
grant read,write on directory data to system; --system:itpux01:other users
grant create any directory to system;
select * from dba_sys_privs where grantee='SYSTEM';
--02) sysdba full=y (sysdbad的意思是以操作系统为认证进行的导出)
expdp "'/ as sysdba'" directory=data dumpfile=expdp_full_db01.dmp logfile=expdp_full_db01.log full=y --sys ( expdp \"/ as sysdba\" )
--3)查询 datapump jobs
select * from dba_datapump_jobs; (select * from DBA_DATAPUMP_SESSIONS;)
expdp "'/as sysdba'" directory=data dumpfile=expdp_full_db01.dmp logfile=expdp_full_db01.log full=y job_name=itpuxexpjob;
## 创建备份路径
su - oracle
sqlplus / as sysdba
create directory data as '/data/dpdata';
grant read,write on directory data to system;
grant create any directory to system;
## 编写备份脚本(在Oracle 用户下操作)
vim expdpfull.sh
export BAKDATE=`date +%Y%m%d`
nohup expdp system/oracle directory=data dumpfile=expdp_full_db01.$BAKDATE.%U.dmp logfile=expdp_full_db01.$BAKDATE.log full=y parallel=4 &
find /data/dpdata -name expdp_full_db01.*.dmp -atime +2 -exec rm -rf {} \;
--如果这个导出是 asm 的或者是 rac 的(两个节点的实例),那么在导出的时候需要加上参数: cluster=N,单机就不用加了
chmod 755 expdpfull.sh
## 自动进行备份
crontab -e
0 20 * * * sh /data/script/expdpfull.sh
--报错的处理:
ORA-39181: Only partial table data may be exported due to fine grain access control on "OE"."PURCHASEORDER"
select count(*) from "OE"."PURCHASEORDER"
grant EXEMPT ACCESS POLICY to system;
expdp system/oracle directory=itpuxbak_dir dumpfile=test-b.dmp logfile=test-b.log tables=OE.PURCHASEORDER
5.1、做数据迁移流程的目的
使用 expdp/impdp 进行数据迁移的前置条件、操作步骤,降低对对应用造成的影响及避免故障
5.2、数据迁移的适用范围
所有线上库>10.2
5.3、 数据迁移的风险评估
01.有些 os 对文件大小有限制,expdp 数据时需要使用 filesize 参数来分割导出文件
02.expdp 导出数据时没有正确估计 dmp 文件所需空间,导致主机磁盘满。
03.跨字符集的数据迁移,由于字符集不兼容导致数据迁移失败。
04.导入表空间不存在或者空间不足,导致表创建失败或者数据导入失败,导致其他应用报错
5.4、数据迁移的准备工作
01.检查源数据库和目标库的版本、字符集,如果目标库版本低于源库,使用目标库的软件做导出。如果字符集不一致,不建议使用 expdp/impdp 迁移数据。
02.user_segments 里查出导出表所占的空间大小,检查 os 对文件大小的限制。
03.表比较多的情况下,建议用 parfile。各个参数在 parfile 里写好
参数:指定导出参数文件的名称。PARFILE=[directory_path] file_name
04.提前准备备份脚本(parfile 参数):
cat expdp_itpux.par
userid=system/oracle
directory=data
dumpfile=expdp_full_db01.$BAKDATE.%U.dmp
logfile=expdp_full_db01.$BAKDATE.log
tables=user.tab1,user.tab2,user.tab3
parallel=4
vi expdp.sh
export BAKDATE=`date +%Y%m%d`
expdp parfile=expdp_itpux.par
nohup ./expdp.sh &
6.1 迁移目的
将 linux 系统 oracle 服务器上 schema(itpux01,itpux02)全部通过 ExpDP 全库迁移到另一台 oracle 服务器,并能正常查询到相关数据。
IMPDP 虽然加上 parallel 参数,在做 table 数据导入时确实速度提高了不少,但是在create index 和 statistics 时,依旧采用单线程的方式,故此一般在迁移过程中这两步操作选择生产 DDL 脚本增加 parallel 参数后手工执行,以最大化缩减迁移时间。
6.2 迁移流程:
---->>linux 系统 oracle 服务器上创建测试数据。
---->>linux 本地用 Expdp 做导出;
---->>远程主机创建相关对象;
---->>远程主机用 expdp 做导入(导入);
---->>验证远程本地数据合法性;
create tablespace itpux01 datafile '/data/app/oracle/oradata/orcl/itpux01.dbf' size 50m;
create tablespace itpux02 datafile '/data/app/oracle/oradata/orcl/itpux02.dbf' size 50m;
create user itpux01 identified by itpux01 default tablespace itpux01;
create user itpux02 identified by itpux02 default tablespace itpux02;
grant dba to itpux01;
grant dba to itpux02;
conn itpux01/itpux01
create table itpux01 (id number(10),name varchar2(10));
create index i_itpux01_id on itpux01(id);
insert into itpux01 values(1,'itpux01');
insert into itpux01 values(2,'itpux02');
insert into itpux01 values(3,'itpux03');
insert into itpux01 values(4,'itpux04');
insert into itpux01 values(5,'itpux05');
commit;
select * from itpux01;
conn itpux02/itpux02
create table itpux02 (id number(10),name varchar2(10));
create index i_itpux01_id on itpux02(id);
insert into itpux02 values(1,'itpux01');
insert into itpux02 values(2,'itpux02');
insert into itpux02 values(3,'itpux03');
insert into itpux02 values(4,'itpux04');
insert into itpux02 values(5,'itpux05');
commit;
select * from itpux02;
conn /as sysdba;
alter system switch logfile;
alter system checkpoint;
dbms_metadata.get_ddl 使用的参考文档:https://www.jb51.net/article/39715.htm
## 在源主机获取ddl (到另一台主机上创建表空间)(不过我之前用下面的2.2 步骤创建了表空间)
conn / as sysdba
SYS@orcl > spool itpux_tbs_create_ddl.sql
SYS@orcl > set long 200000 pagesize 0 head off verify off feedback off linesize 200
SYS@orcl > select dbms_metadata.get_ddl ('TABLESPACE','ITPUX01') from dual;
CREATE BIGFILE TABLESPACE "ITPUX01" DATAFILE
'/data/app/oracle/oradata/orcl/itpux01.dbf' SIZE 50
LOGGING ONLINE PERMANENT BLOCKSIZE 8192
EXTENT MANAGEMENT LOCAL AUTOALLOCATE DEFAULT
NOCOMPRESS SEGMENT SPACE MANAGEMENT AUTO
SYS@orcl > select dbms_metadata.get_ddl ('TABLESPACE','ITPUX02') from dual;
CREATE BIGFILE TABLESPACE "ITPUX02" DATAFILE
'/data/app/oracle/oradata/orcl/itpux02.dbf' SIZE 50m
LOGGING ONLINE PERMANENT BLOCKSIZE 8192
EXTENT MANAGEMENT LOCAL AUTOALLOCATE DEFAULT
NOCOMPRESS SEGMENT SPACE MANAGEMENT AUTO
SYS@orcl > spool off;
SYS@orcl >
create tablespace itpux01 datafile '/data/app/oracle/oradata/orcl/itpux01.dbf' size 50m;
create tablespace itpux02 datafile '/data/app/oracle/oradata/orcl/itpux02.dbf' size 50m;
create user itpux01 identified by itpux01 default tablespace itpux01;
create user itpux02 identified by itpux02 default tablespace itpux02;
grant dba to itpux01;
grant dba to itpux02;
[oracle@ogg12c script]$ more expdpfull.sh
export BAKDATE=`date +%Y%m%d`
nohup expdp system/oracle directory=data dumpfile=expdp_full_db01.$BAKDATE.%U.dmp logfile=expdp_full_db01.$BAKDATE.log full=y parallel=2 &
find /data/dpdata/ -name expdp_full_db01.*.dmp -atime +2 -exec rm -rf {} \;
## 执行脚本
[oracle@ogg12c script]$ sh expdpfull.sh
可以用次命令查看job
select * from dba_datapump_jobs;
把导出的数据传到另一台服务器上
[oracle@ogg12c dpdata]$ ls
expdp_full_db01.20200825.01.dmp expdp_full_db01.20200825.02.dmp expdp_full_db01.20200825.log
[oracle@ogg12c dpdata]$ pwd
/data/dpdata
expdp_full_db01.20200825.01.dmp expdp_full_db01.20200825.02.dmp expdp_full_db01.20200825.log
[oracle@ogg12c dpdata]$ scp expdp_full_db01.20200825.* oracle@192.168.43.116:/data/dpdata
禁止自动维护任务
建立目标数据目录
导入数据库(先到数据,在建索引)
## 关闭自动维护任务
SYS@orcl > execute dbms_auto_task_admin.disable;
## 创建数据目录
SYS@orcl > create or replace directory data as '/data/dpdata';
SYS@orcl > grant read,write on directory data to system;
select * from dba_directories;
## 进行导入 (先导入数据在导入索引,这样比较速度快)
impdp system/oracle directory=data schemas=itpux01,itpux02 dumpfile=expdp_full_db01.20200825.01.dmp,expdp_full_db01.20200825.02.dmp logfile=impdp_full_db01_ddl.log parallel=2 include=index,constraint sqlfile=indexddl.sql
进行查看: 我把没有用的信息都删除了
more indexddl.sql
略。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
CREATE INDEX "ITPUX01"."I_ITPUX01_ID" ON "ITPUX01"."ITPUX01" ("ID")
PCTFREE 10 INITRANS 2 MAXTRANS 255
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 "ITPUX01" PARALLEL 1 ;
ALTER INDEX "ITPUX01"."I_ITPUX01_ID" NOPARALLEL;
-- CONNECT ITPUX02
CREATE INDEX "ITPUX02"."I_ITPUX01_ID" ON "ITPUX02"."ITPUX02" ("ID")
PCTFREE 10 INITRANS 2 MAXTRANS 255
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 "ITPUX02" PARALLEL 1 ;
ALTER INDEX "ITPUX02"."I_ITPUX01_ID" NOPARALLEL;
略。。。。。。。。。。。。。。。。。。。。。。。。。。。。
## 导入数据
nohup impdp system/oracle directory=data dumpfile=expdp_full_db01.20200825.01.dmp,expdp_full_db01.20200825.02.dmp logfile=impdp_full_db01.log full=y parallel=2 exclude=index,constraint,statistics &
##把索引导入进去
[oracle@ogg12c dpdata]$ sqlplus / as sysdba
SYS@orcl > @indexddl.sql
##收集统计信息
stats.sql 编写为sql 文件
begin
dbms_stats.gather_database_stats;
end;
/
nohup sqlplus "/ as sysdba"@stats.sql &
## 无效对象的编译
检查并编译
@?/rdbms/admin/utlrp.sql
##验证数据(两边都进行查看)
select count(*) from itpux01.itpux01;
查看对象是否一致
select owner,object_type,count(*) from dba_objects where owner in ('ITPUX01','ITPUX02') group by owner,object_type order by object_type;
select owner,object_type,count(*) from dba_objects where owner in ('ITPUX01','ITPUX02') group by owner,object_type order by owner;s
select * from dba_objects where status <> 'VALID' and owner in ('ITPUX01','ITPUX02');
## 启动自动维护任务
execute dbms_auto_task_admin.enable;
检查并更正 job 运行时间
SELECT JOB,LOG_USER,SCHEMA_USER,what,LAST_DATE,LAST_SEC,NEXT_DATE,NEXT_SEC, FAILURES, BROKEN FROM DBA_JOBS;
进行数据的导入导出时,我们要注意关于字符集的问题。在 EXPDP/IMPDP 过程中我们需要注意四个字符集的参数:
01.导出端的客户端字符集。
02.导出端数据库字符集。
03.导入端的客户端字符集。
05.导入端数据库字符集。
select * from nls_database_parameters;
//SQL> select * from props$;
PARAMETER VALUE
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_CHARACTERSET ZHS16GBK --客户端应用程序使用的字符集
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE AMERICAN
NLS_SORT BINARY
NLS_TIME_FORMAT HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY $
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
NLS_NCHAR_CHARACTERSET AL16UTF16 --国家字符集
NLS_RDBMS_VERSION 11.2.0.4.0
##设置字符集(我们再来查看客户端的字符集信息:)
客户端字符集的参数 NLS_LANG=_< territory >.
language:指定 oracle 消息使用的语言,日期中日和月的显示。
Territory:指定货币和数字的格式,地区和计算星期及日期的习惯。
Characterset:控制客户端应用程序使用的字符集。通常设置或等于客户端的代码页。
ZHS16GBK、UTF8。
NLS_LANG=NLS_LANGUAGE_NLS_TERRITORY.NLS_CHARACTERSET 默认的格式
--win
set NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
--unix
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK --只是当前生效
在 unix 中:
$ env|grep NLS_LANG
NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
当前修改可用:
$ export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
永久修改可用:(需要修改环境变量参数文件 .bash_profile、.profile)
vi bash_profile
通常在导出时最好把客户端字符集设置得和数据库端相同。当进行数据导入时,主要有以下两种情况:
(1) 源数据库和目标数据库具有相同的字符集设置。这时,只需设置导出和导入端的客户端 NLS_LANG 等于数据库字符集即可。
(2) 源数据库和目标数据库字符集不同。
先将导出端客户端的 NLS_LANG 设置成和导出端的数据库字符集一致,导出数据,然后将导入端客户端的 NLS_LANG 设置成和导出端一致,导入数据,这样转换只发生在数据库端,而且只发生一次。
这种情况下,只有当导入端数据库字符集为导出端数据库字符集的严格超集时,数据才能完全导成功,否则,可能会有数据不一致或乱码出现。
参考文档:http://www.fgedu.net.cn/bbs/thread-288-1-1.html
COMPATIBLE 9.2.0.x.0 10.1.0.x.0 10.2.0.x.0 11.1.0.x.0 11.2.0.x.0
---------- ------------- ------------- ------------- ------------- -------------
10.1.0.x.0 VERSION=9.2 - - - -
---------- ------------- ------------- ------------- ------------- -------------
10.2.0.x.0 VERSION=9.2 VERSION=10.1 - - -
---------- ------------- ------------- ------------- ------------- -------------
11.1.0.x.0 VERSION=9.2 VERSION=10.1 VERSION=10.2 - -
---------- ------------- ------------- ------------- ------------- -------------
11.2.0.x.0 VERSION=9.2 VERSION=10.1 VERSION=10.2 VERSION=11.1
参考文档:http://www.itpux.com/thread-286-1-1.html
关于数据泵datapump EXPDP/IMPDP交互模式常用命令
CONTINUE_CLIENT返回到记录模式。假如处于空闲状态, 将重新启动作业。
START_JOB 启动恢复当前作业。
STATUS在默认值 (0) 将显示可用时的新状态的情况下,要监视的频率 (以秒计) 作业状态。
STATUS=[interval]
STOP_JOB顺序关闭执行的作业并退出客户机。
STOP_JOB=IMMEDIATE 将立即关闭数据泵作业。
ADD_FILE向转储文件集中添加转储文件。
ADD_FILE=dirobjdumpfile-name
CONTINUE_CLIENT 返回到记录模式。假如处于空闲状态, 将重新启动作业。
EXIT_CLIENT 退出客户机会话并使作业处于运行状态。
HELP总结交互命令。
KILL_JOB分离和删除作业。
PARALLEL更改当前作业的活动 worker 的数目。
PARALLEL=worker 的数目。
START_JOB 启动恢复当前作业。
STATUS在默认值 (0) 将显示可用时的新状态的情况下,
要监视的频率 (以秒计) 作业状态。
STATUS=[interval]
STOP_JOB顺序关闭执行的作业并退出客户机。
STOP_JOB=IMMEDIATE 将立即关闭
## 导出数据
export BAKDATE=`date +%Y%m%d`
expdp system/oracle directory=data dumpfile=expdp_full_db01.$BAKDATE.%U.dmp logfile=expdp_full_db01.$BAKDATE.log full=y parallel=2
略。。。
^C
Export>
ctrl + c 后 ,继续查看job,还在进行导出
##可以用次命令查看job
SYS@orcl > select JOB_NAME,STATE from dba_datapump_jobs;
JOB_NAME STATE
------------------------------ ------------------------------
SYS_EXPORT_FULL_01 EXECUTING
[oracle@ogg12c dpdata]$ expdp system/oracle attach=SYS_EXPORT_FULL_01
Export: Release 11.2.0.4.0 - Production on Wed Aug 26 11:45:59 2020
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Job: SYS_EXPORT_FULL_01
Owner: SYSTEM
Operation: EXPORT
Creator Privs: TRUE
GUID: ADC0A34D03580C14E053072BA8C0FFB1
Start Time: Wednesday, 26 August, 2020 11:44:34
Mode: FULL
Instance: orcl
Max Parallelism: 2
EXPORT Job Parameters:
Parameter Name Parameter Value:
CLIENT_COMMAND system/******** directory=data dumpfile=expdp_full_db01.20200826.%U.dmp logfile=expdp_full_db01.20200826.log full=y parallel=2
State: EXECUTING
Bytes Processed: 32,108,568
Percent Done: 99
Current Parallelism: 2
Job Error Count: 0
Dump File: /data/dpdata/expdp_full_db01.20200826.%u.dmp
Dump File: /data/dpdata/expdp_full_db01.20200826.01.dmp
bytes written: 32,763,904
Dump File: /data/dpdata/expdp_full_db01.20200826.02.dmp
bytes written: 4,096
Worker 1 Status:
Process Name: DW00
State: EXECUTING
Object Schema: SYSMAN
Object Name: EMD_LOADER
Object Type: DATABASE_EXPORT/SCHEMA/PACKAGE_BODIES/PACKAGE/PACKAGE_BODY
Completed Objects: 25
Worker Parallelism: 1
Worker 2 Status:
Process Name: DW01
State: WORK WAITING
Export>
Export> stop_job=immediate; 或者另一种方式干掉进程
Export> kill_job
Are you sure you wish to stop this job ([yes]/no): yes
再次查看job
select JOB_NAME,STATE from dba_datapump_jobs;
kill_job 和 stop_job 的区别就是 直接杀掉不能再用了,如果是stop 停止,那还可以进行启动,还能继续在用
参考资料:
http://www.itpux.com/thread-287-1-1.html
进行模拟(思路):
进行导出数据
查看job
停止stop_job
操作过程和步骤一(1.进行演练)的操作一样,这里就不在进行操作了
SYS_EXPORT_FULL_01 是一个完整的数据库导出作业,状态是NOT RUNNING,意味着作业是暂时的停止,实际上作业失败了也是NOT RUNNING状态。
CONNECT / as sysdba
SET lines 200
COL owner_name FORMAT a10;
COL job_name FORMAT a20
COL state FORMAT a12
COL operation LIKE state
COL job_mode LIKE state
SELECT owner_name, job_name, operation, job_mode,
state, attached_sessions
FROM dba_datapump_jobs
WHERE job_name NOT LIKE 'BIN$%'
ORDER BY 1,2;
OWNER_NAME JOB_NAME OPERATION JOB_MODE STATE ATTACHED_SESSIONS
---------- -------------------- ------------ ------------ ------------ -----------------
SYSTEM SYS_EXPORT_FULL_01 EXPORT FULL NOT RUNNING 0
## 定位数据泵主表(来判断是暂停了还是意外不用了)(查看是否有效)
SELECT o.status, o.object_id, o.object_type,
o.owner||'.'||object_name "OWNER.OBJECT"
FROM dba_objects o, dba_datapump_jobs j
WHERE o.owner=j.owner_name AND o.object_name=j.job_name
AND j.job_name NOT LIKE 'BIN$%' ORDER BY 4,2;
STATUS OBJECT_ID OBJECT_TYPE OWNER.OBJECT
------- ---------- ------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------
VALID 87646 TABLE SYSTEM.SYS_EXPORT_FULL_01
## 删除掉(对于过去停止且不再重新启动的作业,删除主表。)
SYS@orcl > drop table SYSTEM.SYS_EXPORT_FULL_01;
SYS@orcl > purge dba_recyclebin; --情空回收站 (然后在查看是否被删除掉)
Data Pump 工作原理有两个特点:作业调度,多进程配合协作。对 Data Pump 的诊断本质上就是对各种 Process 行为的跟踪。Oracle 提供了一个 Trace 的隐含参数,来帮助我们实现这个目标。
Trace并不像其他跟踪过程相同,使用y/n的参数,开启或者关闭。Data Pump的Trace参数是一个 7 位十六进制组成的数字串。不同的数字串表示不同的跟踪对象方法。7位十六进制数字分为两个部分,前三个数字表示特定的数据泵组件,后四位使用 0300就可以。
各个组件分别使用不同的三位十六进制数字代表。如下片段所示:
-- Summary of Data Pump trace levels:
-- ==================================
Trace DM DW ORA Lines
level trc trc trc in
(hex) file file file trace Purpose
10300 x x x SHDW: To trace the Shadow process (API) (expdp/impdp)
20300 x x x KUPV: To trace Fixed table
40300 x x x 'div' To trace Process services
80300 x KUPM: To trace Master Control Process (MCP) (DM)
100300 x x KUPF: To trace File Manager
200300 x x x KUPC: To trace Queue services
400300 x KUPW: To trace Worker process(es) (DW) --工作进程,平行度
800300 x KUPD: To trace Data Package
1000300 x META. To trace Metadata Package
--- +
1FF0300 x x x 'all' To trace all components (full tracing)
一般用 80300 和 400300 就可以,
如果需要同时跟踪多个组件,需要将目标组件的 hex 值进行累加,后面四位的 300 相同。
400300+80300=480300
对于跟踪的 Trace 取值,Oracle 建议使用 480300 就可以应对大部分的情况。480300会跟踪 Oracle Dump 作业的 Master Control Process(MCP)和 Work Process。
作为初始化跟踪的过程,480300 基本就够用了。
我们先从数据导出 Expdp 看 Trace,导出一个案例。首先清理一下 Trace File 目录。
## 导出数据
expdp itpux01/itpux01 directory=data schemas=itpux01 dumpfile=itpux01_trace.dmp logfile=itpux01_trace.log trace=480300
##查看trace 路径
show parameter dump;
[oracle@ogg12c trace]$ pwd
/data/app/oracle/diag/rdbms/orcl/orcl/trace
[oracle@ogg12c trace]$ ll -rst
4 -rw-r----- 1 oracle oinstall 1280 Aug 26 16:15 orcl_dw00_4701.trm
44 -rw-r----- 1 oracle oinstall 44344 Aug 26 16:15 orcl_dw00_4701.trc
4 -rw-r----- 1 oracle oinstall 1043 Aug 26 16:15 orcl_dm00_4699.trm
24 -rw-r----- 1 oracle oinstall 22323 Aug 26 16:15 orcl_dm00_4699.trc
然后检查 trc 目录,Dm 和 dw 标注的就是 MCP 和 Work Process 生成的 Trace 文件。
同时 Parallel 设置使得 dw 有 00 和 01 两个。
## 查看trace 文件
[oracle@ogg12c trace]$ more orcl_dm00_4699.trc
[oracle@ogg12c trace]$ more orcl_dw00_4701.trc
2个 trace 文件在 BACKGROUND_DUMP_DEST 目录下:
Master Process trace file: <SID>_dm<number>_<process_id>.trc
Worker Process trace file: <SID>_dw<number>_<process_id>.trc
在导出过程中,我们可以看到两个 worker 的会话信息。
SQL> select * from dba_datapump_sessions;
其实就是在后面 + 1 (400300+80300=480300+1=480301)实验过程和 480300 一样
在 Trace 过程中,我们也可以如 10046 跟踪过程一样,添加 SQL 跟踪。Data Pump本质上工作还是一系列的 SQL 语句,很多时候的性能问题根源都是从 SQL 着手的。
切换到 SQL 跟踪模式也比较简单,一般是在 Trace 数值后面添加 1。
把之前导出的删除掉,在进行导出
expdp itpux01/itpux01 directory=data schemas=itpux01 dumpfile=itpux01_trace.dmp logfile=itpux01_trace.log trace=480301
[oracle@ogg12c trace]$ more orcl_ora_4768.trc
impdp \"/ as sysdba\" directory=dumpdir dumpfile=itpux_dump.dmp remap_schema=itpux:test trace=480301 parallel=2
我们使用导入过程进行实验。
目录生成的 Trace 文件,都是 10046 格式的 Raw 文件。截取片段如下:
10046 生成的 trace 文件可读性并不好,所有我们可以使用 tkprof 工具进行格式化,方便阅读。
如:格式后输出一个文件(orcl_ora_4768.out)
[oracle@ogg12c trace]$ tkprof orcl_ora_4768.trc orcl_ora_4768.out waits=y sort=exeela
[oracle@ogg12c trace]$ more orcl_ora_4768.out
[oracle@ogg12c trace]$ tail -100f orcl_ora_4768.out
10046 事件有如下级别:
event 10046, level 1 = enable standardSQL_TRACE functionality
event 10046, level 4 = as level 1, plus trace the BIND values
event 10046, level 8 = as level 1, plus trace the WAITs
event 10046, level 12 = as level 1, plus trace the BIND values and the WAITs
不同级别的使用情况如下:
level 1: lowest level tracing - not alwayssufficient to determine cause of errors;
level 4: useful when an error in DataPump's worker or master process occurs;
level 12: useful when there is an issuewith Data Pump performance
注意:
当我们设置 10046 的级别高于 8 或者 12 的时候,需要将 TIMED_STATISTICS 设置为 TRUE. 临时的将这个参数设置为 true,可以将 trace 数据性能的影响降到最低,在 11gR2 里,该参数默认为 true。
一般只有遇到性能问题时,才会使用 8 或者 12 的 level。一般用 4 级别
01、对当前正在运行的进程进行 trace
查看 expdp 进程
## 备份全库
expdp system/oracle directory=data dumpfile=expdp_full.dmp logfile=expdp_full.log full=y
--查看数据泵进程的信息:
set lines 150 pages 100 numwidth 7
col username for a10
col spid for a7
col program for a25
select to_char(sysdate,'YYYY-MM-DDHH24:MI:SS') "DATE", s.program, s.sid,
s.status, s.username, d.job_name, p.spid, s.serial#, p.pid
from v$session s, v$process p,dba_datapump_sessions d
where p.addr=s.paddr and s.saddr=d.saddr;
DATE PROGRAM SID STATUS USERNAME JOB_NAME SPID SERIAL# PID
------------------ ------------------------- ------- -------- ---------- ------------------------------ ------- ------- -------
2020-08-2616:59:56 oracle@ogg12c (DW00) 18 ACTIVE SYSTEM SYS_EXPORT_FULL_01 4905 99 37
2020-08-2616:59:56 oracle@ogg12c (DM00) 45 ACTIVE SYSTEM SYS_EXPORT_FULL_01 4903 243 35
2020-08-2616:59:56 ude@ogg12c (TNS V1-V3) 43 ACTIVE SYSTEM SYS_EXPORT_FULL_01 4901 113 34
使用 sys.dbms_system.set_ev 设置 10046
在上节的查询结果里:
Data Pump Master process (DM00)的 SID 是 58,serial#是 45.
Data Pump Worker process (DW01)的 SID 是 23,serial#是 18.
使用 10046 跟踪活动 session 的语法如下:
Syntax: DBMS_SYSTEM.SET_EV([SID],[SERIAL#],[EVENT],[LEVEL],'')
--在 level 4 跟踪 Worker process 进程(Bind values):
使用 10046 跟踪活动 session 的语法如下:
Syntax: DBMS_SYSTEM.SET_EV([SID],[SERIAL#],[EVENT],[LEVEL],'')
--在 level 4 跟踪 Worker process 进程(Bind values):
SYS@orcl > execute sys.dbms_system.set_ev(45,18,10046,4,'');
PL/SQL procedure successfully completed.
SYS@orcl >
-- stop tracing:
execute sys.dbms_system.set_ev(44,43,10046,0,'');
--在 level 8 跟踪 Master 进程(Waits):
execute sys.dbms_system.set_ev(143,50,10046,8,'');
-- stop tracing:
execute sys.dbms_system.set_ev(143,50,10046,0,'');
可以在 oradebug 中设置 SPID,来进行 trace:
--在 level 4 跟踪 Worker process 进程(Bind values):
oradebug setospid 8173
oradebug unlimit
oradebug event 10046 trace name context forever,level 4
oradebug tracefile_name
--在 level 8 跟踪 Master 进程(Waits):
oradebug setospid 8171
oradebug unlimit
oradebug event 10046 trace name context forever,level 8
oradebug tracefile_name
--stop tracing:
oradebug event 10046 trace name context off
10046 生成的 trace 文件可读性并不好,所有我们可以使用 tkprof 工具进行格式化,
方便阅读。
如:
$ tkprof itpux_dm00_17292.trc tkprof_itpux_dm00_17292.out waits=y sort=exeela
$ tkprof itpux_dw01_17294.trc tkprof_itpux_dw01_17294.out waits=y sort=exeela
1、expdp/impdp 默认就是使用直接路径的,所以速度比较快,但是 expdp/impdp
是服务端程序,影响它速度的只有磁盘 io。
2、导出多表时,expdp/impdp 用法是 tables='table1','table2','table3'。
3、dumpfile 参数 ,可以用%u 指定多个数据文件
expdp xxx/xxx schemas=xxx directory=dump1 dumpfile=xxx_%u.dmp filesize=50g
这样每个文件 50g ,xxx_01.dump,xxx_02.dump 这样。
4、如果要把用户 usera 的对象导到用户 userb,操作如下:
impdp system/passwd directory=expdp dumpfile=expdp.dmp remap_schema='usera':'userb' logfile=/oracle/exp.log;
5、如果导入需要更换表空间, impdp 用remap_tablespace='tabspace_old':'tablespace_new'
6、关于数据导出时要导出哪些内容:
expdp content(all:对象+导出数据行,data_only:只导出对象,metadata_only:只导出数据的记录)
7、数据泵 expdp/impdp 影响速度和性能最大的就是 paralle。 所以使用数据泵,要想提高速度,就要设置并行参数。如:
expdp full=y directory=dump dumpfile=test_%u.dmp parallel=4
那么 expdp 将为 parallel 创建 4 个文件: test_01.dmp,test_02.dmp,test_03.dmp,test_04.dmp。 每个进程一个文件。 这样的话,每个文件的大小会因进程而不同。 可以某个文件很大,某个文件却很小。 要解决这个问题,就是设置
filesize 参数。 来指定每个文件的最大值。 这样当一个文件达到最大值的之后,就会创建一个新的文件。
如 : expdp full=y directory=dump dumpfile=test_%u.dmp parallel=4 filesize=50m
导出的 dump 文件和 paralle 有关系,那么导入也有关系。 paralle 要小于 dump 文件数。 如果 paralle 大于 dump 文件的个数,就会因为超过的那个进程获取不到文件,就不能对性能提高。一般 parall 参数值等于 cpu 的个数。而且要小于dump文件的个数
手机扫一扫
移动阅读更方便
你可能感兴趣的文章