介绍
在本实验中,你将学习备份和恢复 PostgreSQL 数据库的关键技术。妥善管理备份是任何数据库管理员防止数据丢失的一项重要技能。
你将首先创建一个示例数据库并填充数据。然后,你将使用 pg_dump 工具创建数据库的完整备份。之后,你将学习如何使用 psql 命令行工具从备份文件中恢复数据库。最后,你将练习备份和恢复数据库中单个特定表。
创建并填充示例数据库
在此步骤中,你将创建一个名为 salesdb 的 PostgreSQL 数据库并填充示例数据。此数据库将作为后续步骤中备份和恢复操作的基础。
步骤 1: 创建数据库
首先,在你的终端中,使用 createdb 命令行工具创建 salesdb 数据库。这是 CREATE DATABASE SQL 命令的一个便捷封装。
createdb salesdb
步骤 2: 连接到数据库
接下来,使用 psql 交互式终端连接到你新创建的 salesdb 数据库。
psql -d salesdb
你现在将看到 psql 提示符,它看起来像 salesdb=#,表示你已连接到 salesdb 数据库。
步骤 3: 创建表和插入数据
在 psql shell 中,执行以下 SQL 命令来创建两个表:customers 和 products。
创建 customers 表:
CREATE TABLE customers (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
创建 products 表:
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
price NUMERIC(10, 2)
);
现在,向两个表中插入一些示例数据。
向 customers 插入数据:
INSERT INTO customers (name) VALUES ('Alice'), ('Bob');
向 products 插入数据:
INSERT INTO products (name, price) VALUES ('Laptop', 1200.00), ('Mouse', 25.00);
步骤 4: 验证数据
为了确认数据已正确插入,请对两个表运行 SELECT 查询。
SELECT * FROM customers;
输出应为:
id | name
----+-------
1 | Alice
2 | Bob
(2 rows)
现在,检查 products 表:
SELECT * FROM products;
输出应为:
id | name | price
----+--------+---------
1 | Laptop | 1200.00
2 | Mouse | 25.00
(2 rows)
最后,退出 psql shell 以返回到你的常规终端。
\q
你已成功设置好数据库,可以进行下一步操作了。
备份整个数据库
在此步骤中,你将使用 pg_dump 工具创建 salesdb 数据库的完整备份。pg_dump 会生成一个包含 SQL 命令的文件,这些命令可用于重建数据库。
理解 pg_dump
pg_dump 是 PostgreSQL 用于备份单个数据库的标准工具。它会创建一个数据库的一致快照,即使数据库正在被积极使用。默认情况下,它会生成一个纯文本 SQL 脚本文件。
步骤 1: 执行备份
在你的终端中,运行以下命令将 salesdb 数据库转储到项目目录中的名为 salesdb.sql 的文件中。
pg_dump salesdb > ~/project/salesdb.sql
让我们分解一下这个命令:
pg_dump salesdb: 这指定了你要备份salesdb数据库。> ~/project/salesdb.sql: 这会将命令的标准输出重定向到~/project目录中名为salesdb.sql的文件。
步骤 2: 验证备份文件
首先,使用 ls 命令检查文件是否已创建。
ls -l ~/project
你应该会在文件列表中看到 salesdb.sql。
接下来,检查备份文件的内容,以了解 pg_dump 创建了什么。使用 head 命令查看前几行。
head ~/project/salesdb.sql
输出将显示 SQL 脚本的开头,包括有关 pg_dump 版本和用于设置数据库环境的命令的注释。这证实了你的备份文件是一个有效的 SQL 脚本。
从备份恢复数据库
在此步骤中,你将学习如何从纯文本 SQL 备份文件恢复数据库。你将创建一个新数据库,然后使用 psql 工具执行备份文件中的 SQL 命令。
理解数据库恢复
对于由 pg_dump 创建的纯文本 SQL 文件,psql 工具是标准的恢复工具。它读取文件中的 SQL 命令,并在指定的数据库上执行它们,从而有效地重新创建表和数据。
步骤 1: 为恢复创建新数据库
为避免覆盖原始数据库,你将把备份恢复到一个新的、空的数据库中。创建一个名为 salesdb_restored 的数据库。
createdb salesdb_restored
步骤 2: 恢复备份
现在,使用 psql 将 salesdb.sql 备份恢复到 salesdb_restored 数据库中。
psql -d salesdb_restored -f ~/project/salesdb.sql
让我们分解一下这个命令:
psql: PostgreSQL 交互式终端,也可以执行脚本文件。-d salesdb_restored: 指定恢复的目标数据库。-f ~/project/salesdb.sql: 指定包含要执行的 SQL 命令的输入文件。
你将看到正在执行的 SQL 命令的输出,例如 CREATE TABLE 和 INSERT。
步骤 3: 验证恢复的数据库
连接到 salesdb_restored 数据库,以验证表和数据是否已成功恢复。
psql -d salesdb_restored
在 psql shell 中,首先列出表:
\dt
你应该会看到 customers 和 products 表。
List of relations
Schema | Name | Type | Owner
--------+-----------+-------+----------
public | customers | table | labex
public | products | table | labex
(2 rows)
接下来,查询 customers 表以确保数据存在。
SELECT * FROM customers;
输出应与原始数据匹配。
id | name
----+-------
1 | Alice
2 | Bob
(2 rows)
退出 psql shell。
\q
你已成功从备份恢复了数据库。
备份和恢复单个表
有时,你可能只需要备份或恢复特定的表,而不是整个数据库。pg_dump 工具通过 -t 选项支持这一点。
步骤 1: 备份单个表
让我们从原始的 salesdb 数据库中只备份 customers 表。
在你的终端中运行以下命令:
pg_dump -d salesdb -t customers > ~/project/customers_table.sql
-d salesdb: 指定源数据库。-t customers: 指定要转储的目标表。> ~/project/customers_table.sql: 将输出重定向到一个新的备份文件。
步骤 2: 模拟数据丢失
为了演示恢复过程,我们首先从 salesdb_restored 数据库中删除 customers 表,以模拟意外删除。
psql -d salesdb_restored -c "DROP TABLE customers;"
该命令将输出 DROP TABLE,确认删除。
步骤 3: 恢复单个表
现在,从你的表特定备份文件中将 customers 表恢复到 salesdb_restored 数据库中。
psql -d salesdb_restored -f ~/project/customers_table.sql
步骤 4: 验证表恢复
最后,连接到 salesdb_restored 数据库,并验证 customers 表是否已恢复,而 products 表保持不变。
psql -d salesdb_restored
在 psql 中,列出表:
\dt
你应该会再次看到 customers 和 products 表的列表。
List of relations
Schema | Name | Type | Owner
--------+-----------+-------+----------
public | products | table | labex
public | customers | table | labex
(2 rows)
查询已恢复的 customers 表以确认其数据完好无损。
SELECT * FROM customers;
输出应显示原始客户数据。
id | name
----+-------
1 | Alice
2 | Bob
(2 rows)
退出 psql shell。
\q
你已成功备份和恢复了单个表。
总结
在此实验中,你已学习了备份和恢复 PostgreSQL 数据库的基本流程。这些技能对于数据保护和灾难恢复至关重要。
你已学会如何:
- 创建一个数据库并填充表和数据。
- 使用
pg_dump将整个数据库导出为纯文本 SQL 文件。 - 使用
psql将 SQL 备份文件恢复到新数据库中。 - 使用
pg_dump的-t选项从数据库备份单个表。 - 将单个表恢复到数据库中。
掌握这些命令将使你能够自信有效地管理和保护你的 PostgreSQL 数据。


