中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Oracle參數的查詢和修改方法

發布時間:2021-09-14 17:38:29 來源:億速云 閱讀:204 作者:chen 欄目:關系型數據庫

這篇文章主要講解了“Oracle參數的查詢和修改方法”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Oracle參數的查詢和修改方法”吧!

測試環境

DB Version: oracle 11.2 RAC

OS: RHEL 6.x

v$parameter, v$parameter2, v$system_parameter, v$system_parameter2, v$spparameter的區別

Oracle 11g里主要的查詢參數的視圖有v$parameter, v$parameter2, v$system_parameter, v$system_parameter2, v$spparameter, dba_hist_parameter

v$parameter和v$parameter2有什么區別呢?就跟v$system_parameter和v$system_parameter2的區別是一樣的。呵呵,具體為:

v$parameter里存的是每個parameter的value, 一個parameter一條記錄。v$parameter2也存的是每個parameter的value, 不過在v$parameter2里是每行的name只會存一個value。以control_files為例,這個parameter會對應至少兩個值,那么在v$parameter里只會有一條記錄,而在v$parameter2里卻會有2條記錄。其實真想不明白oracle為啥要設計出一個這樣的視圖來,使用場景在哪?歡迎有知道的童鞋告訴我下

v$parameter和v$system_parameter的區別: v$parameter是存儲當前session的parameter/value, 而v$system_parameter存儲的是當前instance級別的parameter/value; 也就是說一個新建立的session, v$parameter和v$system_parameter里面的parameter/value是一致的; 因為session level parameter是從instance level parameter繼承來的; 然后通過alter session可以修改v$parameter的值,但是并不會修改v$system_parameter data

我嘗試從session1執行一個alter session, 然后再session1看到v$parameter值是變化了,打開session2, 看到的v$parameter的值還是老的值,這我就困惑了,不是說v$parameter能看到alter session之后的值嗎?為啥session1和session2看到的結果不一樣呢? 這就是因為v$parameter顯示的是當前session的parameter name/value呀.

v$spparameter和v$system_parameter: 這兩個view的區別在于: v$spparameter用于存儲spfile 里的parameter name/value, 而v$system_parameter用于存儲instance level當前的parameter name/value; 體現在哪呢?

例子

SQL> select name, value from v$system_parameter where name='cursor_sharing';

NAME       VALUE

------------------------------ ------------------------------

cursor_sharing       EXACT

SQL> select name, value from v$spparameter where name='cursor_sharing';

NAME       VALUE

------------------------------ ------------------------------

cursor_sharing       EXACT

SQL> select name, value from v$parameter where name='cursor_sharing';

NAME       VALUE

------------------------------ ------------------------------

cursor_sharing       EXACT

------------執行alter session之后三張表的查詢結果

Session 1:

SQL> select userenv('sid') from dual;

USERENV('SID')

--------------

569

SQL> alter session set cursor_sharing='FORCE';

Session altered.

SQL> select name, value from v$parameter where name='cursor_sharing';

NAME       VALUE

------------------------------ ------------------------------

cursor_sharing       FORCE

SQL> select name, value from v$spparameter where name='cursor_sharing';

NAME       VALUE

------------------------------ ------------------------------

cursor_sharing       EXACT

SQL> select name, value from v$system_parameter where name='cursor_sharing';

NAME       VALUE

------------------------------ ------------------------------

cursor_sharing       EXACT

Session 2:

SQL> select userenv('sid') from dual;

USERENV('SID')

--------------

853

SQL> select name, value from v$parameter where name='cursor_sharing';

NAME       VALUE

------------------------------ ------------------------------

cursor_sharing       EXACT

SQL> select name, value from v$spparameter where name='cursor_sharing';

NAME       VALUE

------------------------------ ------------------------------

cursor_sharing       EXACT

SQL> select name, value from v$system_parameter where name='cursor_sharing';

NAME       VALUE

------------------------------ ------------------------------

cursor_sharing       EXACT

從這里可以看到通過alter session修改之后,當前session1里查v$parameter, cursor_sharing已經改成了FORCE, 但是另外一個session的v$parameter里的值并沒有改變; 通過v$system_parameter和v$spparameter里的值也沒有改變;

例子2:

僅僅修改v$spparameter

通過alter system set ... scope=spfile, 這樣修改的參數就只會進入spfile里,所以只有v$spparameter才能看到;

修改前

