使用pg_basebackup对Postgre进行备份与恢复

postgres 版本9.4.23

暂时在Windows下对postgres进行备份恢复。

在进行备份之前,在认证文件中增加一行,否则无法进行备份

host    replication      postgres        127.0.0.1/24            md5

开始使用pg_basebackup命令进行备份。当pgbak文件夹不存在的时候,备份的过程中会自动创建该文件夹。

关于pg_basebackup的命令,可以参考文档 http://www.postgres.cn/docs/9.4/app-pgbasebackup.html

 

C:\PostgreSQL\9.4\bin>pg_basebackup -h 127.0.0.1 -U postgres -D C:\pgbak -Ft -R -z -v --checkpoint=fast
口令:
pg_basebackup: initiating base backup, waiting for checkpoint to complete
pg_basebackup: checkpoint completed
已复制         1 个文件。
已复制         1 个文件。
已复制         1 个文件。
NOTICE:  pg_stop_backup complete, all required WAL segments have been archived
pg_basebackup: base backup completed

进行模拟破坏。停掉库。 删除掉data目录(注意wal日志以.backup结尾及以后的文件不要删除,因为这些文件没有备份,恢复的时候要使用)。把备份好的tar.gz文件解压到data。

在恢复之前,修改加压后的tar.gz里面的recovery.conf文件(其实是指定归档的位置,这样就会进行恢复)。否则无法启动数据库。修改后的内容如下(#屏蔽掉了备份生成的命令):

#standby_mode = 'on'
#primary_conninfo = 'user=postgres password=postgres host=127.0.0.1 port=5432 sslmode=prefer sslcompression=1 krbsrvname=postgres'

restore_command = 'C:\\PostgreSQL\\9.4\\data\\pg_xlog\\archive_status\\%f' 

启动postgres数据库

C:\PostgreSQL\9.4\bin>pg_ctl start -D C:\PostgreSQL\9.4\data
正在启动服务器进程

C:\PostgreSQL\9.4\bin>2019-08-06 21:22:29 HKT 日志:  日志输出重定向到日志收集进
程
2019-08-06 21:22:29 HKT 提示:  后续的日志输出将出现在目录 "pg_log"中.
已复制         1 个文件。
已复制         1 个文件。
C:\PostgreSQL\9.4\bin>

这样数据库就起来了。恢复正常。

下面是恢复后的wal日志文件情况。

 

使用pg_basebackup对Postgre进行备份与恢复_第1张图片

使用pg_basebackup对Postgre进行备份与恢复_第2张图片

恢复的时候,碰到的一些问题

问题1 。这个原因,是因为在recovery.conf中没有指定restore_command。是按照replicate来进行复制了。所以出错。

2019-08-06 21:20:25 HKT LOG:  database system was shut down in recovery at 2019-08-06 21:15:46 HKT
2019-08-06 21:20:25 HKT LOG:  could not open tablespace directory "pg_tblspc/16419/PG_9.4_201409291": No such file or directory
2019-08-06 21:20:25 HKT LOG:  could not open tablespace directory "pg_tblspc/16577/PG_9.4_201409291": No such file or directory
2019-08-06 21:20:25 HKT LOG:  starting archive recovery
'C:\PostgreSQL\9.4\data\pg_xlog\archive_status\0000000100000000000000D6' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
2019-08-06 21:20:25 HKT LOG:  invalid checkpoint record
2019-08-06 21:20:25 HKT FATAL:  could not locate required checkpoint record
2019-08-06 21:20:25 HKT HINT:  If you are not restoring from a backup, try removing the file "C:/PostgreSQL/9.4/data/backup_label".
2019-08-06 21:20:25 HKT 日志:  启动进程 (PID 544) 已退出, 退出代码 1
2019-08-06 21:20:25 HKT 日志:  由于启动进程失败, 终止启动

问题2,这样原因,是因为在恢复的时候,tar.gz文件夹里面,包含有自己建立的表空间。而在模拟故障的是时候,表空间没有被删除,也就是说,没有使用tar.gz里面的表空间文件覆盖原来的表空间。覆盖后OK。

2019-08-06 21:22:29 HKT LOG:  database system was shut down in recovery at 2019-08-06 21:15:46 HKT
2019-08-06 21:22:29 HKT LOG:  could not open tablespace directory "pg_tblspc/16419/PG_9.4_201409291": No such file or directory
2019-08-06 21:22:29 HKT LOG:  could not open tablespace directory "pg_tblspc/16577/PG_9.4_201409291": No such file or directory
2019-08-06 21:22:29 HKT LOG:  starting archive recovery
'C:\PostgreSQL\9.4\data\pg_xlog\archive_status\0000000100000000000000D6' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
2019-08-06 21:22:29 HKT LOG:  redo starts at 0/D6000090
2019-08-06 21:22:29 HKT LOG:  consistent recovery state reached at 0/D60000B8
'C:\PostgreSQL\9.4\data\pg_xlog\archive_status\0000000100000000000000D7' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
2019-08-06 21:22:29 HKT LOG:  record with zero length at 0/D7000090
2019-08-06 21:22:29 HKT LOG:  redo done at 0/D7000028
'C:\PostgreSQL\9.4\data\pg_xlog\archive_status\0000000100000000000000D7' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
'C:\PostgreSQL\9.4\data\pg_xlog\archive_status\00000002.history' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
2019-08-06 21:22:29 HKT LOG:  selected new timeline ID: 2
'C:\PostgreSQL\9.4\data\pg_xlog\archive_status\00000001.history' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
2019-08-06 21:22:29 HKT FATAL:  the database system is starting up
2019-08-06 21:22:29 HKT LOG:  archive recovery complete
2019-08-06 21:22:29 HKT LOG:  MultiXact member wraparound protections are now enabled
2019-08-06 21:22:29 HKT 日志:  数据库系统准备接受连接
2019-08-06 21:22:29 HKT LOG:  autovacuum launcher started
2019-08-06 21:22:30 HKT LOG:  statement: SET DateStyle=ISO; SET client_min_messages=notice; SELECT set_config('bytea_output','escape',false) FROM pg_settings WHERE name = 'bytea_output'; SET client_encoding='UNICODE';
2019-08-06 21:22:30 HKT LOG:  statement: 
	SELECT
	    db.oid as did, db.datname, db.datallowconn,
	    pg_encoding_to_char(db.encoding) AS serverencoding,
	    has_database_privilege(db.oid, 'CREATE') as cancreate, datlastsysoid
	FROM
	    pg_database db
	WHERE db.datname = current_database()
2019-08-06 21:22:30 HKT LOG:  statement: 
	SELECT
	    oid as id, rolname as name, rolsuper as is_superuser,
	    rolcreaterole as can_create_role, rolcreatedb as can_create_db
	FROM
	    pg_catalog.pg_roles
	WHERE
	    rolname = current_user
2019-08-06 21:22:30 HKT LOG:  statement: /*pga4dash*/

END

你可能感兴趣的:(Postgres,SQL)