资讯专栏INFORMATION COLUMN

Postgresql连续归档和时间点恢复(PITR)

IT那活儿 / 1189人阅读
Postgresql连续归档和时间点恢复(PITR)

点击上方蓝字关注我们


在任何时间,PostgreSQL在数据集簇目录的pg_wal/子目录下都保持有一个预写式日志(wal)。这个日志存在的目的是为了保证崩溃后的安全:如果系统崩溃,可以“重放”从最后一次检查点以来的日志项来恢复数据库的一致性。

Postgresql在PITR模式下重放基础备份下的归档wal数据,从pg_start_backup创建的REDO点到你要恢复的点,在postgresql中,要恢复的点称为恢复目标。

环境如下:

操作系统:redhat6.8

数据库:11.2

PGHOME=/db/pgsql

PGDATA=/db/pgsql_data


01
关闭数据库,修改配置文件postgresql.conf


vipostgresql.conf

archive_mode= on

archive_command= cp -i %p /db/archive/%f

wal_level= hot_standby


02
启动数据库


$/db/pgsql/bin/pg_ctl -D /db/pgsql_data -l logfile start



03
基于文件级别的持续备份


模拟数据

创建测试数据库:

createdatabase aaaa;

创建表,补充数据

CREATETABLE demo1(id int,name varchar(20));

INSERTINTO demo1 VALUES (1,’xiaowang’), (2,’zhaosi’);

aaaa=#select * from demo1;

id| name

----+----------

1| xiaowang

2| zhaosi

(2rows)



04
开始备份


aaaa=# select now();

              now              

-------------------------------

 2021-01-19 23:41:56.476472+08

(1 row)


aaaa=# select pg_start_backup(bak_ws_2021-01-19 23:41:56);

 pg_start_backup

-----------------

 0/2000060

(1row)



05
打包pgsql_data


tar-cvzf pgsql_data.tar pgsql_data


06
结束并切换归档


aaaa=#select pg_stop_backup();

NOTICE: pg_stop_backup complete, all required WAL segments have beenarchived

pg_stop_backup

----------------

0/2000168

(1row)


aaaa=#select pg_switch_wal();

pg_switch_wal

---------------

0/3000078

(1row)

注意:从PostgreSQL10 开始将"pg_xlog"目录重命名为"pg_wal",所以很多网上的版本会存在查看pg_xlog


07
再次插入数据


CREATETABLE demo2(id int,name varchar(20));

aaaa=#INSERT INTO demo2 VALUES (1,xiaoli),(2,zhaoqian);

INSERT0 2


08
模拟毁坏并进行恢复


(1)结束PG服务

aaaa=#q


$/db/pgsql/bin/pg_ctl -D /db/pgsql_data/ stop

waitingfor server to shut down.... done

serverstopped

(2)模拟数据库毁坏

rm-rf pgsql_data

(3)恢复备份文件pgsql_data.tar

$tar -xvf pgsql_data.tar

(4)删除pg_wal文件夹并重建

$rm -rf pg_wal

$ mkdir -p pg_wal/archive_status

(5)拷贝recovery.conf文件并修改

cp$PGHOME/share/recovery.conf.sample $PGDATA/recovery.conf

直接添加或修改以下参数:

restore_command= cp /db/archive/%f "%p"

以下参数可以根据需要进行添加:

archive_cleanup_command=pg_archivecleanup/db/archive %r

###一般来说,设置自动清理archive_log可以在配置文件中添加archive_cleanup_command参数。

recovery_target_time=2021-01-1923:45:12

###recovery_target_time这是用户自行设定的,如果不写则会恢复到之前接收到的最后一个归档文件。


(6)启动数据库:

$/db/pgsql/bin/pg_ctl -D /db/pgsql_data -l logfile start

pg_ctl:another server might be running; trying to start server anyway

waitingfor server to start.... done

serverstarted


$/db/pgsql/bin/psql postgres postgres

psql(11.2)

Type"help" for help.


postgres=#c aaaa

Youare now connected to database "aaaa" as user "postgres".

aaaa=#dt

Listof relations

Schema| Name | Type | Owner

--------+-------+-------+----------

public| demo1 | table | postgres

public| demo2 | table | postgres

(2rows)


aaaa=#select * from demo2;

id| name | age

----+----------+-----

1| xiaoli |

2| zhaoqian |


(7)查看日志,恢复成功

注:结束后,recovery.conf会改名变成recovery.done。


总结:PITR技术对7*24小时支撑很重要,对于数据库体量很小的,可以增加pg_dump备份频率,对于体量较大数据库就很需要了。需要注意的是pg_dump和pg_dumpall不会产生文件系统级别的备份,并且不能用于连续归档方案。这类转储是逻辑的并且不包含足够的信息用于wal重放。




文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/130023.html

相关文章

  • Postgresql 备份与恢复

    摘要:指定要用于查找的口令文件的名称。前四个字段可以是确定的字面值,也可以使用通配符匹配所有。利用环境变量引用的文件权限也要满足这个要求,否则同样会被忽略。在上,该文件被假定存储在一个安全的目录中,因此不会进行特别的权限检查。 pg_dump pg_dump 把一个数据库转储为纯文本文件或者是其它格式. 用法: pg_dump [选项]... [数据库名字] 一般选项: -f, --fi...

    阿罗 评论0 收藏0
  • 阿里云如何打破Oracle迁移上云的壁垒

    摘要:摘要第九届中国数据库技术大会,阿里云数据库产品专家萧少聪带来以阿里云如何打破迁移上云的壁垒为题的演讲。于是,阿里云给出了上面的解决方案。 摘要: 2018第九届中国数据库技术大会,阿里云数据库产品专家萧少聪带来以阿里云如何打破Oracle迁移上云的壁垒为题的演讲。Oracle是指数据库管理系统,面对Oracle迁移上云的壁垒,阿里云如何能够打破它呢?本文提出了Oracle 到云数据库P...

    chavesgu 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<