PostgreSQL备份方法

545 阅读7分钟

PostgreSQL Backup

介绍PostgreSQL的备份

如果你在生产环境中为你的客户使用PostgreSQL数据库,那么你需要确保你的数据库总是工作正常,并且是24*7可用的。为了保证数据库的可用性,你必须经常对客户的数据库进行备份。如果数据库被损坏或崩溃或丢失,那么你应该能够恢复数据库中的数据。出于这个原因,PostgreSQL为我们提供了一个设施,可以使用三种方法来保持备份 -

PostgreSQL的备份方法

下面给出了三种PostgreSQL的备份方法。

1.SQL转储

有一种设施可以使用pg_dump工具来转储数据库。这个工具的优点是,它不是服务器端的特定版本,甚至可以在不同架构的机器上工作。例如,如果你从32位的机器上转储你的数据库,然后在64位的机器上使用它,那么它就能正常工作。

2.文件系统级的备份

我们都知道PostgreSQL数据库的数据是存储在文件和目录结构中。文件系统级备份的想法是存储这些文件的备份,然后在需要时恢复它们。但是它有很多缺点,比如数据库系统需要关闭,即在进行备份时服务器应该关闭。这种类型的备份方法只能在你必须对数据库进行完整的备份和恢复的时候使用。文件数据可以以任何你希望的格式存储。其中一种技术是--

tar -cf mydatabasebackup.tar /etc/psql/12/data

将tar文件中的数据导出到指定位置 - /etc/psql/12/data

3.连续归档

这种方法结合了文件系统级的备份方法和存储在pg_xlog中的WAL(超前写入日志)。日志是为eav=ch和在数据库上进行的每一个交易而维护的。检查点也被维护以了解交易是否成功提交和完成。每当崩溃发生或数据丢失时。可以通过恢复存储在基于文件的系统中的数据来恢复,然后将该点的日志运行到检查点,使数据库达到当前状态。然而,这个过程有点笨拙和复杂,但比前面讨论的其他两种方法提供了一些好处。

在这些方法中,最方便和最好的方法是SQL转储,我们将在接下来的会议中简要讨论。

SQL转储的解释

你必须经常转储你的数据库,以获得你的数据库的最新备份。每当备份被恢复时,数据库将恢复到使用pg_dump创建转储文件时的状态。使用pg_dump工具而不是文件级备份和归档的另一个好处是,它不针对PostgreSQL服务器的版本。

另外,在pg_dump运行时,除了一些与结构变化有关的操作如ALTER TABLE被阻止外,其他的数据库操作都不被锁定并在后台运行。如果你的数据库模式依赖于外键等OID,你就必须在pg_dump命令中指定外部-o。为此,你也需要转储OIDs。

语法:

pg_dump databaseName > outputFile

  • pg_dump:这 是PostgreSQL中提供的实用程序,用于将数据库的当前状态存储到一个文件中,该文件将包含一些命令,当在数据库服务器上运行时,将重新创建使用相同的数据库转储时的状态。它是一个客户端程序,需要通过Linux命令行提示符运行。
  • databaseName。它是你想转储的数据库的名称。
  • outputFile:它是转储完成后必须创建的文件名。

pg_dump过程只需要由超级用户登录完成,因为它有读取所有数据库和表的权限。虽然,你有一个远程转储数据库的工具。默认情况下,环境变量PGHOST、PGPORT和PGUSER被认为是localhost、5432和用户名,你默认使用它们来连接数据库,这与操作系统的用户名相同。

你可以通过使用pg_dump命令中的选项-h代表主机,-p代表端口来改变PGHOST和PGPORT。要改变和覆盖PGUSER变量,你可以在语句中使用-U选项。所有这些都是使用客户认证机制来确认的。

例子。

pg_dump postgres > myBackupFile

检查文件是否被成功创建。让我们使用ls命令,它可以列出当前目录下的所有文件 -

ls

PostgreSQL Backup-1.1

现在,我们被转储的备份文件已经准备好了,名称为myBackupFile。

让我们在 \dt 命令的帮助下,通过检查所有的表来查看Postgres数据库的内容。

\c postgres \dt

PostgreSQL Backup-1.2

因此,它包含了三个表,我们将逐一删除。通过使用命令

drop table educba; drop table teams cascade; drop table developers;

然后进一步检查它们是否都被 \dt 命令删除。

\dt

PostgreSQL Backup-1.3

所以,现在数据库Postgres中不包含任何表。现在,我们将学习如何将数据恢复到数据库中。

恢复转储的数据

现在,如果我们有一个备份文件,我们可以在任何时候恢复数据库,如果我们想恢复数据库被破坏或丢失。然而,在恢复之前,你需要考虑一些事情。你试图恢复的数据库应该存在于数据库服务器上。如果没有,那么你应该使用以下命令来创建数据库

  • createdb -T template0 Postgres

来创建数据库。由于数据库已经存在,可以通过使用命令\l来检查,结果是数据库服务器跟随,我现在不需要执行createb命令。

\l

PostgreSQL Backup-1.4

另一件事是要确保你要恢复的数据库已经包含了所有有权使用它的用户。在我们的例子中,Postgres用户是Postgres数据库的所有者。因此,数据库服务器应该已经有一个名为Postgres的用户,否则在恢复的时候会出现错误。你可以通过执行命令-来检查这个问题。

SELECT usename FROM pg_catalog.pg_user;

这将导致以下结果 -

PostgreSQL Backup-1.5

现在,Postgres数据库和Postgres用户已经存在于我的数据库服务器中了。我可以使用命令-来恢复数据库。

psql postgres < myBackupFile;

因为恢复转储的语法是

psql empty_database < backup_file

其中empty_database是你想恢复的数据库,backup_file是pg_dump命令的结果文件。

psql postgres < myBackupFile;

语法中的输出如下。

PostgreSQL Backup-1.6

现在,如果我们使用命令\dt检查Postgres数据库的内容,它的输出结果是----。

\dt

PostgreSQL Backup-1.7

同时,所有的表的内容都被正确地恢复了 --

select * from developers;

PostgreSQL Backup-1.8

处理恢复的错误

即使中间发生了任何错误,PostgreSQL也会继续恢复数据库。它只在还原完成后才告诉你。在这种情况下,数据库的恢复是不完整的。如果你想在错误发生时停止恢复过程,你可以使用 -

psql --set ON_ERROR_STOP=on postgres < myBackupFile

ON_ERROR_STOP选项可以帮助你在错误发生时停止恢复过程。现在,如果你想以交易方式进行恢复,即要么恢复整个数据库,要么什么都不恢复,那么你可以使用-1或-single-transaction选项来使其成为一个交易过程。

psql -1 postgres < myBackupFile

对于将当前数据库服务器中的所有数据库转储到一个文件,你可以使用pg_dumpall工具程序,并在恢复时提供默认的数据库。

结论 - PostgreSQL备份

我们可以转储我们的数据库,这样在不久的将来就可以使用PostgreSQL中的pg_dump来恢复数据库的数据,如果数据库中的数据出现任何问题。其他方法,如文件系统级备份和连续存档,也可以用来保持你的PostgreSQL数据库的备份。

推荐文章

这是一个关于PostgreSQL备份的指南。在这里我们也讨论了PostgreSQL备份的介绍和三种方法,以及例子和其代码实现。你也可以看看下面的文章以了解更多 -

  1. PostgreSQL轮回
  2. PostgreSQL GRANT
  3. PostgreSQL 内联
  4. PostgreSQL 自动增量