MathJax

MathJax-2

MathJax-3

Google Code Prettify

置頂入手筆記

EnterproseDB Quickstart — 快速入門筆記

由於考慮採用 EnterpriseDB 或是直接用 PostgreSQL 的人,通常需要一些入手的資料。這邊紀錄便提供相關快速上手的簡單筆記 ~ 這篇筆記以 資料庫安裝完畢後的快速使用 為目標,基本紀錄登入使用的範例:

2016年7月21日 星期四

EDB 的 Statspack 報表 - Dynamic Runtime Instrumentation Tools Architecture

PostgreSQL 原生的資料庫監控功能,大多散布在各式系統資料表裡面;此外,有些內建系統表還沒有設置,有時也需要額外安裝,像是 pg_stat_statements;更甚者,可能還需要確認發行版有沒有支援(Dynamic Tracing)。截至 9.5 版,還沒有原生於 PostgreSQL 簡單易用的整合的效能監控工具。

對於資深的 Oracle 使用者,常常會提到 Oracle 有很多效能監控工具,像是常會提到 Oracle Statspack / Oracle AWR,並尋找在 PostgreSQL 裡面相似的工具。

EnterpriseDB 在其企業版資料庫中提供一個叫 Dynamic Runtime Instrumentation Tools Architecture(EDB DRITA)的功能,可以用來衡量資料庫運行效能的紀錄。DRITA 其實是將現有的 PostgreSQL 資料庫效能監控工具(例如  pg_stat_statements,或是 pg_buffercache),並以一個 Oracle 資料庫的用戶所習慣的統合性報表格式呈現。

DRITA 功能不用像 Oracle Statspack/AWR 一樣,先設置專屬空間存放,而是直接存放在同一個 Postgres Instance 裡。


DRITA 的使用方法有兩種:
(1) 在一個 Session 當中,執行兩次系統資訊收集(起、迄 DRITA 快照),然後用這兩次快照,產生快照間資料庫活動的報告(使用上,與 Oracle Statspack 相仿)

(2) 在一段期間中,產生些許系統資訊快照,然後依照需要,選取數個相連續的快照,彙整出資料庫活動的報告

在此以 EDB Postgres Advanced Server 9.5 進行演練:

首先,要啟用 DRITA 功能,有兩種方式。
  • 啟用 postgresql.conf 裡面的參數 timed_statistics(on),並重新載入
  • 這個參數也可以只在一個 Session 當中啟用,如下列指令:
edb=# SET timed_statistics TO true;
SET

用法:
(1) 在一個 Session 中執行:
  • 手動執行一次進行 DRITA 快照(第一次)
edb=# SELECT * FROM edbsnap();
       edbsnap      
----------------------
 Statement processed.
(1 row)

  • 一些資料庫活動:如,執行一個指令(計算階乘)
edb=# select 10000!;

  • 等到所需要觀察、了解的資料庫活動告一段落,再執行一次 DRITA 快照
edb=# SELECT edbsnap();
       edbsnap      
----------------------
 Statement processed.
(1 row)

  • 先來觀察一下,目前累積的快照列表
edb=# SELECT get_snaps();
         get_snaps        
-----------------------------
1 20-JUL-16 07:58:24.869467
2 20-JUL-16 08:10:30.570358
(2 rows)

上面便已經有足夠快照,來列出 Wait Event 報告了。

這個部份,有三種報告模式:
  • sys_rpt(起始快照ID, 末快照ID, 列舉筆數) 用來列舉 wait events
  • sessid_rpt(起始快照ID, 末快照ID, pid) 用來列舉某個 Process ID 活動時造成的 wait events
  • sesshist_rpt(快照ID,pid) 用來列舉指定快照中,紀錄到的某 Process ID 活動
以下列出執行範例,指定當前 Session 的活動:
edb=# SELECT sys_rpt(1,2,5);
                                  sys_rpt                                 
-----------------------------------------------------------------------------
 WAIT NAME                                COUNT      WAIT TIME       % WAIT
