oracle三对内存参数间关系之3AMM启动和关闭两种情况下ASMM机制涉
ASMM机制涉及的一对参数为: SGA_TARGET和SGA_MAX_SIZE 。 SGA_TARGET Default value 0 (SGA autotuning is disabled for DEFERRED mode autotuning requests, but allowed for IMMEDIATE mode autotuning requests) Modifiable ALTER SYSTEM (即表示该参数
ASMM机制涉及的一对参数为:SGA_TARGET和SGA_MAX_SIZE。
SGA_TARGET
Default value |
0 (SGA autotuning is disabled forDEFERRED mode autotuning requests, but allowed forIMMEDIATE mode autotuning requests) |
---|---|
Modifiable | ALTER SYSTEM<code>(即表示该参数为动态参数) |
Range of values | 64 MB to operating system-dependent |
参见:http://docs.oracle.com/cd/E11882_01/server.112/e40402/initparams236.htm#I1010256
SGA_MAX_SIZE
Default value | Initial size of SGA at startup, dependent on the sizes of different pools in the SGA, such as buffer cache, shared pool, large pool, and so on. |
---|---|
Modifiable | No(即表示该参数为静态参数)
|
Range of values | 0 to operating system-dependent |
On 64-bit platforms and non-Windows 32-bit platforms, when either MEMORY_TARGET
orMEMORY_MAX_TARGET
is specified, the default value ofSGA_MAX_SIZE
is set to the larger of the two parameters. This causes more address
space to be reserved for expansion of the SGA.
On Windows 32-bit platforms, the default value of SGA_MAX_SIZE
is the largest of the following values:
-
60% of
MEMORY_TARGET
, if specified -
60% of
MEMORY_MAX_TARGET
, if specified -
25% of the total available virtual address space
参见:http://docs.oracle.com/cd/E11882_01/server.112/e40402/initparams235.htm
上述描述可知,
1、当SGA_TARGET=非0时,SGA_TARGET要在64 MB to operating system-dependent这个范围内,确切说是,SGA_TARGET要在64 MB to<span>SGA_MAX_SIZE</span>。
2、
由于SGA_TARGET始终SGA_MAX_SIZE,所以
当SGA_TARGET=0时,<span>SGA_MAX_SIZE</span>
取值范围为0 to<span>SGA_MAX_SIZE</span>。
当SGA_TARGET=非0时,SGA_TARGET要在64 MB to<span>SGA_MAX_SIZE</span>这个范围内,故而<span>SGA_MAX_SIZE</span>
取值范围为64
MB to operating system-dependent。
说明了SGA_TARGET要SGA_MAX_SIZE的例子,参见下文一大点里1.2的例子。
这里还有一点要知道,sga_max_size可以自动来变动的(sga_max_size自动变动值,无论在实例启动时,还是实例运行期间,都可以;而alter system setsga_max_size只能在实例启动时起效,因为sga_max_size是静态参数),当sga的内存组件的和小于sga_max_size的时候,sga_max_size不会改变,还是维持自己的值,如果超过了这个和,sga_max_size的就会自动变动成和的值,这个你可以自己试试。例如,
我现在想调整database buffer的值到1G,我只需要设置db_cache_size到1G,而不设置sga_max_size,这时由于各组件值大于sga_max_size目前值,所以sga_max_size自动变化:
SQL>alter system set db_cache_size=1000Mscope=spfile;
SQL> shutdown immediate;
SQL> startup;
看看现在的内存信息
Total System Global Area 1301357848 bytes
Fixed Size 455960 bytes
Variable Size 251658240 bytes
Database Buffers 1048576000 bytes
Redo Buffers 667648 bytes
发现sga_max_size已经自动变化
SQL> show parameters sga_
NAME TYPE VALUE
———————————— ——————————— ———
sga_max_size big integer 130135784
也已经变化叻。
【
参见:
http://blog.csdn.net/haiross/article/details/41696485
为什么会出现这样的问题叻,是因为在32位的机器上Oracle的内存有限制,内存最大4G,32位留50%给操作系统,window是单线程的,不能超过1.7G。out of memory也就出来叻。
SGA不能超过1.7G的限制
在Windows上调整SGA大小遭遇ORA-27100、ORA-27102错误的处理方法】
当实例启动前的参数里sga_max_size=0,sga_target=0时,实例启动后sga_max_size值也会自动调整,详见下文一大点里的2.2例子。
那么sga_max_size值自动调整时,该参数的值具体为多少,是什么决定呢?
是由sga_max_size的默认值:
Default value :Initial size of SGA at startup, dependent on the sizes of different pools in the SGA, such as buffer cache, shared pool, large pool, and so on。也就是说
SGA_MAX_SIZE 的 Default value 为Initial size of SGA at startup,所以说SGA_MAX_SIZE是一个没有初始化值的变量。故而在ASMM启动时,SGA_MAX_SIZE 的 Default value 是将SGA_target的值赋值给SGA_MAX_SIZE的,在ASMM关闭时,SGA_MAX_SIZE 的 Default
value 是将sga各个组件的参数值如shared_pool_size相加的值赋值给SGA_MAX_SIZE的。
具体的说是,
On 64-bit platforms and non-Windows 32-bit platforms, when either MEMORY_TARGET
orMEMORY_MAX_TARGET
is specified, the default value ofSGA_MAX_SIZE
is set to the larger of the two parameters. This causes more address
space to be reserved for expansion of the SGA.
On Windows 32-bit platforms, the default value of SGA_MAX_SIZE
is the largest of the following values:
-
60% of
MEMORY_TARGET
, if specified -
60% of
MEMORY_MAX_TARGET
, if specified -
25% of the total available virtual address space
实例运行期间的SGA_MAX_SIZE都是一个非0值,因为SGA_MAX_SIZE是一个静态参数,所以实例运行期间将SGA_MAX_SIZE置为0,但是修改后的值不会立马起效,只有待下一次实例启动时才起效,而待下一次实例启动时如上所说实例启动时SGA_MAX_SIZE还是会从0被调整为一个非0值。详见下文一大点里的2.2例子。
参数默认值不一定就是参数的初始化值:
SGA_MAX_SIZE Default value 为Initial size of SGA at startup,所以说SGA_MAX_SIZE是一个没有初始化值的变量。故而在ASMM启动时,SGA_MAX_SIZE 的 Default value 是将SGA_target的值赋值给SGA_MAX_SIZE的,在ASMM关闭时,SGA_MAX_SIZE 的 Default value 是将sga各个组件的参数值如shared_pool_size相加的值赋值给SGA_MAX_SIZE的。
参见盖国强 《深入解析oracle》 第二章 参数分类
SGA_TARGET和SGA_MAX_SIZE两者关系为
0、SGA_TARGET始终SGA_MAX_SIZE。
否则,会提示
ORA-00823: Specified value ofsga_target greater than sga_max_size。
一、
当AMM启动时,即memory_target=非0
If Automatic Memory Management is enabled (MEMORY_TARGET
is set to a positive value) andSGA_TARGET
is also set to a positive value, theSGA_TARGET
value acts as the minimum value for the size of the SGA.
以下实验时参数文件里MEMORY_TARGET=非0,MEMORY_MAX_TARGET=非0。
1、当SGA_TARGET=非0时(即ASMM启动时)
1.1
当参数文件里SGA_TARGET=非0,<span>SGA_MAX_SIZE</span>=非0时,实例启动成功。
1.2
当参数文件里SGA_TARGET=非0,<span>SGA_MAX_SIZE</span>=0时,实例启动不成功。
下面是具体实验来证明:
参数文件里:
*.memory_max_target= 700M
*.memory_target=700M
*.sga_max_size=0
*.sga_target=400M
*.pga_aggregate_target=100M
SQL>shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE例程已经关闭。
SQL>startup pfile=E:\app\hc\product\11.2.0\dbhome_1\database\INITmonkey.ORA
ORA-00823: Specified value of sga_target greater than sga_max_size
ORA-01078:处理系统参数失败
SQL>
注释:
对比memory_max_target和memory_target关系不同点在于:
当MEMORY_TARGET=非0,MEMORY_MAX_TARGET=0时,启动实例后MEMORY_MAX_TARGET=MEMORY_TARGET值。2、当SGA_TARGET=0时(即ASMM关闭时)
2.1
当参数文件里SGA_TARGET=0,<span>SGA_MAX_SIZE</span>=非0时,实例启动成功。
注释:
memory_target=0时sga_ target可以为0是因为memory_target=0时sga_ target为0,表示sga为手动管理,即由shared_pool_size参数等之和为sga大小。
2.2
当参数文件里SGA_TARGET=0,<span>SGA_MAX_SIZE</span>=0时,实例启动成功。
启动实例成功后,查看SGA_TARGET和<span>SGA_MAX_SIZE</span>(使用showparameters
sga或是select * from v$parameter where name like '%sga%';),发现<span>SGA_MAX_SIZE</span>被调整为一个非0值。
以如下参数文件来启动实例:
memory_target=0,memory_max_target=1400M,
pga_aggregate_target 为0,workarea_size_policy=manual,
sga_max_size=0,sga_target=0
则可以启动实例成功。
SQL> select name,value from v$parameter where name like '%target%' orname like
'%sga%';
NAME VALUE
------------------------ --------------------------------------------------------
sga_max_size 150994944
pre_page_sga FALSE
lock_sga FALSE
sga_target 0
memory_target 0
memory_max_target 1468006400
archive_lag_target 0
fast_start_io_target 0
fast_start_mttr_target 0
db_flashback_retention_target 1440
pga_aggregate_target 0
parallel_servers_target 32
已选择12行。
注释:
为什么启动实例时SGA_MAX_SIZE会从0被调整为一个非0值呢?
sga_max_size可以自动来变动的(sga_max_size自动变动值,无论在实例启动时,还是实例运行期间,都可以;而alter system setsga_max_size只能在实例启动时起效,因为sga_max_size是静态参数),当sga的内存组件的和小于sga_max_size的时候,sga_max_size不会改变,还是维持自己的值,如果超过了这个和,sga_max_size的就会自动变动成和的值。
那么sga_max_size值自动调整时,该参数的值具体为多少,是什么决定呢?
是由sga_max_size的默认值。SGA_MAX_SIZE Default value 为Initial size of SGA at startup,所以说SGA_MAX_SIZE是一个没有初始化值的变量。故而在ASMM启动时,SGA_MAX_SIZE 的 Default value 是将SGA_target的值赋值给SGA_MAX_SIZE的,在ASMM关闭时,SGA_MAX_SIZE 的 Default value 是将sga各个组件的参数值如shared_pool_size相加的值赋值给SGA_MAX_SIZE的。
所以,实例启动前的参数文件即使设置了SGA_MAX_SIZE=0,实例启动时SGA_MAX_SIZE也会从0被调整为一个非0值。
故而我们可以知道实例运行期间的SGA_MAX_SIZE都是一个非0值,因为SGA_MAX_SIZE是一个静态参数,所以实例运行期间将SGA_MAX_SIZE置为0,但是修改后的值不会立马起效,只有待下一次实例启动时才起效,而待下一次实例启动时如上所说实例启动时SGA_MAX_SIZE还是会从0被调整为一个非0值。
二、
当AMM关闭时,即memory_target=0
2、当MEMORY_TARGET=0时(即AMM关闭时)
2.1
当参数文件里MEMORY_TARGET=0,MEMORY_MAX_TARGET=非0时,实例启动成功。
实例启动后,查看MEMORY_TARGET和MEMORY_MAX_TARGET都为原值(使用showparameters mem或是select * from v$parameter where name like '%mem%';)。即If you omit the line for MEMORY_TARGET
and include a value forMEMORY_MAX_TARGET
, theMEMORY_TARGET
parameter defaults to zero. After startup, you can then dynamically changeMEMORY_TARGET
to a nonzero value, provided that it does not exceed the value ofMEMORY_MAX_TARGET
.(文章详解)
2.2
当参数文件里MEMORY_TARGET=0,MEMORY_MAX_TARGET=0时,实例启动成功。
实例启动后,查看MEMORY_TARGET和MEMORY_MAX_TARGET(使用showparameters mem或是select * from v$parameter where name like '%mem%';),发现MEMORY_MAX_TARGET被调整为一个非0值。下面是具体实验来证明:
三、
AMM关闭时(即memory_target=0),才会出现ORA-00849:SGA_TARGET
524288000 cannot be set to more than MEMORY_MAX_TARGET 0.无论是sga_target>memory_max_target还是sga_max_size>memory_max_target。当sga_max_size>memory_max_target时,即使此时sga_target也>memory_max_target,ORA-00849里的SGA_TARGET值还是来自sga_max_size。
附加
sga_max_size是静态参数,所以它即使在实例运行期间修改的值也要在下次启动时起作用,故而不用试验sga_max_size静态参数在实例运行期间修改对sga_target影响。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Oracle 打不開的解決辦法包括:1. 啟動數據庫服務;2. 啟動監聽器;3. 檢查端口衝突;4. 正確設置環境變量;5. 確保防火牆或防病毒軟件未阻止連接;6. 檢查服務器是否已關閉;7. 使用 RMAN 恢復損壞的文件;8. 檢查 TNS 服務名稱是否正確;9. 檢查網絡連接;10. 重新安裝 Oracle 軟件。

解決 Oracle 游標關閉問題的方法包括:使用 CLOSE 語句顯式關閉游標。在 FOR UPDATE 子句中聲明游標,使其在作用域結束後自動關閉。在 USING 子句中聲明游標,使其在關聯的 PL/SQL 變量關閉時自動關閉。使用異常處理確保在任何異常情況下關閉游標。使用連接池自動關閉游標。禁用自動提交,延遲游標關閉。

Oracle 中,FOR LOOP 循環可動態創建游標, 步驟為:1. 定義游標類型;2. 創建循環;3. 動態創建游標;4. 執行游標;5. 關閉游標。示例:可循環創建游標,顯示前 10 名員工姓名和工資。

Oracle 數據庫分頁利用 ROWNUM 偽列或 FETCH 語句實現:ROWNUM 偽列用於通過行號過濾結果,適用於復雜查詢。 FETCH 語句用於獲取指定數量的第一行,適用於簡單查詢。

要停止 Oracle 數據庫,請執行以下步驟:1. 連接到數據庫;2. 優雅關機數據庫(shutdown immediate);3. 完全關機數據庫(shutdown abort)。

在CentOS系統上搭建Hadoop分佈式文件系統(HDFS)需要多個步驟,本文提供一個簡要的配置指南。一、前期準備安裝JDK:在所有節點上安裝JavaDevelopmentKit(JDK),版本需與Hadoop兼容。可從Oracle官網下載安裝包。環境變量配置:編輯/etc/profile文件,設置Java和Hadoop的環境變量,使系統能夠找到JDK和Hadoop的安裝路徑。二、安全配置:SSH免密登錄生成SSH密鑰:在每個節點上使用ssh-keygen命令

可以通過使用 Oracle 的動態 SQL 來根據運行時輸入創建和執行 SQL 語句。步驟包括:準備一個空字符串變量來存儲動態生成的 SQL 語句。使用 EXECUTE IMMEDIATE 或 PREPARE 語句編譯和執行動態 SQL 語句。使用 bind 變量傳遞用戶輸入或其他動態值給動態 SQL。使用 EXECUTE IMMEDIATE 或 EXECUTE 執行動態 SQL 語句。

Oracle 日誌文件寫滿時,可採用以下解決方案:1)清理舊日誌文件;2)增加日誌文件大小;3)增加日誌文件組;4)設置自動日誌管理;5)重新初始化數據庫。在實施任何解決方案前,建議備份數據庫以防數據丟失。
