备份
备份介质
目前 OceanBase 数据库支持 OSS (阿里云对象存储),NFS 和 COS (腾讯云对象存储) 两种备份介质。
物理备份
OceanBase 数据库支持集群级别的物理备份。物理备份由基线数据、日志归档数据两种数据组成,因此物理备份由日志归档和数据备份两个功能组合而成:
- 日志归档指的是日志数据的自动归档功能,OBServer 会定期自动将日志数据归档到指定的备份路径。
- 数据备份指的是备份基线数据的功能,该功能分为全量备份和增量备份两种:
- 全量备份是指备份所有的需要基线的宏块。
- OceanBase 数据库将磁盘切分为大小为 2MB 的定长数据块,称之为宏块(Macro Block),宏块是数据文件写 IO 的基本单位,一个 SSTable 就由若干个宏块构成。
- 增量备份是指备份上一次备份以后新增和修改过的宏块。
备份架构
物理备份架构
当使用系统租户登录到待备份集群以后,需要先用 SQL 发起日志归档,等日志归档发起完成启动阶段以后,才可以发起基线备份。
日志归档是定期备份到备份目的端的,只需要发起一次 alter system archivelog
命令,日志备份就会在后台持续进行。日志归档是由每个 PG(PartitionGroup)的 leader 负责定期将该 PG 的日志归档到备份介质指定的路径,RS(RootService)负责定期统计日志归档的进度,并更新到内部表。
数据备份是需要手工触发的,比较常见的场景是周六触发一次全备,周二周四触发一次增量备份。当用户发起数据备份请求时,这个请求会首先被转发到 RS 所在的节点上;RS 会根据当前的租户和租户包含的 PG 生成备份数据的任务,然后把备份任务分发到 OBServer 上并行的执行备份任务;OBServer 负责备份 PG 的元信息和宏块到指定的备份目录,宏观是按照 PG 为单位管理的。
以下是备份功能在备份目的地创建的目录结构以及每个目录下保存的文件类型。
backup/ # 备份的根目录 └── ob1 # cluster_name └── 1 # cluster_id └── incarnation_1 #分身id ├── 1001 # 租户id │ ├── clog # clog的根目录 │ │ ├── 1 # clog备份的round id │ │ │ ├── data # 日志的数据目录 │ │ │ └── index # 日志的索引目录 │ │ └── tenant_clog_backup_info # 日志备份的元信息,按照round id分段记录 │ └── data # 数据的根目录 │ ├── backup_set_1 # 全量备份的目录 │ │ ├── backup_1 # 差异备份的目录,第一个差异备份目录是全量的meta │ │ ├── backup_2 # 差异备份的目录。第二个差异备份的目录,meta也是全量备份的。 │ │ ├── backup_set_info # 记录了backup_set目录内的多次差异备份的信息 │ │ └── data #宏块数据的目录,包含了所有的全量和差异的宏块 │ └── tenant_data_backup_info # 记录了租户全部的数据备份信息 ├── clog_info # server启动日志备份的信息 │ └── 1_100.88.110.158_12533 # 一个server一个启动日志备份信息 ├── cluster_clog_backup_info # 集群级别的日志备份信息 ├── cluster_data_backup_info # 集群级别的数据备份信息 ├── tenant_info # 租户的信息 └── tenant_name_info #租户name和id的影射关系
备份管理
BackupSet
OceanBase 数据库的数据备份是用 BackupSet 来管理,一次数据备份会生成一个对应的 backup_set_id,这个 ID 在集群级别是全局唯一的。
- 对于全量备份来说,会建立一个独立的元信息目录和一个宏块的目录
- 对于增量备份来说,会建立一个独立的元信息目录,但是会重用对应全量备份的宏块目录
- OceanBase 数据库的增量备份包含了完整的元信息,只重用的宏块数据,不会影响恢复的性能。
Archive Log Round
OceanBase 数据库的日志归档是连续备份的,不受 Backup Set 的管理。每次执行 ALTER SYSTEM ARCHIVELOG
发起日志归档的时候,会将 Archive Log Round 加 1 。 一个 Archive Log Round 表示一个完整连续的日志备份。
日志归档没有单独的备份管理命令,每次删除数据备份的 Backup Set 的时候,会自动将不再需要的日志归档文件删除。如果一个 Archive Log Round 比现存的所有 Backup Set 都旧,那么整个 Archive Log Round 都会被删除。
恢复
支持租户级别的恢复
OceanBase 数据库支持租户级别的恢复,恢复是基于已有数据的备份重建新租户的过程。只需要一个 alter system restore tenant
命令,就可以完成整个恢复过程。
恢复过程包括租户系统表和用户表的 Restore 和 Recover 过程。
- Restore :将恢复需要的基线数据恢复到目标租户的 OBServer
- Recover :将基线对应的日志恢复到对应 OBServer。
恢复架构
物理恢复架构
对于单个 PG 来说,恢复的流程就是将 PG 的元信息和宏块数据拷贝到指定的 OBServer,构建出一个只有基线数据的 PG;然后再把 PG 的日志拷贝到指定的 OBServer,回放到该 PG 的 memtable 中。这个流程中如果日志的量比较大,可能会触发转储操作。
流程
- 在目的集群上用 CREATE RESOURCE POOL 命令建立恢复租户需要的 resource pool。
- 通过 ALTER SYSTEM RESTORE TENANT 命令调度租户恢复任务
restore tenant 命令内部的流程
- 创建恢复用的租户
- 恢复租户的系统表数据
- 恢复租户的系统表日志
- 调整恢复租户的元信息
- 恢复租户的用户表数据
- 恢复租户的用户表日志
- 恢复扫尾工作
物理备份与恢复
下面使用NFS介质进行OceanBase数据库得备份与恢复操作。
部署NFS
NFS 服务端
安装软件
# 通过 YUM 包管理器安装 NFS yum install nfs-utils
设置 Exports
编辑配置文件
vi /etc/exports /data/nfs_server/ 192.168.10.1/24(rw,sync,all_squash)
192.168.10.1/24: 表示允许访问的网段
配置权限
为 nfsnobody
赋权,确保 nfsnobody
有权限访问 exports
中指定的目录
chown nfsnobody:nfsnobody -R /data/nfs_server
配置 NFS 参数
编辑配置文件
vi /etc/sysconfig/nfs RPCNFSDCOUNT=8 RPCNFSDARGS="-N 2 -N 3 -U" NFSD_V4_GRACE=90 NFSD_V4_LEASE=90
重新启动 NFS 服务
systemctl restart nfs-config && systemctl restart nfs-server
设置 Slot Table
编辑 /etc/sysctl.conf 文件并添加以下信息
sunrpc.tcp_max_slot_table_entries=128
客户端
在所有的OBServer 节点上配置
安装软件
yum install nfs-utils
设置 Slot Table
vi /etc/sysctl.conf
sunrpc.tcp_max_slot_table_entries=128
挂载 NFS
mount -tnfs4 -o rw,timeo=30,wsize=1048576,rsize=1048576,namlen=512,sync,lookupcache=positive 192.168.10.181:/data/nfs_server /data/nfs
验证NFS的性能
fio -filename=/data/nfs/fio_test -direct=1 -rw=randwrite -bs=2048K -size=10G -runtime=300 -group_reporting -name=mytest -ioengine=libaio -numjobs=1 -iodepth=64 -iodepth_batch=8 -iodepth_low=8 -iodepth_batch_complete=8
备份数据
通过命令行进行全量备份
1. 使用 root
用户登录数据库的 sys
租户
2. 配置备份目的地址
ALTER SYSTEM SET backup_dest='file:///ups/data/obdata/backup';
3. (可选) 配置备份模式及日志压缩算法
备份模式
目前支持 Optional 模式和 Mandatory 模式,默认为 Optional 模式。
- Optional 模式:表示以用户业务优先。在该模式下,当备份(日志归档)来不及的情况下,日志可能来不及备份就回收了,可能会发生备份断流。
- Mandatory 模式:表示以备份优先。在该模式下如果备份跟不上业务数据的写入,可能会导致无法写入。
日志压缩
目前支持的压缩算法有:zstd_1.3.8 和 lz4_1.0,默认使用压缩算法 lz4_1.0
详细配置
- Optional 模式
ALTER SYSTEM SET backup_log_archive_option = 'optional compression= enable';
- Mandatory 模式
-- 动态修改备份模式和压缩算法 ALTER SYSTEM SET backup_log_archive_option='mandatory compression= zstd_1.3.8'; ALTER SYSTEM SET backup_log_archive_option='mandatory compression= lz4_1.0';
关闭日志归档压缩
- 当前备份模式为 Optional 模式的场景
-- 命令直接关闭归档日志压缩功能 ALTER SYSTEM SET backup_log_archive_option = 'compression= disable'; -- 或者 ALTER SYSTEM SET backup_log_archive_option = 'mandatory compression= disable';
- 当前备份模式为 Mandatory 模式的场景
ALTER SYSTEM SET backup_log_archive_option = 'mandatory compression= disable';
4. 启动日志备份
为了减少日志备份发起的耗时,建议在开启日志备份前进行一次转储,待转储完成后再备份
ALTER SYSTEM ARCHIVELOG;
5. 确认日志备份任务是否已开始
-- 当 STATUS 为 DOING 时,表示日志备份任务已开始。 SELECT * FROM CDB_OB_BACKUP_ARCHIVELOG_SUMMARY; -- 查看日志的备份进度 SELECT * FROM CDB_OB_BACKUP_ARCHIVELOG;
6. 对集群发起一轮合并操作
ALTER SYSTEM MAJOR FREEZE; -- 查看合并进度, 当 info 为 IDLE 时,则表示合并结束。 SELECT * FROM oceanbase.__all_zone WHERE name='merge_status';
7. (可选) 设置备份的密码
SET ENCRYPTION ON IDENTIFIED BY 'password' ONLY;
8. 发起数据备份
ALTER SYSTEM BACKUP DATABASE;
9. 查看备份任务的状态和详细信息
-- 查看正在备份的任务 SELECT * FROM CDB_OB_BACKUP_PROGRESS; -- 查看备份任务的历史 SELECT * FROM CDB_OB_BACKUP_SET_DETAILS;
CDB_OB_BACKUP_SET_DETAILS 说明
增量备份
使用 root
用户登录数据库的 sys
租户
-- 启动增量备份
ALTER SYSTEM BACKUP INCREMENTAL DATABASE;
停止备份
使用 root
用户登录数据库的 sys
租户
停止数据备份任务
ALTER SYSTEM CANCEL BACKUP;
停止日志备份任务
ALTER SYSTEM NOARCHIVELOG;
备份数据清理
自动清理备份数据
通过 backup_dest_option
配置项开启自动清理功能
示例
-- 自动清理 7 天之前的数据 ALTER SYSTEM SET backup_dest_option='log_archive_checkpoint_interval=2m&recovery_window=7d&auto_delete_obsolete_backup=true&log_archive_piece_switch_interval=1d';
- log_archive_checkpoint_interval: 用于控制冷分区(冷分区没有日志写入) Checkpoint 任务的生成间隔,以推进其归档进度。
- 若不使用backup_dest_option项设置,则默认使用集群级别中的log_archive_checkpoint_interval配置项的值(默认120s)
- recovery_window: 用于控制备份数据的保留时间
- 若不使用backup_dest_option项设置,则默认使用集群级别中的backup_recovery_window配置项的值(默认为0,表示备份数据不过期)
auto_delete_obsolete_backup
:用于控制是否自动删除过期的备份数据- 若不使用backup_dest_option项设置,则默认使用集群级别中的auto_delete_expired_backup 配置项的值(默认为False,表示不自动删除备份数据)
log_archive_piece_switch_interval
:用于控制自动按照时间段来切日志文件的目录,默认值为0
,表示不切分 Piece, 有效范围为 [1d, 7d]
通过 auto_delete_expired_backup 配置项开启自动清理功能
集群级别配置项 auto_delete_expired_backup
也可以用来开启自动清理功能。在日常使用中,建议您使用 backup_dest_option
配置项来开启自动清理功能。
-- 设置备份数据的过期时间
ALTER SYSTEM SET backup_recovery_window = <过期时间>;
backup_recovery_window: 表示成功备份的数据可以提供恢复的时间窗口,默认值为
0
,表示永久保留;建议设置为'7d'
,表示备份数据保留一周后过期。
示例
- 设置7d 自动清理备份的数据
ALTER SYSTEM SET backup_recovery_window = '7d';
- 开启备份数据的自动清理功能
ALTER SYSTEM SET auto_delete_expired_backup = 'True';
手动清理备份数据
手动清理方式主要通过 ALTER SYSTEM
命令删除指定的 backup_set_id
、backup_piece_id
、backup_round_id
或者过期的数据。
清理前准备
先配置备份数据的过期时间和清理策略
ALTER SYSTEM SET backup_dest_option='log_archive_checkpoint_interval=5s&recovery_window=7d&auto_delete_obsolete_backup=false&log_archive_piece_switch_interval=1d';
清理指定备份数据
使用 root
用户登录数据库的 sys
租户后
获取待删除的备份数据的 ID 值
分别查询视图 CDB_OB_BACKUP_SET_DETAILS
和 CDB_OB_BACKUP_PIECE_FILES
,找到待删除的备份数据的 backup_set_id
、piece_id
和 round_id
- CDB_OB_BACKUP_SET_DETAILS 视图获取backup_set_id
select INCARNATION,TENANT_ID,BS_KEY,BACKUP_TYPE,COMPLETION_TIME,ELAPSED_SECONDES,STATUS,OUTPUT_BYTES,OUTPUT_RATE_BYTES,KEEP_UNTIL from CDB_OB_BACKUP_SET_DETAILS;
- CDB_OB_BACKUP_PIECE_FILES 视图获取round_id 和 backup_piece_id
select INCARNATION,TENANT_ID,ROUND_ID,BACKUP_PIECE_ID,STATUS,FILE_STATUS from CDB_OB_BACKUP_PIECE_FILES\G
清理备份数据
ALTER SYSTEM DELETE BACKUPSET backup_set_id; -- 删除 backup_set_id 为 1 的备份数据 ALTER SYSTEM DELETE BACKUPSET 1; -- 清理指定 piece_id 的归档数据 ALTER SYSTEM DELETE BACKUPPIECE piece_id; -- 清理指定 round_id 的日志备份的 Round 中的所有数据 ALTER SYSTEM DELETE BACKUPROUND round_id;
清理过期的备份数据
-- 立即清理过期的备份数据
ALTER SYSTEM DELETE OBSOLETE BACKUP;
取消清理备份数据
使用 root
用户登录数据库的 sys
租户
取消正在执行的清理任务
ALTER SYSTEM CANCEL DELETE BACKUP;
对于自动清理场景
对于自动清理场景,为了防止取消清理的任务被再次调度执行,需要先关闭自动清理备份数据功能后,再取消正在执行的清理任务
-- 关闭自动清理备份数据功能 ALTER SYSTEM SET auto_delete_expired_backup = 'False'; -- 取消正在执行的清理任务。 ALTER SYSTEM CANCEL DELETE BACKUP;
恢复全量数据
目前,OB支持租户级别的基于时间点的全量恢复。
流程
恢复会先根据用户输入的命令,从备份的目的地将全量备份恢复回来。之后,再将增量备份恢复到全量备份上面。最后,应用备份出去的事务日志。
通过命令进行恢复
1. 使用 root
用户登录数据库的 sys
租户
2.(可选)停止日志备份
ALTER SYSTEM NOARCHIVELOG;
3.创建资源单元 (Resource Unit)
CREATE RESOURCE UNIT box_16c96g max_cpu 16, max_memory 103079215104, max_iops 10240, max_disk_size 53687091200, max_session_num 64, MIN_CPU=16, MIN_MEMORY=103079215104, MIN_IOPS=10240;
4. 创建 Resource Pool(资源池)
CREATE RESOURCE POOL restore_pool unit = 'box_16c96g', unit_num = 1, zone_list = ('zone1','zone2','zone3');
5. (可选)设置加密信息
SET @kms_encrypt_info = '<加密string>';
其中,
<加密string>
为EXTERNAL_KMS_INFO
的值,EXTERNAL_KMS_INFO
为租户级配置项
6. 打开恢复配置
检查restore_concurrency的值是否为0,若为0,执行下面命令配置
show parameters like 'restore_concurrency'\G ALTER SYSTEM SET restore_concurrency = 50;
7. (可选)修改恢复的等待时间
默认恢复等待时间 _restore_idle_time
为 1 分钟,整个恢复期间会有 3 次等待,即 3 分钟的等待时间。
show parameters where name = '_restore_idle_time'\G ALTER SYSTEM SET _restore_idle_time = '10s';
8. 设置恢复的密码
只有在备份时添加了密码的场景下才需要设置恢复的密码。同时如果全量备份+增量备份设置的密码不一样,则需要输入多个密码,密码之间使用逗号分隔。
SET DECRYPTION IDENTIFIED BY 'password'; -- 多个密码的场景 SET DECRYPTION IDENTIFIED BY 'password1','password2';
9. 执行恢复任务
用法
ALTER SYSTEM RESTORE <dest_tenant_name> FROM <source_tenan_tname> at 'uri' UNTIL 'timestamp'
示例
ALTER SYSTEM RESTORE restored_trade FROM trade at 'file:///ups/data/obdata/backup' until '2021-12-22 09:33:07.901747' with 'backup_cluster_name=ob20daily.backup&backup_cluster_id=1&pool_list=restore_pool;
10. 查看恢复进度
查看系统表 Root Table
SELECT svr_ip, role, is_restore, COUNT(*) FROM __all_root_table AS a, (SELECT value FROM __all_restore_info WHERE name='tenant_id') AS b WHERE a.tenant_id=b.value GROUP BY role, is_restore, svr_ip ORDER BY svr_ip, is_restore;
其中,
is_restore
的取值含义如下:
- 0:表示正常副本
- 1:表示逻辑恢复的副本
- 2:表示物理恢复需要恢复基线的副本
- 3:表示物理恢复需要恢复转储的副本
- 4:物理恢复需要恢复 clog 的副本
- 5:物理恢复需要转储的副本
- 6:物理恢复等待所有副本转储完成的副本
- 7:物理恢复设置 member list 的副本
role
的取值含义如下:
- 1:表示 Leader
- 2:表示 Follower
- 3:表示恢复中的 Leader
查看用户表 Meta Table
SELECT svr_ip,role, is_restore, COUNT(*) FROM __all_virtual_meta_table AS a, (SELECT value FROM __all_restore_info WHERE name='<目标租户名>') AS b WHERE a.tenant_id=b.value GROUP BY role, is_restore, svr_ip ORDER BY svr_ip, is_restore; SELECT svr_ip ,is_restore, COUNT(*) FROM __all_virtual_partition_store_info WHERE tenant_id>1000 group by svr_ip,is_restore order by svr_ip, is_restore;
11. 查看恢复结果
SELECT * FROM __all_restore_info; SELECT * FROM __all_restore_history;
使用 OBDUMPER / OBLOADER 工具导出/导入 OceanBase 数据
java编写的逻辑导出导入工具,目前在社区中未找到软件包。后期再实验完善文档
obdumper 导出数据
使用 obdumper 工具导出 OceanBase 的数据库建议结构和数据分开导出。
用法
只导出表结构
若需要导出表结构,还需要指定 SYS 租户的用户 root
的密码或者用户 proxyro
和 其密码。为了安全性,OBPROXY 默认禁止使用用户 proxyro
登录 OceanBase 集群。root
用户的权限过于大。所以这里推荐使用用户 proxyro
获取表的元数据信息。
修改 OBPROXY 参数跳过用户 proxyro
登录检查
由于默认禁止使用 proxyro 用户登陆,因此,需要配置参数跳过检查
alter proxyconfig set skip_proxyro_check=true; show proxyconfig like '%skip_proxyro_check%'\G
导出表结构
obdumper -h 127.1 -P 2883 -u u_dumper -p 123456 --sys-user=proxyro --sys-password=proxyro -c obce -t obmysql -D test --ddl --all -f /tmp/obdumper
只导出数据
obdumper -h 127.1 -P 2883 -u u_dumper -p 123456 --sys-user=proxyro --sys-password=proxyro -c obce -t obmysql -D test --csv --all -f /tmp/obdumper
obloader 导入数据
用法
obloader -h <主机IP> -P <端⼝> -u <⽤⼾> -p <密码> --sys-user <sys 租户下的 root 用户或 proxyro 用户> --sys-password <sys 租⼾下的账⼾密码> -c <集群> -t <租⼾> -D <Schema 库名> [--ddl] [--csv|--sql] [--all|--table '表名'] -f<数据⽂件或者⽬录>
导入表结构
导入数据
附录
字典视图
oceanbase.CDB_OB_BACKUP_SET_DETAILS
用于显示备份集的状态
OceanBase.CDB_OB_BACKUP_PIECE_FILES
用于展示备份集中 Piece 的状态
结束语:OceanBase 社区版入门到实战教程直播正在进行中~
快和小伙伴一起进群交流学习吧~
加入直播群方式一:
钉钉群号 3582 5151
加入直播群方式二:
扫码下方钉钉二维码加入