【PostgreSQL】PostgreSQL常用备份方法_received smart shutdown request

59 阅读1分钟

备份:

pg_dump dbname | gzip > filename.gz

恢复

gunzip -c filename.gz | psql dbname

 

2)分割

备份:

pg_dump dbname | split -b 1m - filename

恢复

cat filename* | psql dbname

 

具体实验步骤如下:

pg_dump

首先创建数据库并创建测试表

[pg@edb1 ~]$ createdb pg

[pg@edb1 ~]$ psql pg

psql (9.3.9)

Type "help" for help.

 

pg=# create table backup_test(x int);

CREATE TABLE

pg=# insert into backup_test values(1);

INSERT 0 1

pg=# insert into backup_test values(2);

INSERT 0 1

pg=# select * from backup_test;

 x 


 1

 2

(2 rows)

pg=# \q

使用pg_dump工具进行SQL转储:

[pg@edb1 ~]$ pg_dump pg > /home/pg/pg.dmp

删掉原有数据库,使用dmp文件重建:

[pg@edb1 ~]$ dropdb pg

[pg@edb1 ~]$ createdb pg

[pg@edb1 ~]$ psql pg < /home/pg/pg.dmp

....

验证数据是否恢复:

[pg@edb1 ~]$ psql pg

psql (9.3.9)

Type "help" for help.

 

pg=# select * from backup_test;

 x 


 1

 2

(2 rows)

 

pg_dumpall

刚才使用pg_dump只能备份单库,使用pg_dumpall可以备份本地所有库

实验过程如下:

创建测试数据库及测试表

[pg@edb1 ~]$ createdb pg1

[pg@edb1 ~]$ createdb pg2

[pg@edb1 ~]$ psql pg1

psql (9.3.9)

Type "help" for help.

 

pg1=# create table btest1(x int);

CREATE TABLE

pg1=# insert into btest1 values(1);

INSERT 0 1

pg1=# \q

[pg@edb1 ~]$ psql pg2

psql (9.3.9)

Type "help" for help.

 

pg2=# create table btest2(x int);

CREATE TABLE

pg2=# insert into btest2 values(1);

INSERT 0 1

pg2=# \q

备份数据库:

[pg@edb1 ~]$ pg_dumpall > /home/pg/pg_all.dmp

删除数据库:

[pg@edb1 ~]$ dropdb pg1

[pg@edb1 ~]$ dropdb pg2

恢复数据库:

[pg@edb1 ~]$ psql -f /home/pg/pg_all.dmp postgres

......

验证数据:

[pg@edb1 ~]$ psql pg1

psql (9.3.9)

Type "help" for help.

 

pg1=# select * from btest1;

 x 


 1

(1 row)

 

pg1=# \q

[pg@edb1 ~]$ psql pg2

psql (9.3.9)

Type "help" for help.

 

pg2=# select * from btest2;

 x 


 1

(1 row)

 

pg2=# \q

 

2.在线热备

使用select pg_start_backup和select pg_stop_backup()对数据库进行热备

实验过程如下:

(1)开启归档

[pg@edb1 ~]$ vi /home/pg/pgsql/data/postgresql.conf 

配置以下三个参数:

wal_level = archive

archive_mode = on

archive_command = 'cp %p /home/pg/pgsql/backup/archived_log/%f'

(2)创建归档目录

[pg@edb1 ~]$ mkdir -p /home/pg/pgsql/backup/archived_log

(3)重启数据库,使参数生效

[pg@edb1 ~]$ pg_ctl -D /home/pg/pgsql/data stop

[pg@edb1 ~]$ pg_ctl -D /home/pg/pgsql/data start

(4)创建测试库

[pg@edb1 ~]$ createdb arch

[pg@edb1 ~]$ psql arch

psql (9.3.9)

Type "help" for help.

 

arch=# create table btest(x int);

CREATE TABLE

arch=# insert into btest values(1);

INSERT 0 1

(5)创建备份

arch=# select pg_start_backup('baseline');

 pg_start_backup 


 0/5000028

(1 row)

 

arch=# \q

(6)备份数据库目录

[pg@edb1 ~]$ tar -zcvf /home/pg/pg_backup.tar.gz /home/pg/pgsql/data/

......

(7)停止备份

[pg@edb1 ~]$ psql arch

psql (9.3.9)

Type "help" for help.

 

arch=# select pg_stop_backup();

NOTICE:  pg_stop_backup complete, all required WAL segments have been archived

 pg_stop_backup 


 0/50000B8

(1 row)

(8)再插入一些其他数据并切换WAL日志

arch=# insert into btest values(2);

INSERT 0 1

arch=# insert into btest values(3);

INSERT 0 1

arch=# insert into btest values(4);

INSERT 0 1

arch=# select pg_switch_xlog();

 pg_switch_xlog 


 0/6000208

(1 row)

(9)停止数据库

[pg@edb1 ~]$ pg_ctl -D /home/pg/pgsql/data stop

LOG:  received smart shutdown request

LOG:  autovacuum launcher shutting down

LOG:  shutting down

waiting for server to shut down....LOG:  database system is shut down