關閉資料庫會導致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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 關於 iconv 轉碼導致資料丟失的問題
- 伺服器當機會導致Kafka訊息丟失嗎伺服器Kafka
- 【資料庫資料恢復】斷電導致Oracle資料庫資料丟失的資料恢復案例資料庫資料恢復Oracle
- 重組raid會丟失資料嗎AI
- 儲存互斥失敗導致資料丟失的資料恢復成功案例資料恢復
- openGauss 由於RemoveIPC未關閉導致資料庫crashREM資料庫
- 儲存崩潰導致資料丟失如何處理
- 伺服器資料恢復-誤操作導致mysql資料庫資料丟失的資料恢復案例伺服器資料恢復MySql資料庫
- 重灌系統導致分割槽丟失的資料恢復案例資料恢復
- 【北亞資料恢復】vmfs還原快照操作導致SqlServer資料庫資料丟失的資料恢復資料恢復SQLServer資料庫
- 【raid資料恢復案例】raid擴容導致的資料丟失的資料恢復AI資料恢復
- ORACLE DSG資料同步軟體程式導致資料庫無法正常關閉Oracle資料庫
- 【北亞資料恢復】誤操作分割槽損壞導致SqlServer資料庫資料丟失的資料恢復資料恢復SQLServer資料庫
- 【北亞資料庫資料恢復】誤操作導致資料丟失的華為雲mysql資料恢復案例資料庫資料恢復MySql
- SAN LUN Mapping出錯導致的資料丟失恢復全過程APP
- Kafka消費者自動提交配置會導致潛在的重複或資料丟失!Kafka
- 伺服器不同的故障導致資料丟失都怎麼解決的伺服器
- 【資料庫資料恢復】LINUX EXT3檔案系統下ORACLE資料庫誤操作導致資料丟失的資料恢復案例資料庫資料恢復LinuxOracle
- EVA4400儲存斷電導致資料丟失如何恢復
- 虛擬化還原快照導致資料丟失恢復過程
- 【儲存資料恢復】esx vmfs的互斥導致儲存資料丟失的資料恢復案例資料恢復
- 【伺服器資料恢復】MDisk重建導致vdisk丟失,上層Oracle資料庫不可用的資料恢復案例伺服器資料恢復Oracle資料庫
- Nginx轉發導致請求頭丟失Nginx
- Google Drive存在未知故障,導致部分使用者丟失雲盤資料Go
- 【伺服器資料恢復】哪些故障會導致伺服器資料丟失?多塊硬碟離線的資料恢復案例伺服器資料恢復硬碟
- 分析Linux raid6同步成raid5導致資料丟失的情況LinuxAI
- TSPITR方式資料庫找回誤操作丟失的資料資料庫
- Redis能保證資料不丟失嗎?Redis
- 伺服器資料恢復—raid5磁碟離線導致SAP資料丟失的資料恢復案例伺服器資料恢復AI
- 伺服器資料恢復-斷電導致linux作業系統資料丟失的資料恢復案例伺服器資料恢復Linux作業系統
- 【伺服器資料恢復】伺服器意外斷電導致raid資訊丟失的資料恢復伺服器資料恢復AI
- 【伺服器資料恢復】意外斷電導致RAID模組資訊丟失的資料恢復案例伺服器資料恢復AI
- 【伺服器資料恢復】斷電導致raid資訊丟失的磁碟陣列資料恢復案例伺服器資料恢復AI陣列
- 【伺服器資料恢復】raid6崩潰導致分割槽丟失的資料恢復案例伺服器資料恢復AI
- DG修復:異常關庫導致的資料庫啟動失敗ORA-01110及GAP修復資料庫
- 儲存意外斷電導致raid資訊丟失的解決過程AI
- Django資料庫連線丟失問題Django資料庫
- 【伺服器資料恢復】伺服器誤刪除導致郵件資料丟失的資料恢復案例伺服器資料恢復
- wait_type SOS_WORKER導致資料庫連線失敗AI資料庫