在 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
然而,即使我尝试更改用户(FR0MUSER
和 TOUSER
),数据仍然在 USERS
表空间和 SYSTEM
中恢复.
我想解决这个问题的唯一方法是再次导出。我有三个选项:exp
、expdp
和 RMAN
。虽然我不确定这些是否可以帮助我单独更改或修改目标表空间。
任何参考都会很有帮助。
由于您已经导入了所有内容,因此您可以使用 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
) 创建新的模式导出,然后在将表空间重新导入数据库时重新映射表空间。您的步骤将遵循以下大纲:
- 使用类似于此的命令导出模式:
expdp [user]/[pass] SCHEMAS=[SCHEMA] DIRECTORY=DATA_PUMP_DIR DUMPFILE=Export.dmp LOGFILE=export.log
,其中 [SCHEMA] 是您要重新映射的模式的名称。您可以使用您想要的任何目录、转储文件和日志文件名称 - 这只是一个示例。
- 您需要在重新导入之前删除架构。确保使用级联选项,以便删除所有对象:
DROP USER [SCHEMA] CASCADE;
- 最后,您可以重新导入架构并使用 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] 是您为架构创建的表空间.
假设一切顺利,模式将被重新导入到数据库中,并且该模式中最初映射到 USERS
和 SYSTEM
表空间的对象将被重新映射到您的[TABLESPACE]
。
我正在导入数据库 (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
然而,即使我尝试更改用户(FR0MUSER
和 TOUSER
),数据仍然在 USERS
表空间和 SYSTEM
中恢复.
我想解决这个问题的唯一方法是再次导出。我有三个选项:exp
、expdp
和 RMAN
。虽然我不确定这些是否可以帮助我单独更改或修改目标表空间。
任何参考都会很有帮助。
由于您已经导入了所有内容,因此您可以使用 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
) 创建新的模式导出,然后在将表空间重新导入数据库时重新映射表空间。您的步骤将遵循以下大纲:
- 使用类似于此的命令导出模式:
expdp [user]/[pass] SCHEMAS=[SCHEMA] DIRECTORY=DATA_PUMP_DIR DUMPFILE=Export.dmp LOGFILE=export.log
,其中 [SCHEMA] 是您要重新映射的模式的名称。您可以使用您想要的任何目录、转储文件和日志文件名称 - 这只是一个示例。 - 您需要在重新导入之前删除架构。确保使用级联选项,以便删除所有对象:
DROP USER [SCHEMA] CASCADE;
- 最后,您可以重新导入架构并使用 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] 是您为架构创建的表空间.
假设一切顺利,模式将被重新导入到数据库中,并且该模式中最初映射到 USERS
和 SYSTEM
表空间的对象将被重新映射到您的[TABLESPACE]
。