天天看点

Oracle 数据导出与导入常用命令和参数

作者:正义凛然奶茶XH

expdp

基本语法结构

expdp是Oracle数据库的一种数据导出工具。用法如下:

expdp <username>/<password>@<database> directory=<directory> dumpfile=<dumpfile>.dmp logfile=<logfile>.log schemas=<schema1>,<schema2>,...           

其中:

  • <username> 是数据库用户名
  • <password> 是数据库密码
  • <database> 是数据库连接串
  • <directory> 是数据导出文件的存放目录,需要在数据库中预先创建
  • <dumpfile> 是数据导出文件的文件名
  • <logfile> 是日志文件的文件名
  • <schema1>,<schema2>,... 是要导出的schema名称,可以是多个

示例:

expdp scott/tiger@orcl directory=data_pump_dir dumpfile=scott.dmp logfile=scott.log schemas=scott           

这条命令将会导出用户名为scott的schema的数据,并将导出文件存储在data_pump_dir目录下,文件名为scott.dmp,日志文件名为scott.log。

Linux系统日期命名

expdp scott/tiger@orcl directory=data_pump_dir dumpfile=scott.dmp logfile=scott_$(date +%Y%m%d).log schemas=scott           

在上面的命令中,$(date +%Y%m%d)会被替换成当前日期,如20221231, 日志文件名就会变成 scott_20221231.log.

注意,上面的命令是在Unix/Linux系统中使用的,如果在Windows系统中执行,需要修改date +%Y%m%d为相应的Windows命令。

Windows日期命名

Windows系统中日期的格式可以使用%date%来获取。示例如下:

expdp scott/tiger@orcl directory=data_pump_dir dumpfile=scott.dmp logfile=scott_%date:~-4,4%%date:~-7,2%%date:~-10,2%.log schemas=scott           

在上面的命令中,%date:~~-4,4%%date:~~-7,2%%date:~-10,2%会被替换成当前日期,如20221231, 日志文件名就会变成 scott_20221231.log.

注意,如果是在cmd中执行,需要用^来转义%, 如

expdp scott/tiger@orcl directory=data_pump_dir dumpfile=scott.dmp logfile=scott.log schemas=scott           

这样就可以在windows中以当前日期命名日志文件了。

只导出对象结构,不导数据

可以使用CONTENT=METADATA_ONLY参数来实现只导出对象结构,不导出数据。示例如下:

expdp scott/tiger@orcl directory=data_pump_dir dumpfile=scott.dmp logfile=scott.log schemas=scott CONTENT=METADATA_ONLY           

在上面的命令中,CONTENT=METADATA_ONLY参数指示只导出对象结构,不导出数据。

如果想导出整个数据库的对象结构而不导出数据,可以使用 FULL=Y 参数,示例如下:

expdp system/password@orcl directory=exp_dir dumpfile=all_metadata.dmp logfile=all_metadata.log full=y content=metadata_only           

这条命令将会导出所有数据库对象的结构而不导出数据。

按SCN导出

SCN (System Change Number) 是Oracle数据库中的一种时间戳,它表示数据库在一段时间内发生的更改次数。每次更改都会导致SCN值增加,这样就可以确保每一次更改都有唯一的SCN值。SCN值可以用于数据库回滚,备份,恢复和数据同步等操作。 可以使用DBA_FLASHBACK_TRANSACTION_QUERY视图来查询一个事务的SCN值。在Oracle数据库中, SCN由两部分组成: 数据库级别的SCN和事务级别的SCN. 数据库级别的SCN是所有事务共享的,而事务级别的SCN是唯一的。可以使用SCN参数来指定要导出数据的系统更改号(SCN)。示例如下:

expdp scott/tiger@orcl directory=data_pump_dir dumpfile=scott.dmp logfile=scott.log schemas=scott SCN=<SCN>           

在上面的命令中,SCN=<SCN>参数指示只导出系统更改号为<SCN>的数据。

要获得当前SCN可以使用下面的查询:

SELECT current_scn FROM v$database;           

