没有合适的资源?快使用搜索试试~ 我知道了~
首页PostgreSQL 备份恢复技术手册 DBA必备
PostgreSQL 备份恢复技术手册 DBA必备
需积分: 31 204 浏览量
更新于2023-05-26
评论
收藏 473KB PDF 举报
PostgreSQL 备份恢复技术手册 DBA必备,数据库总要会备份与恢复,这个技能非常重要,特别需要掌握的,分享给大家学习
资源详情
资源评论
资源推荐

美河学习在线 www.eimhe.com
PostgreSQL 备份恢复
前言
1、 设置 WAL 日志归档
为持久保存日志文件,需要开启日志归档模式。
在该模式下,可丢弃日志文件被删除前,被拷贝到指定目录。在 postgres.conf 配置文件中
设置三个参数:
wal_level=replica 或更高
archive_mode = on
archive_command = 'cp %p /mnt/server/archivedir/%f'
%p 表示 pg_wal 目录路径和日志文件名
%f 表示日志文件名。
日志被拷贝到/mnt/server/archivedir 目录
日志的归档过程如下:
checkpoint 操作中,当一个日志文件 X 可被覆盖时,在 pg_wal 的 archive_status 目中生成
X.ready 文件。
后台 archive 进程负责日志文件的拷贝。该进程监控 archive_status 目录,当发现有 X.ready
文件名后,使用 archive_command 拷贝文件,并将 X.ready 命名为 X.done
下一次 checkpoint 操作中,将 archive_status 目中 X.done 对应的 X 日志文件改名。
2、数据库的状态
DB_SHUTDOWNED(数据库正常关闭)
DB_SHUTDOWNED_IN_RECOVERY(数据库在恢复时关闭)
DB_SHUTDOWNING(数据库正常关闭过程中崩溃)
DB_IN_CRASH_RECOVERY(数据库在恢复过程中崩溃)
DB_IN_ARCHIVE_RECOVERY(数据库处于归档恢复)
DB_IN_PRODUCTION(数据库处于正常工作状态,等待接受事务处理)
crash recovery
PostgreSQL 正常运行中,直接 kill 主进程,重启 PostgreSQL,将进入 crash recovery 处理流
程,即 Oracle 的实例恢复,从 control 文件中 checkpoint 的 redo lsn 位置开始,使用 pg_wal
目录中的日志文件进行恢复。PostgreSQL 能进行上述处理,是因为将其状态和最近的
checkpoint 记录在在 control 文件中。
⚫ 初始化数据库后,control 文件 DB 状态初始值为 shutdown。
⚫ pg 启动时,当 control 文件 DB 状态为 shutdown,则将状态设置为 production,退出
恢复过程。
⚫ 在正常关闭服务时,执行 checkpoint,并将 control 文件 DB 态设置 shutdown。
⚫ pg 启动时,当 control 文件 DB 状态为 production,则说明发生了从 control 文件读
取最近 checkpoint,从 redo lsn 开始进行恢复,恢复完成后,将状 production 实验示
例

美河学习在线 www.eimhe.com
pg_dump
逻辑备份在恢复时,介于逻辑备份与故障时间点之间的数据难以恢复,而且如果表比较
大时,备份时间会很长,而且恢复时间会更长,故一般不采取逻辑备份方式进行数据库备份;
对于小表和跨平台跨版本的数据迁移,适合用逻辑备份。并且逻辑备份可以当作物理备份的
辅助备份手段。
逻辑备份恢复主要以下三种:
pg_dump
pg_dumpall
copy
pg_dump 备份
只能备份单个数据库,不会导出角色和表空间相关的信息
-F c 备份为二进制格式, 压缩存储. 并且可被 pg_restore 用于精细还原
-F p 备份为文本, 大库不推荐
pg_dump 恢复
$ psql dbname -U username < bakfile
或
pg_restore
– pg_restore [option] ... [filename]
– pg_restore -d dbname bakfile
二进制格式的备份只能使用 pg_restore 来还原, 可以指定还原的表, 编辑 TOC 文件,
定制还原的顺序, 表, 索引等。
文本格式的备份还原, 直接使用用户连接到对应的数据库执行备份文本即可 , 例如
$ psql dbname -f bak.sql
pg_dump 备份恢复示例:
1)创建数据库
$ createdb testdb
2)连入数据库 testdb
$ psql testdb
3)创建测试表,插入数据
testdb=# create table tt( espace tbls_t;
testdb=# insert into tt(a) 1);
testdb=# insert into t a) val s(2);
4)查看数据
testdb=# select * from tt;
5)备份

