国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

oracle自增序列跳號,sequence跳號問題及解決辦法

IT那活兒 / 2737人閱讀
oracle自增序列跳號,sequence跳號問題及解決辦法


01

問題及現象描述

由于數據庫重啟、刷新、奔潰等原因,導致sequence緩存數據丟失,查詢時出現跳號現象,即從下一個號開始。
我們一起來看一個樣例:
--創建序列
CREATE SEQUENCE MYTEST.S_TEST

START

WITH 1

INCREMENT

BY 1

NOMINVALUE

MAXVALUE

10000

NOCYCLE

CACHE 20

NOORDER

SQL> select S_TEST.nextval from dual;

NEXTVAL

----------

1

SQL> select S_TEST.nextval from dual;

NEXTVAL

----------

2

SQL> select S_TEST.nextval from dual;

NEXTVAL

----------

3
刷新共享池,刷新共享池會使所有的沒有使用DBMS_SHARED_POOL.KEEP固定的對象全部被清除,所以共享池剛剛刷新的時候,SQL和PL/SQL的執行效率會略微下降
SQL> ALTER SYSTEM FLUSH SHARED_POOL;
系統已更改。
--由于cache的20個序列號已經從共享池中被清除,下次再取序列的nextval值取的是21。
SQL> select S_TEST.nextval from dual;
NEXTVAL
----------
21
關于序列設置cache之后跳號問題的原因:cache會把sequence緩存在lb cache中,在lb cache中對對象的age out是基于lru算法的,如果cache 20,會把這個序列每次取的時候取出來20個,然后再在lb cache中一個一個用,但是如果在用完這20個之前,這個序列被aged out了,那么沒用的那些數就丟掉了,而下次再去從dd取出sequence的時候就會去取上次那20個+1的號為開始,再來20個。這就是產生斷號的原因


02

如何解決

為了避免上述情況,ORACLE給我們提供了把SEQUENCE KEEP到SHARED POOL(dbms_shared_pool包)中的方法,這樣就保證了SEQUENCE的CACHE不會被交換出去,從而避免了這種情況的發生。
如果將對象固定在內存中,那么在下一次關閉數據庫之前,這個對象就不會失效或者被清空。還需要考慮的是,Metalink的注意事項61760.1:DBMS_SHARED_POOL將被創建為用戶SYS。其他用戶不擁有這個包。需要訪問這個包的任何用戶都必須由SYS授予執行權限。如果在SYS模式中創建這個包并在不同的模式中運行示例代碼,則首先必須給用戶賦予DBMS_SHARED_POOL上的EXECUTE權限。
默認情況下dbms_shared_pool包是不在系統中的,需要運行$ORACLE_HOME/rdbms/admin/dbmspool.sql進行創建。
SQL> desc dbms_shared_pool;
ERROR:
ORA-04043: 對象 dbms_shared_pool 不存在
--創建
SQL> @E:oracleRDBMSADMINdbmspool.sql
程序包已創建。
授權成功。
視圖已創建。
程序包體已創建。
--查看包對象
SQL> desc dbms_shared_pool;
--授權
SQL> grant execute on dbms_shared_pool to MYtest;
授權成功。
SQL> create synonym MYtest.dbms_shared_pool for dbms_shared_pool;
同義詞已創建。
procedure keep參數的解釋:
exec dbms_shared_pool.keep
keep共有兩個參數,flag代表前一個參數的類型,
如果不輸入,則默認為package/procedure/function中的一個;
procedure keep(name varchar2, flag char DEFAULT P)
name
-- The name of the object to keep. There are two
kinds of objects:
-- PL/SQL objects, triggers, sequences, types and
Java objects,
-- which are specified by name, and
-- SQL cursor objects which are specified by a two-part number
-- (indicating a location in the shared pool). For
example:
-- dbms_shared_pool.keep(scott.hispackage)
-- will keep package HISPACKAGE, owned by SCOTT. The
names for
-- PL/SQL objects follows SQL rules for naming objects (i.e.,
-- delimited identifiers, multi-byte names, etc. are allowed).
-- A cursor can be keeped by
-- dbms_shared_pool.keep(0034CDFF, 20348871, C)
-- The complete hexadecimal address must be in the first 8
characters.
-- The value for this identifier is the concatenation of the
-- address and hash_value columns from the v$sqlarea
view. This
-- is displayed by the sizes call above.
-- Currently TABLE and VIEW objects may not be keeped.
flag
-- This is an optional parameter. If the parameter
is not specified,
-- the package assumes that the first parameter is the name of a
-- package/procedure/function and will resolve the
name. Otherwise,
-- the parameter is a character string indicating what kind of
object
-- to keep the name identifies. The string is case
insensitive.
-- The possible values and the kinds of objects they indicate are
-- given in the following table:
-- Value Kind of Object to keep
-- ----- ----------------------
-- P package/procedure/function
-- Q sequence
-- R trigger
-- T type
-- JS java source
-- JC java class
-- JR java resource
-- JD java shared data
-- C cursor


