MathJax

MathJax-2

MathJax-3

Google Code Prettify

置頂入手筆記

EnterproseDB Quickstart — 快速入門筆記

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

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 交易日誌重演就能正常進行了

沒有留言:

張貼留言