# 备份与恢复

URL: https://caijiao.org/postgresql/performance/maintenance/backup
Source: docs/postgresql/performance/maintenance/backup.md
Description: 本章节介绍 PostgreSQL 的备份与恢复策略，包括逻辑备份、物理备份、增量备份等方法。

PostgreSQL 提供了多种备份与恢复的方式，适用于不同的场景和需求。了解各种备份方法和恢复策略，能够确保数据的安全性和高可用性。

## 备份类型

### 1. 逻辑备份

逻辑备份指的是导出数据库中的数据和结构，通常使用 `pg_dump` 工具进行备份。逻辑备份是一种纯数据备份，适用于数据库迁移、单表备份或数据恢复。

#### 使用 `pg_dump` 进行逻辑备份

```bash
-- 备份整个数据库
pg_dump -U username -d database_name -f backup.sql

-- 备份特定表
pg_dump -U username -d database_name -t employees -f employees_backup.sql

-- 备份为压缩文件
pg_dump -U username -d database_name | gzip > backup.gz
````

#### 备份选项

* `-U`: 指定连接的用户名
* `-d`: 指定备份的数据库名
* `-f`: 输出备份文件路径
* `-t`: 备份指定表
* `gzip`: 压缩备份文件

### 2. 物理备份

物理备份指的是直接复制数据库的文件系统级别的数据文件。这种备份方式通常用于大规模数据库或高可用系统。物理备份需要数据库处于一致性状态，通常配合 WAL（Write-Ahead Logging）进行增量备份。

#### 使用 `pg_basebackup` 进行物理备份

```bash
-- 进行物理备份
pg_basebackup -U username -D /path/to/backup_directory -F t
```

#### 物理备份选项

* `-U`: 指定连接的用户名
* `-D`: 指定备份的目录
* `-F`: 备份格式，`t` 表示 tar 格式

### 3. 增量备份与 WAL 归档

增量备份是基于已备份的数据，在之后的时间里仅备份新增或修改的数据。PostgreSQL 使用 WAL（Write-Ahead Logging）日志来记录所有修改操作。通过配置 WAL 归档，您可以实现增量备份和恢复。

#### 启用 WAL 归档

在 `postgresql.conf` 文件中启用 WAL 归档：

```bash
archive_mode = on
archive_command = 'cp %p /path/to/archive/%f'
```

#### 恢复增量备份

恢复增量备份时，需要先恢复物理备份，然后再将相应的 WAL 文件应用到恢复的数据库上。

### 4. 快照备份

快照备份是通过文件系统级别的快照来备份整个数据库的数据目录。它要求数据库处于一致性状态，并且数据库的数据目录需要支持快照操作（如使用 LVM、ZFS 或其他文件系统）。

#### 使用 LVM 快照进行备份

```bash
-- 创建 LVM 快照
lvcreate --size 10G --snapshot --name pg_snapshot /dev/vg00/pgsql_data

-- 备份快照
cp -r /dev/vg00/pgsql_data /backup/pgsql_snapshot
```

快照备份的优点是速度快，但同样需要数据库处于一致性状态。

## 恢复方法

### 1. 恢复逻辑备份

逻辑备份恢复通常使用 `psql` 工具进行。

#### 使用 `psql` 恢复逻辑备份

```bash
-- 恢复整个数据库
psql -U username -d database_name -f backup.sql

-- 恢复特定表
psql -U username -d database_name -f employees_backup.sql
```

### 2. 恢复物理备份

物理备份恢复通常包括以下几个步骤：

1. 停止数据库服务。
2. 恢复数据文件。
3. 恢复 WAL 日志（如果有增量备份）。
4. 启动数据库服务。

#### 使用 `pg_basebackup` 恢复物理备份

```bash
-- 停止数据库服务
pg_ctl stop -D /path/to/data_directory

-- 恢复数据文件
cp -r /path/to/backup_directory/* /path/to/data_directory

-- 恢复 WAL 文件
cp /path/to/archive/* /path/to/data_directory/pg_wal/

-- 启动数据库服务
pg_ctl start -D /path/to/data_directory
```

### 3. 使用 PITR（点-in-time 恢复）

点-in-time 恢复（PITR）是一种恢复方法，可以将数据库恢复到某一时刻的状态。此方法通常用于灾难恢复或回滚操作。

#### 启用点-in-time恢复

1. 从物理备份恢复数据文件。
2. 恢复 WAL 文件。
3. 创建一个 `recovery.conf` 文件，指定恢复时间点：

```bash
restore_command = 'cp /path/to/archive/%f %p'
recovery_target_time = '2025-05-01 12:00:00'
```

4. 启动数据库，PostgreSQL 将恢复到指定时间点。

### 4. 快照恢复

快照恢复与物理备份恢复类似。只需要恢复快照文件即可。

```bash
-- 恢复 LVM 快照
lvcreate --size 10G --snapshot --name pg_snapshot /dev/vg00/pgsql_data

-- 将数据目录恢复到快照中的数据
cp -r /backup/pgsql_snapshot/* /dev/vg00/pgsql_data
```

## 小结

PostgreSQL 提供了多种备份与恢复方法，包括逻辑备份、物理备份、增量备份和快照备份。不同的备份方法适用于不同的场景，管理员应根据具体的需求选择适合的备份策略。定期进行备份、保留增量备份，并测试恢复流程是保障数据安全的关键。恢复操作必须小心谨慎，确保恢复后的数据一致性和完整性。
