注册
达梦数据库DSC集群滚动升级
专栏/技术分享/ 文章详情 /

达梦数据库DSC集群滚动升级

谷顾咕 2026/06/04 109 0 0
摘要

本次升级的数据共享集群的架构如下

主机名 IP 数据库名(db_name) 实例名(instance_name) 角色
DSC-1 192.168.20.36 dmdb dmdb1 控制节点
DSC-2 192.168.20.37 dmdb dmdb2 普通节点

1. 总体思路

正常的升级流程中达梦数据库补丁升级需要关闭所有数据库实例,对一些及其重要的、不可轻易中断的业务系统很难安排升级的窗口。通过滚动升级,可以在业务连接不中断的情况下完成数据库的补丁升级,更方便申请补丁升级窗口。

以两个节点的DSC集群为例,滚动升级的总体思路是在作业准备阶段完成后,先关闭并升级普通节点,升级完成后启动普通节点,再关闭并升级控制节点,完成后启动所有数据库相关服务,进行验证和收尾。升级过程中需要确保应用程序能正常连接集群中的任意一个节点,即需要对应用连接串做检查。

本次升级测试并未完全模拟实际的生产环境,个人仅通过一个小脚本测试确保升级过程中数据库可以连接,对已连接的会话有无影响暂无测试,对于生产环境建议模拟实际情况做进一步测试。

2. 配置连接串

配置 dm_svc.conf 使连接具备自动切换功能

vi /etc/dm_svc.conf dmdsc_svc=(192.168.20.31:5238,192.168.20.32:5238) [dmdsc_svc] SWITCH_TIMES=(10) #故障后尝试连接原数据库10次,生产环境需调整 SWITCH_INTERVAL=(1000) #尝试连接间隔1000ms,生产环境需调整

使用连接串连接数据库

disql /nolog conn sysdba/"******"@dmdsc_svc

登录后查询当前连接的数据库实例,关闭该实例观察是否自动切换

image.png

3. 升级前准备

以下步骤均可在作业时间前操作

若无另外说明,以下操作均在控制节点执行

3.1 上传新版本数据库ISO安装包

用于后续完整安装新版本

3.2 备份磁盘头

mkdir -p /dmdb/dmbak/disk_head_check cd $DM_HOME/bin ./dmasmmgt #检查磁盘头,检查结果应报correct check /dev/dm/ #备份磁盘头,dmlog、dmdata和dmarch按实际数量修改命令 backup /dev/dm/asm-vote to /dmdb/dmbak/disk_head_check/asm-vote.txt backup /dev/dm/asm-dcr to /dmdb/dmbak/disk_head_check/asm-dcr.txt backup /dev/dm/asm-dmlog* to /dmdb/dmbak/disk_head_check/asm-dmlog*.txt backup /dev/dm/asm-dmarch* to /dmdb/dmbak/disk_head_check/asm-dmarch*.txt backup /dev/dm/asm-dmdata* to /dmdb/dmbak/disk_head_check/asm-dmdata*.txt #检查备份,检查结果应是has not been destroyed ,check successfully check local /dmdb/dmbak/disk_head_check

3.3 检查是否支持滚动升级

##两节点都执行 disql -ru_id Rolling update version: dsc[1]-dw[1]

3.4 调整dmdcr.ini

##所有节点都执行 cd /dmdb/dmdata(以实际路径为准) cp dmdcr.ini dmdcr.ini.bak vi dmdcr.ini DMDCR_ASM_TRACE_LEVEL = 2 DMDCR_AUTO_OPEN_CHECK = 33 DMDCR_ASM_MAX_FILE_OPEN=4096 DMDCR_CRASH_CHECK_OPT_COUNT=30 DMDCR_LINK_CHECK_IP = 172.168.*.* #建议配置为DEM服务器所在内网IP,若无可忽略

3.5 数据库内相关备份

