pg_dump 是PostgreSQL自带的命令行工具,可以把数据库导出成备份文件。这个文件可以只包含数据库结构、只包含数据,或者两者都有。
pg_dump最大的优点是可以让你在服务器之间迁移数据、在崩溃后恢复数据库,或者单纯做个长期存档。注意,这个工具更适合做逻辑备份(用SQL语句),而不是直接拷贝数据库文件那种物理备份。
pg_dump命令的基本语法
想用pg_dump做备份,只要在终端里敲下面这条命令:
pg_dump -U username -d database_name -f backup_file.sql
来拆解一下命令里的各个部分:
-U username— 指定用哪个PostgreSQL用户连接数据库。-d database_name— 指定要备份哪个数据库。-f backup_file.sql— 指定备份文件保存到哪里,可以是绝对路径也可以是相对路径。
举个例子:假如你有个数据库叫university,想把它备份到university_backup.sql文件里。命令如下:
pg_dump -U postgres -d university -f university_backup.sql
这时候PostgreSQL会让你输入postgres用户的密码,才能访问数据。
小贴士:如果你在本地服务器上操作,不想每次都输密码,可以配置.pgpass文件。去看看PostgreSQL官方文档,里面有详细说明。
参数和用法
pg_dump这个工具很灵活,可以根据你的需求调整各种备份方式:
- 只备份数据库结构
如果你只想保存数据库结构(比如要在新服务器上搭环境),用--schema-only参数。命令示例:
pg_dump -U postgres -d university --schema-only -f university_schema.sql
这样会生成一个只包含CREATE TABLE、CREATE INDEX等语句的SQL脚本,不带数据。
- 只备份数据
有时候你只想保存数据,不要结构。这种情况用--data-only参数:
pg_dump -U postgres -d university --data-only -f university_data.sql
生成的文件会包含INSERT INTO语句,可以用来恢复你的数据。
- 压缩备份文件
如果你的数据库表和数据很多,备份文件可能会很大。想省点空间,可以用--compress参数:
pg_dump -U postgres -d university -f university_backup.sql --compress=6
压缩级别用0(不压缩)到9(最强压缩)的数字。注意,压缩级别越高,备份时间也会更长。
- 导出成二进制格式
如果你想用更快的方式恢复,可以把备份保存成二进制格式,而不是SQL文本:
pg_dump -U postgres -d university -Fc -f university_backup.dump
-Fc参数表示用Custom格式,这种格式可以用pg_restore工具恢复。
备份示例
完整备份数据库
比如你有个数据库叫company,想把结构和数据都备份下来:
pg_dump -U postgres -d company -f company_backup.sql
只备份一张表
如果你只想备份数据库里的某一张表,用-t参数:
pg_dump -U postgres -d company -t employees -f employees_backup.sql
这个文件只会包含employees表的结构和数据。
备份多张表
想备份多张表,就多加几个-t参数:
pg_dump -U postgres -d company -t employees -t departments -f selected_tables_backup.sql
压缩备份
想省空间,可以用--compress参数,或者直接用压缩格式:
pg_dump -U postgres -d company -Fc -f company_backup_compressed.dump
实用建议
检查备份文件大小。如果备份文件特别小,可能哪里出错了。可以加--verbose参数,看看备份过程的详细信息。
自动化备份流程。用cron或者pg_cron定时做备份。记得定期清理老备份,别让硬盘爆了。
校验备份有效性。在测试服务器上恢复一下备份,看看能不能用,别等到真出事才发现备份坏了。
你可能遇到的错误
认证失败。如果你没写对用户名或者忘了密码,pg_dump会报错。建议配置好.pgpass文件,自动登录。
连接失败。如果PostgreSQL服务器没开,或者数据库名写错了,工具就备不了份。检查下数据库名和服务器状态。
权限问题。你用的用户必须有权限读数据库结构和数据。能用管理员账号就用管理员账号吧。
GO TO FULL VERSION