上一篇文章中,我们主要学习了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快照的方式就行备份。