测试环境的迁移式升级和数据整合(r8笔记第27天)
很多时候,大家工作中都会有一种被动的思维,那就是能不动就不动,从求稳的角度来看无可厚非,但是从风险的角度来说,还是有待商榷的。如果存在风险,还保持原样很可能就是一个不定时炸弹。
这不手头有一套环境,按照以前的标准是根本入不了我的法眼的,但是因为是测试环境,小问题比较多,存在容灾风险,但是这么多年一直这样,也就默然接受了。
这套环境硬件配置很低,基本上和我的笔记本配置差不多,可能还略差一些,在上面跑着3个数据库实例,其中一个是11g的,2个是10g的。两个10g的数据库实例数据量都不大,几十G而已。
看起来是有些别扭,而且这几个数据库实例都是运行在费归档模式下,对于备份目前是采用了逻辑备份的方式,备份了几个重要的schema数据,每天凌晨开始运行,然后上传到异机上去。
听起来也还是可行的,但是一旦发生硬件问题,恢复就是一个大麻烦。
这部凌晨就收到了报警,然后发现这台服务器不可用了。登录ILO之后,发现系统健康情况为Unknown,已经无法连通了。
然后发现备用电源已经停了,强制手工启动之后,算是勉强撑了4个多小时,然后中午又宕机了,下午三点又宕机一次。
当然这个期间,自己已经开始着实一些具体的工作了。
经过评估,发现这个问题还得先整合起来,然后逐步迁移实例。
类似下面的情况,首先在一台新的服务器上安装11gR2的软件,然后把11g的库做成dataguard的形式,然后switchover,这样11g的 库就迁移出去了,然后对于10gR2的库来说,因为数据量不大,可以考虑直接逻辑导出导入即可。当然前提是这几个数据库中的用户表没有冲突。
搭建dataguard用了没多少时间,简单确认就可以直接切换了。测试环境所以流程上就会送一些,但是数据迁移的质量还是要保持,当然吐槽一下dataguard搭建过程中的错误。
搭建的过程中报错。
input datafile file number=00061 name=/U01/app/oracle/oradata/actvdb/slzj_actv_index01.dbf
output file name=/U01/app/oracle/oradata/actvdb/slzj_actv_index01.dbf tag=TAG20160303T133618
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:03
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of Duplicate Db command at 03/03/2016 13:30:18
RMAN-05501: aborting duplication of target database
RMAN-03015: error occurred in stored script Memory Script
trace日志的信息如下:
Errors in file /U01/app/oracle/diag/rdbms/sactvdb/actvdb/trace/actvdb_ora_18030.trc:
ORA-19505: failed to identify file "/U01/app/oracle/product/11.2.3/db_1/dbs/d:oracleoradatamytbs_tl.dbf"
ORA-27040: file create error, unable to create file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 1
Thu Mar 03 13:26:37 2016
Errors in file /U01/app/oracle/diag/rdbms/sactvdb/actvdb/trace/actvdb_ora_18032.trc:
这个问题有多奇葩,竟然在$ORACLE_HOME/dbs下有数据文件,而且竟然还是以d:字样开头的数据文件。
主库端马上做了修复,
alter tablespace TEST_ACTV_DATA offline;
!cp '/U01/app/oracle/product/11.2.3/db_1/dbs/d:oracleoradatamytbs_tl.dbf' '/U01/app/oracle/oradata/actvdb/d:oracleoradatamytbs_tl.dbf';
alter tablespace TEST_ACTV_DATA rename datafile '/U01/app/oracle/product/11.2.3/db_1/dbs/d:oracleoradatamytbs_tl.dbf' to '/U01/app/oracle/oradata/actvdb/d:oracleoradatamytbs_tl.dbf';
alter tablespace TEST_ACTV_DATA online;
然后继续同步,就会从上次的断点处继续,很快就做好了。
然后开始做switchover,当然速度也很快,都在计划之中。
DGMGRL> show configuration;
Configuration - actvdb_dg
Protection Mode: MaxPerformance
Databases:
actvdb - Primary database
sactvdb - Physical standby database
Fast-Start Failover: DISABLED
Configuration Status:
SUCCESS
DGMGRL> switchover to sactvdb;
Performing switchover NOW, please wait...
New primary database "sactvdb" is opening...
Operation requires shutdown of instance "actvdb" on database "actvdb"
Shutting down instance "actvdb"...
ORA-01031: insufficient privileges
第一步完成,后面的就是做数据的整合了。逻辑备份不会同步下面的这些信息。
profile信息,用户的密码和基本基本权限信息,系统权限,角色,表空间定义信息等,这些都需要我们自己来完成。
当然这些也不是什么难事了。生成用户的基本定义信息。
select dbms_metadata.get_ddl('USER',u.username) from dba_users u WHERE USERNAME in ('ACC',。。。。。);
select dbms_metadata.get_granted_ddl('SYSTEM_GRANT',u.username) from dba_users u WHERE USERNAME in USERNAME in ('ACC',。。。。。);
select dbms_metadata.get_granted_ddl('ROLE_GRANT',u.username) from dba_users u WHERE USERNAME in USERNAME in ('ACC',。。。。。);
生成表空间信息
select dbms_metadata.get_ddl('TABLESPACE', ts.tablespace_name)||';' from dba_tablespaces ts;
逻辑备份导出
exp xxx/xxx owner=ACC1,ACC2,ACC3.... buffer=9102000 statistics=none log=acc_test1.log file=acc_test1.dmp
逻辑导入
imp xxx/xxx fromuser=ACC1,ACC2,ACC3.... touser=ACC1,ACC2,ACC3.... buffer=9102000 statistics=none log=acc_test1_imp.log file=acc_test1.dmp
前期准备较好,数据的迁移就会很流畅。
迁移完成之后,终于能够松一口气,也算是脱离那个定时炸弹了,后期修复了电源之后,这台服务器还可以勉强做个备库。得来全不费功夫。
- jquery mobile 移动web(1)
- WordPress Plugin Boilerplate:一个WordPress 插件开发模板(框架)
- [C#6] 5-自动属性增强
- React多页面应用1
- jQuery操作Select
- MSDN杂志上的Windows Phone相关文章
- WCF Data Service工具包
- WordPress 文章截断方式:有more标签的优先more标签,否则截断一定字数
- 为什么要探索宇宙
- Redis的各项功能解决了哪些问题?
- WordPress.com 宣布支持Markdown 语言
- 使用Topshelf 5步创建Windows 服务
- TGM Plugin Activation:为WordPress 主题添加“插件推荐安装”功能
- [腾讯社区开放平台]介绍开放授权协议-OAuth
- 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 数组属性和方法
- PyQt5 技巧篇-QWidget、Dialog界面固定大小设置
- 力扣:地下城游戏,手把手教你做困难题
- RN布局
- 学会MySQL主从复制读写分离,看这篇就够了
- Canal+Kafka实现MySQL与Redis数据同步
- 超详细canal入门,看这篇就够了
- 详细讲解!RabbitMQ防止数据丢失
- 详细讲解!从秒杀聊到ZooKeeper分布式锁
- 正确使用 wait/notify/notify方法以及源码解析
- 秒杀商品超卖事故:Redis分布式锁请慎用!
- 3D开发是一个生态,ThingJS支持js,css,json,html外部资源引用
- 手把手教你实现xxl-job分布式任务调度平台搭建
- 在 vscode 中 debugger 调试
- MongoDB 的安装
- 一次opencanary自定义实践