openGauss逻辑备份与恢复

1.引言

备份和恢复是数据库管理中至关重要的环节。无论是为了防范硬件故障、软件错误,还是人为操作失误,备份都能够确保数据的安全性和可恢复性。openGauss 提供了多种备份和恢复的方法,其中逻辑备份(Logical Backup)是一种灵活且广泛使用的方式。本文将详细介绍 openGauss 逻辑备份与恢复的方法,帮助您掌握使用 gs_dump 和 gs_restore 工具进行数据库备份与恢复的技能。

2.逻辑备份简介

逻辑备份是通过生成一组 SQL 命令来描述数据库对象(如表、索引、视图等)及其数据的一种备份方式。这些 SQL 命令可以在任何兼容的 openGauss 数据库上重新执行,从而重建数据库的状态。

使用 pg_dump 工具创建的备份文件可以在不同操作系统和硬件架构的 openGauss 实例上恢复,并且可以在较新的 openGauss 版本上重新加载,便于数据库迁移和升级。此外,逻辑备份灵活性高,可以选择备份整个数据库、特定的模式或表。

逻辑备份相比物理备份可能会更耗时,尤其是对于大型数据库,并且尽管 gs_dump 能确保备份的一致性,但在备份过程中数据库仍允许其他事务的进行,这可能影响备份性能。

3.使用 pg_dump 进行备份
3.1 gs_dump 简介

gs_dump 是 openGauss 的数据导出工具,允许用户自定义导出数据库或其对象(模式、表、视图等),不包括回收站对象。由操作系统用户 omm 执行,支持导出为纯文本 SQL 脚本或归档文件(tar、目录归档、自定义格式)。gs_dump 可在导出过程中让其他用户访问数据库,并确保导出的数据在导出时刻的一致性。SQL 脚本文件可通过 gsql 恢复数据库,即便在其他主机上稍作修改也能使用;归档文件需配合 gs_restore 使用,用户可选择和排序导入内容。导出过程支持打印详细进度信息。

3.2 gs_dump基本用法

gs_dump可以创建四种不同的导出文件格式,针对不同的文件导出格式,具体的用法如下文所示,示例中:

参数 参数说明
opengauss@123 数据库用户密码
backup/backup.sql 表示导出的文件,其中backup表示相对于当前目录的相对目录
31000 表示数据库服务器端口
postgres 表示要访问的数据库名

注:在导出操作时,请确保该目录存在并且当前的操作系统用户对其具有读写权限。

1.纯文本格式
纯文本脚本文件包含SQL语句和命令。命令可以由gsql命令行终端程序执行,用于重新创建数据库对象并加载表数据。

gs_dump -U omm -W opengauss@123 -f backup/backup.sql -p 31000 postgres -F p

2.tar归档格式
tar归档文件支持从导出文件中恢复所有或所选数据库对象。tar归档格式不支持压缩且对于单独表大小应小于8GB。

gs_dump -U omm -W opengauss@123 -f backup/backup.tar -p 31000 postgres -F t

3.目录归档格式
该格式会创建一个目录,该目录包含两类文件,一类是目录文件,另一类是每个表和blob对象对应的数据文件。

gs_dump -U omm -W opengauss@123 -f backup/backup -p 31000  postgres -F d

4.自定义归档格式
一种二进制文件。支持从导出文件中恢复所有或所选数据库对象。

gs_dump -U omm -W opengauss@123 -f backup/backup.dmp -p 31000 postgres -F c

注意事项

  1. 禁止修改-F c/d/t 格式导出的文件和内容,否则可能无法恢复成功。对于-F p 格式导出的文件,如有需要,可根据需要谨慎编辑导出文件。
  2. 为了保证数据一致性和完整性,gs_dump会对需要转储的表设置共享锁。如果表在别的事务中设置了共享锁,gs_dump会等待锁释放后锁定表。如果无法在指定时间内锁定某个表,转储会失败。用户可以通过指定–lock-wait-timeout选项,自定义等待锁超时时间。
  3. 不支持加密导出存储过程和函数。