---------------------------------------------------------------------------
 db file read                             70         0.078344        61.42
 query plan                               14         0.048646        38.14
 db file extend                           52         0.000559        0.44
(5 rows)

edb=# SELECT sessid_rpt(1,2,pid) FROM pg_stat_activity WHERE pid = pg_backend_pid();
                                            sessid_rpt                                            
-----------------------------------------------------------------------------------------------------
 ID    USER       WAIT NAME                      COUNT TIME(ms)     % WAIT SES % WAIT ALL
---------------------------------------------------------------------------------------------------
 1919 enterprise db file read                   50    0.034929     70.32      70.32
 1919 enterprise query plan                     14    0.014214     28.62      28.62
 1919 enterprise db file extend                 50    0.000528     1.06       1.06
(5 rows)

edb=# SELECT sesshist_rpt(1,pid) FROM pg_stat_activity WHERE pid = pg_backend_pid();
                                                 sesshist_rpt                                                
-----------------------------------------------------------------------------------------------------------------
 ID    USER      SEQ   WAIT NAME                ELAPSED(ms)  File   Name                 # of Blk   Sum of Blks
---------------------------------------------------------------------------------------------------
 1919 enterprise 1     query plan               9            0      N/A                  0          0         
 1919 enterprise 1     query plan               9            0      edb_password_history 0          0         
 1919 enterprise 1     query plan               9            0      edb_password_history 0          0         
 1919 enterprise 1     query plan               9            0      edb_password_history 0          0         
 1919 enterprise 1     query plan               9            0      edb_profile          0          0         
(... 以下略)

註:
除了上述函數觀看 Wait event 之外,EnterpriseDB 裡有提供對應 Oracle 資料庫中 V$SYSTEM_EVENTV$SESSION_WAIT 以及 V$SESSION_WAIT_HISTORY 的 View,分別稱作 edb$system_waits、edb$session_waits 及 edb$session_wait_history,用來觀察當前 Wait event 狀況。相關資訊參考 8.12 Catalog Views 以及 8.11 Event Descriptions


(2) 看總結報告
以下函數,可以指定中長期累積 DRITA 快照報告
edb=# SELECT edbreport(1, 4);\g /path/to/output/file

在 psql 界面下,上面會把報告內容輸出到 /path/to/output/file 所指定檔案位置。

以下列舉出 edbreport(起始快照ID, 末快照ID) 報告內容類型:
Size of the current database
     Tablespace: list, size and owner

Schema: list, size and owner
Top 10 Relations by pages
Top 10 Indexes by pages
Top 10 Relations by DML
DATA from pg_stat_database
DATA from pg_buffercache not included because pg_buffercache is not installed
DATA from pg_stat_all_tables ordered by seq scan
DATA from pg_stat_all_tables ordered by rel tup read
DATA from pg_statio_all_tables
DATA from pg_stat_all_indexes
DATA from pg_statio_all_indexes
System Wait Information
Database Parameters from postgresql.conf

整份報表內容有點長,在此就不提供內容,有興趣可以到使用手冊中查看,並自己試一試。
報表內容描述
Size of the current database
     Tablespace: list, size and owner

