一、前言
最近需要对现有的项目就行修改,修改成另一个项目用于投标使用,修改过程主要是页面数据名称和匹配投标要求的修改。碰到的问题是现在系统数据库(orcal)过于庞大(近30G,数据表近400个),因为投标要部署两套完整的系统,所用要做到数据库每个表数据部分导出,保证系统正常运行。
二、具体过程
思路:首先获得导出对应用户的所用空表和储存过程等。之后将所用空表删除,导出每个表的前1000条数据(一般足够),进行导入 。核心语句就是 imp 用户/密码@localhost:1521/orcl file=f:\1000data.dmp tables=(多个表名称)
1.导出对应用户的所用空表和储存过程等,这一步主要是要将数据库中的储存过程、定时的导出。
exp 用户/密码@localhost:1521/orcl owner=用户 file=f:\kongdata.dmp rows=n compress=n
2.所用空表删除,导出所用空表删除,导出每个表的前1000条数据。空表不删除不能进行所用表的导入。plsql直接删除就行
获得本用户所用表,将数据表后加上逗号,方便执行导出。
select t.TABLE_NAME||',' from user_tables t
复制所用表,打开word,对换行进行替换,之后执行exp导出每个表前1000条数据,
exp 用户/密码@localhost:1521/orcl file=f:\qian1000.dmp tables=(
SRW_CF,SRW_XK,SSFJ_CF,SSFJ_XK,SSJJ_QZSRW_CF,SRW_XK,SSFJ_CF,SSFJ_XK,SSJJ_QZ) QUERY=\"WHERE rownum<1000\",注意删除最后一个逗号。
注意事项:1.exp中表长度有限制,一次执行太多可能会报错。我执行时对400个表分三次进行执行。
2.orcal 11g的新特性空表不能直接导出,需要注意(SELECT 'ALTER TABLE '||TABLE_NAME||' ALLOCATE EXTENT;' SQLSTR FROM USER_TABLES WHERE SEGMENT_CREATED='NO' 执行这句话,执行获得的每一个语句就行)
3.将导出的数据导入到新数据库中
imp 用户/密码@localhost:1521/orcl file=F:\kongdata.dmp full=y ignore=y
经过测试,系统可以运行。数据库数据由原来的30G缩小到100M以下。部署速度明显就快了。