news 2026/5/30 8:12:57

pg_basebackup备份恢复(带自定义表空间)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
pg_basebackup备份恢复(带自定义表空间)

环境:
OS:Centos 7
DB:13.8

#####################################创建自定义表空间##############################
1.创建表空间自定义目录
su - postgres
mkdir -p /opt/pg13/mytps

2.创建表空间
postgres=# create tablespace hxltps location '/opt/pg13/mytps';
CREATE TABLESPACE

这个时候在pg_tblspc目录有个符号链接
[postgres@host134 pg_tblspc]$ pwd
/opt/pg13/data/pg_tblspc
[postgres@host134 pg_tblspc]$ ls -al
total 4
drwx------ 2 postgres postgres 19 Oct 26 09:08 .
drwx------ 19 postgres postgres 4096 Oct 26 00:00 ..
lrwxrwxrwx 1 postgres postgres 15 Oct 26 09:08 32780 -> /opt/pg13/mytps


并将该表空间权限赋予特定用户
postgres=# GRANT CREATE ON TABLESPACE hxltps TO hxl;
GRANT


或是修改数据库的默认表空间
CREATE DATABASE db_test owner hxl;
ALTER DATABASE db_test SET TABLESPACE hxltps;

4.登录并创建表

[postgres@host134 pg_wal]$ psql -h 192.168.1.134 -U hxl -d db_test -p15432 db_test=> create table tb_mytps(i int,name varchar(32)) tablespace hxltps; CREATE TABLE insert into tb_mytps(i,name) values(1,'name1'); insert into tb_mytps(i,name) values(2,'name2'); insert into tb_mytps(i,name) values(3,'name3'); insert into tb_mytps(i,name) values(4,'name4'); insert into tb_mytps(i,name) values(5,'name5'); insert into tb_mytps(i,name) values(6,'name6'); insert into tb_mytps(i,name) values(7,'name7'); insert into tb_mytps(i,name) values(8,'name8'); insert into tb_mytps(i,name) values(9,'name9'); insert into tb_mytps(i,name) values(10,'name10');

5.查看已有的表空间

postgres=# select * from pg_tablespace; oid | spcname | spcowner | spcacl | spcoptions -------+------------+----------+--------------------------------------+------------ 1663 | pg_default | 10 | | 1664 | pg_global | 10 | | 32780 | hxltps | 10 | {postgres=C/postgres,hxl=C/postgres} | (3 rows) 查看表空间对应的路径 postgres=# \db+ List of tablespaces Name | Owner | Location | Access privileges | Options | Size | Description ------------+----------+-----------------+---------------------+---------+---------+------------- hxltps | postgres | /opt/pg13/mytps | postgres=C/postgres+| | 0 bytes | | | | hxl=C/postgres | | | pg_default | postgres | | | | 31 MB | pg_global | postgres | | | | 559 kB | (3 rows)

#####################################备份数据库#######################################

su - postgres
[postgres@host134 pg_backup]$ mkdir -p /tmp/pg_backup/mybak
[postgres@host134 pg_backup]$ pg_basebackup -D /tmp/pg_backup/mybak -Ft -Pv -U postgres -h 192.168.1.134 -p15432

查看备份文件
[postgres@host134 mybak]$ ls -al
total 48824
drwxrwxr-x 2 postgres postgres 80 Oct 26 09:34 .
drwxrwxr-x 4 postgres postgres 34 Oct 26 09:33 ..
-rw------- 1 postgres postgres 10752 Oct 26 09:34 32780.tar
-rw------- 1 postgres postgres 178483 Oct 26 09:34 backup_manifest
-rw------- 1 postgres postgres 33021952 Oct 26 09:34 base.tar
-rw------- 1 postgres postgres 16780288 Oct 26 09:34 pg_wal.tar

可以看到这里多出了一个压缩包文件32780.tar,该文件就是表空间对应的备份文件

查看里面的内容:
[postgres@host134 mybak]$ tar -tvf 32780.tar
drwx------ postgres/postgres 0 2022-10-26 09:18 PG_13_202007201/
drwx------ postgres/postgres 0 2022-10-26 09:18 PG_13_202007201/16385/
-rw------- postgres/postgres 8192 2022-10-26 09:34 PG_13_202007201/16385/32781


说明:
解压base.tar包会有该文件tablespace_map,文件内容如下:
[postgres@host134 data]$ more tablespace_map
32780 /opt/pg13/mytps

#########################################恢复##########################################

1.停掉当前数据库
su - postgres
[postgres@host134 pg_backup]$ pg_ctl -D /opt/pg13/data -l /opt/pg13/log/postgres.log stop -m fast
waiting for server to shut down.... done
server stopped


2.删除data目录和归档目录,以及表空间目录
[postgres@host134 pg13]$ cd /opt/pg13
[postgres@host134 pg13]$ mv data bakdata
[postgres@host134 pg13]$ mv archivelog bakarchivelog
[postgres@host134 pg13]$ mv mytps bakmytps
[postgres@host134 pg13]$ mkdir data
[postgres@host134 pg13]$ mkdir archivelog
[postgres@host134 pg13]$ mkdir mytps ##这里的前提是需要之前表空间所在的目录

3.解压压缩包到相应目录
解压备份包到相应的目录
[postgres@host134 pg_backup]$cd /tmp/pg_backup/mybak
[postgres@host134 pg_backup]$tar -xvf base.tar -C /opt/pg13/data ##解压数据目录
[postgres@host134 pg_backup]$tar -xvf pg_wal.tar -C /opt/pg13/archivelog ##解压到归档目录
[postgres@host134 pg_backup]$tar -xvf 32780.tar -C /opt/pg13/mytps ##解压表空间


