在 PostgreSQL 数据库;目前是不支持类似 Oracle 闪回特性;我们知道 Oracle 闪回特性在数据恢复是非常简单给力。增加数据库操作人员(开发,DBA)的容错率。Oracle 闪回特性使用场景:
成都创新互联专业为企业提供儋州网站建设、儋州做网站、儋州网站设计、儋州网站制作等企业网站建设、网页设计与制作、儋州企业网站模板建站服务,10多年儋州做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。对于 PostgreSQL 闪回;校长(德哥)有写过一系列的文章PostgreSQL flashback(闪回)功能实现与介绍;如今我取巧实现 PostgreSQL 闪回特性。原理参考我之前的文章PostgreSQL恢复误删数据。
实现 flashback 就是一个有效的数据库备份/恢复。
实现 flashback 可以是在线服务器上操作,也可以是在另一台服务器上操作。换句话说:可以是一台服务器或者是两台服务器来实现。在一台服务器上需要更改数据库端口。由于本环境有清理目录操作;避免在在线服务器上误删目录。所以建议用两条服务器来实现。
本文档采用两台服务器来实现。两台服务器时间校准,免密码登录。
cleandir脚本用于在pg_basebackup备份前;先清空备份所需的路径
psql -h 192.168.1.201 -p $PGPORT -t -A -n -c"SELECT pg_catalog.pg_tablespace_location(oid) AS "Location" FROM pg_catalog.pg_tablespace where spcname not in ('pg_default','pg_global')" -o tablespace_location.txtawk '{print "rm -rf " $1}' tablespace_location.txt > cleandir.shecho "rm -rf $PGDATA" >> cleandir.sh
采用pg_basebackup备份;
cleandir.shpg_basebackup -F p --progress -D $PGDATA -h 192.168.1.201 -p $PGPORT -U replica
加入定时任务 crontab 中 例如:每天凌晨过5分执行备份
5 0 * * * pg_backup.sh
执行闪回查询/数据库恢复。多用时间点进行恢复即(PITR)
restore_command = 'scp postgres@192.168.1.201:**/%f %p'recovery_target_time = '2018-11-10 10:33:12'
pg_flashback.sh 脚本用于数据库误操作实现闪回到某个时间点。支持多次闪回。执行闪回 之前;需要配置 recovery.conf 中的 “recovery_target_time” 时间点。即恢复到哪个时间点。
第一次执行;执行
pg_flashback.sh 1
往后执行闪回;通称再次执行;执行命令
pg_flashback.sh 2
当然往后加也行例如:pg_flashback.sh 3
pg_flashback.sh脚本如下
##=========================================================== ## pg_flashback.sh ## created by lottu ## 2018/11/07 ## usage: pg_flashback.sh 1 ##============================================================ #!/bin/bashPGHOME=/opt/pgsql96PGDATA=/data/postgres/data LANG=en_US.utf8PGPORT=5432PGUSER=postgresPGDATABASE=postgresPG_BACK_HOST_IP=192.168.1.202E_BADARGS=65E_FAIL=66if [ $# -ne 1 ];then echo "Usage: `basename $0` Please invoke this script with one command-line arguments" exit $E_BADARGSfiflashback_path=/data/flash_backif [ $1 -eq 1 ];then echo "Info: backup backupset" backup.shelse rebackup.shfi echo "Info: edit recovery.conf"#scp recovery.conf postgres@192.168.1.202:$PGDATAcp /home/postgres/recovery.conf $PGDATAecho "Info: begin start database"pg_ctl start -l /home/postgres/log/pg_server.logif [ $? -eq 0 ];then echo "Info: start database succes" sleep 10 psql -h $PG_BACK_HOST_IP -p 5432 postgres postgres -c "select pg_xlog_replay_resume()"else echo "[Error]: start database fail" exit $E_FAILfi
执行pg_backup.sh脚本。部署成功了是没这个操作。因为每天都有定时备份。
[postgres@Postgres202 ~]$ pg_backup.sh waiting for server to shut down......... doneserver stopped 322503/322503 kB (100%), 4/4 tablespaces
lottu=# create table lottu as select * from lottu01 ; SELECT 4 lottu=# select * from lottu; id | text ------+------- 1001 | lottu 1004 | rax 1002 | world 1003 | world (4 rows) -- 获取时间点;这个时间点“2018-11-10 14:56:56”是我目标恢复时间点。表lottu有4条记录。lottu=# select now(); now ------------------------------ 2018-11-10 14:56:56.30188+08 (1 row) -- 在时间点“2018-11-10 14:57:51”;误操作1 清理表lottu的记录lottu=# delete from lottu; DELETE 4 lottu=# select now(); now ------------------------------- 2018-11-10 14:57:51.891931+08 (1 row) -- 误操作2 删除表lottu。lottu=# drop table lottu; DROP TABLE
我们先在配置文件 recovery.conf 中的参数“recovery_target_time” 设置为 “2018-11-10 14:57:51”。执行闪回pg_flashback.sh 1
[postgres@Postgres202 ~]$ pg_flashback.sh 1 Info: backup backupset Info: edit recovery.conf Info: begin start databaseserver starting Info: start database succespsql: FATAL: the database system is starting up
闪回数据库成功启动;登录查看表lottu情况:表数据未找回;这不是我所需闪回的目标
[postgres@Postgres202 ~]$ psql lottu lottupsql (9.6.0) Type "help" for help. lottu=# \d lottu Table "lottu.lottu" Column | Type | Modifiers --------+---------+----------- id | integer | name | text | lottu=# select * from lottu; id | name ----+------ (0 rows)
在配置文件 recovery.conf 中的参数“recovery_target_time” 设置为 “2018-11-10 14:56:56”。再执行闪回pg_flashback.sh 2
[postgres@Postgres202 ~]$ pg_flashback.sh 2 Info: edit recovery.conf Info: begin start databaseserver starting Info: start database successpsql: FATAL: the database system is starting up
再次闪回也成功了。我们在看下表lottu的情况
[postgres@Postgres202 ~]$ psql lottu lottupsql (9.6.0) Type "help" for help. lottu=# \d lottu Table "lottu.lottu" Column | Type | Modifiers --------+---------+----------- id | integer | name | text | lottu=# select * from lottu; id | name ------+------- 1001 | lottu 1004 | rax 1002 | world 1003 | world (4 rows)
表 lottu 的数据成功找回。在使用 pg_dump 导出表 lottu 的表结构和数据的脚本;
[postgres@Postgres202 ~]$ pg_dump -d lottu -t lottu.lottu -f lottu.sql [postgres@Postgres202 ~]$ scp lottu.sql postgres@192.168.1.201:/home/postgres
再到正式数据库上执行
[postgres@Postgres201 ~]$ psql lottu lottu psql (9.6.0) Type "help" for help. lottu=# \i lottu.sql SET SET SET SET SET SET SET SET SET SET SET CREATE TABLE ALTER TABLE COPY 4 lottu=# \d lottu Table "lottu.lottu" Column | Type | Modifiers --------+---------+----------- id | integer | name | text | lottu=# select * from lottu; id | name ------+------- 1001 | lottu 1004 | rax 1002 | world 1003 | world (4 rows)
在整个闪回过程;除了最后一步是在正式服务器上执行。前面其他操作都是在闪回数据库操作。
PostgreSQL flashback(闪回) 功能实现与介绍
链接:https://pan.baidu.com/s/1j8ZNj3yjxj82MnomzxQkfA
提取码:j4xd
创新互联面向全国提供域名注册、虚拟主机、云服务器、服务器托管与租用,如需了解,请联系QQ:171356849微信:zh18159893430 咨询,谢谢!