因为POSTGRESQL 备份的方式很多,所以在众多的备份方式和软件中,也只能“半网打进”。
POSTGRESQL 在数据库备份的方式是多种多样的,但如果掌握了原理,基本上就是在 数据文件和 WAL LOG 上进行琢磨。下面有三种传统的备份方式。
PG_DUMP 作为PostgreSQL 的原生的备份程序,功能还是蛮强的,可以通过参数在备份的时候,备份出逻辑语句,或者压缩的备份文件,或者增加线程的方式加快备份的速度等等。
例如我们备份 postgre 数据库,然后将数据恢复到 newdb 数据库上
创建备份和恢复小的数据库是很方便的。
但他也存在着一些明显的问题
1 备份和恢复大数量的情况下比较慢
2 需要的开销比较大
3 没有 PITR (基于时间点的数据备份和恢复)
PG 我们还有物理备份的方式,
physical backup 的方法,其实这样的备份方式和ORACLE 的 ALTER TABLESPACE users BEGIN BACKUP;
在执行了 select pg_start_backup('数据库名") 后会产生刷脏页,产生checkpoint点。
然后你就可以拷贝数据目录下的数据了
在拷贝完数据后,可以运行 select pg_stop_backup("数据库名“)
然后会擦除你 start 创建的标签文件, 并且在事务日志归档区建备份历史文件,其中包含pg_start_backup
的标签、备份的事务日志起始与终止位置、备份的起始和终止时间。计算出终止位置后, 当前事务日志的插入点将自动前进到下一个事务日志文件,这样, 结束的事务日志文件可以被立即归档从而完成备份。
但这样做有什么问题
拷贝文件的时候,其实你的不能保证你拷贝的文件到另外的地方是无损的
而一个不能保证数据是无损的数据的备份,的意义又在哪里。
所以,PG, 中的更好的备份方式出现了, pg_basebackup,使用这样的方式可以进行两次备份之间的时间点的任意数据恢复,PITR,pg_basebackup将复制协议连接到PostgreSQL服务器(就像复制客户机一样),并创建服务器$PGDATA目录中数据文件的二进制副本。它创建的副本是一致的——文件与某些特定事务结束时的状态完全对应。而要使用pg_basebackup 是需要一些配置的,需要说明的,pg_basebackup 是对整个数据库集群备份的,如果对单个的数据库备份,还是要使用pg_dump或其他方法。
配置 postgresql.conf
1 wal_level = replica
2 max_wal_senders = 适合的数量
3 archive_mode = on
4 archive_command = '你需要备份的archive命令'
并且你需要给你的备份一个适合的 pg_hba.conf 设置,在replicaiton 位置设置
另外如果你需要从从库进行备份的情形下需要您还需要在主服务器上启用full_page_write
在做完以上工作后,下面就可以开始备份了
1 执行
psql -c "select pg_switch_wal();"
2 执行备份命令,生成压缩文件
pg_basebackup -Ft -z -D /backup
3 备份文件就自动生成了
数据的恢复也比较简单
将已经损坏的数据目录的数据清空,并且将WAL LOG 的目录也清空,然后直接将备份的数据恢复到原有的目录中,在更改recovery.conf
如果你备份时的命令里面添加有 -R 则自动回添加一个recovery.conf文件,但如果你仅仅是为了备份和恢复,则不建议添加。
在原有的数据库目录里面添加 recovery.conf 文件,并在里面填入
restore_command = 'cp 你的archive目录/f% %p'
如果吉祥根据时间点来恢复数据
则直接在下面继续写入
recovery_target_time = '2019-06-13 05:10:00+8'
然后启动 pg_ctl -D /你的数据库目录 start
数据就会进行恢复,并且在日志里记录
上面是简单的数据的备份和恢复,但要进行例如增量备份,备份元数据,以及其他方式的备份,我们需要借助更多的工具来进行,而postgresql在相关方面,可选择的方式很多,例如PGRMAN, BARMAN 等备份开源软件,基本上能满足我们与ORACLE RMAN 一样的备份对等的需求。
到底PGRMAN有什么特点,怎么操作
1 通过一条命令来进行整体数据库的备份,并且也能很简单的进行整体数据库的恢复。
2 支持增量备份的方式并且压缩数据降低占用磁盘空间
3 管理备份的版本和展示备份的目录
4 支持存储snapshot
如何使用
1 pg_rman 需要先设定一个初始目录
pg_rman init -B /backup/
在初始化目录后可以看到目录中已经产生了一些文件
2 在初始化目录后,我们可以直接开始对数据库进行全量的备份
在备份后,我们需要验证一下,否则后续的操作将被阻止
3 进行增量备份
4 在进行 多次备份后,pg_rman 可以清晰的展示出备份的时间成功与否,备份的尺寸,等信息
其中有一些参数
-b 备份的方式 full incremental archive 三种
-Z 压缩被的数据文件用zlib方式
-C 进行一个平滑的 checkpoint
5 时间长了,有些备份是要被清除
可以根据相关的备份的时间点和信息来进行清理,例如我们图中做了四次全备,其实包括三次全备和一次增量都可以清除,因为已经在后面又做了一次全备。可以通过 pg_rman show 命令来查看当前备份的信息
并且通过pg_rman delete "时间的点" 的方式来清除相关的没有存在意义的备份数据
恢复数据也很简单,首先停止Postgresql 数据库,执行恢复数据库的命令
图中很简单的命令就可以将数据库恢复到备份时的状态。
如果想基于PITR的方式,需要在启动数据库前,去处理recovery.conf 中的配置信息,达到相关时间点恢复的需求。
本文分享自 AustinDatabases 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!