美河学习在线 www.eimhe.com
$ pg_dump testdb > dm_bk/testdb.sql #简单语法,可结合选项灵活备份
6)删除数据库 testdb
$ dropdb testdb
7)创建新数据库(恢复之前需创建数据库)
$ createdb testdb
8)恢复数据
$ psql testdb < dm_bk /testdb.sql
9)查看数据是否回复
$ psql testdb
testdb=# select * from tt;
至此,数据已成功恢复!
pg_dump 备份恢复命令扩展练习:
#二进制格式备份文件:-F c
$ pg_dump -F c -f testdb.dmp -C -E UTF8 -h 127.0.0.1 -U postgres testdb
#文本格式备份文件:-F p
$ pg_dump -F p -f testdb.p_dmp -C -E UTF8 -h 127.0.0.1 -U postgres testdb
$ pg_restore testdb.dmp -f testdb.sql #可以以解析为文本内容,类似于 pg_dump 备份
$ pg_restore -l testdb.dmp #查看二进制文件中的内容
$ pg_restore -l testdb.dmp > toc.data #查看控制信息
$ pg_restore -d testdb testdb.dmp #把 dump 文件中的数据导入到 testdb 数据库中
$ pg_restore -d postgres testdb.dmp #把 dump 文件中的数据导入到 postgres 数据库中
⚫ 利用 toc 文件选择性备份恢复:
1)根据二进制备份文件生成 toc 文件
pg_restore -l -f testdb.toc testdb.dmp
2)修改 toc 文件,用‘;’号注释掉不用还原的内容:
;202; 1259 73746 TABLE public t1 postgres
203; 1259 73749 TABLE public t2 postgres
;3034; 0 73746 TABLE DATA public t1 postgres
3035; 0 73749 TABLE DATA public t2 postgres
3)以 toc 文件列表做恢复
pg_restore -F c -L testdb.toc -d testdb testdb.dmp
4)检查发现 t1 表没有被导入。
⚫ 使用 unix 管道压缩备份恢复:
1、导出并且压缩
pg_dump testdb |gzip testdb.sql

美河学习在线 www.eimhe.com
或者:
pg_dump testdb >testdb.sql |gzip testdb.sql
2、解压并且导入,压缩文件不变:
gunzip -c testdb.sql.gz |psql testdb #导入到 testdb 数据库
3、备份后直接进行恢复,文件不落地,把 testdb 数据库的表导入到 testdb1:
pg_dump testdb| psql testdb1
4、并行备份恢复
pg_dump -Fd -j4 -f testdb.p.dump testdb
ls -l testdb.*
-rw-rw-r-- 1 postgres postgres 1240 Feb 23 04:20 testdb.dmp
-rw-rw-r-- 1 postgres postgres 886 Feb 23 04:26 testdb.sql
-rw-rw-r-- 1 postgres postgres 496 Feb 23 03:56 testdb.sql.gz
-rw-rw-r-- 1 postgres postgres 398 Feb 23 04:28 testdb.toc
testdb.p.dump:
total 16
-rw-rw-r-- 1 postgres postgres 37 Feb 23 04:33 3038.dat.gz
-rw-rw-r-- 1 postgres postgres 37 Feb 23 04:33 3039.dat.gz
-rw-rw-r-- 1 postgres postgres 37 Feb 23 04:33 3040.dat.gz
-rw-rw-r-- 1 postgres postgres 1977 Feb 23 04:33 toc.dat
可以看出生成的文件目录包含三个压缩文件和一个 toc.dat 文件。
5、并行导入到 testdb1 数据库中,j 参数指定同时几个进程来同时执行,每个进程同时只处
理一个表的数据:
pg_restore -d testdb1 -j4 testdb.p.dump
6、导出指定的表
pg_dump -d testdb -t emp -t dept > dm_bk/emp_dept.sql
7、导出排除指定的表的数据库
pg_dump -d testdb -T emp > dm_bk/testdb_ex_emp.sql
pg_dumpall 备份恢复
pg_dump 只能备份单个数据库,而且恢复的时候需要创建空数据库。
pg_dumpall 可以备份所有数据库,并且备份角色、表空间。
1. 创建数据库
$ createdb db1
$ createdb db2
2. db1 中创建表并插入数据
$ psql db1
db1=# create table tb1(a int);
db1=# insert into tb1(a) values(1);

美河学习在线 www.eimhe.com
3. db2 中创建表并插入数据
psql db2
db2=# create table tb2(a int);
db2=# insert into tb2(a) values(2);
4.备份数据库
pg_dumpall > db_all.sql
5.删除数据库
dropdb db1
dropdb db2
6.恢复数据库
psql < db_all.sql #如果遇到当前有数据库或者表,会提示表已经存在,数据照常导入。
psql –f db_all.sql
7.查看数据库 db1 是否恢复
psql db1
testdb=# select * from tb1;
a
---
1
(1 rows)
8.查看数据库 db2 是否恢复
psql db2
testdb=# select * from tb2;
a
---
2
(1 rows)
至此,数据已成功恢复!
⚫ pg_dump 备份压缩与分割
压缩与分割的原理都是利用 Linux 的管线(PIPE)命令。
1)压缩
备份
pg_dump testdb| gzip > filename.gz
恢复
gunzip -c filename.gz | psql dbname
2)分割
备份
pg_dump dbname | split -b 1m
恢复
cat filename* | psql dbname
剩余20页未读,继续阅读


















安全验证
文档复制为VIP权益,开通VIP直接复制

评论0