openGauss备份恢复简介
当前高斯备份主要包含物理备份和逻辑备份这两种模式。物理备份只支持全备份,不支持增量备份等方式。当前不支持pitr功能,因此备份数据不能用来做前滚恢复。
物理备份
gs_basebackup的实现目标是对服务器数据库文件的二进制进行拷贝,其实现原理使用了复制协议。远程执行gs_basebackup时,需要使用系统管理员账户。gs_basebackup当前仅支持热备份模式,不支持压缩格式备份。
说明:
- gs_basebackup仅支持全量备份,不支持增量。
- gs_basebackup当前仅支持热备份模式,不支持压缩格式备份。
- gs_basebackup在备份包含绝对路径的表空间时,不能在同一台机器上进行备份。对于同一台机器,绝对路径是唯一的,因此会产生冲突。可以在不同的机器上备份含绝对路径的表空间。
- 若打开增量检测点功能且打开双写, gs_basebackup也会备份双写文件。
- 若pg_xlog目录为软链接,备份时将不会建立软链接,会直接将数据备份到目的路径的pg_xlog目录下。
前提条件
可以正常连接openGauss数据库,pg_hba.conf中需要配置允许复制链接, 需要配置max_wal_senders的数量, 至少有一个可用。
在进行还原时,需要保证各节点备份目录中存在备份文件,若备份文件丢失,则需要从其他节点进行拷贝。
示例
gs_basebackup支持远程备份,通过ip端口连接数据库:
[omm@gsnode2 ~]$gs_basebackup -D home/omm/backup/ -P -v -h 192.168.150.101 -p 26000 -U omm -Womm@123456
gs_basebackup: toomany command-line arguments (first is "omm@123456")
Try"gs_basebackup --help" for more information.
[omm@gsnode2 ~]$gs_basebackup -D home/omm/backup/ -P -v -h 192.168.150.101 -p 26000 -U omm -W
Password:
INFO: The starting position of the xlog copy of thefull build is: 0/1D89E000. The slot minimum LSN is: 0/1D89E000.
transaction logstart point: 0/1D89E000
begin buildtablespace list
finish buildtablespace list
begin get xlog byxlogstream
gs_basebackup:starting background WAL receiver
check identify system successce(/home/omm/backup/backup_label )
send START_REPLICATION 0/1D000000 success
keepalive message is received
keepalive message is receivedespace (/home/omm/backup/base/14790/14)
keepalive message is receivedblespace(/home/omm/backup/base/14790/25)
keepalive message is receivedblespace(/home/omm/backup/gswlm_userinf)
302195/302195 kB(100%), 1/1 tablespace
transaction log endpoint: 0/1E000160
gs_basebackup:waiting for background process to finish streaming...
gs_basebackup:fetch mot checkpoint
gs_basebackup: nomot checkpoint exists
gs_basebackup: basebackup completed
备份文件就是数据目录下的所有文件:
[omm@gsnode2backup]$ pwd
/home/omm/backup
[omm@gsnode2backup]$ ls
backup_label build_completed.done global pg_clog pg_ctl.lock pg_hba.conf.bak pg_llog pg_replslot pg_stat_tmp PG_VERSION postgresql.conf.bak server.crt server.key.rand
backup_label.old cacert.pem gswlm_userinfo.cfg pg_copydir pg_errorinfo pg_hba.conf.lock pg_multixact pg_serial pg_tblspc pg_xlog postgresql.conf.lock server.key term_file
base full_backup_label mot.conf pg_csnlog pg_hba.conf pg_ident.conf pg_notify pg_snapshots pg_twophase postgresql.conf rewind_lable server.key.cipher wdr_report.html
从备份文件恢复数据
当数据库发生故障时需要从备份文件进行恢复。因为gs_basebackup是对数据库按二进制进行备份,因此恢复时可以直接拷贝替换原有的文件,或者直接在备份的库上启动数据库。
说明:
- 若当前数据库实例正在运行,直接从备份文件启动数据库可能会存在端口冲突,这是需要修配置文件的port参数,或者在启动数据库时指定一下端口。
- 若当前备份文件为主备数据库,可能需要修改一下主备之间的复制连接。即配置文件中的postgre.conf中的replconninfo1, replconninfo2等
若要在原库的地方恢复数据库,参考步骤如下:
1. 停止数据库服务器, 具体操作请参见<管理员指南>
2. 将原数据库库和所有表空间复制到另外一个位置, 以备后面需要
3. 清理原库中的所有或部分文件
4. 使用数据库系统用户权限从备份中还原需要的数据库文件
5. 若数据库中存在链接文件, 需要修改使其链接到正确的文件.
6. 重启数据库服务器,并检查数据库内容,确保数据库已经恢复到所需的状态。
说明:
- 暂不支持备份文件增量恢复
- 恢复后需要检查数据库中的链接文件是否链接到正确的文件
停止原库:
[omm@gsnode1 db1]$gs_om -t stop -h gsnode1
Stopping node.
=========================================
Successfullystopped node.
=========================================
End stop node.
[omm@gsnode1 db1]$gs_om -t status --detail
[ Cluster State ]
cluster_state : Unavailable
redistributing : No
current_az : AZ_ALL
[ Datanode State ]
node node_ip instance state | node node_ip instance state
--------------------------------------------------------------------------------------------------------------------------------------
1 gsnode1 192.168.150.101 6001 /gsdata/db1 PDown Manually stopped | 2 gsnode2 192.168.150.102 6002 /gsdata/db1 SStandby Need repair(Disconnected)
首先恢复文件
mv db1 db2
scp -rgsnode2:/home/omm/backup/ .
mv backup db1
尝试启动数据库:
[omm@gsnode1gsdata]$ gs_om -t status --detail
[ Cluster State ]
cluster_state : Degraded
redistributing : No
current_az : AZ_ALL
[ Datanode State ]
node node_ip instance state | node node_ip instance state
--------------------------------------------------------------------------------------------------------------------------------------
1 gsnode1 192.168.150.101 6001 /gsdata/db1 PPrimary Normal | 2 gsnode2192.168.150.102 6002 /gsdata/db1 S Standby Need repair(WAL)
主机恢复完成后,因为备机日志对不上,所以备机也需要重新build。而且只能通过full模式:
[omm@gsnode2backup]$ gs_ctl build -D /gsdata/db1 -b full
[2020-07-1410:22:05.499][70179][][gs_ctl]: gs_ctl full build ,datadir is -D"/gsdata/db1"
[2020-07-1410:22:05.499][70179][][gs_ctl]: stop failed, killing gaussdb by force ...
[2020-07-1410:22:05.499][70179][][gs_ctl]: command [ps c -eo pid,euid,cmd | grep gaussdb |grep -v grep | awk '{if($2 == curuid && $1!="-n") print"/proc/"$1"/cwd"}' curuid=`id -u`| xargs ls -l | awk '{if($NF=="/gsdata/db1") print$(NF-2)}' | awk -F/ '{print $3 }' | xargs kill -9 >/dev/null 2>&1 ]path: [/gsdata/db1]
[2020-07-1410:22:05.551][70179][][gs_ctl]: server stopped
[2020-07-1410:22:05.552][70179][][gs_ctl]: set gaussdb state file when full build:dbstate(BUILDING_STATE), server mode(STANDBY_MODE), build mode(FULL_BUILD).
gs_ctl: set theconnection xc_maintenance_mode to on error.
[2020-07-1410:22:05.720][70179][dn_6001_6002][gs_ctl]: check connect to server success
[2020-07-1410:22:06.012][70179][dn_6001_6002][gs_ctl]: clear old target dir success
[2020-07-1410:22:06.027][70179][dn_6001_6002][gs_ctl]: connect to server success, buildstarted.
[2020-07-1410:22:06.027][70179][dn_6001_6002][gs_ctl]: create build tag file success
[2020-07-1410:22:06.028][70179][dn_6001_6002][gs_ctl]: get system identifier success
[2020-07-1410:22:06.033][70179][dn_6001_6002][gs_ctl]: receiving and unpacking files...
[2020-07-1410:22:06.033][70179][dn_6001_6002][gs_ctl]: create backup label success
[2020-07-1410:22:06.584][70179][dn_6001_6002][gs_ctl]: xlog start point: 0/20000028
[2020-07-1410:22:06.584][70179][dn_6001_6002][gs_ctl]: begin build tablespace list
[2020-07-1410:22:06.584][70179][dn_6001_6002][gs_ctl]: finish build tablespace list
[2020-07-1410:22:06.584][70179][dn_6001_6002][gs_ctl]: begin get xlog by xlogstream
[2020-07-1410:22:06.584][70179][dn_6001_6002][gs_ctl]: starting background WAL receiver
[2020-07-1410:22:06.584][70179][dn_6001_6002][gs_ctl]: starting walreceiver
[2020-07-1410:22:06.584][70179][dn_6001_6002][gs_ctl]: begin receive tar files
[2020-07-1410:22:06.585][70179][dn_6001_6002][gs_ctl]: receiving and unpacking files...
[2020-07-1410:22:06.616][70179][dn_6001_6002][gs_ctl]: check identify system success
[2020-07-1410:22:06.617][70179][dn_6001_6002][gs_ctl]: send START_REPLICATION 0/20000000 success
keepalive message is received
keepalive message is received
[2020-07-1410:22:07.877][70179][dn_6001_6002][gs_ctl]: finish receive tar files
[2020-07-1410:22:07.877][70179][dn_6001_6002][gs_ctl]: xlog end point: 0/200001D0
[2020-07-1410:22:07.877][70179][dn_6001_6002][gs_ctl]: waiting for background process tofinish streaming...
[2020-07-1410:22:07.901][70179][dn_6001_6002][gs_ctl]: fetching MOT checkpoint
[2020-07-1410:22:07.928][70179][dn_6001_6002][gs_ctl]: build dummy dw file success
[2020-07-14 10:22:07.928][70179][dn_6001_6002][gs_ctl]:rename build status file success
[2020-07-1410:22:07.928][70179][dn_6001_6002][gs_ctl]: build completed(/gsdata/db1).
[2020-07-1410:22:08.007][70179][dn_6001_6002][gs_ctl]: waiting for server to start...
.0 [BACKEND]LOG: Begin to start openGauss Database.
2020-07-1410:22:08.158 5f0d16d0.1 [unknown] 140580179332864 [unknown] 0 dn_6001_6002DB001 0 [REDO] LOG: Recoveryparallelism, cpu count = 4, max = 4, actual = 4
2020-07-1410:22:08.158 5f0d16d0.1 [unknown] 140580179332864 [unknown] 0 dn_6001_6002DB001 0 [REDO] LOG: ConfigRecoveryParallelism, true_max_recovery_parallelism:4,max_recovery_parallelism:4
2020-07-1410:22:08.158 5f0d16d0.1 [unknown] 140580179332864 [unknown] 0 dn_6001_600200000 0 [BACKEND] LOG: Transparentencryption disabled.
2020-07-1410:22:08.171 5f0d16d0.1 [unknown] 140580179332864 [unknown] 0 dn_6001_600200000 0 [BACKEND] LOG: InitNumanumaNodeNum: 1 numa_distribute_mode: none inheritThreadPool: 0.
2020-07-1410:22:08.171 5f0d16d0.1 [unknown] 140580179332864 [unknown] 0 dn_6001_600200000 0 [BACKEND] LOG: shared memory1857 Mbytes, memory context 2110 Mbytes, max process memory 4096 Mbytes
2020-07-1410:22:08.171 5f0d16d0.1 [unknown] 140580179332864 [unknown] 0 dn_6001_600200000 0 [BACKEND] LOG: Initilize thememory protect with Process Chunks number 2110, change bits 20
2020-07-1410:22:08.205 5f0d16d0.1 [unknown] 140580179332864 [unknown] 0 dn_6001_600200000 0 [CACHE] LOG: set data cache size(100663296)
2020-07-1410:22:08.210 5f0d16d0.1 [unknown] 140580179332864 [unknown] 0 dn_6001_600200000 0 [CACHE] LOG: set metadatacache size(33554432)
2020-07-1410:22:08.553 5f0d16d0.1 [unknown] 140580179332864 [unknown] 0 dn_6001_600200000 0 [BACKEND] LOG: gaussdb: fsyncfile "/gsdata/db1/gaussdb.state.temp" success
2020-07-1410:22:08.553 5f0d16d0.1 [unknown] 140580179332864 [unknown] 0 dn_6001_600200000 0 [BACKEND] LOG: create gaussdbstate file success: db state(STARTING_STATE), server mode(Standby)
2020-07-1410:22:08.576 5f0d16d0.1 [unknown] 140580179332864 [unknown] 0 dn_6001_600200000 0 [BACKEND] LOG: max_safe_fds =976, usable_fds = 1000, already_open = 14
2020-07-1410:22:08.579 5f0d16d0.1 [unknown] 140580179332864 [unknown] 0 dn_6001_600200000 0 [BACKEND] LOG: Success to startopenGauss Database, please press any key to exit...
[2020-07-1410:22:09.036][70179][dn_6001_6002][gs_ctl]: done
[2020-07-1410:22:09.036][70179][dn_6001_6002][gs_ctl]: server started (/gsdata/db1)
逻辑备份
逻辑备份恢复相关的有三种内置工具:gs_dump gs_dumpall gs_restore。还有一种工具 gs_backup是用来备份软件里的重要二进制文件和数据库的配置文件的。
gs_dump
背景信息
gs_dump是openGauss用于导出数据库相关信息的工具,用户可以自定义导出一个数据库或其中的对象(模式、表、视图等)。支持导出的数据库可以是默认数据库postgres,也可以是自定义数据库。
gs_dump工具由操作系统用户omm执行。
gs_dump工具在进行数据导出时,其他用户可以访问openGauss数据库(读或写)。
gs_dump工具支持导出完整一致的数据。例如,T1时刻启动gs_dump导出A数据库,那么导出数据结果将会是T1时刻A数据库的数据状态,T1时刻之后对A数据库的修改不会被导出。
gs_dump支持将数据库信息导出至纯文本格式的SQL脚本文件或其他归档文件中。
纯文本格式的SQL脚本文件:包含将数据库恢复为其保存时的状态所需的SQL语句。通过gsql运行该SQL脚本文件,可以恢复数据库。即使在其他主机和其他数据库产品上,只要对SQL脚本文件稍作修改,也可以用来重建数据库。
归档格式文件:包含将数据库恢复为其保存时的状态所需的数据,可以是tar格式、目录归档格式或自定义归档格式,详见表1。该导出结果必须与gs_restore配合使用来恢复数据库,gs_restore工具在导入时,系统允许用户选择需要导入的内容,甚至可以在导入之前对等待导入的内容进行排序。
主要功能
gs_dump可以创建四种不同的导出文件格式,通过[-F或者–format=]选项指定,具体如表1所示。
表 1 导出文件格式
格式名称 | -F的参数值 | 说明 | 建议 | 对应导入工具 |
纯文本格式 | p | 纯文本脚本文件包含SQL语句和命令。命令可以由gsql命令行终端程序执行,用于重新创建数据库对象并加载表数据。 | 小型数据库,一般推荐纯文本格式。 | 使用gsql工具恢复数据库对象前,可根据需要使用文本编辑器编辑纯文本导出文件。 |
自定义归档格式 | c | 一种二进制文件。支持从导出文件中恢复所有或所选数据库对象。 | 中型或大型数据库,推荐自定义归档格式。 | 使用gs_restore可以选择要从自定义归档导出文件中导入相应的数据库对象。 |
目录归档格式 | d | 该格式会创建一个目录,该目录包含两类文件,一类是目录文件,另一类是每个表和blob对象对应的数据文件。 | - | |
tar归档格式 | t | tar归档文件支持从导出文件中恢复所有或所选数据库对象。tar归档格式不支持压缩且对于单独表大小应小于8GB。 | - |
说明:可以使用gs_dump程序将文件压缩为纯文本或自定义归档导出文件,减少导出文件的大小。生成纯文本导出文件时,默认不压缩。生成自定义归档导出文件时,默认进行中等级别的压缩。gs_dump程序无法压缩已归档导出文件。通过压缩方式导出纯文本格式文件,gsql无法成功导入数据对象。
注意事项
禁止修改导出的文件和内容,否则可能无法恢复成功。
为了保证数据一致性和完整性,gs_dump会对需要转储的表设置共享锁。如果表在别的事务中设置了共享锁,gs_dump会等待锁释放后锁定表。如果无法在指定时间内锁定某个表,转储会失败。用户可以通过指定–lock-wait-timeout选项,自定义等待锁超时时间。
看一下gs_dump的语法:
[omm@gsnode2backup]$ gs_dump --help
gs_dump dumps adatabase as a text file or to other formats.
Usage:
gs_dump [OPTION]... [DBNAME]
General options:
-f, --file=FILENAME output file ordirectory name
-F, --format=c|d|t|p output file format(custom, directory, tar,
plain text (default))
-v, --verbose verbose mode
-V, --version output versioninformation, then exit
-Z, --compress=0-9 compression level forcompressed formats
--lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT fora table lock
-?, --help show thishelp, then exit
Options controllingthe output content:
-a, --data-only dump only thedata, not the schema
-b, --blobs include large objectsin dump
-c, --clean clean (drop)database objects before recreating
-C, --create includecommands to create database in dump
-E, --encoding=ENCODING dump the data in encodingENCODING
-n, --schema=SCHEMA dump the namedschema(s) only
-N, --exclude-schema=SCHEMA do NOT dump the namedschema(s)
-o, --oids include OIDsin dump
-O, --no-owner skip restorationof object ownership in
plain-text format
-s, --schema-only dump only theschema, no data
-S, --sysadmin=NAME system admin user nameto use in plain-text format
-t, --table=TABLE dump the namedtable(s) only
-T, --exclude-table=TABLE do NOT dump the namedtable(s)
--include-table-file=FileName dump the named table(s) only
--exclude-table-file=FileName do NOT dump the named table(s)
-x, --no-privileges/--no-acl do not dump privileges(grant/revoke)
--column-inserts/--attribute-inserts dump data as INSERT commands withcolumn names
--disable-dollar-quoting disable dollar quoting, useSQL standard quoting
--disable-triggers disable triggersduring data-only restore
--exclude-table-data=TABLE do NOT dump data for thenamed table(s)
--inserts dump data asINSERT commands, rather than COPY
--no-security-labels do not dump securitylabel assignments
--no-tablespaces do not dumptablespace assignments
--no-unlogged-table-data do not dump unlogged tabledata
--include-alter-table dump the table deletecolumn
--quote-all-identifiers quote all identifiers,even if not key words
--section=SECTION dump named section(pre-data, data, or post-data)
--serializable-deferrable wait until the dump can runwithout anomalies
--dont-overwrite-file do not overwrite theexisting file in case of plain, tar and custom format
--use-set-session-authorization
use SET SESSION AUTHORIZATION commands instead of
ALTEROWNER commands to set ownership
--with-encryption=AES128 dump data is encryptedusing AES128
--with-key=KEY AES128 encryptionkey ,must be 16 bytes in length
--binary-upgrade for use by upgradeutilities only
--binary-upgrade-usermap="USER1=USER2" to be used only by upgrade utility formapping usernames
--non-lock-table for use by OM toolsutilities only
--include-depend-objs dump the object whichdepends on the input object
--exclude-self do not dump theinput object
Connection options:
-h, --host=HOSTNAME database server hostor socket directory
-p, --port=PORT database serverport number
-U, --username=NAME connect as specifieddatabase user
-w, --no-password never prompt forpassword
-W, --password=PASSWORD the password of specifieddatabase user
--role=ROLENAME do SET ROLE beforedump
--rolepassword=ROLEPASSWORD the password for role
If no database nameis supplied, then the PGDATABASE environment
variable value isused.
导出纯文本
尝试导出postgres这个数据库:
[omm@gsnode1 ~]$gs_dump -h 192.168.150.101 -p 26000 -U test -W test@123456 -F p--lock-wait-timeout=30 -f postgres.dump postgres
Notice: options -Uis not super or sysadmin role, can only back up objects belonging to user test.
gs_dump:[port='26000'] [postgres] [archiver (db)] [2020-07-14 15:09:39] query failed:ERROR: permission denied for relationpg_roles
gs_dump:[port='26000'] [postgres] [archiver (db)] [2020-07-14 15:09:39] query was:SELECT tableoid, oid, nspname, (SELECT rolname FROM pg_catalog.pg_roles WHEREoid = nspowner) AS rolname, nspacl FROM pg_namespace
显示当前用户权限不够,需要sysadmin权限:
[omm@gsnode1dn_6001]$ gsql -d postgres -p 26000
gsql ((openGauss1.0.0 build 0bd0ce80) compiled at 2020-06-30 18:19:27 commit 0 last mr )
Non-SSL connection(SSL connection is recommended when requiring high-security)
Type"help" for help.
postgres=# alteruser test sysadmin;
ALTER ROLE
postgres=# \q
再次尝试:
[omm@gsnode1 ~]$gs_dump -h 192.168.150.101 -p 26000 -U test -W test@123456 -F p--lock-wait-timeout=30 -f postgres.dump postgres
gs_dump[port='26000'][postgres][2020-07-1415:18:10]: The total objects number is 342.
gs_dump[port='26000'][postgres][2020-07-1415:18:10]: [100.00%] 342 objects have been dumped.
gs_dump[port='26000'][postgres][2020-07-1415:18:10]: dump database postgres successfully
gs_dump[port='26000'][postgres][2020-07-1415:18:10]: total time: 555 ms
导出来的文件里是SQL语句,包含建表和导数的copy语句。
导入纯文本
删掉原表,然后执行下这个语句试试:
[omm@gsnode1dn_6001]$ gsql -h 192.168.150.101 -p26000 -U test -d postgres -W test@123456
gsql ((openGauss1.0.0 build 0bd0ce80) compiled at 2020-06-30 18:19:27 commit 0 last mr )
SSL connection(cipher: DHE-RSA-AES256-GCM-SHA384, bits: 256)
Type"help" for help.
postgres=> droptable t1;
DROP TABLE
postgres=> droptable t2;
DROP TABLE
postgres=> \q
[omm@gsnode1 ~]$gsql -h 192.168.150.101 -p 26000 -U test -d postgres -W test@123456 -f postgres.dump
SET
SET
SET
SET
SET
SET
COMMENT
gsql:postgres.dump:23:ERROR: schema "test" alreadyexists
ALTER SCHEMA
SET
SET
SET
CREATE TABLE
ALTER TABLE
SET
CREATE TABLE
ALTER TABLE
SET
SET
REVOKE
REVOKE
GRANT
GRANT
total time: 61 ms
可以通过-a命令只导出数据。-s只导出定义。因此建议还是分两步,分别导出定义和数据。
导出自定义归档格式
中大型数据库比较建议这种方式导出成二进制文件。导入工具使用gs_restore.
[omm@gsnode1 ~]$gs_dump -h 192.168.150.101 -p 26000 -U test -W test@123456 -F c--lock-wait-timeout=30 -f postgres.bin postgres
gs_dump[port='26000'][postgres][2020-07-1415:30:19]: The total objects number is 342.
gs_dump[port='26000'][postgres][2020-07-1415:30:19]: [100.00%] 342 objects have been dumped.
gs_dump[port='26000'][postgres][2020-07-1415:30:19]: dump database postgres successfully
gs_dump[port='26000'][postgres][2020-07-1415:30:19]: total time: 533 ms
[omm@gsnode1 ~]$ ls-ltr
total 8
-rw------- 1 ommdbgrp 1509 Jul 14 15:18 postgres.dump
-rw------- 1 ommdbgrp 2445 Jul 14 15:30 postgres.bin
[omm@gsnode1 ~]$
二进制文件要比文本文件占用空间更多。一会用gs_restore命令试一下恢复。
gs_restore
背景信息
gs_restore是openGauss提供的针对gs_dump导出数据的导入工具。通过此工具可由gs_dump生成的导出文件进行导入。
gs_restore工具由操作系统用户omm执行。
主要功能包含:
· 导入到数据库
如果连接参数中指定了数据库,则数据将被导入到指定的数据库中。其中,并行导入必须指定连接的密码。
· 导入到脚本文件
如果未指定导入数据库,则创建包含重建数据库所必须的SQL语句脚本并写入到文件或者标准输出。等效于直接使用gs_dump导出为纯文本格式。
查看用法:
[omm@gsnode1 ~]$gs_restore --help
gs_restore restoresa PostgreSQL database from an archive created by gs_dump.
Usage:
gs_restore [OPTION]... FILE
General options:
-d, --dbname=NAME connect to database name
-f, --file=FILENAME output file name
-F, --format=c|d|t backup file format(should be automatic)
-l, --list print summarizedTOC of the archive
-v, --verbose verbose mode
-V, --version output version information,then exit
-?, --help show this help,then exit
Options controllingthe restore:
-a, --data-only restore only the data,no schema
-c, --clean clean (drop)database objects before recreating
-C, --create create the targetdatabase
-e, --exit-on-error exit on error, default is tocontinue
-I, --index=NAME restore named index(s)
-j, --jobs=NUM use this many parallel jobsto restore
-L, --use-list=FILENAME use table of contents from thisfile for
selecting/ordering output
-n, --schema=NAME restore only objects inthis schema(s)
-O, --no-owner skip restoration ofobject ownership
-P, --function=NAME(args) restore named function(s)
-s, --schema-only restore only the schema,no data
-S, --sysadmin=NAME system admin user name touse for disabling triggers
-t, --table=NAME restore named table(s)
-T, --trigger=NAME restore named trigger(s)
-x, --no-privileges/--no-acl skip restoration of access privileges(grant/revoke)
-1, --single-transaction restore as a single transaction
--disable-triggers disable triggers duringdata-only restore
--no-data-for-failed-tables do not restore data of tables thatcould not be
created
--no-security-labels do not restore securitylabels
--no-tablespaces do not restore tablespaceassignments
--section=SECTION restore named section(pre-data, data, or post-data)
--use-set-session-authorization use SET SESSION AUTHORIZATION commandsinstead of
ALTEROWNER commands to set ownership
--with-key=KEY AES128 decryption key,must be 16 bytes in length
Connection options:
-h, --host=HOSTNAME database server host orsocket directory
-p, --port=PORT database server portnumber
-U, --username=NAME connect as specifieddatabase user
-w, --no-password never prompt for password
-W, --password=PASSWORD the password of specifieddatabase user
--role=ROLENAME do SET ROLE beforerestore
--rolepassword=ROLEPASSWORD the password for role
导入自定义归档格式
首先可以查看文件里的对象:
[omm@gsnode1 ~]$gs_restore -l postgres.bin
;
; Archive createdat Tue Jul 14 15:30:19 2020
; dbname: postgres
; TOC Entries: 12
; Compression: -1
; Dump Version: 1.12-0
; Format: CUSTOM
; Integer: 4 bytes
; Offset: 8 bytes
; Dumped from database version: 9.2.4
; Dumped by gs_dump version: 9.2.4
;
;
; Selected TOCEntries:
;
4808; 1262 14790DATABASE - postgres omm
4809; 1262 14790COMMENT - postgres omm
8; 2615 2200 SCHEMA- public omm
4810; 0 0 COMMENT -SCHEMA public omm
4811; 0 0 ACL -public omm
7; 2615 25476SCHEMA - test test
600; 1259 25492TABLE public t1 omm
601; 1259 25495TABLE test t2 test
4802; 0 25492 TABLEDATA public t1 omm
4803; 0 25495 TABLEDATA test t2 test
restore operationsuccessful
total time: 0 ms
删除t1,t2两张表后,使用刚才的自定义归档格式文件来导入数据库。
[omm@gsnode1 ~]$gs_restore -d postgres -F c -v -h 192.168.150.101 -p 26000 -U test -Wtest@123456 postgres.bin
connecting todatabase for restore
start restore operation...
creating COMMENT"postgres"
creating SCHEMA"public"
creating COMMENT"SCHEMA public"
creating SCHEMA"test"
Error whilePROCESSING TOC:
Error from TOCentry 7; 2615 25476 SCHEMA test test
could not executequery: ERROR: schema "test"already exists
Command was: CREATE SCHEMA test;
creating TABLE"public.t1"
creating TABLE"test.t2"
restoring data fortable "public.t1"
table t1 completedata imported !
restoring data fortable "test.t2"
table t2 completedata imported !
Finish reading 12SQL statements!
end restoreoperation ...
setting owner andprivileges for DATABASE "postgres"
setting owner andprivileges for COMMENT "postgres"
setting owner andprivileges for SCHEMA "public"
setting owner andprivileges for COMMENT "SCHEMA public"
setting owner andprivileges for ACL "public"
setting owner andprivileges for SCHEMA "test"
setting owner andprivileges for TABLE "public.t1"
setting owner andprivileges for TABLE "test.t2"
setting owner andprivileges for TABLE DATA "public.t1"
setting owner andprivileges for TABLE DATA "test.t2"
WARNING: errorsignored on restore: 1
restore operationsuccessful
gs_restore命令支持并行导入,-j, --jobs=NUM参数。官方文档介绍gs_restore还可以导出成文本文件。但是没有试成功!
gs_dumpall
背景信息
gs_dumpall是openGauss用于导出所有数据库相关信息工具,它可以导出openGauss数据库的所有数据,包括默认数据库postgres的数据、自定义数据库的数据、以及openGauss所有数据库公共的全局对象。
gs_dumpall工具由操作系统用户omm执行。
gs_dumpall工具在进行数据导出时,其他用户可以访问openGauss数据库(读或写)。
gs_dumpall工具支持导出完整一致的数据。例如,T1时刻启动gs_dumpall导出openGauss数据库,那么导出数据结果将会是T1时刻该openGauss数据库的数据状态,T1时刻之后对openGauss的修改不会被导出。
gs_dumpall在导出openGauss所有数据库时分为两部分:
gs_dumpall自身对所有数据库公共的全局对象进行导出,包括有关数据库用户和组,表空间以及属性(例如,适用于数据库整体的访问权限)信息。
gs_dumpall通过调用gs_dump来完成openGauss中各数据库的SQL脚本文件导出,该脚本文件包含将数据库恢复为其保存时的状态所需要的全部SQL语句。
以上两部分导出的结果为纯文本格式的SQL脚本文件,使用gsql运行该脚本文件可以恢复openGauss数据库。
注意事项
禁止修改导出的文件和内容,否则可能无法恢复成功。
为了保证数据一致性和完整性,gs_dumpall会对需要转储的表设置共享锁。如果某张表在别的事务中设置了共享锁,gs_dumpall会等待此表的锁释放后锁定此表。如果无法在指定时间内锁定某张表,转储会失败。用户可以通过指定–lock-wait-timeout选项,自定义等待锁超时时间。
由于gs_dumpall读取所有数据库中的表,因此必须以openGauss管理员身份进行连接,才能导出完整文件。在使用gsql执行脚本文件导入时,同样需要管理员权限,以便添加用户和组,以及创建数据库。
因为gs_dumpall内部调用gs_dump,基本差不多,就不做更多实验。
gs_backup
背景信息
openGauss部署成功后,在数据库运行的过程中,会遇到各种问题及异常状态。openGauss提供了gs_backup工具帮助openGauss备份、恢复重要数据、显示帮助信息和版本号信息。
前提条件
可以正常连接openGauss数据库。
在进行还原时,需要保证各节点备份目录中存在备份文件,若备份文件丢失,则需要从其他节点进行拷贝(二进制文件需修改文件名中的节点名)。
需以操作系统用户omm执行gs_backup命令。
语法
· 备份数据库主机
复制代码gs_backup -t backup --backup-dir=BACKUPDIR [-h HOSTNAME] [--parameter] [--binary] [--all] [-l LOGFILE]
· 恢复数据库主机
复制代码gs_backup -t restore --backup-dir=BACKUPDIR [-h HOSTNAME] [--parameter] [--binary] [--all] [-l LOGFILE]
gs_backup可以在集群里任一机器上发起,通过制定-h参数备份和存储在对应的节点上。
[omm@gsnode2 ~]$ gs_backup -t backup --backup-dir=/home/omm/backup -h gsnode1 --all -l gs_backup.log
Parsing configuration files.
Successfully parsed the configuration file.
Performing remote backup.
Remote backup succeeded.
Successfully backed up cluster files.
查看备份的文件:
[omm@gsnode1 backup]$ ls -ltr
total 257776
-rw------- 1 omm dbgrp 2464 Jul 14 16:00 gs_local-2020-07-14_160030.log
-rw------- 1 omm dbgrp 92160 Jul 14 16:00 parameter.tar
-rw------- 1 omm dbgrp 263864320 Jul 14 16:01 binary.tar
[omm@gsnode1 backup]$ tar -tvf parameter.tar
-rw------- omm/dbgrp 40960 2020-07-14 16:00 parameter_gsnode1.tar
-rw------- omm/dbgrp 40960 2020-07-14 16:00 parameter_gsnode2.tar
[omm@gsnode1 backup]$ tar -tvf binary.tar
-rw------- omm/dbgrp 263854080 2020-07-14 16:00 binary_gsnode1.tar
其中binary_gsnode1主要是备份的app文件,parameter主要是参数文件:
omm@gsnode1 backup]$ tar -tvf parameter_gsnode1.tar
drwx------ omm/dbgrp 0 2020-07-14 16:00 parameter_gsnode1/
-rw------- omm/dbgrp 7 2020-07-14 16:00 parameter_gsnode1/HOSTNAME
-rw------- omm/dbgrp 31315 2020-07-14 13:35 parameter_gsnode1/6001_postgresql.conf
-rw------- omm/dbgrp 4584 2020-07-14 11:39 parameter_gsnode1/6001_pg_hba.conf
所以gs_backup主要是备份软件而不是数据。
删除app,试着恢复看看。
[omm@gsnode1 install]$ gs_om -t stop -h gsnode1
Stopping node.
=========================================
Successfully stopped node.
=========================================
End stop node.
[omm@gsnode1 install]$ pwd
/opt/huawei/install
[omm@gsnode1 install]$ cd ..
[omm@gsnode1 huawei]$ mv /opt/huawei/install /opt/huawei/install_bck
报错了,显然om那部分不能删:
[omm@gsnode2 ~]$ gs_backup -t restore --backup-dir=/home/omm/backup -h gsnode1 --all -l gs_restore.log
Parsing configuration files.
Successfully parsed the configuration file.
Performing remote restoration.
[GAUSS-51400] : Failed to execute the command: python3 '/opt/huawei/install/om/script/local/Restore.py' -U omm -l /home/omm/gs_local.log --ingore_miss -P /home/omm/backup -p -b. Error:
[FAILURE] gsnode1:
python3: can't open file '/opt/huawei/install/om/script/local/Restore.py': [Errno 2] No such file or directory
.
重新来,这次只删除app_0bd0ce80目录。
[omm@gsnode1 huawei]$ mv /opt/huawei/install /opt/huawei/install_bck
[omm@gsnode1 huawei]$ mv /opt/huawei/install/app_0bd0ce80/ /opt/huawei/install/app_0bd0ce80_bck
[omm@gsnode2 ~]$ gs_backup -t restore --backup-dir=/home/omm/backup -h gsnode1 --all -l gs_restore.log
Parsing configuration files.
Successfully parsed the configuration file.
Performing remote restoration.
[FAILURE] gsnode1:
Executing the local restoration
Parsing the configuration file.
[GAUSS-50201] : The static configuration file [/opt/huawei/install/app_0bd0ce80/bin/cluster_static_config] of designated user [omm] does not exist.
还是不行,看来这个二进制文件的备份没什么用。恢复目录,然后命令成功了。
[omm@gsnode2 ~]$ gs_backup -t restore --backup-dir=/home/omm/backup -h gsnode1 --all -l gs_restore.log
Parsing configuration files.
Successfully parsed the configuration file.
Performing remote restoration.
Successfully restored cluster files.
既然二进制不行,试试能不能恢复参数文件吧:
[omm@gsnode1 db1]$ cat postgresql.conf |grep port
port = 26000 # (change requires restart)
[omm@gsnode1 db1]$ gs_guc set -N all -I all -c "port=12345"
Begin to perform gs_guc for all datanodes.
Total instances: 2. Failed instances: 0.
Success to perform gs_guc!
[omm@gsnode1 db1]$ cat postgresql.conf |grep port
port = 12345 # (change requires restart)
恢复后检查看看:
[omm@gsnode2 ~]$ gs_backup -t restore --backup-dir=/home/omm/backup -h gsnode1 --all -l gs_restore.log
Parsing configuration files.
Successfully parsed the configuration file.
Performing remote restoration.
Successfully restored cluster files.
[omm@gsnode1 db1]$ cat postgresql.conf |grep port
port = 26000 # (change requires restart)
看来恢复配置文件和部分重要的二进制文件是没有问题的。这个这也只能当做一个特殊手段来使用。例如重大变更前,先备份好这些必须的重要文件。
后语
当前openGauss的备份恢复能力还是比较弱,不支持pitr,不支持增量备份和恢复。而这两个基本功能是数据库上生产的必备条件,希望高斯尽快改进。
openGauss支持远程的二进制备份,这个是一大亮点。等pitr出来,如果这个工具也支持归档日志抽取,那就完美了。