数据恢复:隐含参数_minimum_giga_scn被废弃后如何调SCN

崔华,网名 dbsnake

Oracle ACE Director,ACOUG 核心专家

在很多数据恢复的场景中,我们可能需要调节SCN,但是一个重要的隐含参数_minimum_giga_scn,在Oracle 11.2.0.2打上相关的SCN的补丁以及后续的版本中已经被废弃。

Connected to Oracle Database 12c Enterprise Edition Release 12.1.0.1.0

Connected as SYS

SQL> select count(*) from sys.all_parameters where name like ‘_minimum_giga_scn%’;

COUNT(*)

———-

0

SQL> select dbms_flashback.get_system_change_number()/(1024*1024*1024) from dual;

DBMS_FLASHBACK.GET_SYSTEM_CHAN

——————————

0.00187269318848848

[oracle@localhost dbs]$ cat initdb121.ora

db121.__data_transfer_cache_size=0

db121.__db_cache_size=251658240

……省略显示部分内容

*.undo_tablespace=’UNDOTBS1′

*._minimum_giga_scn=1

SQL> startup pfile=/u01/app/oracle/product/12.1.0/dbhome_1/dbs/initdb121.ora

LRM-00101: unknown parameter name ‘_minimum_giga_scn’

ORA-01078: failure in processing system parameters

另外,经我测试,不仅_minimum_giga_scn失效了,alter session set events ‘10015 trace name adjust_scn level XXX’也失效了。

我没有采用改数据文件头再重建控制文件的方法,因为在ASM的环境下这种方法太麻烦了(除非是以后ODU内嵌的BBED支持批量修改文件头)。

我采用的是把控制文件拷出来直接修改控制文件的方式,幸运的是,12cR1的控制文件中我想改的地方其offset和之前的版本比并未改变。

这里我想把SCN调整为1G。

修改方法为:

1、当数据块为8k的时候,控制文件大小为16k

2、找到Controlfile Checkpointed at scn,偏移量为第一个块的60,比如0x4060,然后具体位置在0x4060的第9至第14个byte

3、找到第一个块的第一行,如0x4000,将offset为15的flag由0x04改为0x00,并同时将checksum值(offset为16、17)全部清零。

如下是改完控制文件后的效果:

SQL> startup mount pfile=/u01/app/oracle/product/12.1.0/dbhome_1/dbs/initdb121.ora

ORACLE instance started.

Total System Global Area 438423552 bytes

Fixed Size 2289304 bytes

Variable Size 255852904 bytes

Database Buffers 176160768 bytes

Redo Buffers 4120576 bytes

Database mounted.

SQL> alter database open;

Database altered.

SQL> select dbms_flashback.get_system_change_number()/(1024*1024*1024) from dual;

DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER()/(1024*1024*1024)

———————————————————-

1.00001949

这里再补充另外一种方法,即通过oradebug修改kcsgscn_的方式也可以达到同样的效果:

如下是Big Endian平台kcsgscn_的显示效果:

SQL> select to_char(dbms_flashback.get_system_change_number(),’XXXXXXXXXXXX’) from dual;

