• 售前

  • 售后

热门帖子
入门百科

postgresql一连归档实时间点恢复的操纵

[复制链接]
无奈的剑侠站 显示全部楼层 发表于 2021-10-26 13:40:00 |阅读模式 打印 上一主题 下一主题
简介

前面我们先容了通过pgsql的流复制在生产环境中搭建高可用环境来保证服务的可连续性;我们也要对数据库进行周期备份,来防止数据的丢失,这就必要一连归档,它不仅可以用于大型数据库的增量备份和恢复,也可以用于搭建standby镜像备份。   
PostgreSQL默认处于非归档模式。开启归档模式,重要涉及到三个参数:wal_level,archive_mode和archive_commandwal_level参数默认为mininal,设置此参数为archive大概之上的级别都可以打开归档。当postgresql必要传输归档日志时,会调用archive_command指定的shell下令。
归档文件传输乐成时,shell下令要返回0,此时,postgresql会认为归档文件已经传输乐成,因此可以删除大概重新循环利用归档文件。当shell下令返回非0值时,postgresql会保存全部未乐成传输的归档日志,并不绝尝试重新传输,直到乐成。如果归档下令不停不乐成,pg_xlog目录会连续增长,有耗尽服务器存储空间的可能,此时postgresql会PANIC关闭,直到开释存储空间。
别的将归档WAL日志存储在本机上是风险极高,不被保举的。postgresql通过archive_command提供了存储WAL日志的机动性,可以将归档日志存储到挂装的NFS目录,磁带,刻录到光盘,也可以将WAL日志通过ssh/scp,rsync传输到异机保存。
**注意:**archive_command及restore_command下令将以运行PostgreSQL的体系用户的身份运行。Centos体系里,这个体系用户是postges。
环境说明

      Role      IP      体系      数据库                  源库      10.10.10.60      Centos6.5      postgresql 9.2              备份库      10.10.10.61      Centos6.5      postgresql 9.2    需求说明:源库产生归档日志,并传输到备份库上的归档目录/data/pg_archive;备份库利用归档日志,恢复至源库的任意时间点的数据。
注意:基础环境我们基于postgresql流复制,但是备份库作为一个独立的库,此时请保证recovery.conf中的standby_mode=off
环境设置

1.ssh无密码登录
由于我们备份和还原过程中所用的archive_command和restore_command下令都以postgres用户运行,因此我们必要针对postgres用户实现ssh无密码登录。
  1. #源库
  2. ssh-ketgen -t rsa
  3. scp id_rsa.pub postgres@10.10.10.60:/var/lib/pgsql/.ssh/authorized_keys
  4. #备份库
  5. ssh-ketgen -t rsa
  6. scp id_rsa.pub postgres@10.10.10.61:/var/lib/pgsql/.ssh/authorized_keys
复制代码
**注意:**yum安装postgresql时,默认生成的postgres用户的家目录在/var/lib/pgsql
2.设置备份库的归档目录
  1. #备份库
  2. mkdir -p /data/pg_archive
  3. chmod postgres.postgres /data/pg_archive
复制代码
说明:源库产生的归档日志,要存到到异地备份库的/data/pg_archive下。
3.修改源库的postgresql.conf
在postgresql.conf中添加以下几行
  1. #开启归档模式
  2. archive_mode = on   
  3. archive_command = 'ssh 10.10.10.60 test ! -f /data/pg_archive/%f && scp %p 10.10.10.60:/data/pg_archive/%f'
复制代码
此中: %p表现wal日志文件的路径,%f表现wal日志文件名称。archive_command表现先验证备份库的归档目录下是否存在同名文件,以免发生覆盖丢失数据,若不存在将源库上产生的归档日志保存到备份库的/data/pg_archive目录下。
注意:
(a)archive_timeout逼迫N秒以后进行一次归档,若设置太小,很快就会凌驾wal_keep_segments = 16,导致数据覆盖丢失,因此不要盲目设置。
(b)归档模式的开启,只有在wal_level = hot_standby或archive
4.重载源库并检察
  1. pg_ctl reload -D /data/pgsql/data
  2. postgres=# show archive_mode;
  3. archive_mode
  4. --------------
  5. on
  6. (1 row)
复制代码
模仿归档备份

