備份與恢復:Polardb資料庫資料基於時間點恢復

jaymarco發表於2020-11-12

一、前言

任何系統都有崩潰的可能,任何資料庫產品的備份工作的重要性毋庸置疑。透過備份和恢復來保護資料,避免資料丟失,在發生災難或人為誤操作的情況下,能夠進行恢復日常最重要的工作。不僅要保證能夠成功備份,還要保證備份資料能夠恢復,如果能在更短的時間進行恢復更是錦上添花。此方案是 Polardb-O 資料庫採用全量備份和 PG_WAL 日誌來實現基於時間線的恢復工作。
二、環境資訊

2.1 主機資訊

IP地址

用途

說明

192.168.58.134

備份庫


192.168.58.131

業務庫

三、恢復過程

業務資料庫人為誤操作導致庫表資料丟失問題,因此需要藉助備份庫中的基準備份和增量PG_WAL歸檔日誌來實現基於時間線資料恢復。

3.1 資料庫備份

3.1.1 歸檔配置

1 、建立歸檔目錄

# su - polardb

$ mkdir   -p /home/{backups,archive_wals}

 2 、開啟歸檔引數

alter system set wal_level = archive;

alter   system set wal_keep_segments=10;

alter   system set archive_mode = on;

alter   system set archive_command  ='test ! -f   /home/archive_wals/%f && pfs cp -S disk /vda/data/pg_wal/%f   /home/archive_wals/%f   ';

select   pg_reload_conf();

3 、啟動資料庫

# su - polardb

$   pg_ctl restart -m fast

  說明:如果當前資料庫已經開啟歸檔,就可以忽略此部分操作。直接進入下面操作。

 3.1.2 基礎備份

1、   使用polar_basebackup 工具建立基礎備份

#   su – polardb

# 按日期建立備份路徑

$mkdir   -p  /home/backups/0917

$ polar_basebackup   -D /home/backups/0917/base -X stream --progress -v

如下結果說明基礎備份完成

154279/154279   kB (100%), 2/2 tablespaces                                        

polar_basebackup: write-ahead log   end point: 2/C00081C0

polar_basebackup: waiting for   background process to finish streaming ...

polar_basebackup: base backup completed

 2、   檢視基礎備份

$ cat /home/backups/0917/base/backup_label

START   WAL LOCATION: 2/C00080B8 (file 000000010000000200000003)

CHECKPOINT   LOCATION: 2/C00080F0

BACKUP   METHOD: streamed

BACKUP   FROM: master

START   TIME: 2020-09-17 14:34:55 UTC

LABEL: pg_basebackup   base backup

START   TIMELINE: 1

 3.1.3 增量備份

開啟了歸檔後,PG_WAL日誌檔案寫滿後,會自動將日誌歸檔到本地目錄/home/archive_wals。

# ls -lrt  /home/archive_wals

total   6291456

-rw-------   1 polardb polardb 1073741824 Sep 16 14:28 000000010000000100000002

-rw-------   1 polardb polardb 1073741824 Sep 16 14:44 000000010000000100000003

-rw-------   1 polardb polardb 1073741824 Sep 16 14:47 000000010000000200000000

-rw-------   1 polardb polardb 1073741824 Sep 16 21:25 000000010000000200000001

-rw-------   1 polardb polardb 1073741824 Sep 17 14:33 000000010000000200000002

-rw-------   1 polardb polardb 1073741824 Sep 17 14:53 000000010000000200000003

3.2 資料庫恢復

3.2.1 前置準備

準備好一套需要恢復資料庫的新主機,並安裝相應的polardb-o資料庫軟體與PFS磁碟管理軟體。

1、安裝好polardb和PFS軟體

# rpm -qa|grep alio

PolarDB-O-0200-2.0.0-20200914083756.alios7.x86_64

t-polarstore-pfsd-san-1.1.41-20200909132342.alios7.x86_64

2、使用者環境變數配置

新增polardb使用者環境變數.bash_profoke,然後執行soure ~/.bash_profile生效當前使用者變數配置。

export PGPORT=5432

export PGDATA=/home/polardb_data

export.utf8

export   PGHOME=/usr/local/polardb_o_20200914

export   PFSHOME=/usr/local/polarstore/pfsd

export PFSDISK=vda