Schema: list, size and owner
當前連線資料庫的 database、tablespace、schema 的大小
Top 10 Relations by pages
大小為前十大的資料表格
Top 10 Indexes by pages
大小為前十大的 Index 表
Top 10 Relations by DML
資料更動活動最頻繁的十個資料表格
DATA from pg_stat_database
目前資料庫資訊:當前連線數、交易活動的 Commit/Rollback 次數、硬碟 Blocks 存取次數資訊、Buffer Cache 的 Hit Ratio
DATA from pg_buffercache
列出佔前十多 Buffer Cache 大小的表格
DATA from pg_stat_all_tables ordered by seq scan
依照 Sequential Scan 次數排列的表格列表
DATA from pg_stat_all_tables ordered by rel tup read
依照被撈的資料筆數排列的表格列表(資訊
DATA from pg_statio_all_tables
表格在硬碟上的 Blocks 被讀取的數量的資訊
DATA from pg_stat_all_indexes
Index 被使用的次數資訊
DATA from pg_statio_all_indexes
Index 表在硬碟上的 Blocks 被讀取的數量的資訊
System Wait Information
Wait Events 的類型發生的次數
Database Parameters from postgresql.conf
當前 postgresql.conf 設定檔參數列表

在這裡列出可以注意的幾點:
  • DRITA 報告是針對一個 PostgreSQL Database 收集的,並不是收集整個 PostgreSQL Instance 的資訊。

  • 這份報表,主要收集的是表格與 Index 的資訊

  • 列舉 postgresql.conf 當前參數,可以由以下兩種方式達成
edb=# SELECT name,unit,boot_val,setting,current_setting(name) FROM pg_settings;
edb=# SHOW all;

  • 上面標明紅色的部份「DATA from pg_buffercache not included because pg_buffercache is not installed」,說明 pg_buffercache 這個套件沒有被啟用;需要的話,在收集 DRITA 快照前,先用以下指令,便能夠啟用它:
edb=# CREATE EXTENSION pg_buffercache;

  • 除了 edbreport 函數之外,EDB 再特別對 DRITA 報告內五類資訊,提供能夠單獨取得報告的函數,並且能用分別五個函數去存取:
子報表函數
對應 edbreport 報表部份
stat_db_rpt
DATA from pg_stat_database
stat_tables_rpt
DATA from pg_stat_all_tables ordered by seq scan
DATA from pg_stat_all_tables ordered by rel tup read
statio_tables_rpt
DATA from pg_statio_all_tables
stat_indexes_rpt
DATA from pg_stat_all_indexes
statio_indexes_rpt
DATA from pg_statio_all_indexes

使用方法,可以參考使用手冊


以上大致演練過 DRITA 工具的功能了。最後是清理掉 DRITA 快照資料的方式:
  • 指定清掉某個範圍的 DRITA 快照:
edb=# SELECT purgesnap(1, 2);
             purgesnap            
------------------------------------
 Snapshots in range 1 to 2 deleted.
(1 row)

  • 清除所有 DRITA 快照(重設 DRITA 資料)
edb=# SELECT truncsnap();
      truncsnap
----------------------
 Snapshots truncated.
(1 row)


與  Oracle Statspack / Oracle AWR 的功能相比較,就我目前所知,目前還沒有像 Oracle AWR 一樣,自動產生快照以及設定快照保存策略等功能。有需要的話,就得自己去設置定時收集與清理 DRITA 快照了。


報表內容,目前(9.5 版)與 Oracle 的工具相比,還差一點東西:例如 top sql(吃資源的 SQL 指令)、資料庫參數的使用狀況(例如,Oracle 上能顯示 SGA 及 PGA 的記憶體使用狀況,但在 EDB 裡面沒有這種對等資訊)等;此外, DRITA 功能也沒有紀錄 OS 功能資訊,這需要額外工具才行(例如 Postgres Enterprise ManagerOpen PostgreSQL Monitoring 等)


參考:
使用手冊
其他使用筆記



其他資訊:
在 PostgreSQL 9.6 原生版,將要有內建的 wait event 監控功能,在下面便是一篇相關功能介紹

什麼是Oracle Statspack/Oracle AWR

2016年7月14日 星期四

EDB Backup and Recovery Tool 操作筆記


對 PostgreSQL 進行 Point-in-Time Recovery 備份,若是很多的資料庫要處理,這就會變成一個令人頭昏的大工程。EnterpriseDB 公司的 Backup and Recovery Tool v1.1(EDB-BaRT)是該公司提供來進行資料庫整合管理備份的工具。它主要的功能是用在管理資料庫的全備份(Base Backup),可以有效管理同一個資料庫的多分全備份,並能夠在一處管理多部 PostgreSQL/EnterpriseDB 的資料庫全備份檔案。


該工具為命令列下的工具,可以利用 CRON Job,搭配 BaRT 的 log(會將每次的備份、還原活動紀錄起來),定時進行資料庫全備份,並依照備份時間點,選取適當的備份檔進行還原。


目前 EDB-BaRT v1.1 還不支援管理 Incremental Backup 的功能(也就是,Point-in-Time Recovery),但還是能透過手動加上適當的 recovery.conf 檔案到待還原的全備份中,進行 Point-in-Time Recovery。


系統需求
這個工具支援的是 64 位元版的 RHEL 6.x/7.x,該機器上不見得要安裝 PostgreSQL 資料庫。
而該主機上將會作為資料庫全備份檔案,以及 WAL 交易日誌存放的地方,於是若有多部資料庫要管理,該主機上的儲存空間要準備充足。



安裝 BaRT
BaRT 依賴標準路徑下的 libpq.so,若是安裝 EDB 公司發布的 PostgreSQL distribution,則可以直接由 PostgreSQL 社群維護的 YUM Repository 取得 postgresql9x-libs 的 rpm 安裝檔安裝
[root@bartvm ~]# yum install https://download.postgresql.org/pub/repos/yum/9.5/redhat/rhel-6-x86_64/postgresql95-libs-9.5.3-2PGDG.rhel6.x86_64.rpm

[root@bartvm ~]# rpm -ivh edb-bart-1.1.0-1.rhel6.x86_64.rpm

2016年7月13日 星期三

用 EDB 的 Oracle 相容 DBLink 呼叫 Oracle 上的 stored function

EnterpirseDB 的企業版資料庫是目前對 Oracle 相容性最好的 PostgreSQL 延伸發行版,裡面也提供了在 Oracle 資料庫中,常用的 DBLink 工具的支援。

在原生的 PostgreSQL 已經有對 PostgreSQL 之間的 DBLink;不過,在 EnterpriseDB 企業版中,更特別增加了「對 Oracle」的異質資料庫的 DBLink 內建功能。使的不只在同質資料庫(PostgreSQL)之間有 DBLink,還能跨 EnterpriseDB 與 Oracle ,幫助降低同時使用EnterpriseDB / Oracle 兩種產品時,系統間的整合難度。

不過,對於 EnterpriseDB 對於連到 Oracle 資料庫的 DBLink 支援,畢竟是異質資料庫之間的事情,也不可能是百分之百完全相容的:在基本資料交換上,還能滿足語法一致(用 @ 的語法);不過在更為進階的使用上,就還沒有那麼充分支援。

在這篇練習中,會示範一個稍微進階的 EDB DBLink 用法:在 EDB 上用 DBLink 呼叫遠在 Oracle 上的 Stored Function。

2016年7月12日 星期二

當 pg_basebackup 和 Point-in-Time Recovery 遇到 tablespace ...

在  PostgreSQL 裡面建立 tablespace,能夠把資料庫檔案分到不同目錄下面,便能藉此方便的把不同資料分到不同硬碟上面:
bash-4.1$ mkdir /tmp/space
bash-4.1$ psql -d edb
edb=# show archive_command;
 archive_command   
--------------------
cp %p /tmp/wals/%f
(1 row)

edb=# show data_directory;
data_directory
----------------
/tmp/pitr
(1 row)

edb=# -- 上面列一下環境設定,下面開始設定 tablespace
edb=# create tablespace testsp LOCATION '/tmp/space';
CREATE TABLESPACE
edb=# alter database postgres set tablespace testsp;
ALTER DATABASE
edb=# \c postgres
postgres=# -- 進來放點資料
postgres=# create table test1 AS SELECT *
postgres-#  FROM pg_constraint,pg_class;
SELECT 5070
postgres=# \q
bash-4.1$ ls /tmp/pitr/pg_tblspc/ -l
Total 0
lrwxrwxrwx. 1 enterprisedb enterprisedb 10 2016-07-13 10:28 16385 -> /tmp/space
bash-4.1$ ls /tmp/space -l
Total 4
drwx------. 3 enterprisedb enterprisedb 4096 2016-07-13 10:32 PG_9.5_201510051

然而,在進行資料庫全備份時,遇到 tablespace,會發現得到…不只一個壓縮檔!
bash-4.1$ mkdir /tmp/total
bash-4.1$ pg_basebackup -h localhost -p 5445  -Ft -z -D /tmp/total
NOTICE:  pg_stop_backup complete, all required WAL segments have been archived
bash-4.1$ ls /tmp/total/ -l
Total 6444
-rw-r--r--. 1 enterprisedb enterprisedb 1757338 2016-07-13 10:50 16385.tar.gz
-rw-r--r--. 1 enterprisedb enterprisedb 4835352 2016-07-13 10:50 base.tar.gz
其實這個以數字命名的壓縮檔 16385.tar.gz,就是 tablespace 資料夾裡面的資料打包起來的。而這個數字則是這個 tablespce 的 OID。

將打包起來的資料庫另外找一處解開:
先解開 base.tar.gz,檢查一下 pg_tblspc/ 目錄
bash-4.1$ mkdir /tmp/restore
bash-4.1$ chmod 700 /tmp/restore
bash-4.1$ tar zxf /tmp/total/base.tar.gz -C /tmp/restore
bash-4.1$ ls /tmp/restore/pg_tblspc/ -l
Total 0
可以發現和前面不一樣:裡面沒有任何連結。

所以現在把 tablespace 再找一處放好,並到 pg_tblspc/ 目錄下作一個連結:
bash-4.1$ mkdir /tmp/restore_spc
bash-4.1$ chmod 700 /tmp/restore_spc/
bash-4.1$ tar zxf /tmp/total/16385.tar.gz -C /tmp/restore_spc
bash-4.1$ ls /tmp/restore_spc -l
Total 4
drwx------. 3 enterprisedb enterprisedb 4096 2016-07-13 10:32 PG_9.5_201510051
可見,這個檔案解開後和原先的目錄內容一樣。

那麼,就在 pg_tblspc/ 裡面建立連結:
bash-4.1$ ln -s /tmp/restore_spc/ /tmp/restore/pg_tblspc/16385
值得注意的是,pg_tblspc/ 下的連結檔案名稱要和壓縮檔的數字(OID)一樣才行。

接著繼續資料庫的 Point-in-Time Recovery 就可以了。
bash-4.1$ # 先讓我把現在的 instance 停止
bash-4.1$ pg_ctl -D /tmp/pitr stop
bash-4.1$ # 把舊的 Instance 的 pg_xlog/ 裡面的東西,
bash-4.1$ # 複製到新的 Instance 裡面,盡量回復資料
bash-4.1$ rm -rf /tmp/restore/pg_xlog/
bash-4.1$ cp /tmp/restore/pg_xlog/* /tmp/restore/pg_xlog/
bash-4.1$ # 設定 Point-in-Time Recovery
bash-4.1$ vi /tmp/restore/recovery.conf
restore_command = 'cp /home/cchsu/pgsql/wala95/%f %p'
bash-4.1$ pg_ctl -D /tmp/restore start

所以 Point-in-Time Recovery 的操作,只要將相關的 tablespace 設置回來,接著要進行 Point-in-Time Recovery 就不是問題了:將全備份的還原檔都佈署完畢, WAL 交易日誌重演就能正常進行了

2016年7月1日 星期五

從 EnterpriseDB 到 Oracle 資料庫的 Database Link 設定

DBLink 是一種資料庫之間連線、交換資料的工具,不管是在常見的 Oracle 資料庫之間,或是原生的 PostgreSQL 之間,都有提供這樣的功能;尤其以 Oracle 資料庫的 DBLink 最常耳聞其應用。

對於從 Oracle 系統逐漸轉向兼用 EnterpriseDB 的用戶來說,時常會需要維持既有的系統間資料交換架構,因此而產生了 Oracle 與 EnterpriseDB 之間,異質資料庫間的 DBLink 連線需求。而 EnterpriseDB 的 Oracle 資料庫相容功能內,就提供了可以連接到 Oracle 資料庫的 DBLink 功能,而且操作上,相當接近 Oracle 的操作方式。在這篇演練中,即演習這樣的一個功能。