1.检察源库上的pg_xlog目录
  1. -bash-4.2$ ll pg_xlog
  2. total 16388
  3. -rw-------. 1 postgres postgres 16777216 Apr 21 13:42 000000010000000000000001
  4. drwx------. 2 postgres postgres  4096 Apr 21 13:36 archive_status
复制代码
此时archive_status目录为存放归档日志的状态,若归档已经产生,但没有传输乐成则为xxx.ready,而且不停会保存直至传输乐成,然后状态变为xxx.done;此时目录为空
2.在源库上添加数据
此时由于数据库为空,我们来创建testdb库,并添加数据
  1. postgres=# create database testdb;
  2. CREATE DATABASE
  3. postgres=# create table t1(id int4,create_time timestamp(0) without time zone);
  4. CREATE TABLE
  5. postgres=# insert into t1 values(1,now());
  6. INSERT 0 1
  7. postgres=# insert into t1 values(2,now());
  8. INSERT 0 1
  9. postgres=# select * from t1;
  10. id |  create_time  
  11. ----+---------------------
  12. 1 | 2016-04-21 13:49:34
  13. 2 | 2016-04-21 13:49:48
  14. (2 rows)
复制代码
3.在源库上手动切换归档
  1. postgres=# select pg_switch_xlog();
  2. pg_switch_xlog
  3. ----------------
  4. 0/1821010
  5. (1 row)
复制代码
正常环境下,wal日志段在到达16M后会自动归档,由于测试我们利用手动切换归档。
4.检察源库pg_xlog目录
  1. -bash-4.2$ ll pg_xlog/
  2. total 16388
  3. -rw-------. 1 postgres postgres 16777216 Apr 21 13:42 000000010000000000000001
  4. drwx------. 2 postgres postgres  4096 Apr 21 13:36 archive_status
  5. -bash-4.2$ ls pg_xlog/
  6. 000000010000000000000001 000000010000000000000002 archive_status
  7. -bash-4.2$ ls pg_xlog/archive_status/
  8. 000000010000000000000001.ready
复制代码
此时归档日志的状态为ready,说明此日志没有传输乐成,检察日志
  1. vim /data/pgsql/pg_log/postgresql-Thu.log
  2. ssh: connect to host 10.10.10.60 port 22: Connection timed out^M
  3. FATAL: archive command failed with exit code 255
  4. DETAIL: The failed archive command was: ssh 10.10.10.68 test ! -f /data/pg_archive/000000010000000000000001 && scp pg_xlog/000000010000000000000001 10.10.10.60:/data/pg_archive/000000010000000000000001
  5. LOG: archiver process (PID 22284) exited with exit code 1
复制代码
原来是由于ip地点错误导致无法通过ssh传输,更改ip为10.10.10.61后,再次产生归档才能再次重新传输。
注意:触发归档有三种方式:

1.手动切换wal日志,select pg_switch_xlog()
2.wal日志写满后触发归档,设置文件默认到达16M后就会触发归档,wal_keep_segments = 16
3.归档超时触发归档,archive_timeout
在此我们利用的是手挡切换归档。
  1. postgres=# insert into t1 values(3,now());
  2. INSERT 0 1
  3. postgres=# insert into t1 values(4,now());
  4. INSERT 0 1
  5. postgres=# select pg_switch_xlog();
  6. pg_switch_xlog
  7. ----------------
  8. 0/2000310
  9. (1 row)
  10. postgres=# select pg_switch_xlog();
  11. pg_switch_xlog
  12. ----------------
  13. 0/3000000
  14. (1 row)
  15. postgres=# select pg_switch_xlog();
  16. pg_switch_xlog
  17. ----------------
  18. 0/30000D8
  19. (1 row)
复制代码
再次检察pg_xlog目录
  1. -bash-4.2$ ll pg_xlog/archive_status/
  2. total 0
  3. -rw-------. 1 postgres postgres 0 Apr 21 13:51 000000010000000000000001.done
  4. -rw-------. 1 postgres postgres 0 Apr 21 14:00 000000010000000000000002.done
  5. -rw-------. 1 postgres postgres 0 Apr 21 14:04 000000010000000000000003.done
