暂无图片
暂无图片
4
暂无图片
暂无图片
暂无图片

运维日记丨通过GDB方式推进Oracle的SCN

新运维新数据 2022-03-05
1765

各位新朋友~记得先点蓝字关注我哦~


大家好,今天和大家介绍下如何在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
-------------
e918d325


SQL> oradebug setmypid
Statement 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=YES
oracle 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=YES
oracle 20109 20105 0 Feb15 ? 00:00:13 oracletestdb19c (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))


本次测试库是orcl,因此选9824

[oracle@redhat19c11 ~]$ gdb $ORACLE_HOME/bin/oracle 9824
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-114.el7
Copyright (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) quit
A debugging session is active.


Inferior 1 [process 9824] will be detached.


Quit anyway? (y or n) y
Detaching 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 bytes
Fixed Size 9137824 bytes
Variable Size 603979776 bytes
Database Buffers 1845493760 bytes
Redo Buffers 7639040 bytes
Database 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、达梦等主流商业和开源数据库。并成为首批国内达梦战略合作伙伴之一,拥有海量经验和完善的人员培养体系。并同时提供超融合,私有云整体解决方案。


文章转载自新运维新数据,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论