这条命令将会导出系统更改号为<SCN>的数据,并将导出文件存储在data_pump_dir目录下,文件名为scott.dmp

注意,使用SCN进行导出时,需要在导出时间之前执行查询,获取到的SCN是在导出时间之前的,如果在导出之后执行,那么可能会导出无效的数据。

impdp

基本语法结构

impdp是Oracle数据库的一种数据导入工具,用法如下:

impdp <username>/<password>@<database> directory=<directory> dumpfile=<dumpfile>.dmp logfile=<logfile>.log schemas=<schema1>,<schema2>,...           

其中:

  • <username> 是数据库用户名
  • <password> 是数据库密码
  • <database> 是数据库连接串
  • <directory> 是数据导入文件的存放目录,需要在数据库中预先创建
  • <dumpfile> 是数据导入文件的文件名
  • <logfile> 是日志文件的文件名
  • <schema1>,<schema2>,... 是要导入的schema名称,可以是多个

示例:

impdp scott/tiger@orcl directory=data_pump_dir dumpfile=scott.dmp logfile=scott.log schemas=scott           

这条命令将会导入用户名为scott的schema的数据,并将导入文件从data_pump_dir目录读取,文件名为scott.dmp,日志文件名为scott.log。

remap_schema

REMAP_SCHEMA 是impdp的一个参数,用于在导入数据时更改导出数据中的模式名称。

例如,如果导出数据时使用的模式名称为"A",但是在导入时需要将其映射到模式名称"B"上,可以使用下面的语句:

impdp <username>/<password>@<database> directory=<directory> dumpfile=<dumpfile>.dmp logfile=<logfile>.log remap_schema=A:B           

在上面的命令中,REMAP_SCHEMA=A:B 参数指示在导入时将模式A映射到模式B上。

还可以使用REMAP_SCHEMA参数同时将多个模式映射到不同的模式上,例如:

impdp <username>/<password>@<database> directory=<directory> dumpfile=<dumpfile>.dmp logfile=<logfile>.log remap_schema=A:B,C:D           

这条命令将会将A映射到B上,C映射到D上。

注意:当使用REMAP_SCHEMA参数时,在导入的目标模式不存在时,将会自动创建。

remap_tablespace

REMAP_TABLESPACE 是impdp的一个参数,用于在导入数据时更改导出数据中的表空间名称。

例如,如果导出数据时使用的表空间名称为"A",但是在导入时需要将其映射到表空间名称"B"上,可以使用下面的语句:

impdp <username>/<password>@<database> directory=<directory> dumpfile=<dumpfile>.dmp logfile=<logfile>.log remap_tablespace=A:B           

在上面的命令中,REMAP_TABLESPACE=A:B 参数指示在导入时将表空间A映射到表空间B上。

还可以使用REMAP_TABLESPACE参数同时将多个表空间映射到不同的表空间上,例如:

impdp <username>/<password>@<database> directory=<directory> dumpfile=<dumpfile>.dmp logfile=<logfile>.log remap_tablespace=A:B,C:D           

这条命令将会将A映射到B上,C映射到D上。

注意:当使用REMAP_TABLESPACE参数时,在导入的目标表空间不存在时,将会报错,需要手动创建目标表空间。并且需要确保在导入前目标表空间有足够的空间来存储导入的数据。

另外,在使用REMAP_TABLESPACE参数时,需要确保导入的表空间的数据文件与导出时的表空间的数据文件的路径一致,否则可能会导致导入出错。

需要注意的是,如果在导入之前没有手动创建目标表空间,并且没有使用REMAP_TABLESPACE参数,导入时会使用导出时的表空间名称。如果表空间不存在,导入操作将会失败。

总之,使用REMAP_TABLESPACE参数可以在导入数据时更改导出数据中的表空间名称,在导入数据时灵活地更改表空间名称,但需要确保目标表空间已存在并且有足够的空间来存储导入的数据。

reuse_datafiles

REUSE_DATAFILES 是impdp的一个参数,当为true时,导入数据时将使用现有的数据文件而不是创建新的数据文件。

