在 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 交易日誌重演就能正常進行了
沒有留言:
張貼留言