3.3 常用参数及说明
参数 说明
-U 指定所连接主机的用户名,不指定连接主机的用户名时,用户默认系统管理员。
-W 指定用户连接的密码。如果主机的认证策略是trust,则不会对系统管理员进行密码验证,即无需输入-W选项;如果没有-W选项,并且不是系统管理员,“Dump Restore工具”会提示用户输入密码。
-h 指定数据库服务器的主机名或 IP 地址
-p 指定主机端口
-d 指定要导出的数据库名称
-f 指定输出文件的文件名或目录
-F 指定输出文件的格式,可选值有:
p - 纯文本格式
t - tar 格式
d - 目录归档格式
c - 自定义归档格式
-Z 指定使用的压缩比级别,取值范围:0~9(0表示无压缩;1表示压缩比最小,处理速度最快;9表示压缩比最大,处理速度最慢)
-E 以指定的字符集编码创建转储。默认情况下,以数据库编码创建转储。(得到相同结果的另一个办法是将环境变量“PGCLIENTENCODING”设置为所需的转储编码。)
-n 只转储与模式名称匹配的模式,此选项包括模式本身和所有它包含的对象。如果该选项没有指定,所有在目标数据库中的非系统模式将会被转储。写入多个-n选项来选择多个模式。此外,根据gsql的\d命令所使用的相同规则,模式参数可被理解成一个pattern,所以多个模式也可以通过在该pattern中写入通配符来选择。使用通配符时,注意给pattern打引号,防止shell扩展通配符。
-t 指定转储的表(或视图、或序列、或外表)对象列表,可以使用多个-t选项来选择多个表,也可以使用通配符指定多个表对象
-s 只转储对象定义(模式),而非数据
-a 只输出数据,不输出模式(数据定义)。转储表数据、大对象和序列值
-c 在将创建数据库对象的指令输出到备份文件之前,先将清理(删除)数据库对象的指令输出到备份文件中。(如果目标数据库中没有任何对象,gs_restore工具可能会输出一些提示性的错误信息)
-T 不转储的表(或视图、或序列、或外表)对象列表,可以使用多个-T选项来选择多个表,也可以使用通配符指定多个表对象
-N 不转储任何与模式pattern匹配的模式
-v 显示详细输出
-l 只列出将被导出的对象,而不进行实际导出
--progress 在导出过程中显示进度信息

以上参数可以根据实际需求组合使用,以实现对 openGauss 数据库的灵活导出和备份。

4.使用 pg_restore 进行恢复
4.1 pg_restore 简介

gs_restore 是 openGauss 提供的用于导入由 gs_dump 导出的数据的工具,由操作系统用户 omm 执行。其主要功能包括导入到数据库和导入到脚本文件。如果在连接参数中指定了数据库,数据将被导入到指定数据库中,并且并行导入时必须提供连接密码,生成的列会自动更新并保存。如果未指定导入数据库,则 gs_restore 会创建包含重建数据库所需 SQL 语句的脚本文件,并写入到文件或标准输出,相当于直接使用 gs_dump 导出为纯文本格式。

4.2恢复命令的基本使用

1.自定义归档格式恢复

#将导出的backup.dmp文件导入到postgres数据库
gs_restore -U omm -W opengauss@123 /mnt/workspace/backups/backup.dmp -p 31000 -d postgres

2.tar归档格式恢复

#将导出的backup.tar文件导入到postgres数据库
gs_restore -U omm -W opengauss@123 /mnt/workspace/backups/backup.tar -p 31000 -d postgres

3.目录归档格式恢复

#将导出的文件导入到postgres数据库
gs_restore -U omm -W opengauss@123 /mnt/workspace/backups/backup -p 31000 -d postgres

4.纯文本格式恢复

#将导出的backup.sql文件导入到postgres数据库
gsql -U omm -W opengauss@123 -f /mnt/workspace/backups/backup.sql -p 31000 -d postgres

5.只恢复表定义(-s )

gs_restore /mnt/workspace/backups/backup.dmp -p 31000 -d postgres -e -c -s -n public -t test1

6.只恢复表数据(-a)

