在同一数据库中克隆架构

问题描述 投票:0回答:1

我使用的是 Oracle 12.1。我所说的数据库用于构建目的,我们需要创建与正在使用的代码版本兼容的数据库模式。

例如,我们说 schema1 是类似产品但没有数据的。该架构是执行 expdp 命令导出的。

当我想要构建代码时,该过程将通过对用于导出 schema1 的文件执行 impdp 命令来创建 schema2。一旦我的代码构建完成,schema2 将被导出并可用于构建其他代码等等。

问题在于expdp和impdp命令非常耗时。尽管仅导出/导入元数据,expdp 大约需要 20-25 分钟,impdp 大约需要 7-10 分钟。由于这些操作是针对同一个数据库的,我想知道是否有更好的方法来实现模式的“克隆”。

我目前使用的是 v12.1,但很快就会升级到 v19.2 如果 19.2 中引入了任何功能,那么我也可以使用它。

使用的命令是:

expdp <user>/<pwd>@<db> DIRECTORY=<dir> DUMPFILE=<file> CONTENT=METADATA_ONLY SCHEMAS=<schema1> LOGFILE=<somelog.txt> EXCLUDE=STATISTICS

impdp <user>/<pwd>@<db> DIRECTORY=<dir> DUMPFILE=<file> REMAP_SCHEMA=<schema1>:<schema2> SCHEMAS=<schema1> LOGFILE=<somelog.txt> TRANSFORM=OID:N EXCLUDE=PASSWORD_HISTORY

这是 expdp 命令的输出

Starting "<schema>"."SYS_EXPORT_SCHEMA_07":  <schema>/********@<db> DIRECTORY=<dir> DUMPFILE=<schema>.sch CONTENT=METADATA_ONLY SCHEMAS=<schema1> LOGFILE=logfile.txt EXCLUDE=STATISTICS
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/TABLESPACE_QUOTA
Processing object type SCHEMA_EXPORT/PASSWORD_HISTORY
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/TYPE/TYPE_SPEC
Processing object type SCHEMA_EXPORT/SEQUENCE/SEQUENCE
Processing object type SCHEMA_EXPORT/SEQUENCE/GRANT/OWNER_GRANT/OBJECT_GRANT
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/GRANT/OWNER_GRANT/OBJECT_GRANT
Processing object type SCHEMA_EXPORT/TABLE/COMMENT
Processing object type SCHEMA_EXPORT/TABLE/IDENTITY_COLUMN
Processing object type SCHEMA_EXPORT/PACKAGE/PACKAGE_SPEC
Processing object type SCHEMA_EXPORT/PACKAGE/GRANT/OWNER_GRANT/OBJECT_GRANT
Processing object type SCHEMA_EXPORT/PROCEDURE/PROCEDURE
Processing object type SCHEMA_EXPORT/PROCEDURE/GRANT/OWNER_GRANT/OBJECT_GRANT
Processing object type SCHEMA_EXPORT/PACKAGE/COMPILE_PACKAGE/PACKAGE_SPEC/ALTER_PACKAGE_SPEC
Processing object type SCHEMA_EXPORT/PROCEDURE/ALTER_PROCEDURE
Processing object type SCHEMA_EXPORT/VIEW/VIEW
Processing object type SCHEMA_EXPORT/VIEW/GRANT/OWNER_GRANT/OBJECT_GRANT
Processing object type SCHEMA_EXPORT/PACKAGE/PACKAGE_BODY
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
Processing object type SCHEMA_EXPORT/TABLE/INDEX/FUNCTIONAL_INDEX/INDEX
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/TRIGGER
Processing object type SCHEMA_EXPORT/EVENT/TRIGGER
Master table "<schema>"."SYS_EXPORT_SCHEMA_07" successfully loaded/unloaded
******************************************************************************
Dump file set for <schema>.SYS_EXPORT_SCHEMA_07 is:
  <dir>/<schema>.sch
Job "<schema>"."SYS_EXPORT_SCHEMA_07" successfully completed at Wed Jan 17 13:15:23 2024 elapsed 0 00:19:07
oracle12c oracle19c oracle12.1 oracle-database
1个回答
0
投票

使用主表调试导出和导入性能。主表与 expdp/impdp 输出文件类似,但它包含更多详细信息。

主表始终是为导出或导入而创建的,但通常会在命令完成后删除。要保留它,请将

keep_master=y
添加到数据泵命令中。

表的名称将位于数据泵命令输出的末尾。例如,如果输出的最后一行是

Job "YOUR_USER"."SYS_EXPORT_SCHEMA_01" completed...
,那么您想要查询表
YOUR_USER.SYS_EXPORT_SCHEMA_01

您可以使用这样的查询来查找导出或导入命令中最慢的部分:

select
    start_time,
    (lead(start_time) over (order by start_time) - start_time) * 60*60*24 seconds_diff,
    exp.*
from jheller.sys_export_schema_01 exp
where start_time is not null
order by seconds_diff desc;

我还建议尝试可传输表空间。按原样发送单个二进制文件可能比发送重新创建数据的命令快得多。 (尽管重新填充数据字典仍然需要一些时间。我在这个答案中创建了一个使用可传输表空间在同一数据库中复制模式的示例。

© www.soinside.com 2019 - 2024. All rights reserved.