数据恢复

Hubble的设计具有很高的容错性,所以这些备份主要是为灾难恢复而设计的。如果集群丢失了大部分节点,可通过数据备份恢复。而少部分节点出现问题是不需要任何干预的。

您可以从备份中恢复整个表(包括其索引)或视图。此过程使用存储在备份中的数据在目标数据库中创建全新的表或视图。恢复数据库只是恢复属于数据库的所有表和视图,但不创建数据库。

因为这个过程是为灾难恢复而设计的,所以需要这些表当前不存在于目标数据库中。这意味着目标数据库必须没有需要恢复的表或视图同名的表或视图。可以做以下工作:

  • 先执行DROP TABLEDROP VIEWDROP SEQUENCE,然后在使用数据恢复功能。需要注意序列在列的默认表达式中使用时不能被删除,因此必须在删除序列之前删除那些表达式,并在重新创建序列之后重新创建它们。可以使用setval函数将序列的值设置为以前的值。
  • 将表或视图还原到另一个数据库中。

根据所包含的备份文件,您可以从完全备份进行恢复,也可以从带有增量备份的完全备份进行恢复。

全量恢复:只包含到完整备份的路径。

增量恢复:包括作为第一个参数的完整备份路径,以及作为以下参数的从旧备份到最新备份的后续增量备份。

在成功启动恢复后,它将成为一个job任务,您可以使用SHOW JOBS来查看。

启动恢复之后,您可以使用PAUSE JOBRESUME JOBCANCEL JOB对任务进行操作。

依赖对象

如表存在外键约束,序列,视图,交错表。必须同时备份其依赖的对象。

对象依赖对象
有外键约束的表所关联的表。同时,可以在数据恢复期间将其删除
有序列的表所使用的序列。同时,可以在数据恢复期间将其删除
视图视图定义使用到的表
交错表交错关系中的父表

备份数据路径

每个备份的路径必须是唯一的,备份位置的URL必须使用以下格式:

[scheme]://[host]/[path]?[parameters]
类型schemahost参数示例
httphttp主机地址N/Ahttp://localhost:8080/mydatest.sql
NFS/Localnodelocal节点ID或为空N/Anodelocal://n/path/mydatest/2023/03/30-010108.31

恢复数据的时候要找BACKUP_MANIFEST文件,将地址写到与BACKUP_MANIFEST一致,请看以下示例。

参数说明

可以将以下选项,用以控制恢复进程的行为。

参数描述示例
skip_missing_foreign_keys如果希望恢复具有外键的表,但不希望恢复它引用的表,则可以从表中删除外键约束,然后恢复它。WITH skip_missing_foreign_keys
skip_missing_sequences如果希望还原依赖于序列的表,但不希望还原它引用的序列,则可以从表中删除序列依赖项WITH skip_missing_sequences
skip_missing_views如果您想要还原具有视图的表,但又不想还原视图的依赖项,您可以删除视图,然后恢复表。WITH skip_missing_views

解决命名冲突

在恢复表和数据库的时候,会遇见命名冲突的问题,有两种解决形式

  • 第一种:删除表或者数据库
  • 第二种:更改表的名称或者数据库名

建议选用第2种方式

  • 更改数据库名
alter database database_name rename to database_bak;
  • 更改表名
alter table target_database.example_table rename to target_database.archived_example_table;

示例

完成恢复命令后,找到BACKUP_MANIFEST文件所在位置

[hubble@ty-bj03-test01 30-010108.31]$ pwd
/data/hubble317cyh/extern/backup_tt/2023/03/30-010108.31

执行恢复语句

root@ty-bj03-test01:14432/test> restore  test.tt from 'nodelocal://1/backup_tt/2023/03/30-010108.31';
        job_id       |  status   | fraction_completed | rows | index_entries | bytes
---------------------+-----------+--------------------+------+---------------+--------
  852193907899072513 | succeeded |                  1 |    1 |             0 |    16

恢复完整集群

完整集群还原只能在从未有用户创建的数据库或表的目标集群上运行

restore from 'nodelocal://1/backup/2023/03/30-055845.78';

恢复单个表

restore guar.trans from 'nodelocal://1/backup_data/2023/03/30-010108.31';

恢复多个表

restore guar.trans,guar.tb_bs from 'nodelocal://1/backup_data/2023/03/30-010108.31';

恢复整个数据库

带有new_db_name参数,恢复数据时候会生成一个新的数据库

库中不能包含视图,若有视图,则无法指定新的库名

restore database guar from latest in 'nodelocal://1/backup_db/2023/03/30-022407.66' with new_db_name ='guar_db';

指定恢复时间点

restore guar.trans from 'nodelocal://1/backup_datatime/2023/03/30-022457.26' AS OF SYSTEM TIME '-30s';

恢复到另一个数据库

默认情况下,表和视图被恢复到它们原来所属的数据库。但是,使用into_db选项,您可以控制目标数据库。

restore guar.trans,guar.tb_bs from 'nodelocal://1/backup_data/2023/03/30-021207.04' WITH into_db = 'ora';

在恢复之前删除外键

默认情况下,具有外键约束的表必须与它们引用的表同时恢复。但是,使用skip_missing_foreign_keys选项可以从表中删除外键约束,然后再恢复。

restore guar.emp from 'nodelocal://1/backup_data/2023/03/30-324121.03' with skip_missing_foreign_keys;

从系统中恢复用户,用户备份

system.users表存储集群的用户名及其散列密码。要恢复它们,需要将system.users表恢复到新数据库中,因为您不能删除现有的system.users表。

在将其恢复到新数据库之后,可以将恢复的用户表数据写入集群的现有system.users表。

restore system.users from 'nodelocal://1/backup_users/2023/03/30-104421.14' WITH into_db = 'newdb';
insert into system.users select * from newdb.users;
drop table newdb.users;