PostgreSQL 备份与恢复

PostgreSQLBeginner
立即练习

介绍

在本实验中,你将学习备份和恢复 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 命令来创建两个表:customersproducts

创建 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: 恢复备份

现在,使用 psqlsalesdb.sql 备份恢复到 salesdb_restored 数据库中。

psql -d salesdb_restored -f ~/project/salesdb.sql

让我们分解一下这个命令:

  • psql: PostgreSQL 交互式终端,也可以执行脚本文件。
  • -d salesdb_restored: 指定恢复的目标数据库。
  • -f ~/project/salesdb.sql: 指定包含要执行的 SQL 命令的输入文件。

你将看到正在执行的 SQL 命令的输出,例如 CREATE TABLEINSERT

步骤 3: 验证恢复的数据库

连接到 salesdb_restored 数据库,以验证表和数据是否已成功恢复。

psql -d salesdb_restored

psql shell 中,首先列出表:

\dt

你应该会看到 customersproducts 表。

              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

你应该会再次看到 customersproducts 表的列表。

              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 数据。