export PFSDIR=/vda/data/

export   LD_LIBRARY_PATH=$PGHOME/lib:$LD_LIBRARY_PATH

export   PATH=$PGHOME/bin:$PFSHOME/bin/:$PATH

export PGHOST=$PGDATA

export   PGUSER=polardb 

export   PGDATABASE=polardb

3、啟動PFS程式

# ps -ef |grep pfsd|grep -v grep

root      2426       1 99 16:31 ?        02:00:02   /usr/local/polarstore/pfsd/bin/../bin/pfsdaemon -p vda -c   /usr/local/polarstore/pfsd/bin/../conf/pfsd_logger.conf


如果沒有啟動需要手工拉起 pfsd進行

sudo   /usr/local/polarstore/pfsd/bin/start_pfsd.sh -p vda

4、檢查PFS檔案系統是否具備條件

$ sudo /usr/local/bin/ pfs -C disk ls /vda/

  File    1     4194304           Wed Aug 19 20:25:25 2020  .pfs-paxos

  File    1     1073741824        Wed Aug 19 20:25:26 2020  .pfs-journal

   Dir    1     0                 Wed Sep 16 19:43:29   2020  polar_data

這裡的儲存目錄是 /vda/polar_data/

5、將全量基線備份與增量pg_wal日誌上傳到需要恢復的伺服器

s cp   -r /home/backups/0917/base/  192.168.58.131:/home/recover_dir

scp -r   /home/archive_wals/  192.168.58.131:/home/recover_dir

  說明:確認以上準備工作完成後,就可以進行下面的資料庫恢復工作。

3.2.2 庫恢復

1.    將pfs檔案上面的資料檔案複製到PFS

# su   – polardb

$sudo   /usr/local/bin/pfs cp -r -S disk /home/recover_dir /base/shared/   /vda/polar_data/

如下日誌說明複製成功

pfs tool cmd   record:cp -r -S disk   /home/recover_dir/base/shared/   /vda/polar_data/

[PFS_LOG] Sep 17   15:06:12.101890 INF [40734] pfs build   version:libpfs_version_("polarstore-build-desc-3213c11-Wed Sep  9 13:24:13 CST 2020")

[PFS_LOG] Sep 17   15:06:12.102101 INF [40734] pid: 39652, caller: -bash 

[PFS_LOG] Sep 17   15:06:12.102145 INF [40734] pid: 39650, caller: sshd: root@pts/1      

[PFS_LOG] Sep 17   15:06:12.102184 INF [40734] pid: 1003, caller: /usr/sbin/sshd -D 

......

copy file from   /home/recover_dir/base/shared//pg_xact/0000   to /vda/polar_data///pg_xact/0000 succeeded

copy file from   /home/recover_dir/base/shared//pg_multixact/members/0000   to /vda/polar_data///pg_multixact/members/0000 succeeded

copy file from   /home/recover_dir/base/shared//pg_multixact/offsets/0000   to /vda/polar_data///pg_multixact/offsets/0000 succeeded

copy file from   /home/recover_dir/base/shared//polar_non_exclusive_backup_label   to /vda/polar_data///polar_non_exclusive_backup_label succeeded

  2.    檢查pfs檔案目錄內容

$ sudo   /usr/local/bin/pfs  -C disk ls   /vda/polar_data

   Dir    1     256               Thu Sep 17 15:06:13 2020  pg_wal

   Dir    1     768               Thu Sep 17 15:06:32 2020  base

   Dir    1     9344              Thu Sep 17 15:06:36 2020  global

   Dir    1     0                 Thu Sep 17 15:06:36   2020  pg_tblspc

   Dir    1     0                 Thu Sep 17 15:06:36   2020  pg_logindex

   Dir    1     0                 Thu Sep 17 15:06:36   2020  pg_twophase

   Dir    1     128               Thu Sep 17 15:06:36 2020  pg_xact

   Dir    1     0                 Thu Sep 17 15:06:36   2020  pg_commit_ts

   Dir    1     256               Thu Sep 17 15:06:36 2020  pg_multixact

   Dir    1     0                 Thu Sep 17 15:06:36   2020  pg_csnlog

   Dir    1     0                 Thu Sep 17 15:06:36   2020  pg_replslot

  File    1     226   Thu Sep 17 15:06:36 2020  polar_non_exclusive_backup_labe

  3.    恢復本地資料目錄

