是否有一种方便的方法可以使用单个新表空间或与数据来源不同的表空间将模式导入 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
在阅读了下面菲尔的出色回答后,我发现自己想知道:
由于数据除了默认表空间(用户拥有配额的唯一表空间)外没有其他地方可去,这是否会有效地强制 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 可能是首选。
imp
使用 oracle实用程序导入时,实际上不可能指定不同的表空间。但是,作为一种解决方法,您可以通过ROWS=N
导入表空间来预先创建USERS
表,然后alter table mytable move tablespace BLOG_DATA;
为每个表将它们移动到新表空间,然后使用IGNORE=Y
参数再次导入以忽略表创建错误并导入所有的数据。如果数据是使用 Data Pump (
expdp
) 导出的,(顺便说一句,现在每个人都应该使用它,而不是旧的遗留exp
/实用程序),您可以使用该参数imp
轻松导入另一个表空间。REMAP_TABLESPACE
例如:
您应该按照以下步骤操作:-
imp system/manager file=export.dmp indexfile=newfile.sql
这将导入数据并将所有定义保存到
newfile.sql
.newfile.sql
更改表空间后运行脚本。