Whoami:5年+金融、政府、医疗领域工作经验的DBA
Certificate:PGCM、OCP、YCP
Skill:Oracle、Mysql、PostgreSQL、国产数据库
Platform:CSDN、墨天轮、公众号(呆呆的私房菜)
复制
SCN是Oracle数据库的“心跳”,记录了所有数据变更的时序。当数据库因SCN不一致触发ORA-600 [262] 错误时,需手动推进SCN以修复数据同步问题。
SCN结构:48位整数,拆分为高16位(SCN Wrap)和低32位(SCN Base)。 1. 当 SCN_Base 达到最大值(0xFFFFFFFF)后, SCN_Wrap会进位1,相当于SCN整体增加了4294967296; 2. SCN计算公式如下:
SCN = (SCN_Wrap * 4294967296)+ SCN_Base
复制
本文我们探讨的是通过gdb工具直接修改内存中的值,从而推动scn以强制启动数据库。
1. 安装gdb工具
yum -y install gdb
复制
2. 查看当前scn并转换为16进制
SQL> select current_scn,to_char(current_scn,'xxxxxxxxx') from v$database;
CURRENT_SCN TO_CHAR(CURRENT_SCN,'XXXXXXXXX
----------- ------------------------------
1454944 163360
复制
3. 定位scn内存地址
SQL> oradebug setmypid;
Statement processed.
SQL> oradebug dumpvar sga kcsgscn_;
kcslf kcsgscn_ [0600113B8, 0600113E8) = 00163591 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 60049740 00000000
SCN Base:内存地址 0600113B8 开始的4字节值为 00 16 35 91(16进制),转为十进制为 1455505
SCN Wrap:后续4字节为 00000000,因SCN未超过4字节上限(2^32=4294967296),暂时无需调整。
复制
4. 目标scn计算
当前scn值
SCN = (SCN_Wrap * 4294967296)+ SCN_Base = ( 0 * 4294967296)+ 1455505 = 1455505
增加10w后的目标SCN
1455505 + 100000 = 1555505
转为16机制为 0x17B7A1
复制
5. 附加gdb到oracle进程
通过进程pid附加到数据库实例(数据库需处于mount或open状态)
[root@host-01 ~]# ps -ef |grep LOCAL=YES
oracle 639 535 0 00:21 ? 00:00:00 oracleorcl (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
root 1788 1754 0 00:23 pts/1 00:00:00 grep --color=auto LOCAL=YES
[oracle@host-01 ~]$ gdb $ORACLE_HOME/bin/oracle 639
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-120.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:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from u01/app/oracle/product/12.2.0/dbhome_1/bin/oracle...(no debugging symbols found)...done.
Attaching to program: u01/app/oracle/product/12.2.0/dbhome_1/bin/oracle, process 639
Reading symbols from u01/app/oracle/product/12.2.0/dbhome_1/lib/libodm12.so...(no debugging symbols found)...done.
Loaded symbols for /u01/app/oracle/product/12.2.0/dbhome_1/lib/libodm12.so
Reading symbols from u01/app/oracle/product/12.2.0/dbhome_1/lib/libofs.so...(no debugging symbols found)...done.
Loaded symbols for /u01/app/oracle/product/12.2.0/dbhome_1/lib/libofs.so
Reading symbols from u01/app/oracle/product/12.2.0/dbhome_1/lib/libcell12.so...done.
Loaded symbols for /u01/app/oracle/product/12.2.0/dbhome_1/lib/libcell12.so
Reading symbols from /u01/app/oracle/product/12.2.0/dbhome_1/lib/libskgxp12.so...(no debugging symbols found)...done.
Loaded symbols for /u01/app/oracle/product/12.2.0/dbhome_1/lib/libskgxp12.so
Reading symbols from /u01/app/oracle/product/12.2.0/dbhome_1/lib/libskjcx12.so...(no debugging symbols found)...done.
Loaded symbols for /u01/app/oracle/product/12.2.0/dbhome_1/lib/libskjcx12.so
Reading symbols from /lib64/librt.so.1...(no debugging symbols found)...done.
Loaded symbols for /lib64/librt.so.1
Reading symbols from /u01/app/oracle/product/12.2.0/dbhome_1/lib/libmql1.so...(no debugging symbols found)...done.
Loaded symbols for /u01/app/oracle/product/12.2.0/dbhome_1/lib/libmql1.so
Reading symbols from /u01/app/oracle/product/12.2.0/dbhome_1/lib/libipc1.so...(no debugging symbols found)...done.
Loaded symbols for /u01/app/oracle/product/12.2.0/dbhome_1/lib/libipc1.so
Reading symbols from /u01/app/oracle/product/12.2.0/dbhome_1/lib/libclsra12.so...done.
Loaded symbols for /u01/app/oracle/product/12.2.0/dbhome_1/lib/libclsra12.so
Reading symbols from /u01/app/oracle/product/12.2.0/dbhome_1/lib/libdbcfg12.so...(no debugging symbols found)...done.
Loaded symbols for /u01/app/oracle/product/12.2.0/dbhome_1/lib/libdbcfg12.so
Reading symbols from /u01/app/oracle/product/12.2.0/dbhome_1/lib/libhasgen12.so...done.
Loaded symbols for /u01/app/oracle/product/12.2.0/dbhome_1/lib/libhasgen12.so
Reading symbols from /u01/app/oracle/product/12.2.0/dbhome_1/lib/libskgxn2.so...(no debugging symbols found)...done.
Loaded symbols for /u01/app/oracle/product/12.2.0/dbhome_1/lib/libskgxn2.so
Reading symbols from /u01/app/oracle/product/12.2.0/dbhome_1/lib/libocr12.so...done.
Loaded symbols for /u01/app/oracle/product/12.2.0/dbhome_1/lib/libocr12.so
Reading symbols from /u01/app/oracle/product/12.2.0/dbhome_1/lib/libocrb12.so...done.
Loaded symbols for /u01/app/oracle/product/12.2.0/dbhome_1/lib/libocrb12.so
Reading symbols from /u01/app/oracle/product/12.2.0/dbhome_1/lib/libocrutl12.so...done.
Loaded symbols for /u01/app/oracle/product/12.2.0/dbhome_1/lib/libocrutl12.so
Reading symbols from /lib64/libaio.so.1...Reading symbols from /lib64/libaio.so.1...(no debugging symbols found)...done.
(no debugging symbols found)...done.
Loaded symbols for /lib64/libaio.so.1
Reading symbols from /u01/app/oracle/product/12.2.0/dbhome_1/lib/libons.so...(no debugging symbols found)...done.
Loaded symbols for /u01/app/oracle/product/12.2.0/dbhome_1/lib/libons.so
Reading symbols from /lib64/libdl.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib64/libdl.so.2
Reading symbols from /lib64/libm.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib64/libm.so.6
Reading symbols from /lib64/libpthread.so.0...(no debugging symbols found)...done.
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
Loaded symbols for /lib64/libpthread.so.0
Reading symbols from /lib64/libnsl.so.1...(no debugging symbols found)...done.
Loaded symbols for /lib64/libnsl.so.1
Reading symbols from /lib64/libresolv.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib64/libresolv.so.2
Reading symbols from /lib64/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib64/libc.so.6
Reading symbols from /lib64/libgcc_s.so.1...(no debugging symbols found)...done.
Loaded symbols for /lib64/libgcc_s.so.1
Reading symbols from /lib64/ld-linux-x86-64.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib64/ld-linux-x86-64.so.2
Reading symbols from /usr/lib64/libnuma.so.1...Reading symbols from /usr/lib64/libnuma.so.1...(no debugging symbols found)...done.
(no debugging symbols found)...done.
Loaded symbols for /usr/lib64/libnuma.so.1
Reading symbols from /lib64/libnss_files.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib64/libnss_files.so.2
Reading symbols from /u01/app/oracle/product/12.2.0/dbhome_1/lib/libnque12.so...(no debugging symbols found)...done.
Loaded symbols for /u01/app/oracle/product/12.2.0/dbhome_1/lib/libnque12.so
Reading symbols from /u01/app/oracle/product/12.2.0/dbhome_1/lib/libshpksse4212.so...(no debugging symbols found)...done.
Loaded symbols for /u01/app/oracle/product/12.2.0/dbhome_1/lib/libshpksse4212.so
0x00007f8e8d918740 in __read_nocancel () from /lib64/libpthread.so.0
Missing separate debuginfos, use: debuginfo-install glibc-2.17-326.el7_9.x86_64 libaio-0.3.109-13.el7.x86_64 libgcc-4.8.5-44.el7.x86_64 numactl-libs-2.0.9-7.el7.x86_64
(gdb)
复制
6. 修改内存中的scn值
需要将目标scn转换成小端十六进制
-- x86架构的gdb会自动处理小端序,因此直接写入0x17B7A1即可
(gdb) set *((int*) 0x0600113B8) = 0x17B7A1
(gdb) quit
复制
7. 再次检查内存值
SQL> oradebug dumpvar sga kcsgscn_;
kcslf kcsgscn_ [0600113B8, 0600113E8) = 0017B7A1 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 60049740 00000000
-- 输出中应显示新的SCN Base值(0017B7A1)
-- 查看当前scn
SQL> SELECT current_scn FROM v$database;
CURRENT_SCN
-----------
1555921
复制
8. 强制启动数据库,导出业务数据,导入到新建的数据库中。
alter database open;
复制
本文内容就到这啦,相信读完本篇你对极端情况下SCN不一致问题有了一定的解决思路了吧~希望本篇内容能给你带来帮助。我们下篇再见!

文章转载自呆呆的私房菜,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【专家有话说第五期】在不同年龄段,DBA应该怎样规划自己的职业发展?
墨天轮编辑部
1270次阅读
2025-03-13 11:40:53
Oracle RAC ASM 磁盘组满了,无法扩容怎么在线处理?
Lucifer三思而后行
766次阅读
2025-03-17 11:33:53
Oracle+Deepseek+Dify 实现数据库数据实时分析
bicewow
685次阅读
2025-03-06 09:41:49
【ORACLE】ORACLE19C在19.13版本前的一个严重BUG-24761824
DarkAthena
564次阅读
2025-03-04 14:33:31
Oracle避坑指南|同名表导出难题:如何精准排除指定用户下的表?
szrsu
513次阅读
2025-03-05 00:42:34
2月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
453次阅读
2025-03-13 14:38:19
Ogg23ai高手必看-MySQL Innodb Cluster跟oracle的亲密接触
曹海峰
448次阅读
2025-03-04 21:56:13
【ORACLE】char类型和sql优化器发生的“错误”反应
DarkAthena
404次阅读
2025-03-04 23:05:01
什么,oracle 主机用户被删了?原来是虚惊一场!
Lucifer三思而后行
401次阅读
2025-03-03 21:12:09
Oracle 如何修改 db_unique_name?强迫症福音!
Lucifer三思而后行
341次阅读
2025-03-12 21:27:56