将表导入不同表空间的方法,适用于下面情况:
1. 相同用户,但表空间不同
2. 不同用户,不同表空间
具体步骤如下:
1. 导出dmp文件备份。
2. 如果需要导入到不同用户下,则需要先创建用户。
3. 创建表,脚本可以直接从dmp文件中提取或者通过其它方法提取。
Imp xxx/xxx file=xxx.dmp fromuser=xxx touser=xxx indexfile=xxx.sql
涉及外键约束的表创建将不成功,这时应该分离出主键外键约束来,可以这样提取建表脚本:
Imp xxx/xxx file=xxx.dmp fromuser=xxx touser=xxx indexes=n constraints=n indexfile=xxx.sql
如果是用户相同,则
通过grep –v ‘rows’ xxx.sql | grep –v ‘CONNECT ‘ | sed 's/REM //g’ | sed 's/原表空间名/新表空间名/g’ > ok.sql
得到ok.sql脚本执行即可。
如果是不同用户,则
通过grep –v ‘rows’ xxx.sql | grep –v ‘CONNECT ‘ | sed 's/REM //g’ | sed 's/原用户/新用户/g’ | sed 's/原表空间名/新表空间名/g’ > ok.sql
得到ok.sql脚本执行即可。
SQL> conn xxx/xxx
SQL> @ok.sql
SQL> select table_name,tablespace_name from user_tables;---查看表所在表空间
4. 导入表数据
必须加上ignore=y参数,否则导入失败。
Imp xxx/xxx file=xxx.dmp fromuser=xxx touser=xxx ignore=y
通过ignore=y,数据会被正确导入。
使用ignore=n参数时,即它的默认值时,如果一个表创建错误,import将会越过它执行下一个表。当使用ignore=y参数时,表示即使表不能被创建,import也会尽力导入这个表的数据。
5. 检查表是否正确导入
SQL> conn xxx/xxx
SQL> select table_name,tablespace_name from user_tables;---查看表所在表空间
SQL> select count(*) from 某个表名;
说明:对于表导入不同表空间,网上还有其它的方法,比如下面网址:
http://www.eygle.com/archives/2005/04/ecineeeeiaeioae.html
但该方法有个局限:如果是带有大字段的表,比如blob字段类型的,将不能变更表空间。
测试的例子请查看:附件中的《20070115-imp-success(本文提供的方法).log》和《20070115-imp-fail(网上流行的方法).log》
小结:如果表中含有clob这样的字段,建议用本文提供的方法来转移表所在的表空间。
http://orax.blog.sohu.com/60795298.html