$ cp   -r  /home/recover_dir/base     /home/polardb_data

$chmod 0700   /home/polardb_data

  4.    將歸檔檔案手工複製到PFS

1 )、如下是增量日誌檔案,需要複製到PFS中,用於增量資料恢復

$ ls   -lrt /home/recover_dir/archive_wals/

total   6291456

-rw-------   1 polardb polardb 1073741824 Sep 17 15:00 000000010000000100000002

-rw-------   1 polardb polardb 1073741824 Sep 17 15:00 000000010000000100000003

-rw-------   1 polardb polardb 1073741824 Sep 17 15:01 000000010000000200000000

-rw-------   1 polardb polardb 1073741824 Sep 17 15:01 000000010000000200000001

-rw-------   1 polardb polardb 1073741824 Sep 17 15:01 000000010000000200000002

-rw-------   1 polardb polardb 1073741824 Sep 17 15:02 000000010000000200000003

 

2 )、複製檔案到PFS

/usr/local/bin/pfs   cp -D disk /home/recover_dir/archive_wals//000000010000000100000002   /vda/polar_data/pg_wal/

/usr/local/bin/pfs   cp -D disk /home/recover_dir/archive_wals//000000010000000100000003   /vda/polar_data/pg_wal/

/usr/local/bin/pfs   cp -D disk /home/recover_dir/archive_wals//000000010000000200000000   /vda/polar_data/pg_wal/

/usr/local/bin/pfs   cp -D disk /home/recover_dir/archive_wals//000000010000000200000001   /vda/polar_data/pg_wal/

/usr/local/bin/pfs   cp -D disk /home/recover_dir/archive_wals//000000010000000200000002   /vda/polar_data/pg_wal/

/usr/local/bin/pfs   cp -D disk /home/recover_dir/archive_wals//000000010000000200000003   /vda/polar_data/pg_wal/

 

3 )、檢查日誌是否同步到PFS

$ sudo   /usr/local/bin/pfs -C disk ls    /vda/polar_data/pg_wal/

   Dir    1     0                 Thu Sep 17 18:10:41   2020  archive_status

  File    1     1073741824        Thu Sep 17 18:55:07 2020  000000010000000200000003

  File    1     1073741824        Thu Sep 17 18:54:20 2020  000000010000000100000002

  File    1     1073741824        Thu Sep 17 18:54:32 2020  000000010000000100000003

  File    1     1073741824        Thu Sep 17 18:54:43 2020  000000010000000200000000

  File    1     1073741824        Thu Sep 17 18:54:49 2020  000000010000000200000001

    F ile  1     1073741824        Thu Sep 17 18:54:57 2020  000000010000000200000002

  5.    配置檔案修改postgresql.conf

修改如下兩處配置引數檔案

修改磁碟路徑修改成 /vda/polar_data

polar_datadir='/vda/polar_data'

archive_command='test   ! -f /home/archive_wals/%f && pfs cp -S disk   /vda/polar_data/pg_wal/%f    /home/archive_wals /%f'

 

說明:/home/polardb/archive_wals 此目錄需要提前建立好。

6.    基於時間點增量恢復配置

需要在$PGDATA目錄下新增恢復配置檔案recovery.conf,並指定恢復時間點,修改引數recovery_target_time填寫恢復到某個時間點。

  $ vi / home/polardb_data/recovery.conf

restore_command   = ''

recovery_target_time   = '17-SEP-20 14:48:11.0533 +08:00'

7、庫恢復

1 、啟動資料庫,開始恢復

$ pg_ctl   start

資料庫啟動開始進行恢復,一半恢復一半資料庫會停止恢復,看到如下日誌。

 

2 、登入資料庫psql,執行 resume操作

polardb=#   select  pg_wal_replay_resume() ;

直接完語句後,需要等一段時間才能完成恢復。

 

3 、確認資料庫是否恢復完成

polardb=#   select pg_is_in_recovery();

 pg_is_in_recovery

-------------------

 f

查詢recovery函式狀態為f說明已經恢復成功。f代表主庫,t代表備庫。

 



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28833846/viewspace-2733771/,如需轉載,請註明出處,否則將追究法律責任。

相關文章