Postgresql备份与恢复
一、 Postgresql数据库备份与恢复种类:
物理备份与还原:备份 PGDATA, 归档文件,以及所有表空间目录,适于跨小版本的恢复,但是不能跨平台;
逻辑备份与还原:备份数据,适用于跨版本和跨平台的恢复。
备份恢复方式通常有三种:
1)SQL 转储(逻辑)
2)文件系统级别备份( 物理-冷备份)
3)在线热备份(物理-归档)
4)pg_basebackup(物理备份,采取流复制方式)
(一)pg_dump
1. 创建数据库
createdb eagle
2. 连入数据库eagle
psql eagle
3. 创建测试表,插入数据
eagle=# create table pg_t ( id int);
CREATE TABLE
eagle=# insert into pg_t values(1);
INSERT 0 1
eagle=# insert into pg_t values(2);
INSERT 0 1
eagle=# insert into pg_t values(3);
INSERT 0 1
eagle=# insert into pg_t values(4);
INSERT 0 1
4. 查看数据
eagle=# select * from pg_t;
id
----
1
2
3
4
(4 rows)
5. 备份
pg_dump eagle > /arch/ eagle.dmp
6. 删除数据库pg
dropdb eagle
7. 创建新数据库(恢复之前需创建数据库)
createdb eagle
8. 恢复数据
psql eagle
SET
SET
SET
SET
SET
SET
SET
SET
SET
CREATE TABLE
ALTER TABLE
CREATE TABLE
ALTER TABLE
REVOKE
REVOKE
GRANT
9. 查看数据是否回复
eagle=# select * from pg_t;
id
----
1
2
3
4
(数据已成功恢复)
(二)pg_dumpall
pg_dump只能备份单个数据库,而且恢复的时候需要创建空数据库。pg_dumpall可以备份所有数据库,并且备份角色、表空间。
1. 创建数据库
createdb pg1
createdb pg2
2. pg1中创建表并插入数据
psql pg1
eagle=# create table tb1(id int);
eagle=# insert into tb1 values(1);
3. pg2中创建表并插入数据
eagle pg2
eagle=# create table tb2(id int)
eagle=# insert into tb2 values(2);
4. 备份数据库
pg_dumpall > /arch /pg_all.dmp
5. 删除数据库
dropdb pg1
dropdb pg2
6. 恢复数据库
psql –f /arch/pg_all.dmp postgres
可以指定任何数据库名,如果恢复到一个空的集群中,通常使用postgres数据库
7. 查看数据库pg1是否恢复
psql pg1
eagle=# select * from tb1;
id
---
1
(1 rows)
8. 查看数据库pg2是否恢复
psql pg2
=# select * from tb2;
id
---
2
(1 rows)
(数据已成功恢复)
(三)备份压缩与分割:
压缩与分割的原理都是利用Linux的管线(PIPE)命令。
1)压缩
l 备份:
pg_dump dbname | gzip > filename.gz
l 恢复
gunzip -c filename.gz | psql dbname
2)分割
l 备份:
pg_dump dbname | split -b1m- filename
l 恢复
cat filename* | psql dbname
三、文件系统级别备份(冷备份)
文件系统级别的备份是冷备份,需要停止数据库。
1. 停止数据库
pg_ctl stop
2. 备份数据库
tar –jcv –f /arch/coolbak.tar.bz2 /usr/local/pgsql/data/
3. 删除/usr/local/pgsql/data/目录
rm –r /usr/local/pgsql/data/
4. 解压备份文件到原目录
tar –jxvf /arch /coolbak.tar.bz2 –C /
5,启动数据库
pg_ctl start
6. 查看数据库pg1是否恢复
psql pg1
eagle=# select * from tb1;
id
---
1
(1 rows)
7. 查看数据库pg2是否恢复
psql pg2
eagle=# select * from tb2;
id
---
2
(1 rows)
四、在线热备份(归档)
(一)备份
1. 配置归档模式
配置归档需要编辑postgresql.conf文件:
vim /usr/local/pgsql/data/postgesql.conf
archive_mode = on ---开启归档模式
archive_command = ‘cp %p /arch /%f’ ---指定归档路径
注:%p要被归档的日志文件的路径,%f是要被归档的日志文件的文件名
2. 启动数据库
pg_ctl –D /usr/local/pgsql/data start
查看postgresql进程:
[postgres@PostGres ~]$ ps -ef|grep postgres:|grep -v grep
postgres 1783 1782 0 16:49 pts/0 00:00:00 postgres: pg_statsinfo launcher process
postgres 1784 1782 0 16:49 ? 00:00:00 postgres: logger process
postgres 1786 1782 0 16:49 ? 00:00:00 postgres: checkpointer process
postgres 1787 1782 0 16:49 ? 00:00:00 postgres: writer process
postgres 1788 1782 0 16:49 ? 00:00:00 postgres: wal writer process
postgres 1789 1782 0 16:49 ? 00:00:00 postgres: autovacuum launcher process
postgres 1790 1782 0 16:49 ? 00:00:00 postgres: archiver process ---归档进程
postgres 1791 1782 0 16:49 ? 00:00:00 postgres: stats collector process
postgres 1809 1782 0 16:50 ? 00:00:00 postgres: postgres postgres [local] idle
3. 创建数据库arch
createdb arch
4. 创建表并插入记录
psql arch
arch=# create table tb(a int);
arch=# insert into tb(a) values(1);
5. 创建备份
arch=# select pg_start_backup(‘baseline’);
6. 备份整个data目录
tar –jcv –f /usr/local/pgsql/backup/baseline.tar.bz2 /usr/local/pgsql/data/
7. 停止备份
psql arch
arch=# select pg_stop_backup();
8. 插入新记录,然后切换日志,重复3次
arch=# insert into tb(a) values(2);
arch=# select pg_switch_xlog();
arch=# insert into tb(a) values(3);
arch=# select pg_switch_xlog();
arch=# insert into tb(a) values(4);
arch=# select pg_switch_xlog();
9. 把/data/pg_xlog/下的WAL日志文件复制到预设的归档目录下,保证产生的WAL日志都已归档。
(二)恢复
1. 停止数据库
pg_ctl –D /usr/local/pgsql/data/ stop
2. 删除/data/
rm –r /usr/local/pgsql/data/
3. 恢复备份
tar –jxv –f /usr/local/pgsql/backup/baseline.tar.bz2 –C /
4. 清空/data/pg_xlog/目录下所有文件
rm –r /usr/local/pgsql/data/pg_xlog/
5. 创建/pg_xlog/及其下面的archive_status目录
mkdir /usr/local/pgsql/data/pg_xlog/
mkdir /usr/local/pgsql/data/pg_xlog/archive_status
6. 在/data/目录下创建recovery.conf
vim /usr/local/pgsql/data/recovery.conf
restore_command = ‘cp /usr/local/pgsql/backup/archived_log/%f “%p”’
7. 启动数据库
pg_ctl –D /usr/local/pgsql/data/ start
一切正常的话数据库就会自动应用WAL日志进行恢复
8. 查看数据库arch是否恢复
psql arch
arch=# select * from tb;
a
---
1
2
3
4
(4 rows)
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7721556/viewspace-1408159/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/7721556/viewspace-1408159/