SQL> select name, value from v$parameter where name='cursor_sharing';

NAME       VALUE

------------------------------ ------------------------------

cursor_sharing       EXACT

SQL> select name, value from v$parameter where name='open_cursors';

NAME       VALUE

------------------------------ ------------------------------

open_cursors       500

SQL> select name, value from v$system_parameter where name='open_cursors';

NAME       VALUE

------------------------------ ------------------------------

open_cursors       500

SQL> select name, value from v$spparameter where name='open_cursors';

NAME       VALUE

------------------------------ ------------------------------

open_cursors       500

修改后

SQL> alter system set open_cursors=3000 scope=spfile sid='*';

System altered.

SQL> select name, value from v$system_parameter where name='open_cursors';

NAME       VALUE

------------------------------ ------------------------------

open_cursors       500

SQL> select name, value from v$spparameter where name='open_cursors';

NAME       VALUE

------------------------------ ------------------------------

open_cursors       3000

SQL> select name, value from v$parameter where name='open_cursors';

NAME       VALUE

------------------------------ ------------------------------

open_cursors       500

例子3

只修改v$system_parameter

修改前

SQL> select name, value from v$spparameter where name='db_file_multiblock_read_count';

NAME       VALUE

------------------------------ ------------------------------

db_file_multiblock_read_count

注意這里顯示的是NULL,表示這個parameter value在spfile里沒有設置,但是v$system_parameter里又有值,這是因為系統會根據一定的規則自己計算出一個值來

SQL> select name, value from v$system_parameter where name='db_file_multiblock_read_count';

NAME       VALUE

------------------------------ ------------------------------

db_file_multiblock_read_count  128

SQL> select name, value from v$parameter where name='db_file_multiblock_read_count';

NAME       VALUE

------------------------------ ------------------------------

db_file_multiblock_read_count  128

修改后

SQL> alter system set db_file_multiblock_read_count=256 scope=memory sid='*';

System altered.

SQL> select name, value from v$spparameter where name='db_file_multiblock_read_count';

NAME       VALUE

------------------------------ ------------------------------

db_file_multiblock_read_count

SQL> select name, value from v$system_parameter where name='db_file_multiblock_read_count';

NAME       VALUE

------------------------------ ------------------------------

db_file_multiblock_read_count  256

SQL> select name, value from v$parameter where name='db_file_multiblock_read_count';

NAME       VALUE

------------------------------ ------------------------------

db_file_multiblock_read_count  256

v$spparameter里的值仍然為空,v$system_parameter的值改為了256, 并且   并且 v$parameter里的值也是256. 這說明什么問題?說明如果一個參數沒有執行alter session, 那么這個參數的值在v$parameter和v$system_parameter里的值是一樣的;

當然也可以通過alter system set ... scope=BOTH sid='*' 讓改動在v$spparameter和v$system_parameter里都能看到; 這也就是scope=BOTH/MEMORY/SPFILE的區別

oracle 11G里有355個parameter, 那到底哪個是可以通過alter session修改的,哪個是可以通過alter system修改的呢?以及那些不可以修改的呢?這個通過v$system_parameter就可以知道;

isses_modifiable: 是否能通過alter session修改. 這只有兩個值: TRUE/FALSE

issys_modifiable: 是否能通過alter system修改: 這有三個值: IMMEDIATE/DEFERRED/FALSE  (IMMEDIATE表示立即生效,在當前session就生效; DEFFERED: 表示對所有當前正在連接的session都不生效,只有對這之后的連接才生效. FALSE就表示不允許alter system修改)

對于ISSYS_MODIFIABLE=DEFERRED的參數,必須通過alter system .... deferred才能修改; 否則都會報錯ORA-02096

ORA-02096: specified initialization parameter is not modifiable with this option

當使用ASMM或者AMM的時候,很多 parameter value都是系統自動調整的,當你修改了某個參數之后又想把這個參數交回給系統自動來管理,那怎么辦呢?其實也就是恢復默認值。可以通過SQL: alter system reset name=<value> scope=... 注意這里使用的是RESET命令。 reset的命令的意思其實就是不設置了,也就是把一個item從spfile里刪除,那么如果要刪除,就一定要現有這個item, 所以如果你要reset一個不存在的parameter的時候也會報錯。或者在RAC里,如果設置的時候是instance by instance設置的,而reset的時候通過alter system reset ... sid='*'也會報錯;

