查看文章 |
通过 Oracle Streams 实现平滑分库和升级
2009-06-19 14:37
今天完成了一个负载较高的中央数据库的分库操作, 并实现了oracle的滚动升级(10.2.0.1->10.2.0.4), 业务中断仅15分钟. 平台: RHEL AS 4 + Oracle 10.2.0.1 分库目的: 1) 迁出BUSINESS/BUSINESS_APP两业务系统用户数据, 减轻中央库的业务压力和负载, 调整数据库架构, 以应对后续新业务系统上线造成对中央库的冲击; 2) 新库升级Oracle10.2.0.1到10.2.0.4, 数据库本身修复了很多bug, 增强了数据库的稳定性. 3) 调整定时任务, 把原先的定时任务由crontab/job方式改为oracle scheduler. 大概操作步骤如下: --1) 提前安装Oracle10.2.0.4, 并部署Streams复制(schema复制) BEGIN DBMS_STREAMS_ADM.MAINTAIN_SCHEMAS ( schema_names => 'BUSINESS,BUSINESS_APP', source_directory_object => 'DIR_SOURCE', destination_directory_object => 'DIR_DEST', source_database => 'SOUR.NET', destination_database => 'DEST.LK', perform_actions => TRUE, script_name => NULL, script_directory_object => NULL, capture_name => 'cap_erating', capture_queue_table => 'tab_cap_que_erating', capture_queue_name => 'cap_que_erating', capture_queue_user => NULL, propagation_name => 'prop_erating', apply_name => 'app_erating', apply_queue_table => 'tab_app_que_erating', apply_queue_name => 'app_que_erating', apply_queue_user => NULL, dump_file_name => 'SOUR.dmp', log_file => 'SOUR.log', bi_directional => FALSE, include_ddl => TRUE, instantiation => DBMS_STREAMS_ADM.instantiation_schema ); END; / --2) 检查目标库Streams复制是否正常 SELECT 'capture' process_type, capture_name process_name, status, error_message FROM DBA_CAPTURE UNION ALL SELECT 'propagation' process_type, propagation_name process_name, status, error_message FROM dba_propagation UNION ALL SELECT 'apply' process_type, apply_name process_name, status, error_message FROM dba_apply; SELECT apply_name, local_transaction_id, source_commit_scn, error_creation_time, error_message FROM dba_apply_error ORDER BY source_commit_scn DESC; --3) 停止全部业务系统, 要求只能中断15分钟 --4) 取消源库定时任务(包括crontab/job) --5) 核查源库是否还有连接 SELECT username, status, COUNT ( * ) FROM v$session WHERE username IN ('BUSINESS', 'BUSINESS_APP') GROUP BY username, status; --6) 核查目标库是否还有Streams复制事务 SELECT streams_name, streams_type, cumulative_message_count, first_message_time, XIDUSN, XIDSLT, XIDSQN, last_message_time, total_message_count FROM v$streams_transaction ORDER BY 3 DESC; --7) 从源库获得重建序列语句, Streams复制这点特别注意, 因为Streams本身不会去同步序列值 set pages 0 SELECT 'DROP SEQUENCE ' || sequence_owner || '.' || sequence_name || ';' stmt FROM dba_sequences WHERE sequence_owner IN ('BUSINESS', 'BUSINESS_APP') UNION ALL SELECT 'CREATE SEQUENCE ' || sequence_owner || '.' || sequence_name || ' start with ' || last_number || ' MAXVALUE ' || max_value || ' MINVALUE ' || min_value || DECODE (cycle_flag, 'N', ' NOCYCLE ', ' CYCLE ') || DECODE (cache_size, 0, ' NOCACHE ', ' CACHE '||cache_size) || DECODE (ORDER_FLAG, 'N', ' NOORDER ', ' ORDER ') || ';' stmt FROM dba_sequencesWHERE sequence_owner IN ('BUSINESS', 'BUSINESS_APP'); --8) 目标库重建序列 --9) 源库和目标库刷新同义词, 把同义词指向新的dblink, 同义词脚本提前准备好 --源库 @E:\用户迁移\sour_synonyms.sql --目标库 @E:\用户迁移\dest_synonyms.sql --10) 源库和目标库重新编译失效对象 @?/rdbms/admin/utlrp.sql exec uts.get_invalid; --11) 各业务系统更改数据库连接指向, 并启动各业务系统 --12) 测试业务系统启动情况 SELECT username, status, COUNT ( * ) FROM v$session WHERE username IN ('BUSINESS', 'BUSINESS_APP') GROUP BY username, status; --12) 增加定时任务, 为方便管理统一改为scheduler --13) 删除流配置 exec dbms_streams_adm.remove_streams_configuration; --14) 其它收尾工作, 如各开发人员查询用户的授权等等. --End-- |
最近读者: