首页 > 数据库 >PostgreSQL备份与恢复

PostgreSQL备份与恢复

时间:2024-05-27 12:02:18浏览次数:14  
标签:psql PostgreSQL dump 恢复 备份 转储 dbname pg 数据库

        PostgreSQL数据库应当被定期地备份。虽然过程相当简单,但清晰地理解其底层技术和假设是非常重要的。

有三种不同的基本方法来备份PostgreSQL数据:

  • SQL转储

  • 文件系统级备份

  • 连续归档

每一种都有其优缺点,在下面的小节中将分别讨论。

SQL转储

        SQL 转储方法的思想是创建一个由SQL命令组成的文件,当把这个文件回馈给服务器时,服务器将利用其中的SQL命令重建与转储时状态一样的数据库。 PostgreSQL为此提供了工具pg_dump。这个工具的基本用法是:

pg_dump dbname > dumpfile

        正如你所见,pg_dump把结果输出到标准输出。我们后面将看到这样做有什么用处。 尽管上述命令会创建一个文本文件,pg_dump可以用其他格式创建文件以支持并行 和细粒度的对象恢复控制。

        pg_dump是一个普通的PostgreSQL客户端应用(尽管是个 相当聪明的东西)。这就意味着你可以在任何可以访问该数据库的远端主机上进行备份工作。但是请记住 pg_dump不会以任何特殊权限运行。具体说来,就是它必须要有你想备份的表的读 权限,因此为了备份整个数据库你几乎总是必须以一个数据库超级用户来运行它(如果你没有足够的特权 来备份整个数据库,你仍然可以使用诸如-n schema 或-t table选项来备份该数据库中你能够 访问的部分)。

        要声明pg_dump连接哪个数据库服务器,使用命令行选项-hhost和 -p port。 默认主机是本地主机或你的PGHOST环境变量指定的主机。 类似地,默认端口是环境变量PGPORT或(如果PGPORT不存在)内建的默认值。 (服务器通常有相同的默认值,所以还算方便。)

        和任何其他PostgreSQL客户端应用一样, pg_dump默认使用与当前操作系统用户名同名的数据库用户名进行连接。 要使用其他名字,要么声明-U选项,要么设置环境变量PGUSER。请注意pg_dump的连接也要通过客户认证机制。

        pg_dump对于其他备份方法的一个重要优势是,pg_dump的输出可以很容易地在新版本的PostgreSQL中载入,而文件级备份和连续归档都是极度的服务器版本限定的。pg_dump也是唯一可以将一个数据库传送到一个不同机器架构上的方法,例如从一个32位服务器到一个64位服务器。

        由pg_dump创建的备份在内部是一致的, 也就是说,转储表现了pg_dump开始运行时刻的数据库快照,且在pg_dump运行过程中发生的更新将不会被转储。pg_dump工作的时候并不阻塞其他的对数据库的操作。 (但是会阻塞那些需要排它锁的操作,比如大部分形式的ALTER TABLE

从转储中恢复

pg_dump生成的文本文件可以由psql程序读取。 从转储中恢复的常用命令是:

psql dbname < dumpfile

        其中dumpfile就是pg_dump命令的输出文件。这条命令不会创建数据库dbname,你必须在执行psql前自己从template0创建(例如,用命令createdb -T template0 dbname)。psql支持类似pg_dump的选项用以指定要连接的数据库服务器和要使用的用户名。参阅psql的手册获取更多信息。 非文本文件转储可以使用pg_restore工具来恢复。

        在开始恢复之前,转储库中对象的拥有者以及在其上被授予了权限的用户必须已经存在。如果它们不存在,那么恢复过程将无法将对象创建成具有原来的所属关系以及权限(有时候这就是你所需要的,但通常不是)。

        默认情况下,psql脚本在遇到一个SQL错误后会继续执行。你也许希望在遇到一个SQL错误后让psql退出,那么可以设置ON_ERROR_STOP变量来运行psql,这将使psql在遇到SQL错误后退出并返回状态3:

psql --set ON_ERROR_STOP=on dbname < infile

        不管怎样,你将只能得到一个部分恢复的数据库。作为另一种选择,你可以指定让整个恢复作为一个单独的事务运行,这样恢复要么完全完成要么完全回滚。这种模式可以通过向psql传递-1--single-transaction命令行选项来指定。在使用这种模式时,注意即使是很小的一个错误也会导致运行了数小时的恢复被回滚。但是,这仍然比在一个部分恢复后手工清理复杂的数据库要更好。

        pg_dump和psql读写管道的能力使得直接从一个服务器转储一个数据库到另一个服务器成为可能,例如:

pg_dump -h host1 dbname | psql -h host2 dbname

重要

        pg_dump产生的转储是相对于template0。这意味着在template1中加入的任何语言、过程等都会被pg_dump转储。结果是,如果在恢复时使用的是一个自定义的template1,你必须从template0创建一个空的数据库,正如上面的例子所示。

一旦完成恢复,在每个数据库上运行ANALYZE是明智的举动,这样优化器就有有用的统计数据了。

使用pg_dumpall

        pg_dump每次只转储一个数据库,而且它不会转储关于角色或表空间(因为它们是集簇范围的)的信息。为了支持方便地转储一个数据库集簇的全部内容,提供了pg_dumpall程序。pg_dumpall备份一个给定集簇中的每一个数据库,并且也保留了集簇范围的数据,如角色和表空间定义。该命令的基本用法是:

pg_dumpall > dumpfile

转储的结果可以使用psql恢复:

psql -f dumpfile postgres

(实际上,你可以指定恢复到任何已有数据库名,但是如果你正在将转储载入到一个空集簇中则通常要用(postgres)。在恢复一个pg_dumpall转储时常常需要具有数据库超级用户访问权限,因为它需要恢复角色和表空间信息。如果你在使用表空间,请确保转储中的表空间路径适合于新的安装。

        pg_dumpall工作时会发出命令重新创建角色、表空间和空数据库,接着为每一个数据库pg_dump。这意味着每个数据库自身是一致的,但是不同数据库的快照并不同步。

        集簇范围的数据可以使用pg_dumpall的--globals-only选项来单独转储。如果在单个数据库上运行pg_dump命令,上述做法对于完全备份整个集簇是必需的。

处理大型数据库

        在一些具有最大文件尺寸限制的操作系统上创建大型的pg_dump输出文件可能会出现问题。幸运地是,pg_dump可以写出到标准输出,因此你可以使用标准Unix工具来处理这种潜在的问题。有几种可能的方法:

使用压缩转储。.  你可以使用你喜欢的压缩程序,例如gzip:

pg_dump dbname | gzip > filename.gz


恢复:

gunzip -c filename.gz | psql dbname


或者:

cat filename.gz | gunzip | psql dbname


使用split。.  split命令允许你将输出分割成较小的文件以便能够适应底层文件系统的尺寸要求。例如,让每一块的大小为1兆字节:

pg_dump dbname | split -b 1m - filename


恢复:

cat filename* | psql dbname


使用pg_dump的自定义转储格式。.  如果PostgreSQL所在的系统上安装了zlib压缩库,自定义转储格式将在写出数据到输出文件时对其压缩。这将产生和使用gzip时差不多大小的转储文件,但是这种方式的一个优势是其中的表可以被有选择地恢复。下面的命令使用自定义转储格式来转储一个数据库:

pg_dump -Fc dbname > filename


自定义格式的转储不是psql的脚本,只能通过pg_restore恢复,例如:

pg_restore -d dbname filename


详情请参阅pg_dump和pg_restore。

对于非常大型的数据库,你可能需要将split配合其他两种方法之一进行使用。

使用pg_dump的并行转储特性。.  为了加快转储一个大型数据库的速度,你可以使用pg_dump的并行模式。它将同时转储多个表。你可以使用-j参数控制并行度。并行转储只支持“目录”归档格式。

pg_dump -j num -F d -f out.dir dbname


你可以使用pg_restore -j来以并行方式恢复一个转储。它只能适合于“自定义”归档或者“目录”归档,但不管归档是否由pg_dump -j创建。

标签:psql,PostgreSQL,dump,恢复,备份,转储,dbname,pg,数据库
From: https://blog.csdn.net/qq_33906471/article/details/139233613

相关文章

  • pgsq的学习记录②——PostgreSQL基础用法
    PostgreSQL基础用法创建一个数据库操作数据库创建表删除表表插入数据查询表多表联查创建一个数据库创建一个名为postgres的数据库createdbpostgres操作数据库创建表创建表weatherCREATETABLEweather(cityvarchar(80),temp_lo......
  • 社交媒体数据恢复:米聊
    请注意,本文提供的方法适用于部分场景,不一定能100%找回所有丢失的数据。在尝试恢复数据之前,请确保您已备份了重要的数据。方法一:通过米聊自带的聊天记录迁移功能进行恢复步骤1:在您的手机上打开米聊应用程序。步骤2:在米聊主界面,点击右下角的“我”图标,进入个人主页。步骤3:......
  • 社交媒体数据恢复:腾讯微博
    注意:本教程不涉及推荐数据恢复软件,而是通过微博自身的功能来找回数据。步骤一:登录微博账号首先,我们需要登录自己的腾讯微博账号。打开微博网页版或者手机APP,输入账号和密码登录。步骤二:进入设置登录成功后,在微博首页点击右上角的“设置”按钮,进入设置页面。步骤三:选择“......
  • 在Linux中,如何配置数据库服务器(如MySQL或PostgreSQL)?
    在Linux中配置数据库服务器,如MySQL或PostgreSQL,通常包括安装数据库软件、配置数据库设置、安全加固以及优化性能。以下是为这两种流行的数据库系统提供的配置指南:1.MySQL数据库服务器安装MySQL:对于基于Debian的系统(如Ubuntu):sudoaptupdatesudoaptinstallmysql-serve......
  • 在Linux中,如何进行系统备份?
    在Linux中进行系统备份是一个重要的任务,它可以帮助您在数据丢失或系统崩溃时快速恢复。以下是在Linux中进行系统备份的详细步骤和注意事项:1.选择备份方法Linux提供了多种备份方法,包括使用tar命令手动备份、使用专业的备份软件(如BackupPC)以及使用云备份服务等。根据您的需求和系......
  • 免费激活!Easyrecovery16数据恢复神器
    在数字化时代,数据的价值不言而喻。无论是个人用户还是企业客户,都深知一旦数据丢失或损坏,可能造成的损失无法估量。因此,数据备份与恢复软件成为了维护信息安全的重要工具。其中,EasyRecovery数据恢复软件以其高效、易用的特点,赢得了广大用户的喜爱。但许多用户在体验免费版时,往往......
  • K8S认证|CKA题库+答案| 15. 备份还原Etcd
    目录15、 备份还原EtcdCKA v1.29.0模拟系统  下载试用题目: 开始操作:1)、切换集群2)、登录master并提权3)、备份Etcd现有数据4)、验证备份数据快照5)、查看节点和Pod状态 6)、创建目录​7)、执行Etcd数据恢复命令8)、验证恢复情况 ​9)、更改Etcd配置10)、重启kubel......
  • centos7安装postgresql-15
    摘要:本文将提供一个详细的教程,介绍如何在CentOS7操作系统上安装最新版本的PostgreSQL15。您将学习到如何添加PostgreSQL官方软件仓库,并使用yum命令进行安装和配置。1.引言PostgreSQL是一个功能强大的开源关系型数据库管理系统,被广泛用于企业级应用和数据存储。安装最新版......
  • PostgreSQL的扩展(extensions)-常用的扩展之pg_plan_advsr
    PostgreSQL的扩展(extensions)-常用的扩展之pg_plan_advsrpg_plan_advsr是PostgreSQL社区中的一个扩展,用于分析和改进查询执行计划。它能够自动识别哪些查询执行缓慢,并提供优化建议,以提高查询性能。pg_plan_advsr能够为指定的查询生成性能建议,包括索引创建、SQL语句重写......
  • dnf数据库备份&迁移
    使用mysql自带的mysqldump备份mysqldump-ugame-p--databasesd_channeld_guildd_taiwand_taiwan_secud_technical_reporttaiwan_billingtaiwan_caintaiwan_cain_2ndtaiwan_cain_auction_cerataiwan_cain_auction_goldtaiwan_cain_logtaiwan_cain_webtaiwan_game_e......