以 SYSDBA 登录数据库进行以下备份,涉及的日期需按实际情况修改,需统一格式,建议统一为yyyymmdd(例:20260518)

  1. 备份用户权限

    #备份表的日期按实际情况修改 CREATE TABLE SYSDBA.PRIV_BAK_日期 AS select 'GRANT ' ||SF_GET_SYS_PRIV(PRIVID) ||' TO ' ||B.USERNAME ||';' AS PRIV_TEXT from SYSGRANTS A, DBA_USERS B where not ( OBJID != -1 OR COLID != -1 ) and PRIVID != -1 and A.URID = B.USER_ID and USERNAME not like 'SYS%' UNION ALL SELECT 'GRANT ' ||PRIVILEGE ||' ON '||OWNER||'.' ||TABLE_NAME ||' TO ' ||GRANTEE ||';' AS PRIV_TEXT FROM DBA_TAB_PRIVS A, DBA_USERS B WHERE A.GRANTEE=B.USERNAME AND B.USERNAME NOT LIKE 'SYS%';
  2. 备份位图索引

    CREATE TABLE SYSDBA.BM_INDEXES_BAK_日期 AS SELECT TO_CHAR(DBMS_METADATA.GET_DDL('INDEX',TAB_OBJ.NAME,SCH_OBJ.NAME)) AS DDL_TEXT FROM SYS.SYSOBJECTS TAB_OBJ,SYS.SYSOBJECTS SCH_OBJ,SYS.SYSINDEXES C ,SYS.SYSOBJECTS D WHERE TAB_OBJ.SUBTYPE$='INDEX' AND TAB_OBJ.SCHID=SCH_OBJ.ID AND TAB_OBJ.ID=C.ID AND C.TYPE$='BM' AND C.XTYPE & (0x2000) != (0x2000) AND D.ID=SCH_OBJ.PID AND C.FLAG&(0x1)!=(0x1);
  3. 备份函数索引

    CREATE TABLE SYSDBA.FUN_INDEXES_BAK_日期 AS SELECT TO_CHAR(DBMS_METADATA.GET_DDL('INDEX',TAB_OBJ.NAME,SCH_OBJ.NAME)) AS DDL_TEXT FROM SYS.SYSOBJECTS TAB_OBJ,SYS.SYSOBJECTS SCH_OBJ,SYS.SYSINDEXES C ,SYS.SYSOBJECTS D WHERE TAB_OBJ.SUBTYPE$='INDEX' AND TAB_OBJ.SCHID=SCH_OBJ.ID AND TAB_OBJ.ID=C.ID AND C.XTYPE & (0x2) = (0x2) AND D.ID=SCH_OBJ.PID AND C.FLAG&(0x1)!=(0x1);
  4. 备份全库索引明细

    CREATE TABLE SYSDBA.INDEXES_BAK_日期 AS SELECT * FROM DBA_INDEXES;
  5. 备份当前INI列表

    CREATE TABLE SYSDBA.DMINI_BAK_日期 AS SELECT * FROM V$DM_INI;
  6. 备份当前DBA_OBJECTS

    CREATE TABLE SYSDBA.DBA_OBJECTS_BAK_日期 AS SELECT * FROM DBA_OBJECTS;
  7. 备份SYSINJECTHINT

    create table SYSDBA.sysinjecthint_bak_日期 as select * from sysinjecthint;
  8. 备份rewrite视图

    create table SYSDBA.VSYS_REWRITE_EQUIVALENCES_BAK_日期 as select * from sys.VSYS_REWRITE_EQUIVALENCES;
  9. 备份策略

    CREATE TABLE SYSDBA.DBA_POLICIES_bak_日期 as select * from dba_policies;

3.5 数据库备份

备份前需确认磁盘空间是否充足,评估好时间,在升级的当天下午就可以开始

disql BACKUP DATABASE FULL BACKUPSET '/备份路径' compressed level 4 parallel 8;

3.6 检查作业是否存在相同调度

#查询是否存在相同调度 SELECT COUNT(*) AS JOB_CNT,JOBID FROM SYSJOB.SYSJOBSCHEDULES T WHERE T.ENABLE=1 GROUP BY JOBID ORDER BY 1 DESC; #找到对应的JOBID的作业修改 select NAME "作业名" from sysjob.sysjobs where id ='查询的JOBID'; 修改同一作业count(*) > 2的作业调度策略。

4. 作业实施阶段

4.1 检查集群状态

检查所有节点进程

image.png

image.png

登录监视器检查集群状态

image.png

4.2 检查升级前数据库版本

