首页 > 数据库 > 国内数据库 > 备份与恢复:Polardb数据库数据基于时间点恢复
一、前言
任何系统都有崩溃的可能,任何数据库产品的备份工作的重要性毋庸置疑。通过备份和恢复来保护数据,避免数据丢失,在发生灾难或人为误操作的情况下,能够进行恢复日常最重要的工作。不仅要保证能够成功备份,还要保证备份数据能够恢复,如果能在更短的时间进行恢复更是锦上添花。此方案是
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/,如需转载,请注明出处,否则将追究法律责任。