[20171110]_allow_read_only_corruption參數.txt--//昨天在修改查詢隱含參數腳本時發現一個參數_allow_read_only_corruption,感覺應該可以在異常關閉的情況下以read only打開.--//自己測試看看.1.環境:SYS@book> @ ...
[20171110]_allow_read_only_corruption參數.txt
--//昨天在修改查詢隱含參數腳本時發現一個參數_allow_read_only_corruption,感覺應該可以在異常關閉的情況下以read only打開.
--//自己測試看看.
1.環境:
SYS@book> @ &r/ver1
PORT_STRING VERSION BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx 11.2.0.4.0 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
SYS@book> @ &r/hide _allow_read_only_corruption
NAME DESCRIPTION DEFAULT_VALUE SESSION_VALUE SYSTEM_VALUE
--------------------------- ------------------------------------------------ ------------- ------------- ------------
_allow_read_only_corruption allow read-only open even if database is corrupt TRUE FALSE FALSE
2.測試前準備:
SYS@book> create pfile='/tmp/[email protected]' from spfile ;
File created.
--//修改 /tmp/initbook.ora文件,加入如下內容:
*._allow_read_only_corruption=true
--//做一個異常關閉資料庫.
SYS@book> shutdown abort ;
ORACLE instance shut down.
SYS@book> startup mount pfile='/tmp/[email protected]'
ORACLE instance started.
Total System Global Area 634732544 bytes
Fixed Size 2255792 bytes
Variable Size 197133392 bytes
Database Buffers 427819008 bytes
Redo Buffers 7524352 bytes
Database mounted.
SYS@book> show parameter allow
NAME TYPE VALUE
--------------------------- ------- ------
_allow_read_only_corruption boolean TRUE
--//說明只要配置了參數在參數文件中,隱含參數實際上也可以使用show parameter.但是像前面帶2個下劃線參數,show parameter還是無
--//法查詢.比如:
SYS@book> show parameter __java_pool_size
SYS@book> @ &r/hide __java_pool_size
NAME DESCRIPTION DEFAULT_VALUE SESSION_VALUE SYSTEM_VALUE
----------------- --------------------------------- ------------- ------------- ------------
__java_pool_size Actual size in bytes of java pool FALSE 4194304 4194304
SYS@book> alter database open read only;
alter database open read only
*
ERROR at line 1:
ORA-16005: database requires recovery
--//可以發現不行.也許需要_allow_resetlogs_corruption參數配合.
3.繼續測試:
--//修改 /tmp/initbook.ora文件,加入如下內容:
*._allow_resetlogs_corruption=true
SYS@book> @ &r/logfile
GROUP# STATUS TYPE MEMBER IS_ GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME NEXT_CHANGE# NEXT_TIME
------ ---------- ---------- -------------------------------- --- ------ ------- --------- ----------- --------- ------- --- ---------- ------------- ------------------- ------------ -------------------
1 ONLINE /mnt/ramdisk/book/redo01.log NO 1 1 728 52428800 512 1 NO CURRENT 13277659048 2017-11-09 16:18:09 2.814750E+14
2 ONLINE /mnt/ramdisk/book/redo02.log NO 2 1 726 52428800 512 1 YES INACTIVE 13277630208 2017-11-09 09:54:47 13277632611 2017-11-09 10:18:14
3 ONLINE /mnt/ramdisk/book/redo03.log NO 3 1 727 52428800 512 1 YES INACTIVE 13277632611 2017-11-09 10:18:14 13277659048 2017-11-09 16:18:09
4 STANDBY /mnt/ramdisk/book/redostb01.log NO
5 STANDBY /mnt/ramdisk/book/redostb02.log NO
6 STANDBY /mnt/ramdisk/book/redostb03.log NO
7 STANDBY /mnt/ramdisk/book/redostb04.log NO
7 rows selected.
$ mv /mnt/ramdisk/book/redo01.log /mnt/ramdisk/book/redo01.log_xxx
--//這樣避免找到redo文件.或者假象redo01.log文件損壞了.
SYS@book> shutdown abort ;
ORACLE instance shut down.
SYS@book> startup mount pfile='/tmp/[email protected]'
ORACLE instance started.
Total System Global Area 634732544 bytes
Fixed Size 2255792 bytes
Variable Size 197133392 bytes
Database Buffers 427819008 bytes
Redo Buffers 7524352 bytes
Database mounted.
SYS@book> @ &r/hide allow_r%corrupt%
NAME DESCRIPTION DEFAULT_VALUE SESSION_VALUE SYSTEM_VALUE
--------------------------- ------------------------------------------------ ------------- ------------- ------------
_allow_read_only_corruption allow read-only open even if database is corrupt FALSE TRUE TRUE
_allow_resetlogs_corruption allow resetlogs even if it will cause corruption FALSE TRUE TRUE
SYS@book> alter database open read only;
alter database open read only
*
ERROR at line 1:
ORA-16005: database requires recovery
$ oerr ora 16005
16005, 00000, "database requires recovery"
// *Cause: The database requires recovery, and therefore cannot be opened for
// read-only access by this instance.
// *Action: Perform the necessary recovery and reopen for read-only access.
//
--//視乎與_allow_resetlogs_corruption無關,取消*._allow_resetlogs_corruption=true設置,重來..
SYS@book> shutdown abort ;
ORACLE instance shut down.
SYS@book> startup mount pfile='/tmp/[email protected]'
ORACLE instance started.
Total System Global Area 634732544 bytes
Fixed Size 2255792 bytes
Variable Size 197133392 bytes
Database Buffers 427819008 bytes
Redo Buffers 7524352 bytes
Database mounted.
SYS@book> @ &r/hide allow_r%corrupt%
old 10: and lower(a.ksppinm) like lower('%&1%')
new 10: and lower(a.ksppinm) like lower('%allow_r%corrupt%%')
NAME DESCRIPTION DEFAULT_VALUE SESSION_VALUE SYSTEM_VALUE
--------------------------- ------------------------------------------------ ------------- ------------- -------------
_allow_read_only_corruption allow read-only open even if database is corrupt FALSE TRUE TRUE
_allow_resetlogs_corruption allow resetlogs even if it will cause corruption TRUE FALSE FALSE
SYS@book> recover database until cancel;
ORA-00279: change 13277663682 generated at 11/10/2017 09:14:12 needed for thread 1
ORA-00289: suggestion : /u01/app/oracle/archivelog/book/1_728_896605872.dbf
ORA-00280: change 13277663682 for thread 1 is in sequence #728
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00308: cannot open archived log '/u01/app/oracle/archivelog/book/1_728_896605872.dbf'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
ORA-00308: cannot open archived log '/u01/app/oracle/archivelog/book/1_728_896605872.dbf'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: '/mnt/ramdisk/book/system01.dbf'
SYS@book> alter database open read only;
alter database open read only
*
ERROR at line 1:
ORA-16005: database requires recovery
--//依舊不行.失望!!
4.看看正常關閉資料庫丟失某個redo的情況呢?
$ mv /mnt/ramdisk/book/redo01.log_xxx /mnt/ramdisk/book/redo01.log
--//先恢復到正常狀態.
SYS@book> shutdown abort ;
ORACLE instance shut down.
SYS@book> startup mount
ORACLE instance started.
Total System Global Area 634732544 bytes
Fixed Size 2255792 bytes
Variable Size 197133392 bytes
Database Buffers 427819008 bytes
Redo Buffers 7524352 bytes
Database mounted.
SYS@book> @ &r/hide allow_r%corrupt%
NAME DESCRIPTION DEFAULT_VALUE SESSION_VALUE SYSTEM_VALUE
--------------------------- ------------------------------------------------ ------------- ------------- ------------
_allow_read_only_corruption allow read-only open even if database is corrupt FALSE TRUE TRUE
_allow_resetlogs_corruption allow resetlogs even if it will cause corruption TRUE FALSE FALSE
SYS@book> recover database until cancel;
ORA-00279: change 13277663682 generated at 11/10/2017 09:14:12 needed for thread 1
ORA-00289: suggestion : /u01/app/oracle/archivelog/book/1_728_896605872.dbf
ORA-00280: change 13277663682 for thread 1 is in sequence #728
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
/mnt/ramdisk/book/redo01.log
Log applied.
Media recovery complete.
SYS@book> alter database open ;
alter database open
*
ERROR at line 1:
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open
SYS@book> alter database open NORESETLOGS;
Database altered.
--//這種情況下是可以NORESETLOGS打開的,因為redo文件設置回來了.
SYS@book> select open_mode from v$database ;
OPEN_MODE
-----------
READ WRITE
SYS@book> shutdown immediate ;
Database closed.
Database dismounted.
ORACLE instance shut down.
SYS@book> startup mount pfile='/tmp/[email protected]'
ORACLE instance started.
Total System Global Area 634732544 bytes
Fixed Size 2255792 bytes
Variable Size 197133392 bytes
Database Buffers 427819008 bytes
Redo Buffers 7524352 bytes
Database mounted.
SYS@book> @ &r/logfile
GROUP# STATUS TYPE MEMBER IS_ GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME NEXT_CHANGE# NEXT_TIME
------ ------ ---------- -------------------------------- --- ------ ------- --------- ----------- --------- ------- --- ---------- ------------- ------------------- ------------ -------------------
1 ONLINE /mnt/ramdisk/book/redo01.log NO 1 1 728 52428800 512 1 YES INACTIVE 13277659048 2017-11-09 16:18:09 13277684336 2017-11-10 09:54:02
2 ONLINE /mnt/ramdisk/book/redo02.log NO 2 1 729 52428800 512 1 NO CURRENT 13277684336 2017-11-10 09:54:02 2.814750E+14
3 ONLINE /mnt/ramdisk/book/redo03.log NO 3 1 727 52428800 512 1 YES INACTIVE 13277632611 2017-11-09 10:18:14 13277659048 2017-11-09 16:18:09
4 STANDBY /mnt/ramdisk/book/redostb01.log NO
5 STANDBY /mnt/ramdisk/book/redostb02.log NO
6 STANDBY /mnt/ramdisk/book/redostb03.log NO
7 STANDBY /mnt/ramdisk/book/redostb04.log NO
7 rows selected.
--//當前是/mnt/ramdisk/book/redo02.log.
$ mv /mnt/ramdisk/book/redo02.log /mnt/ramdisk/book/redo02.log_xxx
SYS@book> alter database open read only ;
Database altered.
SYS@book> @ &r/hide allow_r%corrupt%
NAME DESCRIPTION DEFAULT_VALUE SESSION_VALUE SYSTEM_VALUE
--------------------------- ------------------------------------------------ ------------- ------------- ------------
_allow_read_only_corruption allow read-only open even if database is corrupt FALSE TRUE TRUE
_allow_resetlogs_corruption allow resetlogs even if it will cause corruption TRUE FALSE FALSE
--//^_^,這個參數意義不大,要在正常關閉的情況下,redo文件損壞的情況下,可以使用它打開資料庫.
5.看看使用正常參數啟動情況如何?
SYS@book> shutdown immediate ;
Database closed.
Database dismounted.
ORACLE instance shut down.
SYS@book> startup
ORACLE instance started.
Total System Global Area 634732544 bytes
Fixed Size 2255792 bytes
Variable Size 197133392 bytes
Database Buffers 427819008 bytes
Redo Buffers 7524352 bytes
Database mounted.
ORA-03113: end-of-file on communication channel
Process ID: 18301
Session ID: 274 Serial number: 3
--//因為/mnt/ramdisk/book/redo02.log文件無法找到,啟動失敗.修改回來:
$ mv /mnt/ramdisk/book/redo02.log_xxx /mnt/ramdisk/book/redo02.log
SYS@book> startup
ORACLE instance started.
Total System Global Area 634732544 bytes
Fixed Size 2255792 bytes
Variable Size 197133392 bytes
Database Buffers 427819008 bytes
Redo Buffers 7524352 bytes
Database mounted.
Database opened.
SYS@book> @ &r/hide allow_r%corrupt%
old 10: and lower(a.ksppinm) like lower('%&1%')
new 10: and lower(a.ksppinm) like lower('%allow_r%corrupt%%')
NAME DESCRIPTION DEFAULT_VALUE SESSION_VALUE SYSTEM_VALUE
--------------------------- ------------------------------------------------ ------------- ------------- ------------
_allow_read_only_corruption allow read-only open even if database is corrupt TRUE FALSE FALSE
_allow_resetlogs_corruption allow resetlogs even if it will cause corruption TRUE FALSE FALSE
總結:
1._allow_read_only_corruption參數意義不大,要在正常關閉的情況下,某個redo文件不存在或者損壞的情況下臨時open read only打開.
2.一旦資料庫文件頭與控制文件當前scn不一致,需要恢復是無法使用它,read only打開的,怪不得很少見人提到這個參數.
--//補充測試redo損壞不是current的情況.
SYS@book> shutdown immediate ;
Database closed.
Database dismounted.
ORACLE instance shut down.
SYS@book> startup mount pfile='/tmp/[email protected]'
ORACLE instance started.
Total System Global Area 634732544 bytes
Fixed Size 2255792 bytes
Variable Size 197133392 bytes
Database Buffers 427819008 bytes
Redo Buffers 7524352 bytes
Database mounted.
SYS@book> @ &r/logfile
GROUP# STATUS TYPE MEMBER IS_ GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME NEXT_CHANGE# NEXT_TIME
------ ---------- ---------- ------------------------------- --- ------ ------- --------- ----------- --------- ------- --- ---------- ------------- ------------------- ------------ -------------------
1 ONLINE /mnt/ramdisk/book/redo01.log NO 1 1 728 52428800 512 1 YES INACTIVE 13277659048 2017-11-09 16:18:09 13277684336 2017-11-10 09:54:02
2 ONLINE /mnt/ramdisk/book/redo02.log NO 2 1 729 52428800 512 1 NO CURRENT 13277684336 2017-11-10 09:54:02 2.814750E+14
3 ONLINE /mnt/ramdisk/book/redo03.log NO 3 1 727 52428800 512 1 YES INACTIVE 13277632611 2017-11-09 10:18:14 13277659048 2017-11-09 16:18:09
4 STANDBY /mnt/ramdisk/book/redostb01.log NO
5 STANDBY /mnt/ramdisk/book/redostb02.log NO
6 STANDBY /mnt/ramdisk/book/redostb03.log NO
7 STANDBY /mnt/ramdisk/book/redostb04.log NO
7 rows selected.
$ mv /mnt/ramdisk/book/redo03.log /mnt/ramdisk/book/redo03.log_xxx
SYS@book> alter database open ;
alter database open
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
Process ID: 18497
Session ID: 274 Serial number: 3
--//無法打開資料庫.
SYS@book> startup mount pfile='/tmp/[email protected]'
ORACLE instance started.
Total System Global Area 634732544 bytes
Fixed Size 2255792 bytes
Variable Size 197133392 bytes
Database Buffers 427819008 bytes
Redo Buffers 7524352 bytes
Database mounted.
SYS@book> alter database open read only ;
Database altered.
--//還原現場:
SYS@book> shutdown immediate ;
Database closed.
Database dismounted.
ORACLE instance shut down.
$ mv /mnt/ramdisk/book/redo03.log_xxx /mnt/ramdisk/book/redo03.log
SYS@book> startup
ORACLE instance started.
Total System Global Area 634732544 bytes
Fixed Size 2255792 bytes
Variable Size 197133392 bytes
Database Buffers 427819008 bytes
Redo Buffers 7524352 bytes
Database mounted.
Database opened.