复制代码
5.检察备份库上的归档目录
  1. -bash-4.2$ ll /data/pg_archive/
  2. total 49152
  3. -rw-------. 1 postgres postgres 16777216 Apr 21 14:04 000000010000000000000001
  4. -rw-------. 1 postgres postgres 16777216 Apr 21 14:04 000000010000000000000002
  5. -rw-------. 1 postgres postgres 16777216 Apr 21 14:04 000000010000000000000003
复制代码
至此,归档备份已经完成,下面我们要先容利用归档进行恢复。
模仿从归档进行PITR恢复

PITR恢复是基于文件体系备份和wal文件的备份,因此起首我们必要个基础备份,然后在此基础备份上对wal归档日志进行回放。具体步调如下:
1.利用pg_basebackup进行基础备份
pg_basebackup利用replication复制协议,因此必要在源库上设置pg_hba.conf文件以允许replication,无论是本地还是通过网络。
  1. vim pg_hba.conf
  2. #添加以下两行,允许本地和网络上的replication用于pg_basebackup
  3. host replication  rep    127.0.0.1/32   md5
  4. host replication  rep    10.10.10.61/8   md5
  5. #重载
  6. pg_ctl reload -D /data/pgsql/data
复制代码
添加完毕后请重载pgsql
在备份库上执行pg_basebackup进行远程的基础备份
  1. -bash-4.2$ pg_basebackup -D /data/pgsql/data -Fp -Xs -v -P -h 10.10.10.61 -p 5432 -U rep
  2. Password:
  3. transaction log start point: 0/5000020
  4. pg_basebackup: starting background WAL receiver
  5. 26664/26664 kB (100%), 1/1 tablespace         
  6. transaction log end point: 0/50000E0
  7. pg_basebackup: waiting for background process to finish streaming...
  8. pg_basebackup: base backup completed
复制代码
-D 表现接受基础备份的目录,我们将基础备份放到/data/pgsql/data
-X 参数,在备份完成之后,会到主库上收集 pg_basebackup 执行期间产生的 WAL 日志,在 9.2 版本之后支持 -Xs 即stream 形式,这种模式不必要收集主库的 WAL 文件,而能以 stream 复制方式直接追赶主库。
2.修改备库上设置文件
由于全部的设置文件是从源库上的备份过来的,因此我们必要修改:
  1. vim postgresql.conf
  2. 屏蔽以下两行
  3. #archive_mode = on
  4. #archive_command = 'ssh 192.168.3.139 test ! -f /data/pg_archive/%f && scp %p 192.168.3.139:/data/pg_archive/%f'
复制代码
3.检察源库上的时间确认必要的恢复时间点
  1. postgres=# select * from t1;
  2. id |  create_time  
  3. ----+---------------------
  4. 1 | 2016-04-21 13:49:34
  5. 2 | 2016-04-21 13:49:48
  6. 3 | 2016-04-21 14:00:22
  7. 4 | 2016-04-21 14:00:25
  8. 5 | 2016-04-21 14:49:11
  9. 6 | 2016-04-21 14:49:14
  10. 7 | 2016-04-21 14:49:17
  11. (4 rows)
复制代码
由于此次基础备份是在“ 4 | 2016-04-21 14:00:25”这条记载后归档,而反面的5,6,7三条记载是在基础备份后生成的,因此若恢复5,6,7中的记载必要在基础备份上通过回放5,6,7的归档日志到达。
在此我们要将数据恢复到6这条记载下,必要在recovery.conf中做如下设置:
  1. cp /usr/share/pgsql/recovery.conf.sample /data/pgsql/data/recovery.conf
  2. vim recovery.conf
  3. restore_command = 'cp /data/pg_archive/%f %p'
  4. recovery_target_time = '2016-04-21 14:49:14'
