备份和恢复是数据库管理中至关重要的环节。无论是为了防范硬件故障、软件错误,还是人为操作失误,备份都能够确保数据的安全性和可恢复性。openGauss 提供了多种备份和恢复的方法,其中逻辑备份(Logical Backup)是一种灵活且广泛使用的方式。本文将详细介绍 openGauss 逻辑备份与恢复的方法,帮助您掌握使用 gs_dump 和 gs_restore 工具进行数据库备份与恢复的技能。
逻辑备份是通过生成一组 SQL 命令来描述数据库对象(如表、索引、视图等)及其数据的一种备份方式。这些 SQL 命令可以在任何兼容的 openGauss 数据库上重新执行,从而重建数据库的状态。
使用 pg_dump 工具创建的备份文件可以在不同操作系统和硬件架构的 openGauss 实例上恢复,并且可以在较新的 openGauss 版本上重新加载,便于数据库迁移和升级。此外,逻辑备份灵活性高,可以选择备份整个数据库、特定的模式或表。
逻辑备份相比物理备份可能会更耗时,尤其是对于大型数据库,并且尽管 gs_dump 能确保备份的一致性,但在备份过程中数据库仍允许其他事务的进行,这可能影响备份性能。
gs_dump 是 openGauss 的数据导出工具,允许用户自定义导出数据库或其对象(模式、表、视图等),不包括回收站对象。由操作系统用户 omm 执行,支持导出为纯文本 SQL 脚本或归档文件(tar、目录归档、自定义格式)。gs_dump 可在导出过程中让其他用户访问数据库,并确保导出的数据在导出时刻的一致性。SQL 脚本文件可通过 gsql 恢复数据库,即便在其他主机上稍作修改也能使用;归档文件需配合 gs_restore 使用,用户可选择和排序导入内容。导出过程支持打印详细进度信息。
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
注意事项
参数 | 说明 |
---|---|
-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 数据库的灵活导出和备份。
gs_restore 是 openGauss 提供的用于导入由 gs_dump 导出的数据的工具,由操作系统用户 omm 执行。其主要功能包括导入到数据库和导入到脚本文件。如果在连接参数中指定了数据库,数据将被导入到指定数据库中,并且并行导入时必须提供连接密码,生成的列会自动更新并保存。如果未指定导入数据库,则 gs_restore 会创建包含重建数据库所需 SQL 语句的脚本文件,并写入到文件或标准输出,相当于直接使用 gs_dump 导出为纯文本格式。
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
参数 | 说明 |
---|---|
-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 |
使用管道传输密码,禁止在终端使用。 |
示例一:恢复特定表
假设我们有一个备份文件 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
#!/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 {} \;
#!/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
逻辑备份和恢复是确保 openGauss 数据库数据安全的关键手段之一。通过 gs_dump 和gs_restore 工具,您可以灵活地备份和恢复数据库,适应不同的应用场景。尽管逻辑备份在性能方面可能有所限制,但其平台独立性和版本兼容性使其成为数据库迁移和升级的理想选择。定期进行备份,并验证备份文件的完整性和可用性,是保证数据安全的最佳实践。希望本文能够帮助您更好地理解和掌握 openGauss 逻辑备份与恢复的相关技术。