迁移式升级的测试(二)(r10笔记第35天)
在之前写的一篇博文中,自己是打算对一台数据库使用Data Guard+TTS的方式来完成数据迁移和升级的工作,迁移式升级的新方案测试 (r10笔记第30天)
整体的思路如下。
备库Failover之后,导出元数据,然后同一台服务器上的11g的数据库中导入元数据,这样就避免了传输文件的时间消耗。从而达到快速迁移升级的目的。
具体的操作步骤如下所示:
1.在备库端需要开启闪回
这个也是为了能够在迁移失败的情况下,能够迅速回退,马上重构主备库的环境。
2.在开启闪回数据库之后,记录一下SCN的信息,留作后面备用。
select current_scn from v$database;
CURRENT_SCN
------------------
228967862801
3.开始备库切换
在备库端进行Failover的操作。整个过程分分钟即可完成。这个过程需要保证主库端的数据能够及时更新过来。
alter database recover managed standby database finish force;
alter database commit to switchover to primary;
select database_role,open_mode from v$database;
4.在开始迁移前,做一个完整的检查,这是迁移的重中之重,如果迁移的表空间很多,可以直接放到脚本里面来统一处理也可以。
exec dbms_tts.transport_set_check(TS_LIST=>'STORELOG_DATA,STORELOG_INDX,USERS,GHOSTOL_DATA,GHOSTOL_INDEX,TEST_DATA,TEST_INDEX,PERFSTAT,TS_AUDIT,STAT_POINT,TEST_MV_DATA,TEST_MV_INDEX,TEST_AUDIT_DATA,JYCX_DATA,OEM_DATA,TEST_INDEX2,TEST_INDEX3,SWDONLINE_DATA,SWDONLINE_INDX,OEM_MON_TEST,USERCENTER_DATA',INCL_CONSTRAINTS=>TRUE,full_check=>true);
查看检查的结果:
select *from transport_set_violations;
可以看到这个例子中还是违反自包含约束的情况,从日志能够看出,主要是和aud$的处理相关。 经过确认,MARKET_ANGEL_USEDUP是个索引,但是属主存在问题,可以在迁移的时候直接重建。 sys@TEST> drop index MARKET_ANGEL_USEDUP; Index dropped. sys@TEST> create index TEST.MARKET_ANGEL_USEDUP on TEST.MARKET_ANGEL("USED_UP") tablespace TEST_index; Index created. 另外的几个表 TEST_WEAPON,TMP_CNINFO_XTG_20081212,AUD$_20120608是临时表,可以直接删除。 drop table TEST_WEAPON; drop table TMP_CNINFO_XTG_20081212; drop table AUD$_20120608; 最后的注意力就到了aud$,可以看到这个表是在之前因为考虑到数据量较大,直接迁移到一个独立的表空间了,在这个例子中为了保证迁移的顺利,可以先把 aud$迁移到sysaux里面,迁移完成之后再处理即可。数据量不大的情况下直接move tablespace即可,如果里面的数据可以删除,直接truncate即可。 truncate table aud$; alter table aud$ move tablespace sysaux; 这个时候查看检查信息,还是存在下面的一些提示信息。
这个时候可以查看LOB的具体信息,发现是AUD$里面的一个LOB列,单独迁移即可。 SQL> select table_name,column_name,tablespace_name,index_name from user_lobs where index_name='SYS_IL0000011218C00041$$'
SQL>alter table aud$ move tablespace sysaux lob(SQLTEXT) store as lobsegment(tablespace sysaux); 另外一个LOB也是同样的处理。 SQL> alter table aud$ move tablespace sysaux lob(SQLBIND) store as lobsegment2(tablespace sysaux); 对于其他的对象,如果不是LOB列,那很可能就是回收站里的对象了,直接删除即可。 sys@TEST> select table_name,column_name,tablespace_name,index_nam from user_lobs where segment_name='SYS_LOB0000133356C00041$$';
sys@TEST> show recyclebin
SQL>purge recyclebin; 对于aud$上面的索引可以直接rebuild即可达到效果。 alter index I_AUD2 rebuild tablespace sysaux; 再次检查阿九没有任何问题了。 PL/SQL procedure successfully completed. no rows selected 5.接下来的工作就是把表空间置为READ ONLY状态。 alter tablespace USERS read only; alter tablespace TS_AUDIT read only; alter tablespace GHOSTOL_DATA read only; alter tablespace GHOSTOL_INDEX read only; alter tablespace TEST_DATA read only; alter tablespace TEST_INDEX read only; 6.导出10g数据库的元数据信息,标注为迁移表空间的方式。 exp 'sys/oracle as sysdba' file=exp_tts_TEST.dmp transport_tablespace= y tablespaces=USERS,GHOSTOL_DATA,GHOSTOL_INDEX,TEST_DATA,TEST_INDEX,PERFSTAT,STAT_POINT,TEST_MV_DATA,TEST_MV_INDEX,TEST_AUDIT_DATA,JYCX_DATA,OEM_DATA,TEST_INDEX2,TEST_INDEX3,SWDONLINE_DATA,SWDONLINE_INDX,STORELOG_DATA,STORELOG_INDX,OEM_MON_TEST,USERCENTER_DATA log=exp_tts_TEST.log 7.在11g的新库中可以尝试建立相应的用户,这里有几个地方需要注意。 理论上可以通过impdp来完成用户信息的导入,但是这个步骤建议还是手工处理,从10g的库上导出用户的DDL语句,简单修改。 原因在于默认表空间在新库上存在,如果存在PROFILE的资源设置,很可能导入失败。可以批量生成语句,简单修改即可。 CREATE USER "TEST" IDENTIFIED BY VALUES '5F712A8369686639' DEFAULT TABLESPACE "TEST_DATA" TEMPORARY TABLESPACE "TEMP" PROFILE "PF_TEST" ; 后续来继续解读这个迁移的过程。整个过程会是一个完整的演练过程,碰到的问题越多,解决的越多。迁移的时候越顺利。
- 使用View Model从表现层分离领域模型
- 代码实现WordPress点击进入随机一篇文章的方法
- UE4新手编程之创建空白关卡和添加碰撞体
- Office Web Apps
- hadoop: hive 1.2.0 在mac机上的安装与配置
- ASP.NET 5运行时升级到Beta5
- WordPress免插件仅代码实现“返回顶部、返回底部、评论”效果(样式二)
- jQuery/asp.net mvc DateTime 的处理
- WordPress主题下funtions.php的一段“恶意”代码
- eclipse/intellij idea 远程调试hadoop 2.6.0
- Jexus 5.8.2 正式发布为Asp.Net Core进入生产环境提供平台支持
- 区块链技术发展前景可观,银链原子链已开始投入正常交易
- 分布式服务框架 dubbo/dubbox 入门示例
- SmtpClient发送邮件遭遇The specified string is not in the form required for a subject.
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Go 每日一库之 jobrunner
- 在本地运行 fyne 官网
- Python-科学计算-pandas-12-df单列计算
- JDK15就要来了,你却还不知道JDK8的新特性!
- 八佰:用Python看知乎 vs 豆瓣的战斗
- 学习Python你必须了解的lenna小姐姐
- 10行python代码制作笑死人不偿命的倒放gif
- “Hello Node.js” 这一次是你没见过的写法
- 作为DBA,你不得不掌握的压测工具
- Mac之vim普通命令使用
- selenium库的基本使用
- 高效大数据开发之 bitmap 思想的应用
- 从0到1实现一个虚拟DOM
- Xenomai XDDP example and Posix Compling
- 项目实践|基于Flink的用户行为日志分析系统