本次升级的数据共享集群的架构如下
| 主机名 | IP | 数据库名(db_name) | 实例名(instance_name) | 角色 |
|---|---|---|---|---|
| DSC-1 | 192.168.20.36 | dmdb | dmdb1 | 控制节点 |
| DSC-2 | 192.168.20.37 | dmdb | dmdb2 | 普通节点 |
正常的升级流程中达梦数据库补丁升级需要关闭所有数据库实例,对一些及其重要的、不可轻易中断的业务系统很难安排升级的窗口。通过滚动升级,可以在业务连接不中断的情况下完成数据库的补丁升级,更方便申请补丁升级窗口。
以两个节点的DSC集群为例,滚动升级的总体思路是在作业准备阶段完成后,先关闭并升级普通节点,升级完成后启动普通节点,再关闭并升级控制节点,完成后启动所有数据库相关服务,进行验证和收尾。升级过程中需要确保应用程序能正常连接集群中的任意一个节点,即需要对应用连接串做检查。
本次升级测试并未完全模拟实际的生产环境,个人仅通过一个小脚本测试确保升级过程中数据库可以连接,对已连接的会话有无影响暂无测试,对于生产环境建议模拟实际情况做进一步测试。
配置 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
登录后查询当前连接的数据库实例,关闭该实例观察是否自动切换
以下步骤均可在作业时间前操作
若无另外说明,以下操作均在控制节点执行
用于后续完整安装新版本
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
##两节点都执行
disql -ru_id
Rolling update version: dsc[1]-dw[1]
##所有节点都执行
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,若无可忽略
以 SYSDBA 登录数据库进行以下备份,涉及的日期需按实际情况修改,需统一格式,建议统一为yyyymmdd(例:20260518)
备份用户权限
#备份表的日期按实际情况修改
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%';
备份位图索引
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);
备份函数索引
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);
备份全库索引明细
CREATE TABLE SYSDBA.INDEXES_BAK_日期 AS SELECT * FROM DBA_INDEXES;
备份当前INI列表
CREATE TABLE SYSDBA.DMINI_BAK_日期 AS SELECT * FROM V$DM_INI;
备份当前DBA_OBJECTS
CREATE TABLE SYSDBA.DBA_OBJECTS_BAK_日期 AS SELECT * FROM DBA_OBJECTS;
备份SYSINJECTHINT
create table SYSDBA.sysinjecthint_bak_日期 as select * from sysinjecthint;
备份rewrite视图
create table SYSDBA.VSYS_REWRITE_EQUIVALENCES_BAK_日期 as select * from sys.VSYS_REWRITE_EQUIVALENCES;
备份策略
CREATE TABLE SYSDBA.DBA_POLICIES_bak_日期 as select * from dba_policies;
备份前需确认磁盘空间是否充足,评估好时间,在升级的当天下午就可以开始
disql
BACKUP DATABASE FULL BACKUPSET '/备份路径' compressed level 4 parallel 8;
#查询是否存在相同调度
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的作业调度策略。
检查所有节点进程
登录监视器检查集群状态
select * from v$version;
#检查该库是否有MODEL,DIMENSION,MEASURES这三个字段
select * from dba_tab_columns where column_name in ('MODEL','DIMENSION','MEASURES');
#若查出有结果则修改所有节点dm.ini
EXCLUDE_RESERVED_WORDS = MODEL,DIMENSION,MEASURES
关闭前需kill掉节点上所有外部会话
若配置了自动重启需提前关闭
DmService stop DmASMSvrService stop DmCSSService stop DmAPService stop
备份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
备份旧版本软件包,并创建新版本包的安装目录
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
这一步忽略
cd /dmdb/dmdbms/bin
cp /dmdb/dmdbms_oldversion/bin/Dm* ./
cp dependencies/*.so ./
按正常启动流程启动,规范里用系统服务就用系统服务起,用脚本就用脚本起
su - root systemctl start DmAPService systemctl start DmCSSServicecss2 su - dmdba DmASMSvrService start DmService start
查询进程和监视器状态
查询数据库版本
关闭前需kill掉节点上所有外部会话
若配置了自动重启需提前关闭
DmService stop DmASMSvrService stop DmCSSService stop DmAPService stop
备份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
备份旧版本软件包,并创建新版本包的安装目录
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
这一步忽略
cd /dmdb/dmdbms/bin
cp /dmdb/dmdbms_oldversion/bin/Dm* ./
cp dependencies/*.so ./
按正常启动流程启动,规范里用系统服务就用系统服务起,用脚本就用脚本起
su - root systemctl start DmAPService systemctl start DmCSSServicecss2 su - dmdba DmASMSvrService start DmService start
查询进程和监视器状态
查询数据库版本
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 对比看缺了哪个
-- 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);
#由于很多参数被隐藏,为确保重启后不会失效需要保证参数都能打印出来
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
#执行下列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 ;
#不一致时,找出存在差异的权限,执行授权,并再次对比
#重建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');
#执行过程重建视图 SP_CREATE_SYSTEM_VIEWS(1); #重建视图完成后,对比用户权限,若缺少,需重建权限 #重复步骤5.4
#查询所有的高级日志,并保留其结果,如果没有则可跳过下面高级日志步骤
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');
#执行以下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);
#删除函数索引,执行以下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中备份的函数索引执行一遍重建
#将3.5中备份的位图索引执行一遍重建
#执行以下查询,如有结果则需要咨询开发商是否有用到错误日志表及对应关系
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 备份表;
#执行以下查询,检查包、存储过程、函数、包体
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;
#用下面的脚本获取重写规则
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滚动升级完成,后续可通知业务侧验证业务
文章
阅读量
获赞
