Tablespace 迁移
1 目标库的准备
1.1 安装目标库的OS及Oracle(要和原库一样版本,并上和原库一样的Patch)
1.2 修改目标库的初始化参数DB_FILES=2048
1.3 在目标库 nomount状态create control file(修改maxdatafiles为2048)
1.4 Shutdown 目标库,再重新Startup
1.5 给目标库的TEMP表空间增加数据文件
1.6 在目标库上创建User,名称,权限要和原库相同(对于未迁移过来的tablespace的权限不要设)
1.7 Copy原库的tnsnames.ora到目标库,覆盖目标库的tnsnames.ora
1.8 在目标库创建和原库相同的DB_LINK
2 准备原库
2.1 利用工具生成将要移动的user所拥有的object的 生成语句,比如某用户Create FUNCTION,VIEW,PROCEDURE,PACKAGE,package body,job的SQL object.sql
2.2 用方法生成要迁移的table及列COMMENT生成语句COMMENT.sql,如COMMENT ON COLUMN its.ACTION_INPUT.SERIES_NO is'测试';
2.3 以sys身份进入原库,检查要迁移的tablespace是否通过自包含检查,举例如下:
例1:
要迁移的tablespace 名称为tabs1,tabs2,tabs3
SQL>exec dbms_tts.TRANSPORT_SET_CHECK('tabs1,tabs2,tabs3',true);
SQL>select * from transport_set_violations;
如果返回来的结果为空,则表示附和要求,如果找到不符合要求的物件,处理掉它。可以将这些物件移动到合适的tablespace.然后再次验证,直到全部解决。
3 执行tablespace迁移动作
3.1 以 SysDBA权限连接原库,将要搬移的tablespace状态改为read only.
3.2 在原库执行EXP,举例如下
exp 'sys/oracle@orcl as sysdba' tablespaces=(tabs1,tabs2,tabs3) transport_tablespace=y file=mydump.dmp log=exp.log statistics=none constraints=y grants=y triggers=y
3.3 将tabs1,tabs2,tabs3 tablespace所属的数据文件复制到目标库相应的位置
3.4 将导出的DMP文件复制到目标库
3.5 在目标库执行IMP,举例如下
imp 'sys/oracle@orcl as sysdba' tablespaces=(tabs1,tabs2,tabs3) transport_tablespace=y file=mydump.dmp log=imp.log statistics=none constraints=y grants=y parfile=par.txt
par.txt如下:
datafiles=(d:\orcl\tabs1\tabs101.dbf,d:\orcl\tabs1\tabs102.dbf,d:\orcl\tabs2\tabs201.dbf,d:\orcl\tabs3\tabs301.dbf)
3.6 查看日志是否有异常
3.7 在目表库,将迁移过来的tablespace改为 read write.
3.8 在目标库运行2.1生成的object.sql创建FUNCTION,VIEW,PROCEDURE,PACKAGE,package body,job等(一些object未导过来,只有trigger成功导过来了,或许我的方法有纰漏)
3.9 在目标库运行2.2COMMENT.sql(主要是tablespace transport过来之后,COMMENT是乱码,所以要重建,也可能是我的方法有纰漏)
3.10 对比两个库的对象是否相同,补充差异部分
3.11请人员做一次全程测试
3.12更改IP,正式上线