繁体   English   中英

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

[英]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

但是,即使我尝试更改用户( FR0MUSERTOUSER ),数据仍将在USERS表空间以及SYSTEM恢复。

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

任何参考将非常有帮助。

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

有多种方法可以执行此操作,例如使用DBMS_REDEFINITION软件包或发出类似ALTER TABLE [SCHEMA].[TABLE] MOVE TABLESPACE [NEW TABLESPACE]命令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]

由于已经导入了所有内容,因此可以使用alter tablealter 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM