各位新朋友~记得先点蓝字关注我哦~
大家好,今天和大家介绍下如何在12c及以上版本的数据库中对数据库的SCN进行推进的一种方法。首先容我介绍下Oracle中SCN的意义
Oracle中SCN的意义
SCN(System Change Number)就是通常的所说的系统改变号,是数据库中非常重要的一个数据结构,用以标识数据库在某个确切时刻提交的版本。在事务提交时,它被赋予一个唯一的标识事务的SCN。
作为数据库内部的逻辑时钟,数据库事务依据SCN进行排序,Oracle也依据SCN来实现一致性读(Read Consistency)等重要数据库功能,SCN在数据库中是唯一的,并随时间增加而增加,除非我们重建数据库,不然SCN值永远不会重置为0。
修改SCN的方法
在部分数据库的异常恢复的情境下,我们是需要依赖于对数据库进行SCN推进才可以做到打开数据库的操作。
以下方法是常见的修改SCN方法:
1、oradebug poke直接修改内存中的值;
2、event 10015事件来增加scn的值;
3、_minimum_giga_scn来增加scn的值;
4、gdb/dbx来直接修改内存中的值;
5、修改控制文件来修改scn的值;
6、修改数据文件头来修改scn的值;
7、adjust_scn事件来增加scn。
但是在2012年时,Oracle通过补丁更新,导致2、3方法失效,目前只有1、4、5、6方法生效。在这几种方法中,我们常常使用方法1来修改scn的值,但是此方法在12C中,Oracle也已经屏蔽,还可以继续使用4,5,6的方法来实现修改SCN。在12.2中,Oracle多了一个新的EVENT 21307096也可以实现增加SCN的值。
如何通过gdb这种方法推进数据库的SCN
在使用gdb工具前,如果没有安装的话需要预先安装此工具:yum install *gdb* -y
安装完成后,正式开始本次实验。
Session1:
查询当前SCN
SQL> select current_scn from v$database;CURRENT_SCN-----------2910718245
查询当前SCN转成16进制后的值
SQL> select to_char(2910718245,'xxxxxxxxxxxx') from dual;TO_CHAR(29107-------------ad7e0925
查询预修改的SCN转换成16进制后的值,本次测试将最高位增加一位数
SQL> select to_char(3910718245,'xxxxxxxxxxxx') from dual;TO_CHAR(39107-------------e918d325SQL> oradebug setmypidStatement processed.SQL> oradebug dumpvar sga kcsgscn_kscn8 kcsgscn_ [060017E98, 060017EA0) = AD7E093B 00000000
需要注意的是,060017E98是SCN BASE值,AD7E093B是当前的SCN值,可以理解为060017E98是一个代号x,当前的x等于AD7E093B,待会儿我们修改SCN值的时候,就会需要指定060017E98这个值等于多少。
Session2:
[oracle@redhat19c11 ~]$ ps -ef|grep LOCAL=YESoracle 9824 9730 0 Feb22 ? 00:00:01 oracleorcl (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))oracle 18621 8636 0 01:18 pts/1 00:00:00 grep --color=auto LOCAL=YESoracle 20109 20105 0 Feb15 ? 00:00:13 oracletestdb19c (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
本次测试库是orcl,因此选9824
[oracle@redhat19c11 ~]$ gdb $ORACLE_HOME/bin/oracle 9824GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-114.el7Copyright (C) 2013 Free Software Foundation, Inc.License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>This is free software: you are free to change and redistribute it.There is NO WARRANTY, to the extent permitted by law. Type "show copying"and "show warranty" for details.This GDB was configured as "x86_64-redhat-linux-gnu".For bug reporting instructions, please see:。。。。。。(中间省略)(gdb) set *((int *) 0x060017E98) = 0xe918d32--->将SCN BASE修改为刚才查出来的值(gdb) quitA debugging session is active.Inferior 1 [process 9824] will be detached.Quit anyway? (y or n) yDetaching from program: /oracle/app/product/19.3.0/db_1/bin/oracle, process 9824
返回session1查询,修改成功:
SQL> select current_scn from v$database;CURRENT_SCN-----------3910718287
重启数据库,也可以正常打开数据库:
SQL> shutdown immediate;Database closed.Database dismounted.ORACLE instance shut down.SQL> startup;ORACLE instance started.Total System Global Area 2466250400 bytesFixed Size 9137824 bytesVariable Size 603979776 bytesDatabase Buffers 1845493760 bytesRedo Buffers 7639040 bytesDatabase mounted.Database opened.SQL> select current_scn from v$database;CURRENT_SCN-----------3910719415
好了,以上就是通过GDB的方式来推进oracle的SCN,大家快去做一下实验吧!
美创运维中心数据库服务团队拥有Oracle ACE 1人、OCM 10余人、数十名Oracle OCP、MySQL OCP、红帽RHCA、中间件weblogic、tuxedo认证、达梦工程师 ,著有《Oracle DBA实战攻略》,《Oracle数据库性能优化方法和最佳实践》,《Oracle内核技术揭秘》等多本数据运维优化书籍。目前运维各类数据库合计2000余套,精通Oracle、MySQL、SQLServer、DB2、PostgreSQL、达梦等主流商业和开源数据库。并成为首批国内达梦战略合作伙伴之一,拥有海量经验和完善的人员培养体系。并同时提供超融合,私有云整体解决方案。