gs_restore /mnt/workspace/backups/backup.dmp -p 31000 -d postgres -e -a -n public -t test1
4.3常用恢复选项
参数 说明
-a, --data-only 只导入数据,不导入模式(数据定义)。gs_restore 的导入是以追加方式进行的。
-c, --clean 在重新创建数据库对象前,清理(删除)已存在于将要还原的数据库中的数据库对象。
-C, --create 导入数据库之前会先使用 CREATE DATABASE 创建数据库。(指定该选项后,-d 指定的数据库仅用以执行 CREATE DATABASE 命令,所有数据依然会导入到创建的数据库中。)
-e, --exit-on-error 当发送 SQL 语句到数据库时如果出现错误,请退出。默认状态下会继续,且在导入后会显示一系列错误信息。
-I, --index=NAME 只导入已列举的索引的定义。允许导入多个索引。如果多次输入 -I index 导入多个索引。
-j, --jobs=NUM 使用并发任务运行 gs_restore 最耗时的部分(如加载数据、创建索引或创建约束),以缩短导入时间。
-L, --use-list=FILENAME 只导入列举在 list-file 中的那些归档形式元素,导入顺序以它们在文件中的顺序为准。
-n, --schema=NAME 只导入已列举的模式中的对象。该选项可与 -t 选项一起用以导入某个指定的表。多次输入 -n schema-name 可以导入多个模式。
-O, --no-owner 不输出设置对象归属的命令,以匹配原始数据库。
-P, --function=NAME(args) 只导入已列举的函数。
-s, --schema-only 只导入模式(数据定义),不导入数据(表内容)。当前的序列值也不会导入。
-S, --sysadmin=NAME 该参数为扩展预留接口,不建议使用。
-t, --table=NAME 只导入已列举的表定义、数据或定义和数据。
-T, --trigger=NAME 该参数为扩展预留接口。
-x, --no-privileges 防止导入访问权限(GRANT/REVOKE 命令)。
-1, --single-transaction 执行导入作为一个单独事务(即把命令包围在 BEGIN/COMMIT 中)。
--disable-triggers 该参数为扩展预留接口,不建议使用。
--no-data-for-failed-tables 即使创建表的命令失败(如表已经存在),表数据仍会被导入。使用该选项,像这种表的数据会被跳过。
--no-publications 不导入发布。
--no-security-labels 该参数为扩展预留接口,不建议使用。
--no-subscriptions 不导入订阅。
--no-tablespaces 不输出选择表空间的命令。使用该选项,无论默认表空间是哪个,在导入过程中所有对象都会被创建。
--section=SECTION 导入已列举的区段(如 pre-data、data 或 post-data)。
--use-set-session-authorization 输出 SET SESSION AUTHORIZATION 命令,而非 ALTER OWNER 命令,用以决定对象归属。
--pipeline 使用管道传输密码,禁止在终端使用。
4.3.1 恢复特定表或模式

示例一:恢复特定表
假设我们有一个备份文件 backup/MPPDB_backup.tar,并且只想恢复其中的 public 模式下的 table1 表,可以使用以下命令:

gs_restore -h host_name -p port_number -U username -W -d database_name -n public -t table1 backup/MPPDB_backup.tar

示例二:恢复特定模式
假设我们有一个备份文件 backup/MPPDB_backup.tar,并且只想恢复 sch1 和 sch2 模式,可以使用以下命令:

gs_restore -h host_name -p port_number -U username -W -d database_name -n sch1 -n sch2 backup/MPPDB_backup.tar

示例三:恢复多个模式下的特定表
假设我们有一个备份文件 backup/MPPDB_backup.tar,并且想恢复 sch1 模式下的 table1 表以及 sch2 模式下的 table2 表,可以使用以下命令:

gs_restore -h host_name -p port_number -U username -W -d database_name -n sch1 -t table1 -n sch2 -t table2 backup/MPPDB_backup.tar

示例四:恢复特定索引
假设我们有一个备份文件 backup/MPPDB_backup.tar,并且只想恢复 Index1 和 Index2 索引,可以使用以下命令:

gs_restore -h host_name -p port_number -U username -W -d database_name -I Index1 -I Index2 backup/MPPDB_backup.tar

示例五:恢复前清理现有对象
假设我们有一个备份文件 backup/MPPDB_backup.tar,并且希望在恢复之前清理数据库中已存在的对象,可以使用以下命令:

