炭炭背单词免费
125.76MB · 2025-10-10
备份不是“复制文件”这么简单——它是数据安全的最后一道防线。当遇到以下场景时,备份能帮你“起死回生”:
DROP TABLE
);备份的终极目标是可恢复性:确保你能从备份中还原出“完整、一致”的数据,且还原过程可重复、可验证。
PostgreSQL的备份分为物理备份和逻辑备份,二者的本质区别在于“备份的是‘数据文件’还是‘数据的逻辑结构’”。我们用“搬家”类比:
base
目录、pg_wal
日志),速度快,但只能还原到相同版本的PostgreSQL。CREATE TABLE
语句、INSERT
数据),灵活但速度慢,支持跨版本迁移。物理备份的核心工具是pg_basebackup
,它通过流复制协议从数据库服务器复制数据文件和WAL(Write-Ahead Log,预写日志)。
pg_basebackup
做基础备份# -D:指定备份目录(必须为空)
# -U replication:使用有“replication”权限的用户(需提前创建)
# -h:数据库服务器地址(本地用localhost)
# -p:端口号(默认5432)
# -X stream:同步复制WAL日志(确保备份一致性)
# -P:显示进度条
pg_basebackup -D /var/lib/postgresql/17/backups/base_20240520
-U replication
-h localhost
-p 5432
-X stream
-P
参数解释:
-X stream
:关键参数!确保备份过程中产生的WAL日志被同步复制,避免备份“脏数据”。-U replication
:需要在pg_hba.conf
中允许该用户的复制连接(参考下文“常见报错”)。逻辑备份的核心工具是pg_dump
(单数据库)和pg_dumpall
(全集群),它们导出的是可执行的SQL语句或自定义格式文件。
pg_dump
:单数据库逻辑备份pg_dump
是最常用的逻辑备份工具,支持多种输出格式:
psql
恢复;# -U postgres:使用超级用户(需有数据库备份权限)
# -d mydb:备份“mydb”数据库
# -f mydb.sql:输出到“mydb.sql”文件
pg_dump -U postgres -d mydb -f mydb.sql
# -F c:自定义格式(推荐,支持压缩和并行)
# -Z 5:压缩级别(0=无压缩,9=最高压缩,5是平衡)
# -v:显示详细日志(verbose)
pg_dump -U postgres -d mydb -F c -Z 5 -v -f mydb.dump
pg_dumpall
:全集群逻辑备份pg_dump
只能备份单个数据库,而pg_dumpall
可以备份全局对象(如角色、表空间)和所有数据库。
# -f full_cluster.sql:输出到“full_cluster.sql”文件
pg_dumpall -U postgres -f full_cluster.sql
恢复的核心原则是“先恢复全局对象,再恢复数据库”——因为数据库的表、视图可能依赖角色(用户)或表空间。
psql
或pg_restore
pg_dump
导出)# 1. 先连接到“postgres”系统数据库(所有数据库的父数据库)
# 2. -f mydb.sql:恢复“mydb.sql”文件
psql -U postgres -d postgres -f mydb.sql
pg_dump -F c
导出)# -d mydb:恢复到“mydb”数据库(需提前创建:CREATE DATABASE mydb;)
# -F c:输入格式是自定义格式
# -j 4:并行恢复(用4个线程,加快速度)
pg_restore -U postgres -d mydb -F c -j 4 -v mydb.dump
pg_basebackup
备份还原物理恢复的本质是“替换数据目录+应用WAL日志”,步骤如下:
# 以Ubuntu为例,PostgreSQL 17的服务名是“postgresql@17-main”
sudo systemctl stop postgresql@17-main
# 数据目录默认是/var/lib/postgresql/17/main(根据安装路径调整)
sudo rm -rf /var/lib/postgresql/17/main/*
# 将备份目录的内容复制到数据目录
sudo cp -R /var/lib/postgresql/17/backups/base_20240520/* /var/lib/postgresql/17/main/
PostgreSQL 12以后,恢复不再需要recovery.conf
,而是通过recovery.signal
文件触发:
# 在数据目录创建recovery.signal(告诉PostgreSQL启动恢复模式)
sudo touch /var/lib/postgresql/17/main/recovery.signal
sudo systemctl start postgresql@17-main
# 连接到数据库,检查数据是否存在
psql -U postgres -d mydb -c "SELECT count(*) FROM my_table;"
如果数据被误删,你可能不需要恢复到“最后一次备份”,而是“误删前的1分钟”——这就是时间点恢复(PITR)。
pg_basebackup
);postgresql.conf
中设置wal_level = replica
,archive_mode = on
,archive_command = 'cp %p /path/to/archive/%f'
)。recovery.signal
);recovery.conf
(或在postgresql.conf
中设置恢复目标):
# 恢复到2024-05-20 14:30:00(误删前的时间)
recovery_target_time = '2024-05-20 14:30:00'
# 恢复后自动提升为正常服务器(不再接受WAL日志)
recovery_target_action = 'promote'
答案:用pg_dumpall
——它能备份全局对象(角色、表空间)和所有数据库。命令如下:
pg_dumpall -U postgres -f globals.sql
参考链接:www.postgresql.org/docs/17/bac…
答案:
pg_restore
恢复自定义格式备份时,为什么需要提前创建数据库?答案:pg_restore
只能恢复数据库的内容(表、数据),不能创建数据库本身。因此需要提前用CREATE DATABASE mydb;
创建目标数据库。
pg_dump: error: connection to database "mydb" failed: FATAL: role "postgres" does not exist
原因:指定的用户(postgres
)不存在于数据库集群中。
解决:
psql -U your_user -d postgres -c "SELECT rolname FROM pg_roles;"
;admin
):pg_dump -U admin -d mydb -f mydb.sql
;postgres
用户,创建它:CREATE ROLE postgres SUPERUSER LOGIN;
。pg_basebackup: error: could not connect to server: FATAL: no pg_hba.conf entry for replication connection from host "127.0.0.1"
原因:pg_hba.conf
未允许replication
用户从该主机连接。
解决:
pg_hba.conf
(默认路径:/var/lib/postgresql/17/main/pg_hba.conf
);host replication replication 127.0.0.1/32 trust
(允许replication
用户从本地连接);pg_ctl reload -D /var/lib/postgresql/17/main/
。pg_restore: error: input file does not appear to be a valid archive
原因:输入文件格式错误(如用pg_restore
恢复SQL文件)或文件损坏。
解决:
-F p
(SQL文件),需用psql
恢复;若用-F c
(自定义格式),需用pg_restore
;pg_restore -l mydb.dump
(列出文件内容,若报错则文件损坏)。pg_dump
文档:www.postgresql.org/docs/17/app…pg_dumpall
文档:www.postgresql.org/docs/17/bac…pg_basebackup
文档:www.postgresql.org/docs/17/app…余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:编程智域 前端至全栈交流与成长
,阅读完整的文章:PostgreSQL备份不是复制文件?物理vs逻辑咋选?误删还能精准恢复到1分钟前?
vivo 蓝河操作系统 3 将于 11 月开启手表端公测,首批支持 vivo / iQOO WATCH 5
微星推出 MAG X870E TOMAHAWK MAX WIFI PZ 背插主板,可超外频