加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

【PostgreSQL】PostgreSQL常用备份方法

发布时间:2020-12-13 17:11:04 所属栏目:百科 来源:网络整理
导读:针对于 PostgreSQL 备份方式有三种: 1.SQL 转储 2.热备 3.文件系统冷备份 之后对于这三种备份方式一一演示: 1.SQL 转储 这里我们用到的工具是 pg_dump 和 pg_dumpall ,它和 Oracle 中的 expdp , Mysql 的 mysqldump 类似,它可以在数据库正在使用的时候

针对于PostgreSQL备份方式有三种:

1.SQL转储

2.热备

3.文件系统冷备份

之后对于这三种备份方式一一演示:

1.SQL转储

这里我们用到的工具是pg_dumppg_dumpall,它和Oracle中的expdpMysqlmysqldump类似,它可以在数据库正在使用的时候进行完整一致的备份,并不阻塞其它用户对数据库的访问。

同时在使用此种备份方法时可以使用数据库层面的命令对数据进行压缩或分割,如:

1)压缩

备份:

pg_dumpdbname|gzip>filename.gz

恢复

gunzip-cfilename.gz|psqldbname

2)分割

备份:

pg_dumpdbname|split-b1m-filename

恢复

catfilename*|psqldbname

具体实验步骤如下:

pg_dump

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

[pg@edb1~]$createdbpg

[pg@edb1~]$psqlpg

psql(9.3.9)

Type"help"forhelp.

pg=#createtablebackup_test(xint);

CREATETABLE

pg=#insertintobackup_testvalues(1);

INSERT01

pg=#insertintobackup_testvalues(2);

pg=#select*frombackup_test;

x

---

1

2

(2rows)

pg=#q

使用pg_dump工具进行SQL转储:

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

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

[pg@edb1~]$dropdbpg

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

....

验证数据是否恢复:

(2rows)

pg_dumpall

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

实验过程如下:

创建测试数据库及测试表

[pg@edb1~]$createdbpg1

[pg@edb1~]$createdbpg2

[pg@edb1~]$psqlpg1

pg1=#createtablebtest1(xint);

pg1=#insertintobtest1values(1);

pg1=#q

[pg@edb1~]$psqlpg2

pg2=#createtablebtest2(xint);

pg2=#insertintobtest2values(1);

pg2=#q

备份数据库:

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

删除数据库:

[pg@edb1~]$dropdbpg1

[pg@edb1~]$dropdbpg2

恢复数据库:

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

......

验证数据:

pg1=#select*frombtest1;

(1row)

pg2=#select*frombtest2;

pg2=#q

2.在线热备

使用selectpg_start_backupselectpg_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/datastop

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

(4)创建测试库

[pg@edb1~]$createdbarch

[pg@edb1~]$psqlarch

arch=#createtablebtest(xint);

arch=#insertintobtestvalues(1);

INSERT01

(5)创建备份

arch=#selectpg_start_backup('baseline');

pg_start_backup

-----------------

0/5000028

arch=#q

(6)备份数据库目录

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

......

(7)停止备份

arch=#selectpg_stop_backup();

NOTICE:pg_stop_backupcomplete,allrequiredWALsegmentshavebeenarchived

pg_stop_backup

----------------

0/50000B8

(1row)

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

arch=#insertintobtestvalues(2);

arch=#insertintobtestvalues(3);

arch=#insertintobtestvalues(4);

arch=#selectpg_switch_xlog();

pg_switch_xlog

0/6000208

(1row)

(9)停止数据库

LOG:receivedsmartshutdownrequest

LOG:autovacuumlaunchershuttingdown

LOG:shuttingdown

waitingforservertoshutdown....LOG:databasesystemisshutdown

done

serverstopped

(10)删除目录

[pg@edb1~]$rm-rf/home/pg/pgsql/data/

(11)使用tar包备份恢复目录

[pg@edb1~]$tar-zxvfpg_backup.tar.gz-C/

......

(12)重置pg_xlog目录

[pg@edb1~]$rm-r/home/pg/pgsql/data/pg_xlog/

[pg@edb1~]$mkdir/home/pg/pgsql/data/pg_xlog/

(13)创建目录存放之前的归档

[pg@edb1~]$mkdirarch

[pg@edb1~]$cp/home/pg/pgsql/backup/archived_log/*arch/

(14)编辑recovery.conf文件

[pg@edb1~]$vipgsql/data/recovery.conf

restore_command=‘cp/home/pg/arch/%f“%p”’

(15)启动数据库

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

serverstarting

[pg@edb1~]$LOG:databasesystemwasinterrupted;lastknownupat2015-09-2118:27:41CST

LOG:startingarchiverecovery

LOG:restoredlogfile"000000010000000000000005"fromarchive

LOG:redostartsat0/5000090

LOG:consistentrecoverystatereachedat0/50000B8

LOG:restoredlogfile"000000010000000000000006"fromarchive

cp:cannotstat`/home/pg/arch/000000010000000000000007':Nosuchfileordirectory

LOG:redodoneat0/60001E8

LOG:lastcompletedtransactionwasatlogtime2015-09-2118:30:16.033281+08

cp:cannotstat`/home/pg/arch/00000002.history':Nosuchfileordirectory

LOG:selectednewtimelineID:2

cp:cannotstat`/home/pg/arch/00000001.history':Nosuchfileordirectory

LOG:archiverecoverycomplete

LOG:MultiXactmemberwraparoundprotectionsarenowenabled

LOG:databasesystemisreadytoacceptconnections

LOG:autovacuumlauncherstarted

可以看到数据库恢复到了最后一个归档所在的时间点

(16)验证数据

arch=#select*frombtest;

3

4

(4rows)

3.文件系统冷备份

方法就是对数据库相关文件直接进行备份,由于需要停库,对业务影响较大,所以一般不使用这种方法。

实验过程如下:

创建测试库

[pg@edb1~]$createdbtest1

[pg@edb1~]$psqltest1

test1=#createtabletest1(xint);

test1=#insertintotest1values(1);

test1=#q

关库

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

pg_all.dmppg.dmppg.logpgsql/

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

waitingforservertoshutdown....done

serverstopped

进行文件系统打包冷备

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

......

删除原来的文件

[pg@edb1~]$rm-rf/home/pg/pgsql/data/

使用tar包中内容进行替换

[pg@edb1~]$tar-zxvfpgdata.tar.gz-C/

启动数据库查看

[pg@edb1~]$LOG:databasesystemwasshutdownat2015-09-2118:02:27CST

LOG:autovacuumlauncherstarted

[pg@edb1~]$

test1=#select*fromtest1;

test1=#q

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读