[英]Change the TABLESPACE of the destination when restoring a database in Oracle 11g (Windows Server 2012 R2)
我正在从.dmp
文件中将数据库(模式)从Oracle的先前版本(Oracle 10g express editon)导入到Oracle的较新版本(Oracle 11g express Edition) (我没有导出,我仅负责导入到新环境中) ,这样做的方式是我在上一个论坛中咨询过的,并且我设法使用imp
,由于导出未使用expdp
完成,因此我无法使用impdp
。
好了,还原完成后,我最需要的是还原另一个表空间中的所有对象,因为我之前已经创建了一个用户,一个与该用户关联的表空间以及一个与该表空间关联的数据文件。 但是所有对象都已在系统表空间( 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
。 尽管我不确定这些是否可以帮助我单独更改或修改目标表空间。
任何参考将非常有帮助。
需要说明的是,您已经完成了导入并且数据已加载到数据库中,但是,导入的对象已加载到Users和System表空间中,而不是为它们创建的表空间中,对吗?
有多种方法可以执行此操作,例如使用DBMS_REDEFINITION软件包或发出类似ALTER TABLE [SCHEMA].[TABLE] MOVE TABLESPACE [NEW TABLESPACE]
命令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;
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]
。
由于已经导入了所有内容,因此可以使用alter table
和alter index
命令将所有表和索引移动到首选表空间,例如:
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是否会引起问题,但这可能会让您入门-并至少减少了重新导出/重新导入的数量你需要做。
当然,您需要为旧表空间和新表空间都移动对象提供足够的空间,因为它们在移动时将同时存在于它们中-一次一个,但可能仍然是一个问题...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.