SQL> select name, value from v$spparameter where name='db_file_multiblock_read_count';

NAME   VALUE

-------------------------------------------------- --------------------------------------------------

db_file_multiblock_read_count

在v$spparameter里找不到這個parameter value, 說明沒有設置

SQL> alter system reset db_file_multiblock_read_count scope=spfile sid='*';

alter system reset db_file_multiblock_read_count scope=spfile sid='*'

ERROR at line 1:

ORA-32010: cannot find entry to delete in SPFILE

這里報錯了

這是一種情況, 對于RAC來說,你可以instance by instance設置參數信息

這里看到每個instnace的parameter value不一樣。即使value一樣你也可以instance by instance設置

SQL> select sid, name, value from v$spparameter where name='db_file_multiblock_read_count';

SID NAME    VALUE

-------------------------------------------------------------------------------- ----------------------------------

racaaweb1 db_file_multiblock_read_count    64

racaaweb2 db_file_multiblock_read_count    256

SQL> alter system reset db_file_multiblock_read_count scope=spfile sid='*';

alter system reset db_file_multiblock_read_count scope=spfile sid='*'

ERROR at line 1:

ORA-32010: cannot find entry to delete in SPFILE

這里還是出錯了

隱含參數

Oracle還有另外一種參數,稱為隱含參數,隱含參數的名字以下劃線_打頭。默認情況下隱含參數不會出現在上面的幾張表里,除非你修改了這些參數的值;

例子

alter system set "_undo_autotune"=TRUE;

這個語句修改了隱含參數_undo_autotune的值; 這里涉及到注意點:

1) 修改隱含參數的時候,隱含參數名字需要用雙引號""括起來

2) 對于這種后面沒帶scope的,scope的默認值是BOTH

3) 對于這種后面沒帶sid的,sid的默認值是'*'

更新之后的值如下:

SQL> select name, value from v$spparameter where name='_undo_autotune';

NAME   VALUE

-------------------------------------------------- --------------------------------------------------

_undo_autotune   TRUE

SQL> select name, value from v$system_parameter where name='_undo_autotune';

NAME   VALUE

-------------------------------------------------- --------------------------------------------------

_undo_autotune   TRUE

也就是說,所有修改過的并且當前生效的參數都可以在v$parameter里看到, 不管是隱含的還是非隱含的。那么如何查詢哪些沒有修改過的隱含參數呢?使用一下SQL:

Hidden Parameter

set linesize 1000

SET VERIFY OFF

COLUMN parameter      FORMAT a37

COLUMN description    FORMAT a50 WORD_WRAPPED

COLUMN session_value  FORMAT a10

COLUMN instance_value FORMAT a10

SELECT a.ksppinm AS parameter,

a.ksppdesc AS description,

b.ksppstvl AS session_value,

c.ksppstvl AS instance_value

FROM   x$ksppi a,

x$ksppcv b,

x$ksppsv c

WHERE  a.indx = b.indx

AND    a.indx = c.indx

AND    a.ksppinm LIKE '%'||LOWER('&1')||'%' ESCAPE '/'

ORDER BY a.ksppinm;

補充

1:  x$ksppi: 這里存的是所有的parameter name;  x$ksppcv存的是session level的parameter value, x$ksppsv存的是instance level的parameter value; 這個通過查詢x$fixed_view_definition就能看到了

2. oracle snapshot也會記錄下這些parameter value,所以從這里也能看到是否有變化;

3. 當修改任何一個parameter的時候,都會在alert log里有記錄,所以從這里也能看到所有被改變的parameter;

感謝各位的閱讀,以上就是“Oracle參數的查詢和修改方法”的內容了,經過本文的學習后,相信大家對Oracle參數的查詢和修改方法這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

淳安县| 淮南市| 多伦县| 上林县| 客服| 巴中市| 彰化县| 信阳市| 鄂托克前旗| 偃师市| 土默特右旗| 聂荣县| 南溪县| 海城市| 利辛县| 禄劝| 溧阳市| 尼玛县| 织金县| 鹤庆县| 揭东县| 吉木乃县| 金山区| 新乡市| 汶上县| 新干县| 汉寿县| 义乌市| 新昌县| 霍林郭勒市| 舟山市| 西丰县| 丽江市| 遂昌县| 游戏| 屯门区| 蓬安县| 泰州市| 玛沁县| 罗山县| 吐鲁番市|