select * from v$version;

image.png

4.3 添加屏蔽关键字

#检查该库是否有MODEL,DIMENSION,MEASURES这三个字段 select * from dba_tab_columns where column_name in ('MODEL','DIMENSION','MEASURES'); #若查出有结果则修改所有节点dm.ini EXCLUDE_RESERVED_WORDS = MODEL,DIMENSION,MEASURES

4.4 关闭普通节点DSC-2所有数据库进程

关闭前需kill掉节点上所有外部会话

若配置了自动重启需提前关闭

DmService stop DmASMSvrService stop DmCSSService stop DmAPService stop

4.5 修改dm.ini

备份dm.ini文件,修改以下参数,若没有则新增

参数需根据实际情况调整,以下仅供参考。个人实验环境在内存不大的情况下建议 DICT_BUF_SIZE、BUFFER、CACHE_POOL_SIZE、MAX_SCAN_PAGES 不调整

cp dm.ini dm.ini.bak20260519 vi dm.ini INVOCATION_OPT_FLAG=117 OUTER_CVT_INNER_PULL_UP_COND_FLAG=19 RLOG_LLOG_COMPRESS=1 ENABLE_BCT=1 BEXP_CALC_ST_FLAG=0 ENABLE_INDEX_FILTER=2 MULTI_PAGE_GET_NUM=1 PRELOAD_SCAN_NUM= 4 PRELOAD_EXTENT_NUM= 5 SLCT_OPT_FLAG=0 HASH_PLL_OPT_FLAG=19 PARALLEL_POLICY=2 DIST_OPT_FLAG = 1 ENABLE_MONITOR_PLNHIST = 0 --该参数必须设置为0,取1时会有宕机风险 ARGUMENT_MATCHING_MODE = 0 --该参数需设置为0,设置为1时会导部分对象编译失败 HASH_JOIN_LOOP_TIMES = 1 -- 新增到ini文件的最后一行 SVR_LOG_PLN_STR = 0 VPD_CAN_CACHE = 0 GEN_SQL_MEM_RECLAIM=0 --该参数必须设置为0,取1时会有宕机风险 OPERATION_NEW_MOTION=0 --该参数必须设置为0,取其它值会有宕机风险 BATCH_PARAM_OPT=0 MAX_SCAN_PAGES = 1024 DML_TTS_OPT = 0 DSC_TRX_VIEW_SYNC=1 MULTI_UPD_OPT_FLAG = 1 PTX_ROLLBACK = 1 ENABLE_CREATE_BM_INDEX_FLAG = 0 BAK_TIMEOUT = 300 TRX_CR_PAGE_NUM = 200 MERGER_OPT_FLAG = 0 REDOS_ENABLE_SELECT=2 -- 涉及灾备建设的库需要修改该值 REDOS_PARALLEL_NUM = 64 --涉及灾备建设的库需要修改该值 PAGE_CHECK_INDEXID=0

4.6 部署新版本数据库软件包

备份旧版本软件包,并创建新版本包的安装目录

mv /dmdb/dmdbms /dmdb/dmdbms_oldversion mkdir /dmdb/dmdbms

挂载 ISO 镜像并完整安装数据库软件,已有配置文件不修改,不重新注册 DMAP 服务

cd /dmdb/soft/ mount -o loop dm8_20251027_x86_kylin10_sp1_64.iso /mnt/ su - dmdba cd /mnt ./DMInstall.bin -i 配置文件/etc/dm_svc.conf已存在,是否进行替换? (Y/y,N/n) [Y/y]:n 请以root系统用户执行命令: /dmdb/dmdbms/script/root/root_installer.sh 这一步忽略

4.7 拷贝原服务和依赖包到新版本bin目录

