PostgreSQL 提供了三种备份和恢复的方式:SQL dump、文件系统复制和联机热备份。每一种备份方式都有自己的优点和缺点,下面将详细介绍。
SQL dump
这种备份方式产生一个文本文件,里面包含创建各种数据库对象的 SQL 语句和每个表中的数据。另外,表上创建的索引中的数据不会被导出,只会导出索引的定义信息。在恢复数据库的时候,索引会被重建。可以使用数据库提供的工具 pg_dumpall 和 pg_dump 来进行备份。pg_dumpall 会备份一个数据库集群中的所有信息和数据。pg_dump 只备份数据库集群中的某个数据库的数据,它不会导出角色和表空间相关的信息,因为这些信息是整个数据库集群共用的,不属于某个单独的数据库。
pg_dump 的基本用法如下:
pg_dump [connection-option...] [option...] [dbname] > [backup_file]
pg_dump 命令用来备份一个 PostgreSQL 数据库到 SQL 文件或者归档文件,备份 PostgreSQL 数据库是不会锁定数据库,也不会阻止用户读写。
常用连接选项(connection-option...):
- -h host
--host=host
指定服务器的主机名或者 IP,如果以/
开头,表示是 Unix 套接字所在的目录。 - -p port
--port=port
指定 PostgreSQL 数据库服务器使用的TCP端口号。 - -U username
--username=username
指定连接 PostgreSQL 数据库的用户。
常用选项(option...):
- -t table
--table=table
只转储指定名称的表。
示例:
pg_dump -h 127.0.0.1 -U test demo_db > backup.sql
恢复数据库
pg_dump 创建的备份文件可以被工具 psql 识别。因此可以使用 psql 来读取 pg_dump 创建的备份文件,实现恢复数据库的功能。
psql 数据库名 < 备份文件名
使用 pg_dumpall
pg_dump 只备份数据库集群中的某个数据库的数据,它不会导出角色和表空间相关的信息。pg_dumpall 则可以导出整个数据库集群中所有的数据库中的数据,同时也会导出角色、用户和表空间的定义信息。
使用 pg_dumpall 的一般命令格式如下:
pg_dumpall > 备份文件名
大型数据库的备份和恢复
如果数据库的规模比较大,产生的备份文件的大小超级了操作系统能够允许的单个文件的大小的最大值,可以使用压缩和将备份文件分成对个部分这两个方法来解决这个问题。
采用压缩的方法
可以采用操作系统提供的任何一种压缩工具来实现,常用的是gzip。例如:
pg_dump dbname | gzip > filename.gz
恢复时,使用下面的命令:
gunzip -c filename.gz | psql dbname
也可以使用下面的命令来恢复数据库:
cat filename.gz | gunzip | psql dbname
将备份文件分成多个部分
使用操作系统的工具split来实现。例如:
pg_dump dbname | split -b 1m - filename
在这个例子中,数据库备份被分成多个大小为1MB的文件。使用下面的命令进行恢复操作:
cat filename* | psql dbname
使用pg_dump自带的压缩功能
这种方法产生的备份文件也是被压缩的,同第一种方法相比,它有一个优点,就是可以只恢复备份文件中的某个表的数据。这种方法的命令格式如下,就是增加了选项-Fc:
pg_dump -Fc dbname > filename
不能使用psql命令恢复用这种方法备份的数据,必须使用pg_restore来进行恢复操作。命令格式如下:
pg_restore -d dbname filename
对于非常大的数据库,可以将压缩与分割的方法同时使用(同时使用第一种和第二种方法,或者同时使用第二种和第三种方法)。
文件系统复制
文件系统复制这种方法是直接复制所有的数据库文件,存放到其它的存储介质上。这是最简单的备份数据库的方法。可以使用操作系统的命令来完成备份,例如:
tar -cf backup.tar /usr/local/pgsql/data
复制数据文件以前,必须关闭数据库。这种备份方法产生的备份文件比较大,因为索引数据也会被备份。恢复数据库时只要把备份文件复制到存放数据文件的目录中即可。
实战示例
笔者的数据库表非常大,所以用参数 custom 的压缩方式,这样会大大减小备份数据的大小。
首先,使用 postgres 登录数据库,并执行以下 pg_dump
命令:
pg_dump -F custom -t product db_product > product.dump
然后,通过一顿搬砖操作(如 scp),将备份文件同步到新的数据库机器,这里给出下载和上传文件的例子:
scp root@xxx.xxx.xxx.xx:/var/lib/pgsql/backups/*.dump ./
最后,在数据库机器上执行如下 pg_restore
命令:
pg_restore -d db_product product.dump
轻松搞定。