概述
OceanBase 数据库 V4.1.0 版本支持 OSS、NFS 两种备份介质,提供了备份、恢复、清理三大功能。不管是社区版还是企业版,备份恢复功能应该是一致的。
由于企业版 4.1 没有对外发布,所以本文分享的是 社区版 4.1 的备份恢复实践。
跟 3.2 版本相比, 4.1 版本在备份方面最大的变化就是支持租户级别的物理备份。备份策略依然是支持数据全量备份、增量备份和事务日志备份(即归档)。备份目录有些变化,这个以后再专门分析。
本次实践是将一个单副本架构的 OB 社区版集群里的业务租户备份,并还原到历史时间点。新租户就在当前 OB 集群中(也可以在其他独立的 OB 集群中)。OB 租户还原不支持覆盖形式恢复,可以恢复出新名字的租户。如果需要替换原租户,可以通过租户重命名的方式。
备份介质准备
OB 的备份目前支持 NFS 和 云盘 OSS 。这个参考文章:OB 企业版 3.2 备份恢复实践 (qq.com) ,这里就不再重复了。
OB 集群手动备份
本文演示的是 OB 社区版 5.7.25-OceanBase_CE-v4.1.0.0 。
OB 4.1 版本支持租户级别的备份,所以备份参数设置也改为租户级别了。
此外,加上 4.1 版本支持日志流(Log stream)设计,租户的事务日志也是独立的。所以事务日志备份也要按租户粒度开启。
配置 OB 事务日志备份参数
配置租户备份目录
备份目录依然是通过参数 LOG_ARCHIVE_DEST
配置。
如果是在 SYS 租户里设置业务租户的备份目录,需要加上生效范围 TENANT = obmysql
。
[root@server066 ~]$mysql -h10.0.0.66 -uroot@sys#obcedemo -P2883 -paaAA11__ -c -A oceanbase(root@10.0.0.66:2883) [oceanbase]> ALTER SYSTEM SET LOG_ARCHIVE_DEST='LOCATION=file:///backup/obbackup/' TENANT = obmysql;ERROR 9080 (HY000): the format file does not exist under the destination(root@10.0.0.66:2883) [oceanbase]> ALTER SYSTEM SET LOG_ARCHIVE_DEST='LOCATION=file:///backup/obcebackup/obmysql' TENANT = obmysql;Query OK, 0 rows affected (0.55 sec)
如果是在业务租户里,就可以直接设置。
[root@server066 ~]$mysql -h10.0.0.66 -uroot@obmysql#obcedemo -P2883 -paaAA11__ -c -A testALTER SYSTEM SET LOG_ARCHIVE_DEST='LOCATION=file:///backup/obcebackup/obmysql' ;
上面第一次设置备份目录,报错信息官网有解释,这个设计跟之前的备份逻辑有所变化。目录不为空时会检查是否有 Format 文件(设置过备份目录为当前目录)。
ERROR 9080 (HY000) : the format file does not exist under the destinationOceanBase 错误码:9080错误原因:备份目的端的 Format 文件不存在。原因如下:目的端在参与备份任务前,Format 文件被移除。设置的目的端非空,且目的端下没有 Format 文件。解决方式:检查备份目的端的 Format 文件是否存在,如果不存在,则此目的端已失效。设置新的目的端时,需要将目的端的文件都清空后,再加入备份。
设置后,OB 会在备份目录生成一个 format
文件,用于校验备份目录的有效性。
[root@server066 obmysql]$ls -lrth backup/obcebackup/obmysql/total 8.0Kdrwx------. 2 nfsnobody nfsnobody 4.0K Jun 13 2023 check_file-rw-------. 1 nfsnobody nfsnobody 141 Jun 13 2023 format.obbak
LOG_ARCHIVE_DEST
有多个属性,其中 LOCATION
是必填的,指定备份目录。BINDING
属性是可选的,默认值是 Optional
模式,另外一种值是 Mandatory
模式。选哪个取决于在事务日志备份速度赶不上事务日志生成速度时,是备份重要还是业务可用性重要。如果是备份重要,OB 会减慢或者挂起租户的事务;如果是业务可用性重要,事务日志可能被回收导致日志归档断流,从而导致备份链路设计出现缺口,影响恢复的能力。
配置归档目的端状态
通常第一次设置归档目的端后,状态都是 ENABLE
状态。后期也可以通过参数 LOG_ARCHIVE_DEST_STATE
暂停这个归档目录。这个应该是参考 ORACLE 设计。也许将来还会支持多个归档路径。
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE='DEFER';
查看日志归档参数。
租户日志归档参数查看租户下的视图。
SELECT * FROM DBA_OB_ARCHIVE_DEST ;
在 SYS 租户则查看视图 CDB_OB_ARCHIVE_DEST
。
发起事务日志备份(归档)
可以在 SYS 租户里发起所有租户的事务日志归档,也可以指定某个租户的事务日志归档。该命令对后期创建的租户不会生效(即使租户删除重建)。
ALTER SYSTEM ARCHIVELOG TENANT = obmysql ;
也可以登录业务租户发起该租户的事务日志归档。
ALTER SYSTEM ARCHIVELOG ;
查看租户的事务日志归档状态
查看租户视图 DBA_OB_TENANTS
。
SELECT TENANT_ID , TENANT_NAME , TENANT_TYPE , COMPATIBILITY_MODE ,status, IN_RECYCLEBIN , TENANT_ROLE , LOG_MODE FROM DBA_OB_TENANTS t;
业务租户结果:
SYS 租户结果:
关闭事务日志归档
关闭事务日志归档用 NOARCHIVELOG
命令,跟前面一样,可以在 SYS 租户和业务租户执行。
ALTER SYSTEM NOARCHIVELOG TENANT = obmysql ;
查看事务日志归档文件 Pieces 信息。
在 SYS 租户下查看视图 CDB_OB_ARCHIVELOG_PIECE_FILES
, 在业务租户下查看视图 DBA_OB_ARCHIVELOG_PIECE_FILES
。
SELECT dest_id, ROUND_ID ,PIECE_ID ,INCARNATION ,DEST_NO ,status, COMPRESSION ,INPUT_BYTES_DISPLAY ,OUTPUT_BYTES_DISPLAY ,COMPRESSION_RATIO ,FILE_STATUS ,PATHFROM oceanbase.DBA_OB_ARCHIVELOG_PIECE_FILES ;
SELECT TENANT_ID ,DEST_ID ,ROUND_ID ,PIECE_ID ,INCARNATION ,DEST_no,STATUS ,COMPRESSION ,INPUT_BYTES_DISPLAY ,OUTPUT_BYTES_DISPLAY ,COMPRESSION_RATIO ,FILE_STATUS ,pathFROM oceanbase.CDB_OB_ARCHIVELOG_PIECE_FILES ;
查看事务日志归档进度信息。
在 SYS 租户下查看视图 CDB_OB_ARCHIVE_LOG
, 在业务租户下查看视图 DBA_OB_ARCHIVE_LOG
。
SELECT DEST_ID ,ROUND_ID ,INCARNATION ,DEST_NO ,STATUS ,BASE_PIECE_ID ,USED_PIECE_ID ,INPUT_BYTES_DISPLAY ,OUTPUT_BYTES_DISPLAY ,COMPRESSION ,COMPRESSION_RATIO ,COMMENT , `PATH`FROM oceanbase.DBA_OB_ARCHIVELOG ;
SELECT TENANT_ID ,DEST_ID ,ROUND_ID ,INCARNATION ,DEST_NO ,STATUS ,BASE_PIECE_ID ,USED_PIECE_ID ,INPUT_BYTES_DISPLAY ,OUTPUT_BYTES_DISPLAY ,COMPRESSION ,COMPRESSION_RATIO ,COMMENT ,`PATH`FROM oceanbase.CDB_OB_ARCHIVELOG l ;
查看事务日志归档历史
在 SYS 租户查看视图 CDB_OB_ARCHIVELOG_SUMMARY
,在业务租户查看视图 DBA_OB_ARCHIVELOG_SUMMARY
。
这个字段跟上面一样,不重复展示了。
发起数据备份
设置数据备份目录。
数据备份目录参数是 DATA_BACKUP_DEST
,也支持在 SYS 租户和业务租户下设置两种方法。
下面在业务租户下设置。
ALTER SYSTEM SET DATA_BACKUP_DEST = 'file:///backup/obcebackup/obmysql_data';(root@10.0.0.66:2883) [test]> ALTER SYSTEM SET DATA_BACKUP_DEST = 'file:///backup/obcebackup/obmysql_data';ERROR 4009 (58030): IO error(root@10.0.0.66:2883) [test]> ALTER SYSTEM SET DATA_BACKUP_DEST = 'file:///backup/obcebackup/obmysql_data';Query OK, 0 rows affected (0.12 sec)
第一次报错的原因是新增的目录没有读写权限。需要在 NFS Server 上将新增目录 owner
设置为 nfsnobody
。
查看数据备份目录信息
在 SYS 租户可以查看视图 CDB_OB_BACKUP_PARAMETER
,在业务租户查看视图 DBA_OB_BACKUP_PARAMETER
。
SELECT * FROM oceanbase.CDB_OB_BACKUP_PARAMETER ;
这两个视图字段略显单薄,后面估计还会进一步丰富。
发起全量数据备份
首先全量数据备份之前要自己确认事务日志归档已经打开。
备份之前也可以在会话级别设置密码。
SET ENCRYPTION ON IDENTIFIED BY 'aaAA11__' ONLY;
全量备份可以在 SYS 租户里发起,指定所有租户或者某个租户。也可以在业务租户里发起。这里我选用先在业务租户下发起备份。
ALTER SYSTEM BACKUP DATABASE;
再到 SYS 租户发起一次全量备份和增量备份。
mysql -h10.0.0.66 -uroot@sys#obcedemo -P2883 -paaAA11__ -c -A oceanbase
ALTER SYSTEM BACKUP TENANT = obmysql ;ALTER SYSTEM BACKUP INCREMENTAL TENANT = obmysql ;
查看备份进度和历史。
在 SYS 租户查看视图 CDB_OB_BACKUP_JOBS
和 CDB_OB_BACKUP_TASKS
, 在业务租户查看视图 DBA_OB_BACKUP_JOBS
和 DBA_OB_BACKUP_TASKS
。这些视图也有响应的历史视图。
这里我在业务租户查询。
SELECT jh.JOB_ID ,jh.INCARNATION ,jh.BACKUP_SET_ID ,jh.INITIATOR_TENANT_ID ,jh.EXECUTOR_TENANT_ID , jh.PLUS_ARCHIVELOG , jh.BACKUP_TYPE , jh.JOB_LEVEL , jh.ENCRYPTION_MODE ,jh.START_TIMESTAMP ,jh.END_TIMESTAMP , jh.STATUS , jh.`RESULT` , jh.COMMENT, th.task_ID, th.INPUT_BYTES , th.OUTPUT_BYTES , th.`RESULT` , th.`PATH`FROM DBA_OB_BACKUP_JOBS jh, DBA_OB_BACKUP_TASKS thWHERE jh.JOB_ID =th.JOB_ID AND jh.BACKUP_SET_ID = th.BACKUP_SET_ID;SELECT jh.JOB_ID ,jh.INCARNATION ,jh.BACKUP_SET_ID ,jh.INITIATOR_TENANT_ID ,jh.EXECUTOR_TENANT_ID , jh.PLUS_ARCHIVELOG , jh.BACKUP_TYPE , jh.JOB_LEVEL , jh.ENCRYPTION_MODE ,jh.START_TIMESTAMP ,jh.END_TIMESTAMP , jh.STATUS , jh.`RESULT` , jh.COMMENT, th.task_ID, th.INPUT_BYTES , th.OUTPUT_BYTES , th.`RESULT` , th.`PATH`FROM DBA_OB_BACKUP_JOB_HISTORY jh, DBA_OB_BACKUP_TASK_HISTORY thWHERE jh.JOB_ID =th.JOB_ID AND jh.BACKUP_SET_ID = th.BACKUP_SET_ID;
(可选)停止备份
如果数据库很大,备份时间很久,中间想取消,可以发命令:CANCEL BACKUP
。
这个就不演示了。
OB 集群手动恢复
OB 4.1 版本的恢复依然是租户粒度的恢复,需要提前准备新租户的资源池,(可选)设置加密信息等。
准备恢复租户的资源池
首先查看当前租户剩余资源。
select svr_ip, CPU_CAPACITY, (CPU_CAPACITY-CPU_ASSIGNED) CPU_FREE, round(MEM_CAPACITY/1024/1024/1024) MEM_CAPACITY_GB, round((MEM_CAPACITY-MEM_ASSIGNED)/1024/1024/1024,2) MEM_FREE_GB, round(DATA_DISK_CAPACITY/1024/1024/1024) DATA_CAPACITY_GB, round((DATA_DISK_CAPACITY-DATA_DISK_IN_USE)/1024/1024/1024,2) DATA_FREE_GB, round(DATA_DISK_CAPACITY/1024/1024/1024) LOG_CAPACITY_GB, round((LOG_DISK_CAPACITY-LOG_DISK_IN_USE)/1024/1024/1024,2) LOG_FREE_GBfrom GV$OB_SERVERS ;
内存资源没有剩余。
先创建一个用于检验的表,然后再删除这个业务租户释放一些资源。
[root@server066 ~]$mysql -h10.0.0.66 -uroot@obmysql#obcedemo -P2883 -paaAA11__ -c -A test<...>Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.(root@10.0.0.66:2883) [test]> create table t_backup(id bigint not null auto_increment primary key, c1 varchar(100) , c2 timestamp default current_timestamp );Query OK, 0 rows affected (0.88 sec)(root@10.0.0.66:2883) [test]> insert into t_backup(c1) values('test ob 4.1 backup and restore');Query OK, 1 row affected (0.41 sec)(root@10.0.0.66:2883) [test]> insert into t_backup(c1) values('test ob 4.1 backup and restore 2 ');Query OK, 1 row affected (0.03 sec)(root@10.0.0.66:2883) [test]> select * from t_backup;+----+-----------------------------------+---------------------+| id | c1 | c2 |+----+-----------------------------------+---------------------+| 1 | test ob 4.1 backup and restore | 2023-06-13 11:47:11 || 2 | test ob 4.1 backup and restore 2 | 2023-06-13 11:48:08 |+----+-----------------------------------+---------------------+2 rows in set (0.01 sec)
恢复目标是恢复到时间点:2023-06-13 11:48:00
。
直接在 OCP-Express 里删除了租户。确认租户已经删除。
(root@10.0.0.66:2883) [oceanbase]> select tenant_id,tenant_name,status from __all_tenant;+-----------+-------------+--------+| tenant_id | tenant_name | status |+-----------+-------------+--------+| 1 | sys | NORMAL || 1001 | META$1002 | NORMAL || 1002 | ocp | NORMAL |+-----------+-------------+--------+3 rows in set (0.01 sec)
再次确认剩余可分配资源。
创建用于恢复的租户的资源池。
CREATE RESOURCE UNIT b_4c2g MAX_CPU 4, MEMORY_SIZE = '2G', MAX_IOPS 10240, MIN_IOPS=10240;CREATE RESOURCE POOL restore_pool unit = 'b_4c2g', unit_num = 1, zone_list = ('zone1');
开始不完全恢复
恢复新租户到时间点:2023-06-13 11:48:00
。
(可选)设置解密密码。
如果备份中使用了密码,这里就需要设置解密密码。否则后面恢复的时候会报错提示密码不对。
SET DECRYPTION IDENTIFIED BY 'aaAA11__' ;
恢复租户到指定时间点。
ALTER SYSTEM RESTORE restored_obmysql FROM 'file:///backup/obcebackup/obmysql_data,file:///backup/obcebackup/obmysql' UNTIL TIME='2023-06-13 11:48:00' WITH 'pool_list=restore_pool&locality=F@zone1' ;
跟 3.2 版本恢复不同的是,4.1 版本的恢复命令会阻塞一会,原因不明。
查看恢复进度和详情
在 SYS 租户查看视图 CDB_OB_RESTORE_PROGRESS
和 CDB_OB_RESTORE_HISTORY
。
SELECT p.TENANT_ID , p.JOB_ID , p.RESTORE_TENANT_ID , p.RESTORE_TENANT_NAME , p.BACKUP_TENANT_ID , p.BACKUP_TENANT_NAME, p.BACKUP_CLUSTER_NAME , p.BACKUP_DEST , p.RESTORE_OPTION , p.STATUS , p.START_TIMESTAMP , p.BACKUP_SET_LIST , p.BACKUP_PIECE_LIST , p.TOTAL_BYTES_DISPLAY , p.FINISH_BYTES_DISPLAYFROM CDB_OB_RESTORE_PROGRESS p ;SELECT h.TENANT_ID , h.JOB_ID , h.RESTORE_TENANT_ID , h.RESTORE_TENANT_NAME , h.BACKUP_TENANT_ID , h.BACKUP_TENANT_NAME, h.BACKUP_CLUSTER_NAME , h.BACKUP_DEST , h.RESTORE_OPTION , h.STATUS , h.START_TIMESTAMP , h.BACKUP_SET_LIST , h.BACKUP_PIECE_LIST , h.TOTAL_BYTES_DISPLAY , h.FINISH_BYTES_DISPLAYFROM CDB_OB_RESTORE_HISTORY h ;
TENANT_ID | JOB_ID | RESTORE_TENANT_ID | RESTORE_TENANT_NAME | BACKUP_TENANT_ID | BACKUP_TENANT_NAME | BACKUP_CLUSTER_NAME | BACKUP_DEST | RESTORE_OPTION | STATUS | START_TIMESTAMP | BACKUP_SET_LIST | BACKUP_PIECE_LIST | TOTAL_BYTES_DISPLAY | FINISH_BYTES_DISPLAY |
1 | 2 | 1,006 | restored_obmysql | 1,004 | obmysql | obcedemo | file:///backup/obcebackup/obmysql_data,file:///backup/obcebackup/obmysql | pool_list=restore_pool&locality=F@zone1 | SUCCESS | 2023-06-13 12:06:40.323 | file:///backup/obcebackup/obmysql_data/backup_set_2_full,file:///backup/obcebackup/obmysql_data/backup_set_3_inc | file:///backup/obcebackup/obmysql/piece_d1004r1p1 | 25.25MB | 0.00MB |
1,006 | 2 | 1,006 | restored_obmysql | 1,004 | obmysql | obcedemo | file:///backup/obcebackup/obmysql_data,file:///backup/obcebackup/obmysql | pool_list=restore_pool&locality=F@zone1 | SUCCESS | 2023-06-13 12:06:40.323 | file:///backup/obcebackup/obmysql_data/backup_set_2_full,file:///backup/obcebackup/obmysql_data/backup_set_3_inc | file:///backup/obcebackup/obmysql/piece_d1004r1p1 | 25.25MB | 0.00MB |
sys租户的任务记录(记录被恢复租户的恢复相关信息)和 新租户的记录(记录被恢复出来的租户的恢复进度信息)。
status字段会反应具体的恢复阶段。详情参考官网:查看恢复进度-OceanBase 数据库 -OceanBase文档中心-分布式数据库使用文档 。
验证恢复结果

obmysql。
alter tenant restored_obmysql rename global_name to obmysql;select tenant_id, tenant_name , locality from __all_tenant;

总结
CDB_开头,业务租户下的视图是
DBA_开头。SYS 租户下能查询和管理整个集群里所有租户的备份相关事情,业务租户只查看和管理当前租户的备份相关事情。租户的备份相关元数据是跟租户 ID 关联,而不是名字。被恢复出来的租户虽然名字可以改为一样,但实际是不同的租户。






