Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3386010
  • 博文数量: 631
  • 博客积分: 10716
  • 博客等级: 上将
  • 技术积分: 8397
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-01 22:35
文章分类

全部博文(631)

文章存档

2020年(2)

2019年(22)

2018年(4)

2017年(37)

2016年(22)

2015年(1)

2013年(12)

2012年(20)

2011年(19)

2010年(20)

2009年(282)

2008年(190)

分类: Oracle

2018-01-10 14:23:22

隐含参数_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,比如0×4060,然后具体位置在0×4060的第9至第14个byte

3、找到第一个块的第一行,如0×4000,将offset为15的flag由0×04改为0×00,并同时将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为0×0943,SCN base为0x93E2E03F,这个显示结果和如下用oradebug查看kcsgscn_的显示结果一致:

SQL> oradebug setmypid

Statement processed.

SQL> oradebug dumpvar sga kcsgscn_

kcslf kcsgscn_ [7000000000182A0, 7000000000182D0) = 00000943 93E2E07700000000 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

” 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进制是0×80000000

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 0×80000000

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

阅读(7268) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~