MathJax

MathJax-2

MathJax-3

Google Code Prettify

置頂入手筆記

EnterproseDB Quickstart — 快速入門筆記

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

顯示具有 PostgreSQL延伸 標籤的文章。 顯示所有文章
顯示具有 PostgreSQL延伸 標籤的文章。 顯示所有文章

2020年1月6日 星期一

觀察 GPDB 6.x 開源版的 Primary/Mirror 同步

從 Greenplum 6.0 開始,Greenplum 官方社群提供社群版 RPM 安裝檔(DEB 安裝檔倒是很久以前就一直有提供了~)。
另外,Greenplum 6.0 之後,正式根基於 PostgreSQL 9.4 系列,與之前版本都只有 PostgreSQL 8.x 相比,差異很多了~因此值得去了解一下。
近期釋出的是 6.2.1 版,由 Pivotal 公司發行的企業版 Pivotal Greenplum 與開源的 Greenplum 功能差異可以參考 Release Note:主要是一些進階功能(如,GPCC、GPTEXT)不提供。
這邊用 LXC 啟動一個 GPDB 的 1 Master + 2 Segment 叢集。用來簡單安裝,並觀察一下下 Streaming Replication 的狀態。

2019年3月24日 星期日

從 Postgres 11.2 對 Greenplum 5.17.0 作 Materialized View

好久以前有紀錄從 Postgres 開 postgres_fdw 連線到 Greenplum 的筆記,前一陣子又看到 Materialized Views and Foreign Data Wrappers | EnterpriseDB 這篇文章,拿來試著對 Greenplum 試試看~

在 Postgres 11 的 Materialized View,進行刷新(REFRESH MATERILAIZED VIEW)會把資料整組清掉,重新查詢並把結果拉回來快取。

現在,要透過 Foreign Data Wrapper,搭配 Materialized View,從 Greenplum(基於 PostgreSQL 的延伸專案)把查詢拉到 Postgres 裡面。

2017年7月23日 星期日

在 Oracle XE 設定連線到 EDB Postgres 的 ODBC DBLink

很多人好像很「想要」從 Oracle 資料庫用 DBLink 連到其他異質資料庫,例如 EDB 的 PostgreSQL 企業版。雖然以前已經有幾篇很清楚的文章了,但是過程中還是會遇到諸多麻煩 ... 這裡還是把坑踩一下好了...

2016年12月8日 星期四

mongo_fdw 筆記

MongoDB 資料庫是現在知名的 NoSQL 資料庫,他讓程式開發部門「避開」與資料庫管理人員申請資料欄位的往返溝通,直接塞想要的資料存起來。聽說這在作為網頁後端資料庫很方便。
要是想要把這裡面的資料拉出來分析,就稍微不方便一些,因為他的資料都塞在一份份的 JSON 檔案裡面,要單獨取出大量某個「欄位」(JSON Key)的資料作運算,分析,就有點不方便,尤其要進行普通的關聯式資料庫的 JOIN,尤其不容易。
PostgreSQL 提供的 Foreign Data Wrapper 中,有跨接 MongoDB 的套件,叫做 mongo_fdw,是一個由 EnterpriseDB 公司維護的開源專案。這個模組能夠對 MongoDB 的 JSON 資料,取過來 PostgreSQL 裡面,當成一般表格處理,便能夠和現有資料庫的資料,進行進一步的分析。

以下將示範 mongo_fdw 的套件使用流程。

2016年11月16日 星期三

檢視當前的 PostgreSQL Log 的偷懶 Script

每次要一直找新的 PostgreSQL Log 檔名有點麻煩,在這裡作個很簡單的紀錄 ...
把下面這個 Shell Script 的資訊 PGUSER(登入帳號)、PGDATA(資料目錄)、PGDATABASE(登入的資料庫)然後執行,可以比較簡單的找出 Log 檔查看。
#!/bin/bash


PGUSER=enterprisedb
PGDATA=/opt/PostgresPlus/9.5AS/data
PGDATABASE=edb


LATEST_LOG="SELECT pg_ls_dir
 FROM pg_ls_dir('pg_log')
 ORDER BY (pg_stat_file('pg_log/' || pg_ls_dir)).modification DESC
 LIMIT 1;"


CURRENT_PGLOG_FILE=(`psql -U PGUSER -d "${PGDATABASE}" -c "${LATEST_LOG}" --tuples-only`)


tail -f $PGDATA/pg_log/$CURRENT_PGLOG_FILE

顯然,這個 Script 只有在資料庫有在運作的時候才有用處,資料庫要是是關掉的,這就派不上用場了。當然也可以把 Script 的 LATEST_LOG 變數換成在 Shell 裡面列舉最新的 Log 檔案就好了。

參考資料:


2016年5月8日 星期日

PostgreSQL 9.x 連到 Greenplum

Greenplum 基於 PostgreSQL 8.x,照理說要很像 PostgreSQL;那麼兩類資料庫要跨接時,能怎麼做?目前我找到的方式,有使用 DBLink,或是用 postgres_fdw 這個 Foreign Data Wrapper 套件。

使用 DBLink 連到 Greenplum,找到的都是實驗性質的使用。所以在此我用 Foreign Data Wrapper 接到 Greenplum。