复制代码
**注意:**recovery.conf中standby_mode要为off,否则备份库将会以备库身份启动,而不是即时恢复。
4.启动备份库
备份库启动过程中,会进行PITR恢复到指定的时间点
  1. pg_ctl start -D /data/pgsql/data
  2. #查看日志
  3. vim /data/pgsql/pg_log/postgresql-Thu.log
  4. LOG: database system was interrupted; last known up at 2016-04-21 14:34:29 CST
  5. LOG: starting point-in-time recovery to 2016-04-21 14:49:14+08
  6. LOG: restored log file "000000010000000000000005" from archive
  7. LOG: redo starts at 0/5000020
  8. LOG: consistent recovery state reached at 0/50000E0
  9. LOG: restored log file "000000010000000000000006" from archive
  10. LOG: recovery stopping before commit of transaction 1898, time 2016-04-21 14:49:16.635744+08
  11. LOG: redo done at 0/6000398
  12. LOG: last completed transaction was at log time 2016-04-21 14:49:13.786388+08
  13. cp: cannot stat ‘/data/pg_archive/00000002.history': No such file or directory
  14. LOG: selected new timeline ID: 2
  15. cp: cannot stat ‘/data/pg_archive/00000001.history': No such file or directory
  16. LOG: archive recovery complete
  17. LOG: autovacuum launcher started
  18. LOG: database system is ready to accept connections
  19. #查看数据
  20. postgres=# select * from t1;
  21. id |  create_time  
  22. ----+---------------------
  23. 1 | 2016-04-21 13:49:34
  24. 2 | 2016-04-21 13:49:48
  25. 3 | 2016-04-21 14:00:22
  26. 4 | 2016-04-21 14:00:25
  27. 5 | 2016-04-21 14:49:11
  28. 6 | 2016-04-21 14:49:14
  29. (6 rows)
复制代码
7.检察备份库pg_xlog
  1. -bash-4.2$ ll pg_xlog
  2. total 49160
  3. -rw-------. 1 postgres postgres 16777216 Apr 21 15:00 000000010000000000000005
  4. -rw-------. 1 postgres postgres 16777216 Apr 21 15:00 000000010000000000000006
  5. -rw-------. 1 postgres postgres 16777216 Apr 21 15:00 000000020000000000000006
  6. -rw-------. 1 postgres postgres  64 Apr 21 15:00 00000002.history
  7. drwx------. 2 postgres postgres  4096 Apr 21 15:00 archive_status
  8. -bash-4.2$ cat pg_xlog/00000002.history
  9. 1 000000010000000000000006 before 2016-04-21 14:49:16.635744+08
复制代码
从pg_xlog我们看到设置好recovery.conf文件后,启动数据库,将会产生新的timeline,id=2,而且会生成一个新的history文件00000002.history,里面记载的是新时间线2从什么时间哪个时间线什么缘故原由分出来的,该文件可能含有多行记载。
别的,恢复的默认举动是沿着与当前根本备份相同的时间线恢复。如果你想恢复到某些时间线,你必要指定的recovery.conf目的时间线recovery_target_timeline,不能恢复到早于根本备份分支的时间点。
注意:如果恢复过一次,并重新设置recovery_target_time,重新启动触发恢复,并不会基于时间线1进行恢复,而是基于时间线2进行恢复的,但是此时间线上在/data/pg_archive/并没偶然间线为2的归档日志,因此会报错。
增补postgres修改归档模式
步调一:
修改postgresql的设置文件(postgresql.conf)
  1. wal_level=hot_standby
  2.       archive_mode =on
  3.       archive_command ='DATE=`date +%Y%m%d`;DIR="/home/postgres/arch/$DATE";(test -d $DIR || mkdir -p $DIR)&& cp %p $DIR/%f'
复制代码
ps:%p 是指相对路径 %f是指文件名
步调二:创建归档路径
  1. mkdir -p /home/postgres/arch     
  2. chown -R postgres:postgres /home/postgres/arch
复制代码
步调三:重启数据库
步调四:验证归档是否正常
  1. postgres=# checkpoint;
  2.                CHECKPOINT
  3.       postgres=# select pg_switch_xlog();
  4.        pg_switch_xlog
  5.        ----------------
  6.        1/760000E8
  7.        (1 row)
  8.      postgres@ubuntu:~$ cd /home/postgres/data/data_1999/arch/
  9.      postgres@ubuntu:~/data/data_1999/arch$ ls
  10.       20150603
  11.      postgres@ubuntu:~/data/data_1999/arch$ cd 20150603/
  12.       postgres@ubuntu:~/data/data_1999/arch/20150603$ ls
  13.       000000010000000100000074 000000010000000100000075 000000010000000100000076
复制代码
以上为个人履历,渴望能给各人一个参考,也渴望各人多多支持草根技能分享。如有错误或未思量完全的地方,望不吝见教。

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作