This man is too old to remember everything in his brain. Right now, he needs a place to write down what he has studied.
標籤
4GL
(1)
人才發展
(10)
人物
(3)
太陽能
(4)
心理
(3)
心靈
(10)
文學
(31)
生活常識
(14)
光學
(1)
名句
(10)
即時通訊軟體
(2)
奇狐
(2)
爬蟲
(1)
音樂
(2)
產業
(5)
郭語錄
(3)
無聊
(3)
統計
(4)
新聞
(1)
經濟學
(1)
經營管理
(42)
解析度
(1)
遊戲
(5)
電學
(1)
網管
(10)
廣告
(1)
數學
(1)
機率
(1)
雜趣
(1)
證券
(4)
證券期貨
(1)
ABAP
(15)
AD
(1)
agentflow
(4)
AJAX
(1)
Android
(1)
AnyChart
(1)
Apache
(14)
BASIS
(4)
BDL
(1)
C#
(1)
Church
(1)
CIE
(1)
CO
(38)
Converter
(1)
cron
(1)
CSS
(23)
DMS
(1)
DVD
(1)
Eclipse
(1)
English
(1)
excel
(5)
Exchange
(4)
Failover
(1)
Fedora
(1)
FI
(57)
File Transfer
(1)
Firefox
(3)
FM
(2)
fourjs
(1)
Genero
(1)
gladiatus
(1)
google
(1)
Google Maps API
(2)
grep
(1)
Grub
(1)
HR
(2)
html
(23)
HTS
(8)
IE
(1)
IE 8
(1)
IIS
(1)
IMAP
(3)
Internet Explorer
(1)
java
(4)
JavaScript
(22)
jQuery
(6)
JSON
(1)
K3b
(1)
ldd
(1)
LED
(3)
Linux
(120)
Linux Mint
(4)
Load Balance
(1)
Microsoft
(2)
MIS
(2)
MM
(51)
MSSQL
(1)
MySQL
(27)
Network
(1)
NFS
(1)
Office
(1)
OpenSSL
(1)
Oracle
(131)
Outlook
(3)
PDF
(6)
Perl
(60)
PHP
(33)
PL/SQL
(1)
PL/SQL Developer
(1)
PM
(3)
Postfix
(2)
postfwd
(1)
PostgreSQL
(1)
PP
(50)
python
(5)
QM
(1)
Red Hat
(4)
Reporting Service
(28)
ruby
(11)
SAP
(234)
scp
(1)
SD
(16)
sed
(1)
Selenium
(3)
Selenium-WebDriver
(5)
shell
(5)
SQL
(4)
SQL server
(8)
sqlplus
(1)
SQuirreL SQL Client
(1)
SSH
(3)
SWOT
(3)
Symantec
(2)
T-SQL
(7)
Tera Term
(2)
tip
(1)
tiptop
(24)
Tomcat
(6)
Trouble Shooting
(1)
Tuning
(5)
Ubuntu
(37)
ufw
(1)
utf-8
(1)
VIM
(11)
Virtual Machine
(2)
VirtualBox
(1)
vnc
(3)
Web Service
(2)
wget
(1)
Windows
(19)
Windows
(1)
WM
(6)
Xvfb
(2)
youtube
(1)
yum
(2)
2019年7月1日 星期一
用Perl的Mail::Sendmail模組寄送SMTP中文表頭
http://oldwww.geego.com.tw/tech_support/tech-tips-sending-utf8-smtp-header-using-perl-mail
電子郵件分成兩大部分:表頭及本文,表頭如果使用utf8字元的話,Perl的Mail::Sendmail模組在寄送後,收件人可能會看到亂碼,我們使用Encode模組來解決這個問題。
程式範例:
#!/usr/bin/perl
use utf8;
use Encode;
use Mail::Sendmail;
$sender = “奇科電腦 – Perl程式設計課程<perl@geego.com.tw> “;
$email = '奇科電腦 Perl團隊<perl.mail::sendmail@geego.com.tw>';
my $message = "奇科電腦: 這是一封用來測試Perl的Mail::Sendmail模組可否成功寄送utf8字元的郵件表頭.\n"
$sender = Encode::encode('MIME-Q', $sender); #避免header的內容變亂碼
$message = encode( "utf8", $message );
my %mail = ( To => "$email",
From => “$sender”,
'Content-type' => 'text/plain; charset="utf-8"',
Subject => "Perl’s Mail::Sendmail sending utf8 mail header",
Message => "$message" );
sendmail(%mail) or die $Mail::Sendmail::error;
2019年4月7日 星期日
perl 如何解決https 和 需要預設流覽器 問題
perl -MCPAN -e shell
cpan[1]>install LWP::Protocol::connect
or
cpan[1]> install LWP::Protocol::https
##########################################################################
#!/usr/bin/perl
use LWP::UserAgent;
use HTML::TokeParser;
my $ua = LWP::UserAgent->new(ssl_opts => { verify_hostname => 1 });
#如果出現Can't connect to flora2.epa.gov.tw:443 (certificate verify failed)
#
#SSL connect attempt failed error:14090086:SSL #routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed at /usr/local/share/perl5/LWP/Protocol/http.pm line 47.
#類似這類的訊息,則改為verify_hostname =>0
$ua->agent("Mozilla/4.0 (compatible; MSIE 5.12; Mac_PowerPC)");
my $res = $ua->get("https://example.com");
my $stream = HTML::TokeParser->new(\$res->decoded_content);
...
...
...
##########################################################################
可以參考 https://blog.51cto.com/flyingsnail/989998
cpan[1]>install LWP::Protocol::connect
or
cpan[1]> install LWP::Protocol::https
##########################################################################
#!/usr/bin/perl
use LWP::UserAgent;
use HTML::TokeParser;
my $ua = LWP::UserAgent->new(ssl_opts => { verify_hostname => 1 });
#如果出現Can't connect to flora2.epa.gov.tw:443 (certificate verify failed)
#
#SSL connect attempt failed error:14090086:SSL #routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed at /usr/local/share/perl5/LWP/Protocol/http.pm line 47.
#類似這類的訊息,則改為verify_hostname =>0
$ua->agent("Mozilla/4.0 (compatible; MSIE 5.12; Mac_PowerPC)");
my $res = $ua->get("https://example.com");
my $stream = HTML::TokeParser->new(\$res->decoded_content);
...
...
...
##########################################################################
可以參考 https://blog.51cto.com/flyingsnail/989998
2018年12月5日 星期三
殖利率曲線倒掛
https://news.cnyes.com/news/id/4249803
http://goldensun.get.com.tw/FinanceWeek/detail.aspx?no=412784
因長天期債券的到期天期較長,所以未來通膨與經濟前景較短天期債券而言,更具不確定性,故長天期債券通常被拿來作為檢視一國經濟與通膨前景之指標,而一般而言,市場會對長天期債券要求更高的風險貼水,使得長天期債券殖利率高於短天期債券。
在一國經濟體陷入經濟衰退時期時,央行將實行降息調降此前的高利率水準,以刺激經濟復甦,短率在此時期將快速走低,使得長短天期債券利差擴大,拉升殖利率曲線斜率。
3. 經濟擴張時期:
由於在經濟擴張時期,一國通膨也將同步呈現上揚,此時央行會執行升息循環,使得短率走升速度高於長率、長短天期債券的利差收斂,形成殖利率曲線斜率趨平。
4. 經濟過熱時期:
在經濟擴張的高檔末端,由於實體經濟的通膨預期將表現強勁,央行的升息步伐也需隨之加快,引導短率快速上行,長短天期利差更進一步收窄或為負值,使得殖利率曲線斜率加速趨平,甚至「倒掛」形成負斜率。
前美國聯邦準備理事會( Fed )主席葛林斯潘( Alan Greenspan )在 2005 年其聯準會主席任內,執行升息循環時發現, Fed 升息僅會拉抬短天期的美債殖利率,並無法提升長天期的美債殖利率,這意謂著美債殖利率曲線更平坦,甚至出現倒掛,亦即美國經濟已進入經濟成長的末期,這也被稱為「葛林斯潘難題」。
http://goldensun.get.com.tw/FinanceWeek/detail.aspx?no=412784
因長天期債券的到期天期較長,所以未來通膨與經濟前景較短天期債券而言,更具不確定性,故長天期債券通常被拿來作為檢視一國經濟與通膨前景之指標,而一般而言,市場會對長天期債券要求更高的風險貼水,使得長天期債券殖利率高於短天期債券。
長、短天期債券殖利率相減之後的利差,亦代表著殖利率曲線上之斜率變化,同時長短天期利差更可彰顯一國景氣的四個階段:
1. 經濟衰退時期:
在一國經濟體陷入經濟衰退時期時,央行將實行降息調降此前的高利率水準,以刺激經濟復甦,短率在此時期將快速走低,使得長短天期債券利差擴大,拉升殖利率曲線斜率。
2.經濟復甦時期:此時期一般出現於一國剛經歷完經濟衰退,央行為繼續支持經濟發展,會選擇較為寬鬆的降息循環,如零利率、負利率政策等貨幣政策,使得短率繼續下行、長短天期利差持續擴大,引導殖利率曲線斜率陡峭。
3. 經濟擴張時期:
由於在經濟擴張時期,一國通膨也將同步呈現上揚,此時央行會執行升息循環,使得短率走升速度高於長率、長短天期債券的利差收斂,形成殖利率曲線斜率趨平。
4. 經濟過熱時期:
在經濟擴張的高檔末端,由於實體經濟的通膨預期將表現強勁,央行的升息步伐也需隨之加快,引導短率快速上行,長短天期利差更進一步收窄或為負值,使得殖利率曲線斜率加速趨平,甚至「倒掛」形成負斜率。
前美國聯邦準備理事會( Fed )主席葛林斯潘( Alan Greenspan )在 2005 年其聯準會主席任內,執行升息循環時發現, Fed 升息僅會拉抬短天期的美債殖利率,並無法提升長天期的美債殖利率,這意謂著美債殖利率曲線更平坦,甚至出現倒掛,亦即美國經濟已進入經濟成長的末期,這也被稱為「葛林斯潘難題」。
2018年1月14日 星期日
switch undo tablespace
swtich undo tablespace
Step 1 : Create Tablespace : Create undo tablespace undotbs2
SQL> create undo tablespace UNDOTBS2 datafile 'D:\ORACLE\ORADATA\NOIDA\UNDOTBS02.DBF' size 100M;
Step 2 : Edit the parameter file
SQL> alter system set undo_tablespace=UNDOTBS2 ;
SQL> alter system set undo_management=MANUAL scope=spfile;
Step 3: Check the all segment of old undo tablespace to be offline
SQL> select owner, segment_name, tablespace_name, status from dba_rollback_segs order by 3;
If any one the above segment is online then change it status to offline by using below command .
SQL>alter rollback segment "_SYSSMU9_1192467665$" offline;
Step 4 : Drop old undo tablespace
SQL> drop tablespace UNDOTBS1 including contents and datafiles;
Step 5 : Change undo management to auto and restart the database
SQL> alter system set undo_management=auto scope=spfile;
SQL> shut immediate;
SQL> startup
SQL> show parameter undo_tablespace
2018年1月6日 星期六
沒有iotop指令時,如何用ps找出 wait io process
http://bencane.com/2012/08/06/troubleshooting-high-io-wait-in-linux/
for x in `seq 1 1 10`; do ps -eo state,pid,cmd | grep "^D"; echo "----"; sleep 5; done
2018年1月4日 星期四
資料庫緩衝快取區(DB Buffer Cache)
http://dbatim4026.blogspot.tw/2014/12/db-buffer-cache.html
Oracle有一個很重要的觀念,就是不到絕對必要,不會等待磁碟I/O,因為磁碟I/O是電腦系統運作中最慢的一個部份,因此,所執行的I/O是越少越好,在Oracle的資料庫架構設計裡面這種觀念是無所不在,資料庫緩衝快取區(Database
Buffer Cache)即是因應此概念而規劃出來,其基礎觀念如下:
alter system flush buffer_cache;
設定好之後如何讓某一個Segment使用某一個buffer pool呢?方式有兩種
在建置segment時在storage參數裡面加上 buffer_pool_keep或是buffer_pool_recycle就可以了。語法範例如下
SELECT ADVICE_STATUS,
SIZE_FOR_ESTIMATE,
ESTD_PHYSICAL_READ_FACTOR,
ESTD_PHYSICAL_READS
FROM V$DB_CACHE_ADVICE WHERE NAME = 'DEFAULT';
查詢結果如圖
由上圖可以知道ESTD_PHYSICAL_READ_FACTOR為1時,最佳的DB_BUFFER_SIZE是1600,因為在這之後的調整對降低I/O的效能有限,以上面的數據用座標圖來呈現就可以明顯的看出趨緩的狀況。
3. 此畫面及提供資料庫快取緩衝區相關建議事項,如圖2-30所示
當設定好DB_nK_CACHE_SIZE之後在建置表格空間(TABLESPACE)可透過BLOCKSIZE此參數來指定資料區塊大小,如以下範例:
在參數檔內設定DB_nK_CACHE_SIZE範例如下
db_16k_cache_size=16M
此參數也可動態設定語法範例如下
ALTER SYSTEM SET db_16k_cache_size = 16 SCOPE=MEMORY;
ALTER SYSTEM SET db_32k_cache_size = 32 SCOPE=MEMORY;
ALTER SYSTEM SET db_4k_cache_size = 4 SCOPE=MEMORY;
ALTER SYSTEM SET db_8k_cache_size = 8 SCOPE=MEMORY;
此時以show parameter方式確認,如圖
手動建置表格空間的語法就必須加上BLOCKSIZE此參數來指定資料區塊的大小,語法如下
CREATE TABLESPACE TEST LOGGING
DATAFILE '/u01/app/oracle/oradata/test/test01.dbf' SIZE 5M
BLOCKSIZE 16384
EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO;
如果設定了DB_nK_CACHE_SIZE在OEM上建置表格空間時,在「Storage」分頁籤「Block information」區塊內的「Block Size」部份就有下拉選項可供選擇,如圖所示。
查詢V$BUFFER_POOL,方式如下:
SELECT * FROM v$buffer_pool WHERE id <> 0;查詢結果如圖
SELECT name,1 - (physical_reads / (db_block_gets + consistent_gets))
"HIT_RATIO" FROM sys.v$buffer_pool_statistics
WHERE db_block_gets + consistent_gets > 0;結果如圖所示。
資料庫緩衝快取區(DB Buffer Cache)
- 資料庫緩衝快取區主要的功能是用來暫時存放最近讀取自資料庫裡面的資料,也就是資料檔(Datafile)內的資料,而資料檔是以資料區塊(Block)為單位,因此資料庫緩衝快取區裡面的大小是以Block為基數。當使用者透過應用程式第一次向Oracle資料庫送出查詢需求時,Oracle會先在資料庫緩衝快取區內尋找該資料,如果有需要的資料,就直接從資料庫緩衝快取區回傳給使用者稱為快取命中(cache hit),這麼一來,即可減少硬碟上的I/O次數,如果Oracle發現使用者要的資料並不在資料庫緩衝快取區裡面稱為快取失誤(cache miss),Oracle會從資料庫中讀取所需要的資料blocks,先放入資料庫緩衝快取區裡面,再傳送給使用者。
SELECT 1 - (phy.value / (cur.value + con.value)) "CACHE HIT RATIO"FROM v$sysstat cur, v$sysstat con, v$sysstat phyWHERE cur.name = 'db block gets'AND con.name = 'consistent gets'AND phy.name = 'physical reads';
- db block gets:是指DML 指令所得到的資料區塊個數。
- consistent gets:是指查詢指令得到的資料區塊個數。
- logical reads:將db block gets + consistent gets得到的資料區塊個數。
- physical reads:實際從disk讀出的資料。
Tip - Cache Hit Ratio重要事項
- CACHE HIT RATIO = 1 -(physical reads /(db block gets + consistent gets))
- HIT RATIO最好要大於90%
- 以上的查詢命中快取率是以整個資料庫緩衝快取區為主。
- 資料庫緩衝快取區裡面包含三種不同性質的快取,依序如下:
- Dirty Buffer:此類的Buffer是指存放已修改但尚未寫入資料庫的資料。
- Clean Buffer:此類的Buffer是指裡面的內容和資料庫內是一模一樣,也就這些Buffer是已經寫入資料庫內,隨時可以拿來覆蓋重復使用。
- Pinned Buffer:此類的Buffer是指正在被使用的Buffer。
- Free or Unused Buffer :此類Buffer指的是當Instance被開啟時,所有的Buffer都式呈現為使用狀態,其狀態等同Clean Buffer。
- 資料庫緩衝快取區是利用兩種List來控管內部那三種不同的性質的Buffer:
- Dirty list:包含存放dirty buffer,主要是將準備要寫入資料庫的資料,在適當的時機寫入。也就是被修改但尚未入Datafile的Bolock。
- LRU list:包含Free Buffer、Dirty Buffer、Pinned Buffers。
- Oracle對於資料庫緩衝快取區的運作方式是利用背景處理程式的DBWRn寫入資料檔(Data File)內,而DBWRn將Dirty Buffer從資料庫緩衝快取區取出寫到資料檔(Data File)內主要是透過兩種方式多個時機點
方式一: LRU機制
時機點:
- Dirty buffer達到閥值時 沒有free buffer時(server process在LRU list裏找不到足夠多的free buffer)。
- 3每3秒,DBWn會去檢查dirty list,如果dirty list未到觸發值,就去讀LRU list,將dirty buffer移到dirty list;如果dirty list已滿或已達觸發值,則寫入數Datafile中。
方式二:當Checkpoint發生時
時機點:
- log switch時,要求做檢查點,也就是把DBWn將dirty buffer從LRU list中移到dirty list,然後把dirty list中的dirty block 回寫到Datafile中。
- Tablespace offline或Hot backup時。
- drop一個物件時
關閉DB時
資料緩衝快取區的運作狀況
資料緩衝快取區(Data Buffer Cache)的運作狀況詳細內容如圖
![]() |
| Data Buffer Cache的運作狀況 |
- 當使用者連線透過Server
Process要讀取一筆資料時,第一個動作是會去資料緩衝快取區(Data Buffer Cache)裡使用雜湊函式(Hash
Function)的運算來找到這筆資料的資料區塊的位置有沒有存在資料緩衝快取區(Data Buffer Cache)裡面。在此步驟會有兩種狀況:狀況一 如果有存在資料緩衝快取區(Data Buffer Cache)裡面就往步驟2。狀況二 如果沒有存在資料緩衝快取區(Data Buffer Cache)裡面就步驟5。
- 假如有存在資料緩衝快取區(Data Buffer Cache)的話,就從LRU List移到MRU端。
- 當Server Process在LRU List裡面搜尋的時候,會先從LRU端開始找,找的過程中當他遇到一個Free Buffer的就將它註記起來,一直找到需要的個數,如果我再找的過程中當我遇到Dirty Buffer,Server Process就負責將這些Dirty Buffer移到Dirty List去。
- 在此步驟會有兩種狀況:狀況一 如果Server Process將Dirty Buffer由LRU List移到Dirty List的過程中造成Dirty List滿了 ,也就是超過Dirty List的最大值,此時Server Process就會觸發DBWn ( DB Writer ),將Dirty List裡面的Dirty Buffer寫到資料檔(Data File)裡面去,當寫進去後呢?這些被寫到資料檔(Data File)裡去的Dirty Buffer就會都變成Free Buffer,而這些Free Buffer會全部加到LRU List最尾端去,此時Server Process會再重新去找,就可以更快找到Free Buffer ( 還記得嗎?掃LRU List是從LRU端開始掃的 );所以不一定要把LRU List掃完才會發現不夠,當在掃的過程中發現Dirty List滿了,就會先做寫入的動作,然後把空間release出來。
狀況二 還有另一種狀況是,當Server Process從LRU List裡面找Free Buffer的時候,看到Dirty
Buffer就把Dirty Buffer丟到Dirty List裡面去,當Dirty List尚未到達最大值時,只要Server
Process讀了多少個資料區塊(Block)之後,發現Dirty Buffer太多了而Free Buffer又太少了,此時又會觸發另一種狀況,就是告訴Server
Process不要再找了,因為裡面的Dirty Buffer太多了,而Free
Buffer又太少了,所以不用浪費這個時間再找了,就直接將Dirty List裡的東西直接寫到資料檔(Data
File)裡面去,寫完之後就會將空間釋放出來了,這樣Server Process就可以很快的找到所需要的Free
Buffer,找到空間之後就會將資料從資料檔(Data File)裡面讀出,放到資料緩衝快取區(Data Buffer
Cache)裡面去,之後Oracle就會將那些資料區塊(Block)放到LRU List裡面的MRU端,之後就是可以新增、修改或刪除。
- 如果今天所需要的資料在資料緩衝快取區(Data Buffer Cache)裡沒有找到的話呢?Oracle會將資料從資料檔(Data File)讀取到資料緩衝快取區(Data Buffer Cache)裡來,當讀取的過程中要先檢查一件事,就是確認到底有沒有空間容納這些資料,所以說當Server Process要從資料檔(Data File)裡面讀取資料到資料緩衝快取區(Data Buffer Cache)裡前,Oracle會先確認有沒有足夠的空間,如何確認呢?Oracle會去掃LRU List,掃LRU List主要是看看有沒有足夠的Free Buffer,在掃的過程中會有幾種狀況如步驟3與步驟4。
- 當Dirty List超過最大值,時背景處理程序DBWn(DB Writer)會將Dirty List裡的資料寫回到資料檔(Data File)裡去,然後再將這些空間釋放出來。
- 當Server Process在從LRU List裡面尋找空的Free Buffer時,從當Oracle找了一段時間還找不到足夠的Free Buffer,代表裡面Dirty Buffer太多了,所以也會觸發DBWn(DB Writer)將裡面的Dirty Buffer回寫資料檔(Data File)。
- 超過三秒,也就是說每三秒鐘DBWn會自動起來檢查Dirty List
- 狀況一 在檢查的過程中如果發現Dirty List的最大值尚未到達時,會去讀LRU List,將讀到的Dirty Block移到LRU List。
- 當LGWR觸發LOG SWITCH時就會要求作checkpoint,當執行checkpoint時也就是將資料緩衝快取區(Data Buffer Cache)裡的Dirty Buffer回寫到回寫資料檔(Data File)裡面去,也就是說我們的DBWn(DB Writer)會複製Dirty Buffer從LRU List到Dirty List裡面去,然後再將Dirty List裡面的資料回寫資料檔(Data File)。
- 當針對表格空間(Tablespace)執行以下指令也會觸發Checkpoint
狀況二 如果在檢查的過程中發現的Dirty List的最大值達到了,就會回寫回寫資料檔(Data File)。
alter tablespace offline temporary;
alter tablespace offline normal;
alter tablespace begin backup;
- 當你移除(Drop)一個物件時,Oracle會針對這個物件產生checkpoint事件,做完checkpoint之後才會把物件移除(Drop),也就是說當某一個物件被執行移除(Drop)的指令時,會先產生Checkpoint利用DBWn將LRU List上的Dirty Buffer移到Dirty List上再寫入資料檔(Data File)裡,如此checkpoint就算執行結束,之後才會真正的移除(Drop)物件。
- 當關閉資料庫是以shutdown normal、Immediate或Transactional方式也會產生checkpoint。
資料庫緩衝快取區重要觀念
資料庫緩衝快取區是在SGA內佔有相當重要的份量,下面將針對資料庫緩衝快取區的觀念做重點提示。資料庫緩衝快取區的大小設定
資料庫緩衝快取區大小設定有兩種方式,依序如下- 直接在參數檔內設定DB_CACHE_SIZE即可,預設值48M。
- 第二種方式是利用DB_BLOCK_BUFFERS和DB_BLOCK_SIZE這兩個參數DB_BLOCK_BUFFERS則指定了Database Buffer Cache中的Block數量,DB_BLOCK_SIZE則指定了每個Block的大小。因此,資料庫緩衝快取區的大小就等於DB_BLOCK_BUFFERS * DB_BLOCK_SIZE。,Block的大小預設值是8K。
Tip
- DB_CACHE_SIZE和DB_BLOCK_BUFFERS是不能同時設置的,否則當Instance啟動時會有錯誤訊息。
- DB_CACHE_SIZE是可以動態修改的參數,修改後Instance不需重啟。
- 按照一般經驗在線上交易系統(On-line Transaction Processing;OLTP)DB_CACHE_SIZE的大小可設定為DB_CACHE_SIZE=SGA_MAX_SIZE/2到SGA_MAX_SIZE*2/3之間,但還是需要以實際的狀況做調整。
清除資料庫緩衝快取區
之前有提過Dirty Buffer是指存放已修改但尚未寫入資料庫的資料,但如果資料庫緩衝快取區內存在大量的Dirty Buffer,那麼就可能導致整個效能低落,此時可以使用人工的方式將Dirty Buffer整批的回寫到資料檔內,語法如下。alter system flush buffer_cache;
資料庫緩衝快取區分區管理
可以將資料庫緩衝快取區切分為三種不同性質的分區,每一個分區都有不同功用,如圖
![]() |
| 資料庫緩衝快取區分區管理 |
- RECYCLE POOL:當資料只要放到recycle pool時,只要空間不夠用時馬上就會被釋放出來。要被放在Recycle pool的資料區塊應該不會被反覆使用,也就是說,這些資料區塊只是在交易(transaction)還存在的時候才會被用到,當交易結束時,就會被被釋放出來。RECYCLE POOL的大小最好是default pool的1/2大。
- KEEP POOL:當資料只要放到keep pool裡時,代表這個資料是需要常常被重複使用的,所以資料如果是被放在keep pool裡,代表資料會盡可能的被放在裡面。KEEP POOL的大小應該是Default pool的10%
- DEFAULT POOL:當沒有指定時就會放在default pool,也就是說,放在Default Pool的資料是利用LRU機制。
DB_BLOCK_BUFFERS = 20000
DB_BLOCK_LRU_LATCHES = 6
BUFFER_POOL_KEEP=(BUFFERS:14000,LRU_LATCHES:1)
BUFFER_POOL_RECYCLE=(BUFFERS:2000,LRU_LATCHES:3)
Tip
- BUFFER_POOL_KEEP:分配的Buffer是14000個;LRU LATCH是1個。
- BUFFER_POOL_RECYCLE:分配的Buffe是2000個;LRU LATCH是3個。
- BUFFER_POOL_DEFAULT:剩下的就是default。buffers是4000個;LRU LATCH是2個。
除了指定Buffer個數之外還需指定LRU_LATCH,LRU_LATCH的用途是,一個LRU_LATCH就要控制一個LRU LIST如果定義有3個LRU_LATCH代表同時可以有3個Server Process同時使用,因此由此可知上面的例子是
- BUFFER_POOL_KEEP: 是一個LATCH管14000個BUFFERS。
- BUFFER_POOL_RECYCLE:是一個LATCH管600多個BUFFERS。
- BUFFER_POOL_DEFAULT:是一個LATCH管2000多個BUFFERS。
一個LATCH最少要管50個BLOCKS。
在建置segment時在storage參數裡面加上 buffer_pool_keep或是buffer_pool_recycle就可以了。語法範例如下
CREATE INDEX INDEX_NAME STORAGE (BUFFER_POOL KEEP …);或是
CREATE TABLE table_name (column_name)
tablespace tablespace_name storage ( initial 200k next 200k BUFFER_POOL KEEP);
將已存在的SEGMENT利用Alter語法指定。語法範例如下
ALTER TABLE table_name STORAGE (BUFFER_POOL RECYCLE);
ALTER INDEX index_name REBUILD STORAGE (BUFFER_POOL KEEP);
資料庫緩衝快取區重要參數與View
DB_CACHE_ADVICE
Oracle提供了一些自動偵測效能的工具,用於提高系統效能。DB_CACHE_ADVICE就是其中一種,當設定DB_CACHE_ADVICE的作用就是在系統運作過程中,透過監控相關的統計資料,提供給DBA對於資料庫緩衝快取區相關訊息,以作最佳的調整。DB_CACHE_ADVICE的設定有三種方式如下所示:
DB_CACHE_ADVICE=OFF
DB_CACHE_ADVICE=ON
DB_CACHE_ADVICE=READY
OFF代表不開啟DB_CACHE_ADVIDE
- DB_CACHE_ADVICE=ON代表開啟DB_CACHE_ADVICE,但這要注意一開啟為ON時Oracle會從共用區(Shared Pool)中取得一些記憶體空間,所以有可能會影響效能。
- DB_CACHE_ADVICE=READY 代表在下次開啟Instance時會預先分配足夠的記憶體,通成建議使用此方式。
- 此參數是可以以動態方式也就是”ALTER SYSTEM SET…”修改,並且當DB_CACHE_ADVICE開啟後會將統計資料儲存到V$DB_CACHE_ADVICE內。
DB_CACHE_ADVICE的參數設定可以提供給資料庫緩衝快取區相關訊息,以作最佳的調整。當開啟參數DB_CACHE_ADVICE後,經過一段時間,Oracle就會自動收集足夠的相關統計資料,並預測出DB_CACHE_SIZE在不同大小情況的性能資料,而這些資料就是透過V$DB_CACHE_ADVICE來顯示出來,因此可以根據這些資料對DB_CACHE_SZIE做相關的調整,以達到最佳狀況。欄位解說如下所列:
- ID:不同資料庫緩衝快取區的編號,一般來說DB_CACHE_SIZE的編號是3
- NAME:資料庫緩衝快取區的名稱(Default、Keep、Recycle)
- BLOCK_SIZE:資料區塊的大小(單位是K)
- ADVICE_STATUS:開啟狀態:ON代表開啟,OFF代表關閉
- SIZE_FOR_ESTIMATE:預測效能的Cache大小(M為單位)
- SIZE_FACTOR:預測的Cache大小比例,也就是與目前大小的比例
- BUFFERS_FOR_ESTIMATE:預測性能資料的資料區塊個數
- ESTD_PHYSICAL_READ_FACTOR:在資料庫緩衝快取區裡實體讀取因數,也就是說當Buffer Cache大小為SIZE_FOR_ESTIMATE此欄位時,db_cache_advice預測的實體讀數與當前實體讀數的比率值。如果當前實體讀數為0,這個值為空。
- ESTD_PHYSICAL_READS:當Buffer Cache大小為SIZE_FOR_ESTIMATE時,db_cache_advice預測得實際讀數。
- ESTD_PHYSICAL_READ_TIME:當前實體讀取的時間。
- ESTD_PCT_OF_DB_TIME_FOR_READS:當前實體讀取的時間佔所有時間的比例。
SELECT ADVICE_STATUS,
SIZE_FOR_ESTIMATE,
ESTD_PHYSICAL_READ_FACTOR,
ESTD_PHYSICAL_READS
FROM V$DB_CACHE_ADVICE WHERE NAME = 'DEFAULT';
查詢結果如圖
![]() |
| 查詢V$DB_CACHE_ADVICE |
使用OEM上可以看到相同的圖表步驟如下
- 進入OEM之後點選「Server」頁籤,並點選「Database Configuration」區塊內的「Memory Advisors」連結。
- 點選「SGA」頁籤並點選「Buffer Cache」的「Advice」按鈕,如圖所示。
![]() |
| 使用OEM確認DB BUFFER CATCH建議-1 |
![]() |
| 用OEM確認DB BUFFER CATCH建議-2 |
DB_nK_CACHE_SIZE
Oracle可以同時支援不同大小的資料區塊 (2K,4K,8KB,16KB及32KB五種),除了DB_BLOCK_SIZE之外還可以設定其他的大小,並且可以為不同塊尺寸的資料塊指定不同大小的資料庫緩衝快取區分。而DB_BLOCK_SIZE的參數設定,稱為標準資料區塊『Standard Block』,區間在2k-32k之間。9i以後,除了SYSTEM表格空間(System Tablespace)和TEMPORARY表格空間(Temporary Tablespace)必須使用標準標準資料區塊外,所有其他表格空間都可以最多指定四種不同的標準資料區塊大小。當設定好DB_nK_CACHE_SIZE之後在建置表格空間(TABLESPACE)可透過BLOCKSIZE此參數來指定資料區塊大小,如以下範例:
在參數檔內設定DB_nK_CACHE_SIZE範例如下
db_16k_cache_size=16M
此參數也可動態設定語法範例如下
ALTER SYSTEM SET db_16k_cache_size = 16 SCOPE=MEMORY;
ALTER SYSTEM SET db_32k_cache_size = 32 SCOPE=MEMORY;
ALTER SYSTEM SET db_4k_cache_size = 4 SCOPE=MEMORY;
ALTER SYSTEM SET db_8k_cache_size = 8 SCOPE=MEMORY;
此時以show parameter方式確認,如圖
![]() |
| DB_nK_CACHE_SIZE設定 |
CREATE TABLESPACE TEST LOGGING
DATAFILE '/u01/app/oracle/oradata/test/test01.dbf' SIZE 5M
BLOCKSIZE 16384
EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO;
如果設定了DB_nK_CACHE_SIZE在OEM上建置表格空間時,在「Storage」分頁籤「Block information」區塊內的「Block Size」部份就有下拉選項可供選擇,如圖所示。
![]() |
| OEM之區塊大小設定 |
當設定好DB_nK_CACHE_SZIE與建置相關大小的表格空間後,當資料庫緩衝快取區讀取此表格空間時就會使用此相對應的DB_nK_CACHE_SZIE大小的資料區塊,也就是說當建置一個16K的表格空間,就可以透過設定DB_16K_CACHE_SIZE為來指定資料庫緩衝快取區存取這個表空間資料區塊。
Tip
- 不同大小的資料區塊是不能相互混合儲存,也就是說一個16K的表格空間就必須透過DB_16K_CACHE_SIZE為來指定資料庫緩衝快取區,不可用4K的去儲存。
- 如果當DB_BLOCK_SIZE 設定為 8K,就不可再設定DB_8K_CACHE_SIZE 參數。
V$BUFFER_POOL
之前有提過可將資料庫緩衝快取區切分為三個不同類型的分區,而V$BUFFER_POOL,可將每個分區的詳細情況列出查詢V$BUFFER_POOL,方式如下:
SELECT * FROM v$buffer_pool WHERE id <> 0;查詢結果如圖
![]() |
| V$BUFFER_POOL查詢結果 |
V$BUFFER_POOL_STATISTICS
可查詢V$BUFFER_POOL_STATISTICS來看每個分割資料庫緩衝快取區命中快取率,方式如下:SELECT name,1 - (physical_reads / (db_block_gets + consistent_gets))
"HIT_RATIO" FROM sys.v$buffer_pool_statistics
WHERE db_block_gets + consistent_gets > 0;結果如圖所示。
![]() |
| 查詢分割資料庫緩衝快取區命中快取率 |
Tip
- SYS.V$BUFFER_POOL_STATISTICS,要先跑 catclust.sql 這支script。
- 注意,原則上GET HIT RATIO要在90%以上。但Recycle如果是在90%以上,就代表這常用的東西是被放在Recycle裡,那Recycle裡的東西又是常被reused,所以如果Recycle是在90%以上,就代表有問題,因為這代表90%以上的東西用完就丟,所以應該將常用的東西放在KEEP裡面。
2017年12月20日 星期三
如何给其他会话设置session级别的参数
http://www.askmaclean.com/archives/how-to-set-other-session-parameter.html
之前有同学问我如何才能给非自身的其他会话设置会话级别(alter session)的参数;在实际的Oracle管理过程中我们往往希望在不修改实例级别参数的情况下, 让部分session使用指定的参数值。
如果仅仅是修改本地会话的参数值,那么很好办,只需要alter session set parameter 即可,如:
但是如果是要给非本地会话的其他会话设置session级别的参数的话,那么就比较麻烦了。
就我所知,存在2种方法,这里抛砖引玉一下:
1. 通过 AFTER LOGON ON Trigger登录后触发器实现部分用户或程序登录即触发session级别的参数被设置,如:
当有用户以MACLEAN账号登录时,会触发该Trigger在session级别设置optimizer_mode=RULE使用RBO优化器。
2.使用DBMS_SYSTEM包的SET_INT_PARAM_IN_SESSION和SET_BOOL_PARAM_IN_SESSION 2个存储过程,实际我在利用<dbms_system包加速imp导入数据时的索引建立> 一文中已经介绍过了如何利用SET_INT_PARAM_IN_SESSION优化imp导入数据时创建索引相关的会话级别参数。
SET_INT_PARAM_IN_SESSION 过程用以给其他SESSION设置值为整形类的参数,如db_file_multiblock_read_count,其具体用法:
SET_BOOL_PARAM_IN_SESSION 过程用以给其他SESSION设置布尔类型的参数,如skip_unusable_indexes:
注意虽然有些parameter的值是TRUE或者False,但是这些参数实际可能是string字符串类型,而非boolean类型,具体可以通过show parameter来查看,如star_transformation_enabled参数默认虽然是FALSE,但是实际是一个String type的Parameter:
遗憾的是DBMS_SYSTEM包仅仅提供了设置整形和布尔类值的过程, 对于字符类值的参数尚不支持对其他session的修改。 换句话说就是如star_transformation_enabled这类的会话参数,DBMS_SYSTEM包没有提供一个可用的过程来对非本地的其他会话修改, 到目前为止(版本11.2.0.3)都不支持这种做法。针对这类字符值参数,据我所知如果要达到我们上述的目的那么只能用触发器的方法。
实际上Metalink上已经有相关的Note说明了该软件缺陷”SET A CHARACTER-STRING VALUED PARAMETER IN ANOTHER USERS SESSION”:
之前有同学问我如何才能给非自身的其他会话设置会话级别(alter session)的参数;在实际的Oracle管理过程中我们往往希望在不修改实例级别参数的情况下, 让部分session使用指定的参数值。
如果仅仅是修改本地会话的参数值,那么很好办,只需要alter session set parameter 即可,如:
SQL> select * from v$version; BANNER -------------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production PL/SQL Release 11.2.0.3.0 - Production CORE 11.2.0.3.0 Production TNS for Linux: Version 11.2.0.3.0 - Production NLSRTL Version 11.2.0.3.0 - Production SQL> select * from global_name; GLOBAL_NAME ------------------------------------------------------- www.askmaclean.com & www.askmaclean.com SQL> alter session set workarea_size_policy=MANUAL; Session altered.
但是如果是要给非本地会话的其他会话设置session级别的参数的话,那么就比较麻烦了。
就我所知,存在2种方法,这里抛砖引玉一下:
1. 通过 AFTER LOGON ON Trigger登录后触发器实现部分用户或程序登录即触发session级别的参数被设置,如:
CREATE OR REPLACE TRIGGER AUTO_SESSION_PARAMETER
AFTER LOGON ON MACLEAN.SCHEMA
BEGIN
execute immediate 'alter session set optimizer_mode=RULE';
END;
/
Trigger created.
当有用户以MACLEAN账号登录时,会触发该Trigger在session级别设置optimizer_mode=RULE使用RBO优化器。
2.使用DBMS_SYSTEM包的SET_INT_PARAM_IN_SESSION和SET_BOOL_PARAM_IN_SESSION 2个存储过程,实际我在利用<dbms_system包加速imp导入数据时的索引建立> 一文中已经介绍过了如何利用SET_INT_PARAM_IN_SESSION优化imp导入数据时创建索引相关的会话级别参数。
SET_INT_PARAM_IN_SESSION 过程用以给其他SESSION设置值为整形类的参数,如db_file_multiblock_read_count,其具体用法:
dbms_system.set_int_param_in_session( sid IN NUMBER, serial# IN NUMBER, parnam IN VARCHAR2, intval IN BINARY_INTEGER); exec dbms_system.set_int_param_in_session(10, 161, 'sort_area_size', 1048576);
SET_BOOL_PARAM_IN_SESSION 过程用以给其他SESSION设置布尔类型的参数,如skip_unusable_indexes:
dbms_system.set_bool_param_in_session( sid IN NUMBER, serial# IN NUMBER, parnam IN VARCHAR2, bval IN BOOLEAN); exec dbms_system.set_bool_param_in_session(10, 161, 'skip_unusable_indexes', TRUE);
注意虽然有些parameter的值是TRUE或者False,但是这些参数实际可能是string字符串类型,而非boolean类型,具体可以通过show parameter来查看,如star_transformation_enabled参数默认虽然是FALSE,但是实际是一个String type的Parameter:
SQL> show parameter star_transformation_enabled NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ star_transformation_enabled string FALSE
遗憾的是DBMS_SYSTEM包仅仅提供了设置整形和布尔类值的过程, 对于字符类值的参数尚不支持对其他session的修改。 换句话说就是如star_transformation_enabled这类的会话参数,DBMS_SYSTEM包没有提供一个可用的过程来对非本地的其他会话修改, 到目前为止(版本11.2.0.3)都不支持这种做法。针对这类字符值参数,据我所知如果要达到我们上述的目的那么只能用触发器的方法。
实际上Metalink上已经有相关的Note说明了该软件缺陷”SET A CHARACTER-STRING VALUED PARAMETER IN ANOTHER USERS SESSION”:
Hdr: 8939043 11.1.0.7 RDBMS 11.1.0.7 SQL LANGUAGE PRODID-5 PORTID-267 Abstract: SET A CHARACTER-STRING VALUED PARAMETER IN ANOTHER USERS SESSION Using DBMS_SYSTEM you can set a Boolean parameter with the SET_BOOL_PARAM_IN_SESSION procedure. Similarly, you can also set an Integer parameter with the SET_INT_PARAM_IN_SESSION procedure. There is no procedure in dbms_system or in other package or any other direct method to set this parameter. so, it should be a direct method to simulate something like alter session <number_of_session> set cursor_sharing='EXACT'; We have a specific process that is running very slowly since upgrading to 11g. If we set optimizer_features_enabled =11.1.0.7 the process runs well. We can not set this parameter at the database level though as it causes online errors in other parts of the system.
訂閱:
文章 (Atom)