TO_CHAR(DBMS_FLASHBACK.GET_SYS

——————————

94393E2E03F

从上述显示结果中我们可以看到,上述系统的SCN wrap为0x0943,SCN base为0x93E2E03F,这个显示结果和如下用oradebug查看kcsgscn_的显示结果一致:

SQL> oradebug setmypid

Statement processed.

SQL> oradebug dumpvar sga kcsgscn_

kcslf kcsgscn_ [7000000000182A0, 7000000000182D0) = 00000943 93E2E077 00000000 00000000 005C3BEE 00000000 00000000 00000000 00000000 00000000 07000000 00017F80

kcsgscn_就是SCN的值,所以其值会不断往上增长:

SQL> oradebug dumpvar sga kcsgscn_

kcslf kcsgscn_ [7000000000182A0, 7000000000182D0) = 00000943 93E2E0A3 00000000 00000000 005C3C08 00000000 00000000 00000000 00000000 00000000 07000000 00017F80

oradebug中可以用poke命令来修改内存,其语法为:

“oradebug poke <address> <length> <value>” allows you to modify a given region of memory (length of memory is limited to size of scalar C types)

还是回到之前那个例子,之前我们已经通过修改控制文件的方式把SCN调成了1G,现在我们通过oradebug直接修改内存的方式把SCN从1G调整到2G。

现在系统SCN为1G:

SQL> select dbms_flashback.get_system_change_number()/(1024*1024*1024) from dual;

DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER()/(1024*1024*1024)

———————————————————-

1.00007167

SQL> select CHECKPOINT_CHANGE#/(1024*1024*1024) from v$database;

CHECKPOINT_CHANGE#/(1024*1024*1024)

———————————–

1.00007022

SQL> select to_char(CHECKPOINT_CHANGE#,’XXXXXXXXXXXX’) from v$database;

TO_CHAR(CHECK

————-

40012688

现在数据库服务器为Linux,是Little Endian,所以其SCN base在前,SCN wrap在后,这和如下oradebug的显示结果一致:

SQL> oradebug setmypid

Statement processed.

SQL> oradebug dumpvar sga kcsgscn_

kcslf kcsgscn_ [06001AD30, 06001AD60) = 40012D2C 00000000 00000000 00000000 00000232 00000000 00000000 00000000 00000000 00000000 6001A8D0 00000000

2G对应的16进制是0x80000000

SQL> select to_char(2*1024*1024*1024,’XXXXXXXXXXXX’) from dual;

TO_CHAR(2*1024*1024*1024,’XXXX

——————————

80000000

SQL> shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup mount

ORACLE instance started.

Total System Global Area 438423552 bytes

Fixed Size 2289304 bytes

Variable Size 255852904 bytes

Database Buffers 176160768 bytes

Redo Buffers 4120576 bytes

Database mounted.

SQL> oradebug setmypid

Statement processed.

SQL> oradebug dumpvar sga kcsgscn_

kcslf kcsgscn_ [06001AD30, 06001AD60) = 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 6001A8D0 00000000

SQL> oradebug poke 0x06001AD30 4 0x80000000

BEFORE: [06001AD30, 06001AD34) = 00000000

AFTER: [06001AD30, 06001AD34) = 80000000

SQL> oradebug dumpvar sga kcsgscn_

kcslf kcsgscn_ [06001AD30, 06001AD60) = 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 6001A8D0 00000000

SQL> alter database open;

Database altered.

SQL> select dbms_flashback.get_system_change_number()/(1024*1024*1024) from dual;

DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER()/(1024*1024*1024)

———————————————————-

2.00000081

从上述显示结果中我们可以看到,我们已经成功的把系统SCN从1G调到了2G。

原文发布于微信公众号 - 数据和云(OraNews)

原文发表时间:2016-05-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏智能大石头

SQLite事务与自增深度分析

SQLite什么都好,就怕“database is locked”这些年来想尽办法去规避它。 测试代码: static void Test2() { ...

1787
来自专栏杨建荣的学习笔记

dataguard添加临时数据文件的bug(r7笔记第27天)

有一个环境是10gR2,一主两备,因为10g的备库还不是active,所以有一些查询的需求的时候,我们还是会打开相应的窗口时间。 开发的同学需要做一个大查询,数...

3257
来自专栏乐沙弥的世界

SQL*PLus 帮助手册(SP2-0171)

    对于经常在SQL*Plus 下工作的大师们而言,总是时不时查询SQL*Plus的帮助命令。着实太多了,记不住。SQL*Plus下直接提供了help命令来...

1043
来自专栏数据和云

返璞归真:RAC环境下不同实例的参数文件选择与设置

? 杨廷琨(yangtingkun) 云和恩墨 CTO 高级咨询顾问,Oracle ACE 总监,ITPUB Oracle 数据库管理版版主 参数文件是Or...

3188
来自专栏C/C++基础

C++利用MSQL API连接和操作数据库

在Windows平台,我们可以使用ADO、ODBC或者MySQL API进行连接和操作。ADO (ActiveX Data Objects,ActiveX数据对...

1081
来自专栏杨建荣的学习笔记

alert日志中的两种ORA错误分析(r6笔记第21天)

今天在巡检系统的时候,发现alert日志中有两种类型的ora错误。 Errors in file /U01/app/oracle/diag/rdbms/XX/...

2695
来自专栏杨建荣的学习笔记

一个普通数据库用户所能查到的"意料之外"的信息(r2笔记98天)

有时候限于工作环境的情况,大多数开发人员只得到了一个权限收到限制的数据库用户。 可能你都不知道你所拥有的数据库用户都能查到哪些你想象不到的数据库信息,其实你知道...

3308
来自专栏Golang语言社区

48. 访问MySql数据库增删改查和连接池及空字段处理 | 厚土Go学习笔记

和上一节相比,go 语言访问 MySql 数据库可以有更好的写法,今天来讲一下连接池。同时,也演示一下当表字段内容为 NULL 时,go 语言的处理。 首先我们...

3868
来自专栏数据和云

诊断案例:从实例挂起到归档失败和内存管理的蝴蝶效应

杨廷琨(yangtingkun) 云和恩墨 CTO 高级咨询顾问,Oracle ACE 总监,ITPUB Oracle 数据库管理版版主 编辑手记:在很多数据...

2819
来自专栏Java面试笔试题

锁机制有什么用?简述Hibernate的悲观锁和乐观锁机制

有些业务逻辑在执行过程中要求对数据进行排他性的访问,于是需要通过一些机制保证在此过程中数据被锁住不会被外界修改,这就是所谓的锁机制。 Hibernate支持悲...

905

扫码关注云+社区