如何在Oracle数据库中创建完整架构的副本?

16

我想在同一数据库上创建完整的架构副本。最佳技术是什么?

我有几个想法:

  1. 通过 Db 链路进行数据泵
  2. 在网络链接上执行 IMPDP
  3. 使用 EXPDP,然后使用 IMPDP

每种技术的优点和/或缺点是什么?

3个回答

28

你不需要任何高级的网络连接或者其他设备,只需要使用expdp/impdp命令。 首先导出你想要的模式:

expdp fromUser/fromPword schemas=sourceSchema directory=DUMPDIR dumpfile=dump.dmp logfile=explog.txt

提示:确保该用户具有写入DUMPDIR或其他目录的权限

然后使用remap_schema参数重新导入模式:

impdp toUser/toPword directory=DUMPDIR dumpfile=dump.dmp logfile=implog.txt remap_schema=fromUser:toUser
如果你真的想要使用 network_link 参数(因为某些原因不想创建 dumpfile),那么我建议阅读这篇文章或者这篇文章。你还可以在这里找到有关你问题的很好的信息。

那对我有用,尽管我在权限方面遇到了一些困难,最终通过使用sysdba登录运行命令解决了 - schemas/remap_schema参数仍然告诉导出/导入什么。当默认设置适合您时,可以省略目录参数,请参见http://www.orafaq.com/wiki/Datapump#Create_database_directories。 - Matthias
@Matthias 不要使用SYS用户进行EXP/IMP操作。 :) - mmmmmpie
在上面的例子中,运行impdp命令时是否假定您已经创建了新的“toUser”模式?还是该命令会处理这个问题? - u123

2
请尝试以下方法:

将模式复制到同一数据库中

我测试过,它可以工作。但是您必须像评论中提到的那样创建一个公共链接。

如果您创建了一个重新映射表空间的.par文件,则可以重用它。当然要进行一些搜索和替换。

还有,不要忘记在.par文件中放置转换:

TRANSFORM=oid:n

否则您可能会收到错误信息。

有趣的解决方案,但那让我感到恐惧。 - Chris Maggiulli
1
链接已损坏。 - AJPerez

1

以下是我在Oracle中将模式user_a的内容复制到模式user_b所执行的步骤:

假设这些模式定义如下:

create user user_a identified by user_a_pass default tablespace tablespace_a;
grant
    create materialized view,
    create procedure,
    create sequence,
    create session,
    create table,
    create type,
    create trigger,
    create view to user_a;

create user user_b identified by user_b_pass default tablespace tablespace_a;
grant
    create materialized view,
    create procedure,
    create sequence,
    create session,
    create table,
    create type,
    create trigger,
    create view to user_b;

重点在于:这些模式可以访问相同的表空间,并具有创建会话权限。
为了复制,需要数据模式的目录: 检查授予的目录:
select tp.grantee, tp.table_name from all_tab_privs tp where tp.privilege = 'WRITE' and tp.type = 'DIRECTORY';

请检查目录的物理路径是否存在,并且组dba可以访问该目录。

如果目录未分配给模式用户,请执行以下操作:

create or replace directory user_dir as '/opt/oracle/product/19c/dbhome_1/user_dir_name';
grant read, write on directory user_dir to user_a;
grant read, write on directory user_dir to user_b;

运行导出命令:

expdp user_a/user_a_pass@host/database schemas=user_a directory=user_dir dumpfile=user_a.dmp logfile=schema_exp.log

运行导入操作:

impdp user_b/user_b_pass@host/database directory=user_dir dumpfile=user_a.dmp logfile=schema_imp.log remap_schema=user_a:user_b 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接