Foreign Data Wrapper 是一個 PostgreSQL 的擴充套件(Extension),所以要使用  Foreign Data Wrapper,要先在所連線的資料庫裡面建立 Extension。例如,以下在 postgres 下為例:

postgres=# CREATE EXTENSION postgres_fdw;

若想要之後每次都產生 database 時,都自動加上這個套件的話,則將該套件建立到 template1:

[postgres ~]$ psql -d template1 -c 'create extension postgres_fdw;'

接著便開始要進行設定。

連線設定,要先使用 CREATE SERVER 指令,使用連線字串設定方式設定連線到 Greenplum 的資訊。在此 Greenplum 的 入口 IP (Master Instance)為 192.168.238.152,port 為 5432:
postgres=# CREATE SERVER gp_db
postgres-# FOREIGN DATA WRAPPER postgres_fdw
postgres-# OPTIONS (host '192.168.238.152', port '5432', dbname 'fdwtest');
CREATE SERVER

接著設定登入帳密:值得注意的是,一般帳密都是設在連線字串裡面,不過 Foreign Data Wrapper 則是另外用 CREATE USER MAPPING 指令設定的:

postgres=# CREATE USER MAPPING FOR user4gpfdw SERVER gp_db
postgres-# OPTIONS (user 'fdwuser',password 'fdwuser');
CREATE USER MAPPING

到目前為止,Foreign Data Wrapper 的資訊已經建立完畢了。

再來便是要在 Greenplum 上面建立一個可以連線的測試資料表格。
在 Greenplum 上:

gpadmin=# \c fdwtest brandon
You are now connected to database "test" as user "brandon".
fdwtest=# SET search_path TO testing;
SET
fdwtest=# CREATE TABLE productest
fdwtest-# (name VARCHAR(40), prod_id INTEGER)
fdwtest-# DISTRIBUTED BY (prod_id);
CREATE TABLE

接著,回到 PostgreSQL 上,建立一個上面已經存在於 Greenplum 上的資料表:

postgres=# CREATE FOREIGN TABLE foreigntab(
postgres(# name TEXT,
postgres(# id INTEGER)
postgres-# SERVER gp_db
postgres-# OPTIONS (schema_name 'testing', table_name 'productest');
CREATE FOREIGN TABLE

可以在 Greenplum 上檢查一下連線資訊:

gpadmin=# SELECT datname,usename,client_addr,application_name
gpadmin=#  FROM pg_stat_activity;
  datname | usename |  client_addr   | application_name
 ---------+---------+----------------+------------------
  gpadmin | brandon |                | psql
  fdwtest | fdwuser | 192.168.62.178 | postgres_fdw
  fdwtest | brandon | 192.168.62.178 | psql
(3 rows)

以上可見 postgres_fdw 連線進入的資訊,表示 postgres_fdw 有成功連線到 Greenplum 。

使用會發現,要直接輸入資料,會出現下列錯誤:
Greenplum Database does not support REPEATABLE READ transactions

所以要指定 transaction level,再輸入資料,才能避免上述錯誤:
postgres=# START TRANSACTION ISOLATION LEVEL SERIALIZABLE;
START TRANSACTION
Time: 0.331 ms

postgres*=# INSERT INTO foreigntab VALUES ('rastberry',101);
INSERT 0 1

Time: 220.690 ms
postgres*=# -- 這時資料輸入進去了。 
postgres*=# -- 從 PostgreSQL裡面檢查一下資料
postgres*=# SELECT * FROM foreigntab;
    name   | prod_id 
-----------+---------
 grava     |     100
 pen       |       1
 rastberry |     101
 pencil    |       2
(4 rows)

Time: 169.112 ms
postgres*=# END;
COMMIT

Time: 110.171 ms

要透過 postgres_fdw 存取 Greenplum 上的資料,都需要向上面所示,使用 SERIALIZABLE 的交易等級才行。

現在到 Greenplum 上直接檢查,也會看到剛剛從 PostgreSQL 輸入進來的資料:

gpadmin=# SELECT * FROM productest;
    name   | prod_id 
-----------+---------
 pen       |       1
 pencil    |       2
 grava     |     100
 rastberry |     101
(4 rows)


[Update 20190325] 如果要用 IMPORT FOREIGN SCHEMA 簡化匯入外部表的方式,也需要指定 isolation level。跟上面一樣,CREATE SERVER 以及 CREATE USER MAPPING 不用包在這個 Transaction 裡面(這邊延續上面的環境~)
postgres=# CREATE SCHEMA gptables;
CREATE SCHEMA
postgres=# BEGIN;
BEGIN
postgres=# SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SET
postgres=# IMPORT FOREIGN SCHEMA testing LIMIT TO (productest) FROM SERVER gp_db INTO gptables;
IMPORT FOREIGN SCHEMA
postgres=# COMMIT;
COMMIT
postgres=# 



參考資料:

這是一個 postgres_fdw 的操作介紹
A look at Foreign Data Wrappers Craig Kerstiens 
以下是此次實作中,用到的 Greenplum 資料
What are the Table Distribution Policy in Greenplum - A Web Portal for Greenplum Database Professionals!
SET TRANSACTION | Pivotal Greenplum Database Docs