Postgresql杂谈 18—Postgresql中的备份和恢复(二)

       上一篇文章中,我们主要学习了Postgresql的逻辑备份和恢复,接着上一篇的内容,今天我们介绍下Postgresql的物理备份。所谓物理备份,就是针对数据库的数据文件或者目录进行备份,物理备份的好处就是简单高效,不需要针对每个数据库对象进行备份,只需要将所有数据一次性的打包。不足之处在于,它不支持部分备份只能进行全量备份。物理备份有冷备份和热备份的说法,冷备份是指备份时需要先停止当前数据库的运行,保证在备份期间不会有新的数据库的改动。而热备份是线上备份,备份是不影响数据库的访问。

       下面,笔者将从冷备份和热备份两个方面就这一问题进行介绍。

一、Postgresql的冷备份

       冷备份比较简单,停掉数据库之后,只需要将原来的数据库实例的目录进行打包,复制到其它目录或者其它机器上,再使用Postgresql程序进行启动即可。为了保证本文知识的完整性,虽然简单,我们也动手做一边。

       首先,停止数据库:

[postgres@VM-115-39-centos ~]/usr/pgsql-11/bin/pg_ctl stop -D /var/lib/pgsql/11/data/ -m fast
waiting for server to shut down.... done
server stopped

       从上面停止数据库的命令中我们也可以看到,此次数据库的数据目录在/var/lib/pgsql//11/data,这就是我们的备份目标目录,下面对该目录进行打包:

tar zcvf data.tar.gz /var/lib/pgsql/11/data/

       打包完成之后,把压缩包移动到/data/pgsql-11/目录下面,再进行解压缩:

mv data.tar.gz /data/pgsql-11/ tar -zxvf data.tar.gz

       最后启动数据库实例时,目标指向我们解压好的目录即可:

[postgres@VM-115-39-centos /data/pgsql-11/data]/usr/pgsql-11/bin/pg_ctl start -D /data/pgsql-11/data/ 
waiting for server to start....2021-07-02 09:48:34.172 CST [30752] LOG:  listening on IPv4 address "0.0.0.0", port 55432
2021-07-02 09:48:34.173 CST [30752] LOG:  listening on IPv6 address "::", port 55432
2021-07-02 09:48:34.178 CST [30752] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.55432"
2021-07-02 09:48:34.188 CST [30752] LOG:  listening on Unix socket "/tmp/.s.PGSQL.55432"
2021-07-02 09:48:34.242 CST [30752] LOG:  redirecting log output to logging collector process
2021-07-02 09:48:34.242 CST [30752] HINT:  Future log output will appear in directory "log".
 done
server started

       可以看到,数据库正常启动,连接上去也可以看到所有的数据都完整备份下来。不过在实际的生产过程中,这种备份方式基本不会被用到,几乎都不会把数据库停下来进行一次这种不入流的备份。下面,我们继续学习下Postgresql物理热备份的方法——LVM快照备份。

二、Postgresql的热备份

2.1 LVM快照备份

       LVM是 Logical Volume Manager(逻辑卷管理)的简写,它将一个或者多个硬盘再逻辑上集合,相当一个大硬盘来用。它可以实现硬盘的动态扩容,当逻辑硬盘不够用时,可以再在逻辑硬盘中动态地加入新的硬盘,从而实现了扩容。LVM模型如下所示

 

       使用LVM进行Postgresql的热备份,实际上就是利用LVM的快照功能,给数据库实例所在的数据目录进行快照,但是前提是Postgresql的数据库建立在LVM之上。

       为了验证这个功能,需要先安装LVM,然后在LVM上创建Postgresql数据库实例。笔者的主机是CentOS7.5,在CentOS下执行使用yum安装即可,如果是Ubuntu或者Debian直接使用apt get install应该就可以安装。

[root@VM-115-39-centos]yum install lvm2
Loaded plugins: fastestmirror, langpacks
......

       安装好LVM之后,先建立一个卷组,卷组建立在我本机一个云硬盘上。卷组是一个存储池,是物理硬盘或者物理硬盘分区的集合。

[root@VM-115-39-centos /dev]vgcreate vgpg01 /dev/vdb
WARNING: ext4 signature detected on /dev/vdb at offset 1080. Wipe it? [y/n]: y
  Wiping ext4 signature on /dev/vdb.
  Physical volume "/dev/vdb" successfully created.
  Volume group "vgpg01" successfully created

       建立了卷组vgpg01之后,还需要建立一个逻辑卷:

[root@VM-115-39-centos /dev]lvcreate -n lvpg01 vgpg01 -L 10G
  Logical volume "lvpg01" created.

-n:后面是逻辑卷的名称

-L:后面是逻辑卷的大小,这里是10G

       此时可以在/dev/下面可以看到我们创建的卷组,在卷组里可以找到逻辑卷:

[root@VM-115-39-centos /dev/vgpg01]ls

lvpg01

       接下来需要在该逻辑卷上建立文件系统,这里我选择格式化成ext4文件系统:

[root@VM-115-39-centos /dev/vgpg01]mkfs -t ext4 /dev/vgpg01/lvpg01 
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
655360 inodes, 2621440 blocks
131072 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2151677952
80 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

       完成上述步骤之后,需要建立挂载点,笔者建立的目录是跟目录下的/data目录

