關閉資料庫會導致cache的sequence值丟失嗎?
sequence的值為什麼不連續了,換一個說法就是什麼情況下sequence的值會丟失。
有幾種情況:
先看第一種情況:關閉資料庫會導致cache的sequence值丟失嗎?
做個實驗看看。
ORACLE12>conn test/test
Connected.
test@ORACLE12>create sequence seq_a;
Sequence created.
test@ORACLE12>col SEQUENCE_NAME for a25
test@ORACLE12>select sequence_name, cache_size from all_sequences where sequence_name = 'SEQ_A';
SEQUENCE_NAME CACHE_SIZE
------------------------- ----------
SEQ_A 20
test@ORACLE12>select seq_a.nextval from dual;
NEXTVAL
----------
1
test@ORACLE12>/
NEXTVAL
----------
2
我們乾淨的關閉資料庫,看看cache的sequence是否會丟失。
test@ORACLE12>conn / as sysdba
Connected.
ORACLE12>shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
ORACLE12>startup
ORACLE instance started.
Total System Global Area 6046453760 bytes
Fixed Size 3481176 bytes
Variable Size 2801795496 bytes
Database Buffers 3221225472 bytes
Redo Buffers 19951616 bytes
Database mounted.
Database opened.
ORACLE12>conn test/test
Connected.
test@ORACLE12>select seq_a.nextval from dual;
NEXTVAL
----------
3
有點出乎我的意外,sequence的next值是從3開始的,sequence的值並沒有丟失,看來乾淨的關閉資料庫不會導致sequence值丟失。
看看shutdown abort是否會導致cache的sequence值丟失。
test@ORACLE12>conn / as sysdba
Connected.
ORACLE12>startup force
ORACLE instance started.
Total System Global Area 6046453760 bytes
Fixed Size 3481176 bytes
Variable Size 2801795496 bytes
Database Buffers 3221225472 bytes
Redo Buffers 19951616 bytes
Database mounted.
Database opened.
ORACLE12>conn test/test
Connected.
test@ORACLE12>select seq_a.nextval from dual;
NEXTVAL
----------
23
有幾種情況:
先看第一種情況:關閉資料庫會導致cache的sequence值丟失嗎?
做個實驗看看。
ORACLE12>conn test/test
Connected.
test@ORACLE12>create sequence seq_a;
Sequence created.
test@ORACLE12>col SEQUENCE_NAME for a25
test@ORACLE12>select sequence_name, cache_size from all_sequences where sequence_name = 'SEQ_A';
SEQUENCE_NAME CACHE_SIZE
------------------------- ----------
SEQ_A 20
test@ORACLE12>select seq_a.nextval from dual;
NEXTVAL
----------
1
test@ORACLE12>/
NEXTVAL
----------
2
我們乾淨的關閉資料庫,看看cache的sequence是否會丟失。
test@ORACLE12>conn / as sysdba
Connected.
ORACLE12>shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
ORACLE12>startup
ORACLE instance started.
Total System Global Area 6046453760 bytes
Fixed Size 3481176 bytes
Variable Size 2801795496 bytes
Database Buffers 3221225472 bytes
Redo Buffers 19951616 bytes
Database mounted.
Database opened.
ORACLE12>conn test/test
Connected.
test@ORACLE12>select seq_a.nextval from dual;
NEXTVAL
----------
3
有點出乎我的意外,sequence的next值是從3開始的,sequence的值並沒有丟失,看來乾淨的關閉資料庫不會導致sequence值丟失。
看看shutdown abort是否會導致cache的sequence值丟失。
test@ORACLE12>conn / as sysdba
Connected.
ORACLE12>startup force
ORACLE instance started.
Total System Global Area 6046453760 bytes
Fixed Size 3481176 bytes
Variable Size 2801795496 bytes
Database Buffers 3221225472 bytes
Redo Buffers 19951616 bytes
Database mounted.
Database opened.
ORACLE12>conn test/test
Connected.
test@ORACLE12>select seq_a.nextval from dual;
NEXTVAL
----------
23
sequence的next值已經從23開始了,丟失了4-22範圍的sequence的值,看來shutdown abort值會導致cache的sequence值丟失。
第二種情況,flush shared pool會導致cache的sequence值丟失
test@ORACLE12>select seq_a.nextval from dual;
NEXTVAL
----------
23
test@ORACLE12>/
NEXTVAL
----------
24
test@ORACLE12>alter system flush shared_pool;
System altered.
test@ORACLE12>select seq_a.nextval from dual;
NEXTVAL
----------
43
第三種情況,事務回滾導致sequence值丟失
sequence值一旦獲取,就必須使用或扔棄,即使事務回滾,已經被獲取的sequence不能被重新使用。
這種情況即使把sequence的cache屬性設定為nocache也無濟於事。本文提到的前兩種情況都可以透過把sequence的cache屬性設定為nocache來避免。
這裡需要補充一個merge裡呼叫seq的特殊情況:
第二種情況,flush shared pool會導致cache的sequence值丟失
test@ORACLE12>select seq_a.nextval from dual;
NEXTVAL
----------
23
test@ORACLE12>/
NEXTVAL
----------
24
test@ORACLE12>alter system flush shared_pool;
System altered.
test@ORACLE12>select seq_a.nextval from dual;
NEXTVAL
----------
43
第三種情況,事務回滾導致sequence值丟失
sequence值一旦獲取,就必須使用或扔棄,即使事務回滾,已經被獲取的sequence不能被重新使用。
這種情況即使把sequence的cache屬性設定為nocache也無濟於事。本文提到的前兩種情況都可以透過把sequence的cache屬性設定為nocache來避免。
這裡需要補充一個merge裡呼叫seq的特殊情況:
create table test1 as select * from dba_objects;
create table test2 as select * from test1;
create sequence seq_test1;
select seq_test1.nextval from dual;
NEXTVAL
----------
1
select seq_test1.nextval from dual;
NEXTVAL
----------
1
MERGE INTO test1 T
USING test2 Y
ON (T.object_ID = Y.object_ID)
WHEN MATCHED THEN
UPDATE SET T.object_name = Y.object_name
WHEN NOT MATCHED THEN
INSERT (object_ID, object_name) VALUES (seq_test1.NEXTVAL, 333);
15357 rows merged.
上面的merge語句並不會觸發not matched部分的程式碼,但是我們再次檢視seq_test1的next值,已經增大到15359了,相當於每一條T.object_ID = Y.object_ID符合的記錄,都要觸發seq_test1.NEXTVAL,我們在使用merge語句的時候需要注意到這個問題,有可能會遭遇表裡的seq值經常斷號的問題。
select seq_test1.nextval from dual;
NEXTVAL
----------
15359
上面的merge語句並不會觸發not matched部分的程式碼,但是我們再次檢視seq_test1的next值,已經增大到15359了,相當於每一條T.object_ID = Y.object_ID符合的記錄,都要觸發seq_test1.NEXTVAL,我們在使用merge語句的時候需要注意到這個問題,有可能會遭遇表裡的seq值經常斷號的問題。
select seq_test1.nextval from dual;
NEXTVAL
----------
15359
select count(*) from test1;
COUNT(*)
----------
15357
1 row selected.
select count(*) from test2;
COUNT(*)
----------
15357
1 row selected.
解決這個問題的辦法可以參考:
http://blog.itpub.net/10356975/viewspace-680338/
http://blog.csdn.net/smartyidiot/article/details/8196449
http://www.itpub.net/thread-1874494-1-1.html
解決這個問題的辦法可以參考:
http://blog.itpub.net/10356975/viewspace-680338/
http://blog.csdn.net/smartyidiot/article/details/8196449
http://www.itpub.net/thread-1874494-1-1.html
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22034023/viewspace-1215283/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 資料庫OPEN下,丟失部分或所有control file 是否會導致 例項關閉。資料庫
- 關於 iconv 轉碼導致資料丟失的問題
- 伺服器當機會導致Kafka訊息丟失嗎伺服器Kafka
- 【資料庫資料恢復】斷電導致Oracle資料庫資料丟失的資料恢復案例資料庫資料恢復Oracle
- 重組raid會丟失資料嗎AI
- 儲存互斥失敗導致資料丟失的資料恢復成功案例資料恢復
- 使用impdp不當導致的資料丟失問題
- 用資料庫指令碼重建了資料庫,導致資料丟失,還能找回來麼?資料庫指令碼
- 磁碟損壞導致資料檔案丟失的恢復
- 儲存崩潰導致資料丟失如何處理
- openGauss 由於RemoveIPC未關閉導致資料庫crashREM資料庫
- 伺服器資料恢復-誤操作導致mysql資料庫資料丟失的資料恢復案例伺服器資料恢復MySql資料庫
- UNDO表空間資料檔案丟失處理(二)正常關閉資料庫資料庫
- 重灌系統導致分割槽丟失的資料恢復案例資料恢復
- oracle資料庫正常關閉狀態下丟失undo檔案的恢復Oracle資料庫
- 【北亞資料庫資料恢復】誤操作導致資料丟失的華為雲mysql資料恢復案例資料庫資料恢復MySql
- 【北亞資料恢復】vmfs還原快照操作導致SqlServer資料庫資料丟失的資料恢復資料恢復SQLServer資料庫
- cassandra tombstone導致寫資料丟失問題徵解
- ORACLE DSG資料同步軟體程式導致資料庫無法正常關閉Oracle資料庫
- 【北亞資料恢復】誤操作分割槽損壞導致SqlServer資料庫資料丟失的資料恢復資料恢復SQLServer資料庫
- [20170302]正常關閉資料庫日誌丟失3.txt資料庫
- Kafka消費者自動提交配置會導致潛在的重複或資料丟失!Kafka
- SCN異常增長導致資料庫異常關閉風險的防範資料庫
- 【raid資料恢復案例】raid擴容導致的資料丟失的資料恢復AI資料恢復
- 伺服器不同的故障導致資料丟失都怎麼解決的伺服器
- 虛擬化還原快照導致資料丟失恢復過程
- EVA4400儲存斷電導致資料丟失如何恢復
- 【儲存資料恢復】esx vmfs的互斥導致儲存資料丟失的資料恢復案例資料恢復
- Nginx轉發導致請求頭丟失Nginx
- 檔案館資料丟失:雲平臺會更安全些嗎
- 【資料庫資料恢復】LINUX EXT3檔案系統下ORACLE資料庫誤操作導致資料丟失的資料恢復案例資料庫資料恢復LinuxOracle
- redo log 丟失(非歸檔模式,資料庫正常關閉,redo log 被誤刪除!)模式資料庫
- 【伺服器資料恢復】MDisk重建導致vdisk丟失,上層Oracle資料庫不可用的資料恢復案例伺服器資料恢復Oracle資料庫
- 【伺服器資料恢復】哪些故障會導致伺服器資料丟失?多塊硬碟離線的資料恢復案例伺服器資料恢復硬碟
- Google Drive存在未知故障,導致部分使用者丟失雲盤資料Go
- 關於Session值丟失問題Session
- Redis能保證資料不丟失嗎?Redis
- 大量"library cache lock"事件導致資料庫無法連線事件資料庫