将架构导入新的或不同的表空间


13

是否有一种简便的方法可以使用一个新的或不同于数据来源的表空间将模式导入Oracle 11gR2?

例如,我已经从OLDDB导出了BLOG_DATA,所有用户数据都存储在USERS表空间中。

在NEWDB上,我想导入BLOG_DATA模式,但是将用户对象存储在专门为此用户创建的BLOG_DATA表空间中。

我已经创建了BLOG_DATA用户,创建了BLOG_DATA表空间,并将其设置为该用户的默认表空间,并添加了适当的无限配额。

CREATE TABLESPACE blog_data DATAFILE SIZE 1G;

CREATE USER blog_data IDENTIFIED BY secretpassword DEFAULT TABLESPACE blog_data QUOTA UNLIMITED ON blog_data;

GRANT connect,resource TO blog_data

该模式是从OLDDB导出的,类似于

exp blog_data/secretpassword@OLDDB file=blog_data.dmp 

在阅读了Phil的出色回答后,我发现自己很纳闷

由于数据除了默认表空间(用户拥有配额的唯一表空间)外别无其他地方,这是否会有效地迫使imp将所有用户对象放在该默认表空间中?

imp blog_data/secretpassword@NEWDB file=blog_data.dmp

然后,这会将整个blog_data模式放在NEWDB的blog_data表空间中吗?有什么原因为什么这行不通或者我会遇到某些对象等问题?

更新:

我进行了快速测试,发现情况确实如此。Imp将对象放置在该用户的默认表空间中,前提是该对象不能将其放置在原始表空间中(例如,该表空间不存在)。完整说明:http : //www.dolicapax.org/? p= 57

不过,我认为像Phil那样使用Data Pump可能是首选。


它是使用旧版exp实用程序还是通过expdp(数据泵)导出的?
Philᵀᴹ

在示例中,它是使用常规exp实用工具导出的,如上所示。我想一个人可以同样容易地使用expdp并从旧的db服务器中获取文件,这会使向新表空间的转换更容易吗?
罗伊

我已经在回答中都提到了。使用数据泵-它更容易执行该任务
Philᵀᴹ

Answers:


15

使用oracle imp实用程序导入时,实际上不可能指定其他表空间。但是,作为一种解决方法,您可以通过ROWS=N导入USERS表空间来预先创建表,然后alter table mytable move tablespace BLOG_DATA;针对每个表将它们移动到新表空间,然后再次使用IGNORE=Y参数进行导入以忽略表创建错误并导入所有表数据。

如果数据是使用数据泵(expdp)导出的(顺便说一句,这几天每个人都应该使用此数据,而不是旧的旧版exp/ imp实用程序),则可以使用REMAP_TABLESPACE参数轻松地将其导入另一个表空间。

例如:

impdp scott/tiger@ZOMG file=blog_data.dmp directory=mydir remap_tablespace=USERS:BLOG_DATA

非常感谢你,菲尔。我想知道:如果要导入的用户在默认表空间上具有唯一配额,那么是否将强制imp将所有导入的对象放置在该默认表空间中,而不管数据源上的布局如何?
罗伊2012年

我正在做类似的事情,但这是使用expdp / impdp的整个数据库迁移,因为我希望我们的QA环境与生产匹配。如果我使用remap_tablespace,它将把每个模式重新映射到另一个单个表空间,但是我认为我可以为每个模式使用remap_tablespace运行一次impdp命令。这应该可以完成工作。
Nicolas de Fontenay

0

您应遵循以下提到的步骤:

  • 导出用户
  • 使用命令执行导入。
    imp system/manager file=export.dmp indexfile=newfile.sql
    这将导入数据并将所有定义保存到中newfile.sql
  • 放下必要的对象。
  • newfile.sql更改表空间后运行脚本。
  • 从备份中导入必要的对象。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.