Alter system suspend/resume 導致的bug和特性
ORACLE:Oracle Database 11g Enterprise Edition Release 11.1.0.6.0
OS:redhat enterprise edition 2.6.18-8.el5 @ X86
From 11G Document:
"
The ALTER SYSTEM SUSPEND statement halts all input and output (I/O) to datafiles
(file header and file data) and control files. The suspended state lets you back up a
database without I/O interference. When the database is suspended all preexisting
I/O operations are allowed to complete and any new database accesses are placed in a
queued state.
"
According to BUG:3620559 on metalink:
"
"CONNECT /AS SYSDBA" HANG AFTER SUSPEND
"
我們可以很簡單的reproduce這個bug在11G @ liux上,有兩個命令可以導致這個bug:
Alter system flush shared_pool;
Alter system flush buffer_cache;
TEST case:
session 1 and session 2 login as sysdba;
session 1:
alter system flush BUFFER_CACHE/SHARED_POOL;
session 2:
alter system suspend;session 3:
sqlplus / as sysdba
-- it will hung by the wait event "writes stopped by instance recovery or database suspension".
當我們pstack這個hung住的程式:
: ~ > pstack 3531
#0 0x00ad1402 in __kernel_vsyscall ()
#1 0x0021ab54 in semtimedop () from /lib/libc.so.6
#2 0x0e57691f in sskgpwwait ()
#3 0x0e5758ae in skgpwwait ()
#4 0x0e2c3a44 in ksliwat ()
#5 0x0e2c33b1 in kslwaitctx. ()
#6 0x0e2c06f1 in kslwait ()
#7 0x0af1a640 in kcbwwa ()
#8 0x087fe162 in kcbzib ()
#9 0x0e348bb7 in kcbgtcr ()
#10 0x0e2ed288 in ktecgsc ()
#11 0x0e2ebad0 in ktecgetsh. ()
#12 0x0e2eba3a in ktecgshx ()
#13 0x0e2edd10 in kteinicnt1 ()
#14 0x0e4b668f in qertbFetch ()
#15 0x00000004 in ?? ()
#16 0x00000000 in ?? ()
會發現有kcb call,從這個bug metalink中:
kcbzib KCB: input buffer - reads a block from disk into a buffer
原來"connect as sysdba"會有physical reads存在,如果在我們flush 了buffer_cache或者shared_pool後。
如果我們此時不幸地退出了所有其他sysdba的連線,那麼唯一讓系統恢復的辦法就只有kill掉oracle 程式(一般kill -9
再重啟資料庫,此時會自動清掉 suspend的flag,select database_status from v$instance;會顯示active。
我又測試了對於一般的查詢,flush shared_pool 和flush buffer_cache的區別:
1. 如果只flush shared_pool,不flush buffer_cache,然後suspend system,再執行:
SQL> select * from test test2;
ID
----------
1
在suspend時結果會返回,這是因為結果已經儲存在buffer_cache裡了,而這裡只需要hard parse一下就可以了。
可見在suspend的system中,hard parse是允許的,只要結果在buffer cache裡,不需要physical read,那麼結果也是可以返回的。
從10046 trace中可以證明這點:
PARSE #3:c=1999,e=2147,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1,tim=1232295633394990 --hard parse發生
STAT #3 id=1 cnt=1 pid=0 pos=1 bj=12632 p='TABLE ACCESS FULL TEST (cr=3 pr=0 pw=0 time=0 us cost=2 size=13 card=1)' --沒有physical read and write發生,所以可以執行。
2. 如果只flush buffer_cache,不flush shared_pool,然後suspend system,再執行:
SQL> select * from test test2;
----it will hung
從10046 trace中看:
PARSE #1:c=0,e=192,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,tim=1232295772815066 --沒有hard parse發生
每隔五秒會檢測一次,出現以下資訊:
WAIT #1: nam='writes stopped by instance recovery or database suspension' ela= 5008936 by thread#=2147483647 our thread#=1 p3=0 obj#=12453 tim=1232295807892952
重新resume system後,
STAT #1 id=1 cnt=1 pid=0 pos=1 bj=12632 p='TABLE ACCESS FULL TEST (cr=3 pr=2 pw=2 time=0 us cost=2 size=13 card=1)' --兩次物理讀和寫
3. 在suspend之後,執行:
SQL> insert into test values (2);
1 row created.
SQL> commit;
-- it will hung.
4. 在suspend之後,執行:
SQL> delete from test;
3 rows deleted.
SQL> exit
--it will hung.
當resume後,10046:
WAIT #0: nam='log file sync' ela= 26545 buffer#=1978 p2=0 p3=0 obj#=12632 tim=1232298062864245
這兩個例子說明了當commit或正常退出時,從10046也可以看出,這是的hung是因為要“log file sync”,
也就是要在事務完成前將redo buffer寫入redo log中去,這裡是物理寫。
綜上,所以Alter system suspend;的一個重要特徵就是禁止任何檔案物理讀寫,這裡的檔案不僅包括datafile 和control file,也包括redo log。
而對於在buffer cache中的資料,可以有邏輯讀寫。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15415488/viewspace-541353/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ufs runtime suspend/resume
- alter system set event和set events的區別
- 當心ORACLE 12.2 RAC新特性引入的BUG導致ORA-4031Oracle
- 淺複製導致的bug
- ALTER SYSTEM FLUSH BUFFER_POOL
- 2.7.6.2.1 ALTER SYSTEM SET語句中的SCOPE子句
- Containerd 的 Bug 導致容器被重建!如何避免?AI
- WPF Image automatically display image via System.Timers.Timer ,pause and resume, scaletransformORM
- alter system set ... scope=... 中的scope的含義是什麼?
- 記php-fpm重啟導致的一個bugPHP
- resume
- “alter database switchover to xx“過程不當導致的primary-primary 雙主問題Database
- MySQL8.0的一個bug導致複製延時MySql
- 12.2.0.1bug導致的Failed to register in OCRLOCAL group.錯誤AI
- [20231023]備庫與alter system flush buffer_cache.txt
- 一個導致JVM實體記憶體消耗大的BugJVM記憶體
- Laravel 多條件查詢時粗心導致的一個 BUGLaravel
- 【Not BUG】微軟Winform窗體中設計上的Bug,會導致程式編譯失敗?不,這不是BUG!微軟ORM編譯
- ZooKeeper 避坑指南: ZooKeeper 3.6.4 版本 BUG 導致的資料不一致問題
- Golang 中由零值和 gob 庫的特性引起的 BUGGolang
- kotlin協程的掛起suspendKotlin
- Oracle 12.2 BUG :分割槽維護導致的 ORA-600 KKPOFPCD3Oracle
- UE floating pawn movement Bug Set location 導致速度異常發射
- BUG—Nuget包版本不一致導致程式行為與預期不符
- mysql alter modify 和 change的區別MySql
- GCC8 編譯最佳化 BUG 導致的記憶體洩漏GC編譯記憶體
- ORACLE之手動註冊監聽listener。alter system set local_listener="XXX"Oracle
- 萬萬沒想到,一個 MongoDB.Driver 的 bug 導致 .NET5 程式死鎖!MongoDB
- 阿里簡訊回執.net sdk的bug導致生產服務cpu 100%排查阿里
- 解Bug之路-記一次中介軟體導致的慢SQL排查過程SQL
- Laravel 專案一次釋出導致的 BUG(環境變數問題)Laravel變數
- 阿里雲大面積故障原因:觸發一個未知程式碼bug導致阿里
- Oracle 12c因bug導致ORA-04031問題處理過程Oracle
- 微軟升級病毒庫導致Win7/8.1端Defender出現bug微軟Win7
- 蘋果iOS 11.3/11.4曝bug:“黑點錯誤”導致裝置崩潰蘋果iOS
- 導致IP被封的原因
- Cocos2d-js 中 使用ClippingNode做動畫導致裁剪b部分顯示的bugJS動畫
- system.exit(0)和system.exit(1)的區別
- 微軟承認 Win10 更新再出 BUG:導致工作列消失,系統卡死微軟Win10