首页 > 数据库 > Oracle > 如何通过GDB推进SCN来打开数据库
GDB是GNU项目开发的命令行调试工具,支持多种编程语言(C/C++、Go、Rust等),主要用于分析程序崩溃、逻辑错误和内存问题。它允许开发者在程序运行时检查内部状态(如变量值、调用栈),动态修改执行流程。
在本案例中可用于调整推进数据库的SCN,来处理由于SCN问题无法打开的数据库。不过该方法适用于12C及以上的数据库。
经测试发现,数据库 mount 和 open 状态下都可以通过此方法推进 SCN 。
Session1 :
查询当前 SCN
|
1
2
3
4
5 |
SQL>
select
current_scn
from
v$
database
;
CURRENT_SCN-----------
2910718245 |
查询当前 SCN 转成 16 进制后的值
|
1
2
3
4
5 |
SQL>
select
to_char(2910718245,
'xxxxxxxxxxxx'
)
from
dual;
TO_CHAR(29107-------------
ad7e0925 |
查询预修改的 SCN 转换成 16 进制后的值
|
1
2
3
4
5
6
7
8
9
10
11 |
SQL>
select
to_char(3910718245,
'xxxxxxxxxxxx'
)
from
dual;
TO_CHAR(39107-------------
e918d325
SQL>SQL> oradebug setmypidStatement processed.SQL> oradebug dumpvar sga kcsgscn_kscn8 kcsgscn_ [060017E98, 060017EA0) = AD7E093B 00000000 |
060017E98 是 SCN BASE 值,我们待会修改的就是他,修改成多少,数据库 SCN 就是多少
AD7E093B 是当前的 SCN 值,可以理解为 060017E98 是一个代号 x ,当前的 x 等于 AD7E093B
Session2:
|
1
2
3
4 |
[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
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 |
[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) = 0xe918d325
--->将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 查询,修改成功:
|
1
2
3
4
5 |
SQL>
select
current_scn
from
v$
database
;
CURRENT_SCN-----------
3910718287 |
重启数据库,也正常:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 |
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
|
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70013625/viewspace-3091047/ ,如需转载,请注明出处,否则将追究法律责任。