以下所说是的操作系统环境是linux系统,数据库是oracle 9i。
由于以前部署系统的不小心,把系统的数据库表建在了一个不太合适的表空上。现在升级系统想把数据库表重新建合适的表空上。于是涉及到把表导出来,再导入到指定的表空上这一操作,上网查了一下,查到如下方法,经过试验,发现不太好用。
-------------------------------网上查到的方法 begin -----------------------------------------------------
将数据导出到指定表空间
1、 导出数据,最好指定导出某个用户的数据
exp userid/pwd@dbsid file=xxx.dmp owner=(xxx ,xxx)
2、 创建表空间
create tablespace XXXX
nologging
datafile '+DATA/webdb/datafile/XXX.dbf'
size 1024m
autoextend on
next 100m
maxsize 30810m
extent management local
解释:
nologging 表示不用创建日志,由于新创建的表空间,无需日志
+DATA/webdb/datafile/XXX.dbf' 这个是存储设备路径
3、 授权用户使用该表空间
alter user XXX quota unlimited on XXXX;
4、 修改oracle导出文件xxx.dmp中的表空间 (问题出在这一步上,修改之后导入的表不全)
vim xxx.dmp
%s/TABLESPACE "XXX"/XXXX/g
5、导入
imp xxx/xxx@dbsid fromuser=xxx touser=xxx
-----------------------------网上查到的方法 end---------------------------------------------------------------
后来想到,会不会是因为有数据在dmp文件里,用vi修改后改变了dmp文件的内部结构?试试先把表结构和数据分开导出,再分开导入的方法:
1、导出表结构:
exp myuser/mypass file = mytable.dmp full=n rows=n
2、导表里的数据:
exp myuser/mypass file = mydata.dmp full=n
3、修改mytable.dmp里关于旧表空的字符串,我这里的是TS_RSGL,也就是表是建在TS_RSGL这表空上的,现在我想把表导入在TS_XMGL这个表空上,用vi打开mytable.dmp后,用下面的命令:
%s/TS_RSGL/TS_XMGL/gc
这个命令在整个文件中把TS_RSGL这个字符串改为TS_XMGL这个字符串,最后的“gc"是每一个字符串在替换前询问是否替换,这样可以把人工把关一下,别把不需要替换的也替换了。修改完成后保存退出。
4、在新机器上导入表结构
imp myuser/mypass file=mytable.dmp full=y ignore=y
5、在新机器上导入数据
imp myusr/mypass file=mydata.dmp full=y ignore=y
完成后,检查表、索引、触发器等是否都建在TS_XMGL这个表空上,如果是,导入成功。系统运行测试正常。