磐维数据库,简称"PanWeiDB"。是中国移动信息技术中心首个基于中国本土开源数据库打造的面向ICT基础设施的自研数据库产品。其产品内核能力基于华为openGauss开源软件,并进一步提升了系统稳定性。
本文将指导当磐维数据库中存在自定义表空间的情况下如何进行物理备份。
1. 概述
在panweidb中,比较常用的物理备份工具是gs_basebackup和gs_probackup,后者的功能相对更加完善一些。对于表空间,panweidb自带两个默认表空间pg_default和pg_global,pg_default位于数据目录的base文件夹用于存放业务用户创建的对象和数据,pg_global主要存放全局的系统对象。在业务场景下,磁盘IO能力至关重要,数据访问效率会直接影响用户体验,高速磁盘在物理层面可以提升数据扫描效率、优化sql执行速率,将数据放在高速高质量的磁盘上也是常用优化手段之一。
简言之,如果默认的表空间磁盘IO能力不能完全满足业务需求,可以通过自定义表空间将需要提升访问效率的对象和数据移存到高速磁盘来提高吞吐。本文主要测试如何在有自定义表空间存在的数据库进行物理备份与恢复以及需要注意的点。
2. 环境准备
- 系统:centos7
- 数据库版本:panweidb 1.0
- 数据库安装目录:/database/panweidb
- 架构:单机
3. gs_probackup工具介绍
4. 实践测试
1.创建自定义表空间my_tablespace
postgres=# create tablespace my_tablespace location '/data/pw';
CREATE TABLESPACE
2.在my_tablespace中新建测试表t
postgres=# create table t(id int) tablespace my_tablespace;
CREATE TABLE
postgres=# insert into t values(1),(2);
INSERT 0 2
postgres=# \d+ t
Table "public.t"
Column | Type | Modifiers | Storage | Stats target | Description | Attalias
--------+---------+-----------+---------+--------------+-------------+----------
id | integer | | plain | | | id
Has OIDs: no
Tablespace: "my_tablespace"
Options: orientation=row, compression=no, fillfactor=80
3.物理全备(不带参数-E)
gs_probackup init -B /backup/probackup/ gs_probackup add-instance -B /backup/probackup/ --instance=panweidb -D /database/panweidb/data gs_probackup backup -B /backup/probackup/ --instance=panweidb -b full
Tips:
- 备份操作需要在主库进行,且主库数据库服务正常运行(可连接)
- 当数据量比较大时,需调整参数wal_sender_timeout、session_timeout、–rw-timeout的值防止备份中途超时退出
- 适当调大wal_keep_segments的值确保需要的wal文件不被提前删除
- 如需增量备份,需要设置参数enable_cbm_tracking = on
- 当存在用户自定义表空间时,备份的时候要加上–external-dirs参数(-E,多个表空间用冒号分隔)
4.物理恢复
首先需要关闭数据库服务,移除当前数据目录,然后进行restore
gs_om -t stop
mv /database/panweidb/data /database/panweidb/data_bak
gs_probackup restore -B /backup/probackup/ --instance=panweidb -i xxx LOG: Restore begin. LOG: check tablespace directories of backup SAXVTP ERROR: restore tablespace destination is not empty: "/data/pw"
可以发现,当我们在使用gs_probackup进行物理备份时,如果不带自定义表空间相关参数(-E),在恢复时仍然需要验证自定义表空间目录为空,所以这里的判断就是一个很冗余的设计,因为如果确实没有将自定义表空间的数据进行备份,那么单纯地备份一个目录链接还会影响恢复操作!可以将该目录移除规避报错:
mv /data/pw /data/pw_bak
(验证不带参数’-E’的情况下是否备份了数据)
5.启库验证
gs_ctl start -D $PGDATA gsql -d postgres -p 17700 -r
postgres=# \dt
List of relations
Schema | Name | Type | Owner | Storage
--------+------+-------+-------+------------------------------------------------
public | t | table | omm | {orientation=row,compression=no,fillfactor=80}
(1 row)
postgres=# select * from t;
ERROR: could not open file "pg_tblspc/78372/PG_9.2_201611171_dn_6001/20538/78376": No such file or directory
上面证明了如果不带-E参数确实会导致自定义表空间的数据不被备份,但是会备份自定义表空间的目录名和相关的对象名,简单来说,全备不加-E参数时仍会备份自定义表空间的相关结构,但不含任何数据,当把/data/pw_bak改回原来的/data/pw后数据便可以正常抓到了。
mv /data/pw_bak /data/pw
postgres=# select * from t;
id
----
1
2
(2 rows)
6.备份自定义表空间
gs_probackup backup -B /backup/probackup/ --instance=panweidb -b full -E /data/pw
查看物理备份目录,多出的文件夹external_directories存储数据目录以外的数据(包括自定义表空间):
-rw------- 1 omm dbgrp 1121926 Mar 26 14:08 backup_content.control -rw------- 1 omm dbgrp 693 Mar 26 14:08 backup.control drwx------ 27 omm dbgrp 4096 Mar 26 14:08 database drwx------ 3 omm dbgrp 26 Mar 26 14:07 external_directories -rw------- 1 omm dbgrp 3281504 Mar 26 14:08 page_header_map
7.恢复验证
操作前需要先关库并移除当前数据目录,恢复操作同样会验证原本的自定义表空间目录为空(如果自定义表空间目录不为空脚本是不会直接把备份的数据放进去,防止覆盖等操作导致数据丢失)
mv /data/pw /data/pw_bak gs_probackup restore -B /backup/probackup/ --instance=panweidb -i xxx
当然,如果需要对自定义表空间替换目录位置可以使用–tablespace-mapping(-T)和–external-mapping来映射新目录,如果是单纯的外部目录只需要设定–external-mapping参数即可:
gs_probackup restore -B /backup/probackup/ --instance=panweidb -i xxx --tablespace-mapping=/data/pw=/data/pw_new --external-mapping=/data/pw=/data/pw_new
postgres=# \db
List of tablespaces
Name | Owner | Location
---------------+-------+----------------
my_tablespace | omm | /data/pw_new
pg_default | omm |
pg_global | omm |
5. 总结
当自定义表空间存在时,使用gs_probackup进行全备如果不加参数-E,并不会备份自定义表空间,但是会备份自定义表空间目录名(恢复时验证自定义表空间为空),所以往往需要加上-E参数,并在恢复时选择置空原自定义表空间目录还是重映射,从而实现自定义表空间的备份恢复。