解压发现pg_tblspc目录是没有任何内容的
[postgres@host134 pg_tblspc]$ pwd
/opt/pg13/data/pg_tblspc
[postgres@host134 pg_tblspc]$ ls


4.修改配置文件
vi /opt/pg13/data/postgresql.conf 修改如下参数

restore_command = 'cp /opt/pg13/archivelog/%f %p'
##下面这两个参数也是正确的
##restore_command = 'cp /opt/pg13/archivelog/%f "%p"'
##restore_command = 'cp /opt/pg13/archivelog/%f /opt/pg13/data/pg_wal/'

##recovery_target = 'immediate' ##该选择只能恢复到备份的时间点,无法使用备份后生成的wal
recovery_target_timeline = 'latest'
##这里我们使用timeline恢复到最近的wal,因为备份的时候还会产生wal,若使用recovery_target = 'immediate'
##就无法使用到备份之后产生的wal日志,达不到恢复到最近wal的目的


5.生成recovery.signal标识文件
[postgres@host134 data]$ cd /opt/pg13/data
[postgres@host134 data]$ touch recovery.signal


6.修改权限
su - root
[root@host134 ~]# chmod 0700 /opt/pg13/data

7.将备份后产生的wal日志拷贝到归档目录(目的是恢复到最近的时间点,不拷贝的话只能恢复到备份的时间点)
拷贝备份后的归档日志
cp /opt/pg13/bakarchivelog/20221025/00000004000000000000001B /opt/pg13/archivelog/
cp /opt/pg13/bakarchivelog/20221025/00000004000000000000001C /opt/pg13/archivelog/
cp /opt/pg13/bakarchivelog/20221025/00000004000000000000001D /opt/pg13/archivelog/
cp /opt/pg13/bakarchivelog/20221025/00000004000000000000001E /opt/pg13/archivelog/

拷贝备份后的wal日志
cp /opt/pg13/bakdata/pg_wal/00000004000000000000001F /opt/pg13/archivelog/
cp /opt/pg13/bakdata/pg_wal/000000040000000000000020 /opt/pg13/archivelog/
cp /opt/pg13/bakdata/pg_wal/000000040000000000000021 /opt/pg13/archivelog/
cp /opt/pg13/bakdata/pg_wal/000000040000000000000022 /opt/pg13/archivelog/
cp /opt/pg13/bakdata/pg_wal/000000040000000000000023 /opt/pg13/archivelog/
cp /opt/pg13/bakdata/pg_wal/000000040000000000000024 /opt/pg13/archivelog/
cp /opt/pg13/bakdata/pg_wal/000000040000000000000025 /opt/pg13/archivelog/

8.启动数据库
[postgres@host134 data]$pg_ctl -D /opt/pg13/data -l /opt/pg13/log/postgres.log start


9.检查表空间文件情况
[postgres@host134 pg_tblspc]$ cd /opt/pg13/data/pg_tblspc
[postgres@host134 pg_tblspc]$ ls -al
total 4
drwx------ 2 postgres postgres 19 Oct 26 10:25 .
drwx------ 19 postgres postgres 4096 Oct 26 10:25 ..
lrwxrwxrwx 1 postgres postgres 15 Oct 26 10:25 32780 -> /opt/pg13/mytps

这个时候可以看到pg_tblspc目录下自动创建了指向表空间目录的软链接

10.数据验证

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/30 8:09:42

【YOLO目标检测全栈实战】94 YOLO模型在极端光照条件下的自适应推理策略

开篇故事 上个月,我去一家汽车零部件工厂做项目验收。客户的生产线检测工位装了两台海康相机,白天检测精度99.2%,一到晚上换班就掉到91%。 车间主任急得直跺脚:“你们算法是不是有bug?白天好好的,晚上就瞎了?” 我蹲在生产线旁观察了两个小时,发现问题出在灯光上——…

作者头像 李华
网站建设 2026/5/30 8:09:14

Makefile和树

MakefileMakefile 是用于管理项目构建过程的工具,它通过定义规则和指令,自动化编译、链接等步骤,大大简化了开发者的工作基本概念Makefile 主要包括以下三部分内容:目标 :最终生成的可执行程序或中间文件依赖 &#xf…

作者头像 李华
网站建设 2026/5/30 8:09:00

算法练手:“套圈”游戏(quoit)

原题还是英文的 在 Cyberground(赛博游乐场)中,每个玩具的位置是固定的,并且圆环被精心设计成“同一时刻只能圈住一个玩具”。同时,为了让游戏看起来更有趣,圆环被设计成尽可能大的半径。 现在给定场地中所…

作者头像 李华
网站建设 2026/5/30 8:08:07

字符串处理

在 C 语言中,字符串的处理一直是一大核心难点。针对字符串的输入和输出,标准库提供了各式各样的函数。很多初学者常被 getchar、putchar、scanf、sscanf、fscanf 这几个函数绕晕。虽然它们长得很像,但由于设计初衷不同,它们对字符…

作者头像 李华
网站建设 2026/5/30 8:08:03

2026年佰维存储数字IC笔试试卷带答案

满分:100分 时间:90分钟 一、单选题(每题3分,共30分) 1. 在数字IC的可测试性设计(DFT)中,边界扫描测试通常基于以下哪个标准( ) A. IEEE 802.3 B. IEEE 1149.1 (JTAG) C. IEEE 1394 D. IEEE 1588 答案:B 解析:边界扫描测试(Boundary Scan Test)基于IEEE 1149.1…

作者头像 李华