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

紧急救援!SCN调整秘籍(二)

呆呆的私房菜 2025-03-25
39
    Whoami5年+金融、政府、医疗领域工作经验的DBA
    Certificate:PGCM、OCP、YCP
    Skill:Oracle、Mysql、PostgreSQL、国产数据库
    Platform:CSDN、墨天轮、公众号(呆呆的私房菜)
    复制
    阅读本文可以了解Oracle SCN不一致场景下,如何通过推SCN方式进行强制启动。

    01

    概述
    • 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以强制启动数据库。

      02

      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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                      评论