在 Oracle 11g (Windows Server 2012 R2) 中恢复数据库时更改目标的 TABLESPACE

Change the TABLESPACE of the destination when restoring a database in Oracle 11g (Windows Server 2012 R2)

我正在导入数据库 (schema) 从以前的版本 (Oracle 10g express editon) 到更新的版本版本 (Oracle 11g express edition) in Oracle from a .dmp file (我没有导出,我只负责导入到新环境),我在以前的论坛上咨询过的方法,我设法使用 imp 导入,我不能使用 impdp,因为导出不是用 expdp.

好吧,恢复完成后我最需要的是恢复另一个表空间中的所有对象,为此我之前创建了一个用户,一个与该用户关联的表空间,自然还有一个与该表空间关联的数据文件。但是所有对象都已在系统表空间 (USERS) 中恢复,因为在源数据库中,这些对象位于该表空间中。

我使用并认为对我有帮助的说明如下:

imp my_user/password@XE FILE=C:\oraclexe\app\oracle\admin\XE\dpdump\my_file.dmp FROMUSER=my_user TOUSER=my_user

然而,即使我尝试更改用户(FR0MUSERTOUSER),数据仍然在 USERS 表空间和 SYSTEM 中恢复.

我想解决这个问题的唯一方法是再次导出。我有三个选项:expexpdpRMAN。虽然我不确定这些是否可以帮助我单独更改或修改目标表空间。

任何参考都会很有帮助。

由于您已经导入了所有内容,因此您可以使用 alter table and alter index 命令将所有 table 和索引移动到您首选的 tablespace,例如:

alter table my_table move tablespace my_tablespace;
alter index my_index rebuild tablespace my_tablespace;

您可以使用数据字典生成这些语句,例如:

select 'alter table "' || object_name || '" move tablespace my_tablespace;'
from user_objects
where object_type = 'TABLE';

select 'alter index "' || object_name || '" rebuild tablespace my_tablespace;'
from user_objects
where object_type = 'INDEX';

然后将输出写入脚本 运行;或者您可以使用类似的查询和动态 SQL 一次性完成。

您可能需要处理一些边缘情况 - 可能需要额外的分区步骤,我不确定 IOT 是否会导致问题,但这可能会让你开始 - 并且至少减少 re-export/re-import 你需要做的。

当然,新旧 tablespace 都需要足够的 space 来移动对象,因为它们在移动时会存在于两者中 - 一个一次,但也可能仍然是一个问题...

需要说明的是,您已经完成导入并且数据已加载到数据库中,但是,导入的对象被加载到用户和系统表空间,而不是您为它们创建的表空间,对吗?

有很多方法可以做到这一点,例如使用 DBMS_REDEFINITION 包或发出 ALTER TABLE [SCHEMA].[TABLE] MOVE TABLESPACE [NEW TABLESPACE] 之类的命令,但是这可能非常乏味,并且如果数据库是正在使用。您将不得不重建索引,并且还必须移动 lob 文件。

我建议使用数据泵 (EXPDP) 创建新的模式导出,然后在将表空间重新导入数据库时​​重新映射表空间。您的步骤将遵循以下大纲:

  1. 使用类似于此的命令导出模式:expdp [user]/[pass] SCHEMAS=[SCHEMA] DIRECTORY=DATA_PUMP_DIR DUMPFILE=Export.dmp LOGFILE=export.log,其中 [SCHEMA] 是您要重新映射的模式的名称。您可以使用您想要的任何目录、转储文件和日志文件名称 - 这只是一个示例。
  2. 您需要在重新导入之前删除架构。确保使用级联选项,以便删除所有对象:DROP USER [SCHEMA] CASCADE;
  3. 最后,您可以重新导入架构并使用 REMAP_TABLESPACE 子句将对象重新映射到所需的表空间:impdp [user]/[pass] SCHEMAS=[SCHEMA] REMAP_TABLESPACE=SYSTEM:[TABLESPACE] REMAP_TABLESPACE=USERS:[TABLESPACE] DIRECTORY=DATA_PUMP_DIR DUMPFILE=Export.dmp LOGFILE=import.log,其中 [TABLESPACE] 是您为架构创建的表空间.

假设一切顺利,模式将被重新导入到数据库中,并且该模式中最初映射到 USERSSYSTEM 表空间的对象将被重新映射到您的[TABLESPACE]