安裝成功后,執行exec dbms_shared_pool.keep(數據庫用戶名.sequence名稱, Q);執行成功即可;

若安裝不成功,試試看執行$ORACLE_HOME/rdbms/admin/utlrp.sql;
--測試結果
S_TEST和S_TEST2序列都是設置cache20,將s_test序列keep到shared pool中。
SQL> select S_TEST.nextval from dual;
NEXTVAL
----------
24
SQL> select S_TEST.nextval from dual;
NEXTVAL
----------
25
SQL> select S_TEST2.nextval from dual;
NEXTVAL
----------
1
SQL> exec dbms_shared_pool.keep(s_test,q);
PL/SQL 過程已成功完成。
SQL> select S_TEST2.nextval from dual;
NEXTVAL
----------
21
SQL> select S_TEST.nextval from dual;
NEXTVAL
----------
26
-- dbms_shared_pool.unkeep的作用是取消已經keep在shared pool中的對象
SQL> exec
dbms_shared_pool.unkeep(s_test,q);
PL/SQL 過程已成功完成。
SQL> select S_TEST.nextval from dual;
NEXTVAL
----------
27
SQL> alter system flush shared_pool;
系統已更改。
SQL> select S_TEST.nextval from dual;
NEXTVAL
----------
41



本 文 原 創 來 源:IT那活兒微信公眾號(上海新炬王翦團隊)


文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/129714.html

相關文章

  • 基于 oracle 的 flask 項目(一)——配置項目

    摘要:一般印象,項目適合做一些短小精悍的項目,特別是與等數據庫結合很是般配。生成報表,不同的查詢結果生成不同的報表。配置從下載客戶端,然后解壓后放入自己指定的目錄。指定數據庫連接池的超時時間。 一般印象,flask 項目適合做一些短小精悍的項目,特別是與 sqlite、mysql 等數據庫結合很是般配。但是在一些大公司,特別是一些金融行業等國企公司,還是以 oracle 居多,那么,這個小辣...

    xialong 評論0 收藏0
  • 使用SpringBoot-JPA進行自定義的保存批量保存

    摘要:既然行不通,或許可以考慮使用注解來自定義一個實現。仍舊提供給了使用者原始的使用方式利用來構造并執行。就像一樣,使用者也可以自定義來執行,試試看,同樣沒有問題,再多的數據也可以被保存到數據庫中批量保存的效果達到了。 更多精彩博文,歡迎訪問我的個人博客 說明 SpringBoot版本:2.1.4.RELEASE java版本:1.8 文中所說JPA皆指spring-boot-starte...

    boredream 評論0 收藏0
  • 關于生成訂單號規則的一些思考

    摘要:關于我為什么寫這篇文章是因為今天在做訂單模塊的時候看到之前的上描述的年月日用戶位企業位四位自增長數。背景對于其定訂單的生成。個人的看法是主要是唯一,其他關于業務方面的不是太太重要。自增實現了用于將的值遞增,并返回結果。 關于我為什么寫這篇文章是因為今天在做訂單模塊的時候,看到之前的PRD上描述的年月日+用戶id2位+企業id位+四位自增長數。然后竟被我反駁的突然改成了精確時間+4位自增...

    omgdog 評論0 收藏0
  • 探討分布式ID生成系統

    摘要:結合對做如下調整的毫秒時間戳的數據邏輯分區以及的自增序列。為了解決這個問題,便引入了邏輯分區。參考文章批量插入返回自增的問題美團點評分布式生成系統 這里的博客版本都不會被更新維護。查看最新的版本請移步:http://neojos.com 全稱Universally Unique Identifier,UUID占128bit,也就是16個英文字符的長度(16byte),需要強調的是,它...

    junbaor 評論0 收藏0

發表評論

0條評論

IT那活兒

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<