cd /dmdb/dmdbms/bin cp /dmdb/dmdbms_oldversion/bin/Dm* ./ cp dependencies/*.so ./

4.8 启动DSC-2所有数据库进程

按正常启动流程启动,规范里用系统服务就用系统服务起,用脚本就用脚本起

su - root systemctl start DmAPService systemctl start DmCSSServicecss2 su - dmdba DmASMSvrService start DmService start

4.9 DSC-2版本升级后检查

查询进程和监视器状态

image.png

image.png

查询数据库版本

image.png

4.10 关闭控制节点DSC-1所有数据库进程

关闭前需kill掉节点上所有外部会话

若配置了自动重启需提前关闭

DmService stop DmASMSvrService stop DmCSSService stop DmAPService stop

4.11 修改dm.ini

备份dm.ini文件,修改以下参数,若没有则新增

参数需根据实际情况调整,以下仅供参考。个人实验环境在内存不大的情况下建议 DICT_BUF_SIZE、BUFFER、CACHE_POOL_SIZE、MAX_SCAN_PAGES 不调整

cp dm.ini dm.ini.bak20260519 vi dm.ini INVOCATION_OPT_FLAG=117 OUTER_CVT_INNER_PULL_UP_COND_FLAG=19 RLOG_LLOG_COMPRESS=1 ENABLE_BCT=1 BEXP_CALC_ST_FLAG=0 ENABLE_INDEX_FILTER=2 MULTI_PAGE_GET_NUM=1 PRELOAD_SCAN_NUM= 4 PRELOAD_EXTENT_NUM= 5 SLCT_OPT_FLAG=0 HASH_PLL_OPT_FLAG=19 PARALLEL_POLICY=2 DIST_OPT_FLAG = 1 ENABLE_MONITOR_PLNHIST = 0 --该参数必须设置为0,取1时会有宕机风险 ARGUMENT_MATCHING_MODE = 0 --该参数需设置为0,设置为1时会导部分对象编译失败 HASH_JOIN_LOOP_TIMES = 1 -- 新增到ini文件的最后一行 SVR_LOG_PLN_STR = 0 VPD_CAN_CACHE = 0 GEN_SQL_MEM_RECLAIM=0 --该参数必须设置为0,取1时会有宕机风险 OPERATION_NEW_MOTION=0 --该参数必须设置为0,取其它值会有宕机风险 BATCH_PARAM_OPT=0 MAX_SCAN_PAGES = 1024 DML_TTS_OPT = 0 DSC_TRX_VIEW_SYNC=1 MULTI_UPD_OPT_FLAG = 1 PTX_ROLLBACK = 1 ENABLE_CREATE_BM_INDEX_FLAG = 0 BAK_TIMEOUT = 300 TRX_CR_PAGE_NUM = 200 MERGER_OPT_FLAG = 0 REDOS_ENABLE_SELECT=2 -- 涉及灾备建设的库需要修改该值 REDOS_PARALLEL_NUM = 64 --涉及灾备建设的库需要修改该值 PAGE_CHECK_INDEXID=0

4.12 部署新版本数据库软件包

备份旧版本软件包,并创建新版本包的安装目录

mv /dmdb/dmdbms /dmdb/dmdbms_oldversion mkdir /dmdb/dmdbms

挂载 ISO 镜像并完整安装数据库软件,已有配置文件不修改,不重新注册 DMAP 服务

cd /dmdb/soft/ mount -o loop dm8_20251027_x86_kylin10_sp1_64.iso /mnt/ su - dmdba cd /mnt ./DMInstall.bin -i 配置文件/etc/dm_svc.conf已存在,是否进行替换? (Y/y,N/n) [Y/y]:n 请以root系统用户执行命令: /dmdb/dmdbms/script/root/root_installer.sh 这一步忽略

4.13 拷贝原服务和依赖包到新版本bin目录

cd /dmdb/dmdbms/bin cp /dmdb/dmdbms_oldversion/bin/Dm* ./ cp dependencies/*.so ./

4.14 启动DSC-1所有数据库进程

按正常启动流程启动,规范里用系统服务就用系统服务起,用脚本就用脚本起

su - root systemctl start DmAPService systemctl start DmCSSServicecss2 su - dmdba DmASMSvrService start DmService start

4.15 DSC-1版本升级后检查

查询进程和监视器状态

image.png

image.png

查询数据库版本

image.png

5. 收尾阶段

5.1 验证修改参数

select para_name,para_value from v$dm_ini where para_name in ('INVOCATION_OPT_FLAG','OUTER_CVT_INNER_PULL_UP_COND_FLAG','RLOG_LLOG_COMPRESS','ENABLE_BCT','BIND_PARAM_OPT_FLAG','ENABLE_INDEX_FILTER','DICT_BUF_SIZE','MULTI_PAGE_GET_NUM','PRELOAD_SCAN_NUM','PRELOAD_EXTENT_NUM','SLCT_OPT_FLAG','ENABLE_RQ_TO_NONREF_SPL','HASH_PLL_OPT_FLAG','PARALLEL_POLICY','DIST_OPT_FLAG','ENABLE_MONITOR_PLNHIST','ARGUMENT_MATCHING_MODE','HASH_JOIN_LOOP_TIMES','SVR_LOG_PLN_STR','VPD_CAN_CACHE','GEN_SQL_MEM_RECLAIM','OPERATION_NEW_MOTION','BATCH_PARAM_OPT','MAX_SCAN_PAGES','DML_TTS_OPT','DSC_TRX_VIEW_SYNC','MULTI_UPD_OPT_FLAG');

和 4.5 对比看缺了哪个

5.2 检查部分参数

-- SLCT_OPT_FLAG=0 -- ARGUMENT_MATCHING_MODE = 0 -- ENABLE_MONITOR_PLNHIST = 0 -- BEXP_CALC_ST_FLAG = 0 select para_name,para_value from v$dm_ini where para_name='SLCT_OPT_FLAG'; select para_name,para_value from v$dm_ini where para_name='BEXP_CALC_ST_FLAG'; -- 如果参数值,不满足条件,需修改参数 SP_SET_PARA_VALUE(1,'SLCT_OPT_FLAG',0); SP_SET_PARA_VALUE(1,'BEXP_CALC_ST_FLAG',0);

5.3 检查ini参数

#由于很多参数被隐藏,为确保重启后不会失效需要保证参数都能打印出来 cat dm.ini|grep INVOCATION_OPT_FLAG cat dm.ini|grep OUTER_CVT_INNER_PULL_UP_COND_FLAG cat dm.ini|grep RLOG_LLOG_COMPRESS cat dm.ini|grep ENABLE_BCT cat dm.ini|grep BEXP_CALC_ST_FLAG cat dm.ini|grep BIND_PARAM_OPT_FLAG cat dm.ini|grep ENABLE_INDEX_FILTER cat dm.ini|grep DICT_BUF_SIZE cat dm.ini|grep MULTI_PAGE_GET_NUM cat dm.ini|grep PRELOAD_SCAN_NUM cat dm.ini|grep PRELOAD_EXTENT_NUM cat dm.ini|grep SLCT_OPT_FLAG cat dm.ini|grep OR_CVT_HTAB_FLAG cat dm.ini|grep BUFFER cat dm.ini|grep CACHE_POOL_SIZE cat dm.ini|grep VIEW_OPT_FLAG cat dm.ini|grep ENABLE_RQ_TO_NONREF_SPL cat dm.ini|grep HASH_PLL_OPT_FLAG cat dm.ini|grep JSON_MODE cat dm.ini|grep PARALLEL_POLICY cat dm.ini|grep DIST_OPT_FLAG cat dm.ini|grep ENABLE_MONITOR_PLNHIST cat dm.ini|grep ARGUMENT_MATCHING_MODE cat dm.ini|grep HASH_JOIN_LOOP_TIMES cat dm.ini|grep SVR_LOG_PLN_STR cat dm.ini|grep VPD_CAN_CACHE cat dm.ini|grep GEN_SQL_MEM_RECLAIM cat dm.ini|grep OPERATION_NEW_MOTION cat dm.ini|grep BATCH_PARAM_OPT cat dm.ini|grep MAX_SCAN_PAGES cat dm.ini|grep DML_TTS_OPT cat dm.ini|grep DSC_TRX_VIEW_SYNC cat dm.ini|grep MULTI_UPD_OPT_FLAG cat dm.ini|grep PAGE_CHECK_INDEXID cat dm.ini|grep REDOS_ENABLE_SELECT cat dm.ini|grep REDOS_PARALLEL_NUM

5.4 确认用户权限与升级前一致

#执行下列SQL,查询是否有缺失的用户权限,SYSDBA.PRIV_BAK_日期为3.5节创建的视图 #注意SESSION权限,容易遗漏 WITH TMP_PRIV AS( select 'GRANT ' ||SF_GET_SYS_PRIV(PRIVID) ||' TO ' ||B.USERNAME ||';' AS PRIV_TEXT from SYSGRANTS A, DBA_USERS B where not ( OBJID != -1 OR COLID != -1 ) and PRIVID != -1 and A.URID = B.USER_ID and USERNAME not like 'SYS%' UNION ALL SELECT 'GRANT ' ||PRIVILEGE ||' ON '||OWNER||'.' ||TABLE_NAME ||' TO ' ||GRANTEE ||';' AS PRIV_TEXT FROM DBA_TAB_PRIVS A, DBA_USERS B WHERE A.GRANTEE=B.USERNAME AND B.USERNAME NOT LIKE 'SYS%') select * from SYSDBA.PRIV_BAK_日期 A left join TMP_PRIV B ON A.PRIV_TEXT = B.PRIV_TEXT WHERE B.PRIV_TEXT IS NULL ; #不一致时,找出存在差异的权限,执行授权,并再次对比

5.5 重建系统包

#重建DBMS_LOCK sp_create_system_packages(0,'DBMS_LOCK'); sp_create_system_packages(1,'DBMS_LOCK'); #关闭系统包 sp_create_system_packages(0,'DBMS_ADVANCED_REWRITE'); sp_create_system_packages(0,'DBMS_ALERT'); sp_create_system_packages(0,'DBMS_BINARY'); sp_create_system_packages(0,'DBMS_LOB'); sp_create_system_packages(0,'DBMS_LOGMNR'); sp_create_system_packages(0,'DBMS_METADATA'); sp_create_system_packages(0,'DBMS_MVIEW'); sp_create_system_packages(0,'DBMS_OBFUSCATION_TOOLKIT'); sp_create_system_packages(0,'DBMS_OUTPUT'); sp_create_system_packages(0,'DBMS_PAGE'); sp_create_system_packages(0,'DBMS_PIPE'); sp_create_system_packages(0,'DBMS_RANDOM'); sp_create_system_packages(0,'DBMS_SESSION'); sp_create_system_packages(0,'DBMS_SPACE'); sp_create_system_packages(0,'DBMS_SQL'); sp_create_system_packages(0,'DBMS_SQLTUNE'); sp_create_system_packages(0,'DBMS_TRANSACTION'); sp_create_system_packages(0,'DBMS_STATS'); sp_create_system_packages(0,'DBMS_UTILITY'); sp_create_system_packages(0,'UTL_ENCODE'); sp_create_system_packages(0,'UTL_FILE'); sp_create_system_packages(0,'UTL_INADDR'); sp_create_system_packages(0,'UTL_MAIL'); sp_create_system_packages(0,'UTL_MATCH'); sp_create_system_packages(0,'UTL_TCP'); sp_create_system_packages(0,'UTL_URL'); sp_create_system_packages(0,'UTL_SMTP'); sp_create_system_packages(0,'UTL_HTTP'); sp_create_system_packages(0,'UTL_I18N'); sp_create_system_packages(0,'DBMS_ERRLOG'); #创建系统包 sp_create_system_packages(1,'DBMS_ADVANCED_REWRITE'); sp_create_system_packages(1,'DBMS_ALERT'); sp_create_system_packages(1,'DBMS_BINARY'); sp_create_system_packages(1,'DBMS_LOB'); sp_create_system_packages(1,'DBMS_LOGMNR'); sp_create_system_packages(1,'DBMS_METADATA'); sp_create_system_packages(1,'DBMS_MVIEW'); sp_create_system_packages(1,'DBMS_OBFUSCATION_TOOLKIT'); sp_create_system_packages(1,'DBMS_OUTPUT'); sp_create_system_packages(1,'DBMS_PAGE'); sp_create_system_packages(1,'DBMS_PIPE'); sp_create_system_packages(1,'DBMS_RANDOM'); sp_create_system_packages(1,'DBMS_SESSION'); sp_create_system_packages(1,'DBMS_SPACE'); sp_create_system_packages(1,'DBMS_SQL'); sp_create_system_packages(1,'DBMS_SQLTUNE'); sp_create_system_packages(1,'DBMS_TRANSACTION'); sp_create_system_packages(1,'DBMS_STATS'); sp_create_system_packages(1,'DBMS_UTILITY'); sp_create_system_packages(1,'UTL_ENCODE'); sp_create_system_packages(1,'UTL_FILE'); sp_create_system_packages(1,'UTL_INADDR'); sp_create_system_packages(1,'UTL_MAIL'); sp_create_system_packages(1,'UTL_MATCH'); sp_create_system_packages(1,'UTL_TCP'); sp_create_system_packages(1,'UTL_URL'); sp_create_system_packages(1,'UTL_SMTP'); sp_create_system_packages(1,'UTL_HTTP'); sp_create_system_packages(1,'UTL_I18N'); sp_create_system_packages(1,'DBMS_ERRLOG');

5.6 重建视图

#执行过程重建视图 SP_CREATE_SYSTEM_VIEWS(1); #重建视图完成后,对比用户权限,若缺少,需重建权限 #重复步骤5.4

5.7 重建高级日志

#查询所有的高级日志,并保留其结果,如果没有则可跳过下面高级日志步骤 SELECT 'ALTER TABLE '||OWNER||'.'||TABLE_NAME||' WITH ADVANCED LOG;' FROM (SELECT DISTINCT USER_OBJ_INNER.NAME TABLE_NAME,SCH_OBJ_INNER.NAME OWNER FROM SYS.SYSOBJECTS USER_OBJ_INNER,SYS.SYSOBJECTS SCH_OBJ_INNER,SYS.SYSOBJECTS USER_OBJ WHERE USER_OBJ_INNER.SCHID=SCH_OBJ_INNER.ID AND SCH_OBJ_INNER.TYPE$='SCH' AND (USER_OBJ_INNER.INFO3 & (0X400000000)) !=0 AND USER_OBJ_INNER.SUBTYPE$ LIKE '_TAB'); #如需要重建,在关闭高级日志之后将以上查询结果重复执行即可
#关闭高级日志功能,执行以下SQL,并将结果拿出执行 SELECT 'ALTER TABLE '||OWNER||'.'||TABLE_NAME||' WITHOUT ADVANCED LOG;' FROM (SELECT DISTINCT USER_OBJ_INNER.NAME TABLE_NAME,SCH_OBJ_INNER.NAME OWNER FROM SYS.SYSOBJECTS USER_OBJ_INNER,SYS.SYSOBJECTS SCH_OBJ_INNER,SYS.SYSOBJECTS USER_OBJ WHERE USER_OBJ_INNER.SCHID=SCH_OBJ_INNER.ID AND SCH_OBJ_INNER.TYPE$='SCH' AND (USER_OBJ_INNER.INFO3 & (0X400000000)) !=0 AND USER_OBJ_INNER.SUBTYPE$ LIKE '_TAB');

5.6 升级空间索引

#执行以下SQL,将结果拿出来执行即可 SELECT 'CALL SP_ROWID_UPGRADE_SPATIAL('''||OWNER||''','''||TABLE_NAME||''','''||INDEX_NAME||''',1);' FROM (SELECT E.OWNER,E.INDEX_NAME,E.TABLE_NAME FROM SYS.SYSOBJECTS TAB_OBJ,SYS.SYSOBJECTS SCH_OBJ,SYS.SYSINDEXES C ,SYS.SYSOBJECTS D,DBA_INDEXES E WHERE TAB_OBJ.SUBTYPE$='INDEX' AND TAB_OBJ.SCHID=SCH_OBJ.ID AND TAB_OBJ.ID=C.ID AND C.TYPE$='ST' AND C.XTYPE & (0x2000) != 0x2000 AND D.ID=SCH_OBJ.PID AND C.FLAG&(0x1)!=(0x1) AND TAB_OBJ.NAME=E.INDEX_NAME AND SCH_OBJ.NAME=E.OWNER);

5.7 重建函数索引

#删除函数索引,执行以下SQL,并将结果拿出执行 SELECT 'DROP INDEX '||SCH_OBJ.NAME||'.'||TAB_OBJ.NAME||';' FROM SYS.SYSOBJECTS TAB_OBJ,SYS.SYSOBJECTS SCH_OBJ,SYS.SYSINDEXES C ,SYS.SYSOBJECTS D WHERE TAB_OBJ.SUBTYPE$='INDEX' AND TAB_OBJ.SCHID=SCH_OBJ.ID AND TAB_OBJ.ID=C.ID AND C.XTYPE & (0x2) =(0x2) AND D.ID=SCH_OBJ.PID AND C.FLAG&(0x1)!=(0x1); #重建函数索引 #将3.5中备份的函数索引执行一遍重建

5.8 重建位图索引

#将3.5中备份的位图索引执行一遍重建

5.9 重建错误日志表

#执行以下查询,如有结果则需要咨询开发商是否有用到错误日志表及对应关系 SELECT OWNER,TABLE_NAME,COLUMN_NAME FROM DBA_TAB_COLUMNS WHERE COLUMN_NAME='DM_ERR_ROWID$'; #备份错误日志表 CREATE TABLE 备份表 AS SELECT * FROM 错误日志表; #删除错误日志表 DROP TABLE 错误日志表; #使用DBMS_ERRLOG包重建错误记录表 DBMS_ERRLOG.CREATE_ERROR_LOG(基表,错误日志表); #回填数据 INSERT INTO 错误日志表 SELECT * FROM 备份表;

5.10 检查包、存储过程、函数有效性

#执行以下查询,检查包、存储过程、函数、包体 SELECT A.OBJECT_NAME 新版本对象名, A.OBJECT_TYPE 新版本对象类型, A.STATUS 新版本对象状态, B.OBJECT_NAME 生产版本对象名, B.OBJECT_TYPE 生产版本对象类型, B.STATUS 生产版本对象状态 FROM DBA_OBJECTS A FULL JOIN (SELECT * FROM SYSDBA.DBA_OBJECTS_BAK_日期 C where C.OBJECT_TYPE IN ('PROCEDURE','PACKAGE','FUNCTION','PACKAGE BODY') ) B ON A.OBJECT_NAME =B.OBJECT_NAME AND A.OBJECT_TYPE = B.OBJECT_TYPE AND A.OWNER=B.OWNER WHERE A.OBJECT_TYPE IN ('PROCEDURE','PACKAGE','FUNCTION','PACKAGE BODY') AND A.STATUS<>B.STATUS;
#有不一致的对象需要重新编译并处理对象报错问题 #编译包、存储过程、函数 SELECT 'ALTER '||A.OBJECT_TYPE|| ' '||A.OWNER||'.'||A.OBJECT_NAME||' COMPILE;' F, A.OBJECT_NAME 新版本对象名, A.OBJECT_TYPE 新版本对象类型, A.STATUS 新版本对象状态, B.OBJECT_NAME 生产版本对象名, B.OBJECT_TYPE 生产版本对象类型, B.STATUS 生产版本对象状态 FROM DBA_OBJECTS A FULL JOIN (SELECT * FROM SYSDBA.DBA_OBJECTS_BAK_日期 C where C.OBJECT_TYPE IN ('PROCEDURE','PACKAGE','FUNCTION') ) B ON A.OBJECT_NAME =B.OBJECT_NAME AND A.OBJECT_TYPE = B.OBJECT_TYPE AND A.OWNER=B.OWNER WHERE A.OBJECT_TYPE IN ('PROCEDURE','PACKAGE','FUNCTION') AND A.STATUS<>B.STATUS;

5.11 重建规则

#用下面的脚本获取重写规则 select 'DBMS_ADVANCED_REWRITE.DROP_REWRITE_EQUIVALENCE(''' ||NAME||'''); BEGIN DBMS_ADVANCED_REWRITE.DECLARE_REWRITE_EQUIVALENCE('''||NAME||''', NULL, '''||replace(substr(DESTINATION_STMT, 1, REGEXP_INSTR(DESTINATION_STMT, '/')), ')', '\)') ||substr(DESTINATION_STMT, REGEXP_INSTR(DESTINATION_STMT, '/')+1, lengthb(DESTINATION_STMT)) ||''', FALSE, ''TEXT_MATCH'' ); END;' from sys_rewrite_equivalences; #如上SQL执行若有结果,反馈给开发方执行重写规则,无结果忽略

DSC滚动升级完成,后续可通知业务侧验证业务

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服