Roy*_*Roy 13 oracle oracle-11g-r2 import
是否有一种便捷的方法可以使用单个新表空间或与数据来源不同的表空间将模式导入 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
Run Code Online (Sandbox Code Playgroud)
该模式是从 OLDDB 导出的,类似于
exp blog_data/secretpassword@OLDDB file=blog_data.dmp
Run Code Online (Sandbox Code Playgroud)
在阅读了 Phil 在下面的出色回答后,我发现自己想知道:
由于数据除了默认表空间(用户拥有配额的唯一表空间)之外别无他处,这是否会有效地强制 imp 将所有用户对象放在该默认表空间中?
imp blog_data/secretpassword@NEWDB file=blog_data.dmp
Run Code Online (Sandbox Code Playgroud)
这会将整个 blog_data 模式放在 NEWDB 的 blog_data 表空间中吗?有什么理由为什么这不起作用,或者我会遇到某些对象等问题?
更新:
我做了一个快速测试,发现情况确实如此。Imp
将对象放置在该用户的默认表空间中,前提是它不能将其放置在原始表空间中(例如,该表空间不存在)。完整说明:http : //www.dolicapax.org/? p= 57
不过,我认为像 Phil 建议的那样使用数据泵可能是首选。
Phi*_*lᵀᴹ 15
使用 oracleimp
实用程序进行导入时,实际上不可能指定不同的表空间。但是,作为一种解决方法,您可以通过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
Run Code Online (Sandbox Code Playgroud)