这个参数可以用来节省空间,如果现有数据文件足够存储导入数据.

示例:

impdp <username>/<password>@<database> directory=<directory> dumpfile=<dumpfile>.dmp logfile=<logfile>.log reuse_datafiles=true           

注意,在使用REUSE_DATAFILES参数时,需要确保现有的数据文件足够存储导入的数据。否则会导致导入失败。

另外,当使用REUSE_DATAFILES参数时,对于导入数据中的表空间,需要确保在导入之前已经创建了对应的表空间,否则将会导致导入失败。

skip_unusable_indexes

SKIP_UNUSABLE_INDEXES 是impdp的一个参数,当为true时,导入操作会跳过导出时无法使用的索引。

当使用该参数时,impdp将会忽略那些在导入时无法使用的索引,而不是中断导入操作。这在导入过程中遇到索引无法使用的情况下非常有用。

示例:

impdp <username>/<password>@<database> directory=<directory> dumpfile=<dumpfile>.dmp logfile=<logfile>.log skip_unusable_indexes=true           

注意,在使用skip_unusable_indexes参数时,需要确保在导入数据之前已经创建了相应的索引或者确保不需要这些索引。

另外,使用skip_unusable_indexes参数可能会导致导入数据不完整,并且可能会导致数据不一致,在使用这个参数时需要谨慎.

table_exists_action

TABLE_EXISTS_ACTION 是impdp的一个参数,用于指定在导入过程中遇到已经存在的表时的操作。

该参数可以接受三个值:

  • APPEND:将导入数据附加到已经存在的表中。
  • TRUNCATE:清空已经存在的表中的数据,然后导入数据。
  • REPLACE:删除已经存在的表,然后导入新的数据。

示例:

impdp <username>/<password>@<database> directory=<directory> dumpfile=<dumpfile>.dmp logfile=<logfile>.log table_exists_action=REPLACE           

这条命令中,当导入时遇到已经存在的表,impdp将会删除已经存在的表,然后导入新的数据。

注意,使用 TABLE_EXISTS_ACTION=REPLACE 参数时需要谨慎,因为它会删除已经存在的表及其相关数据。在使用这个参数时,需要确保已经备份了需要保留的数据。

transport_datafiles

TRANSPORT_DATAFILES 是impdp的一个参数,用于指定在导入过程中是否将数据文件复制到目标数据库。

该参数可以接受两个值:

  • TRUE:在导入过程中将数据文件复制到目标数据库。
  • FALSE:在导入过程中不将数据文件复制到目标数据库。

示例:

impdp <username>/<password>@<database> directory=<directory> dumpfile=<dumpfile>.dmp logfile=<logfile>.log transport_datafiles=<source_directory>           

这条命令中,当导入时,impdp将会把数据文件复制到source_directory中,复制到目标数据库。

注意,使用TRANSPORT_DATAFILES参数时,需要确保复制到的目标目录有足够的空间来存储复制的文件。

如果没有使用该参数,impdp 会按照数据文件在导出时的路径来导入数据文件。

如果导入和导出是在同一个数据库上进行的,那么一般不需要使用该参数。

FLASHBACK_SCN

FLASHBACK_SCN 是impdp的一个参数,用于指定在导入过程中使用的SCN值。

SCN (System Change Number) 是Oracle数据库中用于跟踪数据库变化的一个值。在导入数据时,可以使用FLASHBACK_SCN参数指定一个特定的SCN值,以便在导入数据时使用这个SCN值。

示例:

impdp <username>/<password>@<database> directory=<directory> dumpfile=<dumpfile>.dmp logfile=<logfile>.log flashback_scn=<scn_value>           

这条命令中,当导入时,impdp将会使用指定的SCN值来导入数据。

注意,使用FLASHBACK_SCN参数时需要确保导入时使用的SCN值是合法的。否则,可能会导致导入失败或者导入的数据不正确。

另外, FLASHBACK_SCN 只能在数据库处于 FLASHBACK ON 状态下使用, 需要确保数据库处于此状态。