mkdir /data

       然后,将逻辑卷挂载到这个目录下面

mount /dev/vgpg01/lvpg01 /data

       可以查看下,有没有挂载成功:

[root@VM-115-39-centos /dev/vgpg01]df -TH
Filesystem                Type      Size  Used Avail Use% Mounted on
devtmpfs                  devtmpfs  509M     0  509M   0% /dev
tmpfs                     tmpfs     520M   41k  520M   1% /dev/shm
tmpfs                     tmpfs     520M  586k  520M   1% /run
tmpfs                     tmpfs     520M     0  520M   0% /sys/fs/cgroup
/dev/vda1                 ext4       53G   39G   12G  77% /
tmpfs                     tmpfs     104M     0  104M   0% /run/user/0
/dev/mapper/vgpg01-lvpg01 ext4       11G   38M  9.9G   1% /data

       从第9行可以看到,我们新建的逻辑卷已经成功挂载到了/data目录下面,接下啦,笔者在/data目录下创建一个Postgresql数据库实例:

mkdir /data/pgsql/11/lvdata
/usr/pgsql-11/bin/pg_ctl init -D /data/pgsql/11/lvdata/

       启动该实例:

[postgres@VM-115-39-centos ~]/usr/pgsql-11/bin/pg_ctl start -D /data/pgsql/11/lvdata/
waiting for server to start....2021-07-02 15:02:05.172 CST [14417] LOG:  listening on IPv6 address "::1", port 5432
2021-07-02 15:02:05.172 CST [14417] LOG:  listening on IPv4 address "127.0.0.1", port 5432
2021-07-02 15:02:05.182 CST [14417] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2021-07-02 15:02:05.201 CST [14417] LOG:  listening on Unix socket "/tmp/.s.PGSQL.5432"
2021-07-02 15:02:05.221 CST [14417] LOG:  redirecting log output to logging collector process
2021-07-02 15:02:05.221 CST [14417] HINT:  Future log output will appear in directory "log".
 done
server started

       启动实例之后,我们登录到数据库实例中,创建相关数据表并插入测试数据。

postgres=# create database lvdata template = template0;
CREATE DATABASE
postgres=# \c lvdata;
You are now connected to database "lvdata" as user "postgres".
lvdata=# create table t1(id int,name varchar(32));
CREATE TABLE
lvdata=# insert into t1 values (1,'tom');
INSERT 0 1
lvdata=# insert into t1 values (2,'jerry');
INSERT 0 1
lvdata=# select * from t1;
 id | name  
----+-------
  1 | tom
  2 | jerry
(2 rows)

       现在解释下上面的代码:

       首先第1行创建了一个lvdata的数据库,第5行创建了一个测试表t1,第7行、第9行分别向t1表中插入两条数据,第11行是查询t1表。

       执行完上述的命令之后,我们的测试数据库里面已经插入了数据。接下来,笔者就通过创建LVM快照的方式进行Postgresql数据库的备份。在创建快照之前,我们先插入一个检查点:

lvdata=# checkpoint;
CHECKPOINT

       然后创建LVM快照:

[root@VM-115-39-centos ~]# lvcreate -s -n snap20210702 vgpg01/lvpg01 -L 200M
  Logical volume "snap20210702" created.

-s:表示正在创建快照

-n:后面是快照的名称

-L:快照可使用的最大空间值

lvs命令可以看到做的已经做的快照:

[root@VM-115-39-centos ~]# lvs
  LV           VG     Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lvpg01       vgpg01 owi-aos---  10.00g                                                    
  snap20210702 vgpg01 swi-a-s--- 200.00m      lvpg01 0.16 

       快照文件的实际位置在我们创建的卷组的下面:

[root@VM-115-39-centos ~]# ls /dev/vgpg01/
lvpg01  snap20210702

       我们可以像使用逻辑卷一样使用快照,比如说,将快照挂载到指定的目录上面:

[root@VM-115-39-centos ~]# mount  /dev/vgpg01/snap20210702 -t ext4 /data/pgsql/11/lvdata20210702/
[root@VM-115-39-centos ~]# df -TH
Filesystem                      Type      Size  Used Avail Use% Mounted on
devtmpfs                        devtmpfs  509M     0  509M   0% /dev
tmpfs                           tmpfs     520M   33k  520M   1% /dev/shm
tmpfs                           tmpfs     520M  635k  519M   1% /run
tmpfs                           tmpfs     520M     0  520M   0% /sys/fs/cgroup
/dev/vda1                       ext4       53G   39G   12G  77% /
tmpfs                           tmpfs     104M     0  104M   0% /run/user/0
/dev/mapper/vgpg01-lvpg01       ext4       11G   88M  9.8G   1% /data
/dev/mapper/vgpg01-snap20210702 ext4       11G   88M  9.8G   1% /data/pgsql/11/lvdata20210702
[root@VM-115-39-centos ~]# 

       可以看到,快照已经成功挂载到了对应的目录上面,现在对该目录进行打包:

tar -zcvf lvdata20210702.tar.gz /data/pgsql/11/lvdata20210702/

       打包完成之后,我们可以将打包文件拷贝到任意机器上进行解压缩,然后使用Postgresql程序进行加载,这样就得到了一个完全一样的数据库。至此,就完成了通过LVM快照的方式就行备份。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值