Whoami:5年+金融、政府、医疗领域工作经验的DBACertificate:PGCM、OCP、YCPSkill: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 00000000SCN Base:内存地址 0600113B8 开始的4字节值为 00 16 35 91(16进制),转为十进制为 1455505SCN Wrap:后续4字节为 00000000,因SCN未超过4字节上限(2^32=4294967296),暂时无需调整。
4. 目标scn计算
当前scn值SCN = (SCN_Wrap * 4294967296)+ SCN_Base = ( 0 * 4294967296)+ 1455505 = 1455505增加10w后的目标SCN1455505 + 100000 = 1555505转为16机制为 0x17B7A1
5. 附加gdb到oracle进程
通过进程pid附加到数据库实例(数据库需处于mount或open状态)
[root@host-01 ~]# ps -ef |grep LOCAL=YESoracle 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 639GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-120.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:<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 639Reading 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.soReading 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.soReading 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.soReading 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.soReading 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.soReading symbols from /lib64/librt.so.1...(no debugging symbols found)...done.Loaded symbols for /lib64/librt.so.1Reading 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.soReading 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.soReading 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.soReading 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.soReading 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.soReading 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.soReading 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.soReading 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.soReading 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.soReading 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.1Reading 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.soReading symbols from /lib64/libdl.so.2...(no debugging symbols found)...done.Loaded symbols for /lib64/libdl.so.2Reading symbols from /lib64/libm.so.6...(no debugging symbols found)...done.Loaded symbols for /lib64/libm.so.6Reading 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.0Reading symbols from /lib64/libnsl.so.1...(no debugging symbols found)...done.Loaded symbols for /lib64/libnsl.so.1Reading symbols from /lib64/libresolv.so.2...(no debugging symbols found)...done.Loaded symbols for /lib64/libresolv.so.2Reading symbols from /lib64/libc.so.6...(no debugging symbols found)...done.Loaded symbols for /lib64/libc.so.6Reading symbols from /lib64/libgcc_s.so.1...(no debugging symbols found)...done.Loaded symbols for /lib64/libgcc_s.so.1Reading symbols from /lib64/ld-linux-x86-64.so.2...(no debugging symbols found)...done.Loaded symbols for /lib64/ld-linux-x86-64.so.2Reading 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.1Reading symbols from /lib64/libnss_files.so.2...(no debugging symbols found)...done.Loaded symbols for /lib64/libnss_files.so.2Reading 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.soReading 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.so0x00007f8e8d918740 in __read_nocancel () from /lib64/libpthread.so.0Missing 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)-- 查看当前scnSQL> SELECT current_scn FROM v$database;CURRENT_SCN-----------1555921
8. 强制启动数据库,导出业务数据,导入到新建的数据库中。
alter database open;
本文内容就到这啦,相信读完本篇你对极端情况下SCN不一致问题有了一定的解决思路了吧~希望本篇内容能给你带来帮助。我们下篇再见!

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