gs_restore -h host_name -p port_number -U username -W -d database_name --clean backup/MPPDB_backup.tar
5.备份与恢复的最佳实践
5.1 备份策略的制定
  1. 定期备份:根据业务需求,制定明确的备份计划。例如,对于高频率更新的数据库,建议每天进行备份。对于重要但更新不频繁的数据,可以每周进行一次全量备份。
  2. 多层次备份:结合全量备份和增量备份策略。每周进行一次全量备份,每天进行一次增量备份,以节省存储空间和备份时间,同时确保数据的全面性和可恢复性。
  3. 异地备份:将备份文件存储在不同的地理位置,以防止本地灾难(如火灾、洪水等)导致数据丢失。可以使用云存储服务或远程服务器进行异地备份。
  4. 备份测试:定期测试备份文件的可用性,确保在需要时备份文件能够正常恢复数据。
5.2 备份文件的管理
  1. 命名规范:使用一致且清晰的命名规则命名备份文件。例如,可以使用 dbname_YYYYMMDD_HHMMSS.backup 格式,包含数据库名称、备份日期和时间,便于识别和管理。
  2. 压缩和加密:对备份文件进行压缩以节省存储空间,同时对备份文件进行加密,确保备份数据的安全性,防止未经授权的访问。
  3. 定期清理:制定备份文件的清理策略。根据业务需求,保留一定时间范围内的备份文件,如保留最近三个月的备份,定期删除过期的备份文件,以释放存储空间。
  4. 存储介质的选择:选择可靠的存储介质进行备份文件的存储,如高可靠性的硬盘阵列(RAID)、云存储等,以确保备份文件的安全和可用性。
5.3 自动化备份与恢复脚本
  1. 自动化备份:编写脚本实现备份过程的自动化。例如,可以使用 shell 脚本结合 gs_dump 工具定期执行备份任务。将脚本配置为计划任务(如 cron 作业),确保备份过程定期、自动化执行,如下为一个备份脚本示例:
#!/bin/bash
# 自动备份脚本
BACKUP_DIR="/mnt/workspace/backups"
DB_NAME="postgres"
DATE=$(date +%Y%m%d_%H%M%S)
FILENAME="${BACKUP_DIR}/${DB_NAME}_${DATE}.dmp"
gs_dump -U omm -W opengauss@123 -f $FILENAME -p 31000 postgres -F c

#删除30天前的备份
find ${BACKUP_DIR} -type f -mtime +7 -name '*.dmp' -exec rm {} \;
  1. 恢复脚本:编写脚本实现恢复过程的自动化。在测试环境中定期执行恢复脚本,验证备份文件的可用性。以下是一个恢复脚本示例:
#!/bin/bash
# 自动恢复脚本
BACKUP_FILE="/mnt/workspace/backups/postgres_YYYYMMDD_HHMMSS.dmp"
DB_NAME="test_db"

gsql -U omm -W opengauss@123 -p 31000 -d $DB_NAME -c "DROP DATABASE $DB_NAME;"
gsql -U omm -W opengauss@123 -p 31000 -c "CREATE DATABASE $DB_NAME;"
gs_restore -U omm -W opengauss@123 -p 31000 -d $DB_NAME $BACKUP_FILE

  1. 监控与报警:结合监控工具(如 Zabbix、Prometheus等)监控备份和恢复过程。当备份失败或恢复失败时,自动发送报警通知,及时处理问题,确保备份和恢复过程的顺利进行。
6.结论

逻辑备份和恢复是确保 openGauss 数据库数据安全的关键手段之一。通过 gs_dump 和gs_restore 工具,您可以灵活地备份和恢复数据库,适应不同的应用场景。尽管逻辑备份在性能方面可能有所限制,但其平台独立性和版本兼容性使其成为数据库迁移和升级的理想选择。定期进行备份,并验证备份文件的完整性和可用性,是保证数据安全的最佳实践。希望本文能够帮助您更好地理解和掌握 openGauss 逻辑备份与恢复的相关技术。

参考资料
  1. openGauss
  2. 逻辑备份

你可能感兴趣的:(数据库,网络,centos,postgresql,gaussdb)