【OceanBase】v4.2.1 集群备份恢复命令汇总

0. Oceanbase介绍

认识术语

Root Service (RS)

OceanBase数据库集群会有一个总控服务Root Service,运行在某个ObServer节点上。当Root Service所在机器故障时,其余节点会选举出来新的Root Service。Root Service主要提供资源管理、容灾、负载均衡、schema管理等功能。

OBProxy

OceanBase 数据库代理, OceanBase Database Proxy, ODP,ob数据库专用的代理服务器,ob数据库用户的数据会以多副本的形式存放在各个OBServer节点上,ODP接收用户发出的SQL请求,并将SQL请求转发至最佳目标OBServer节点,最后将执行结果返回给用户。

OBServer Node
OBServer节点,OB数据库服务器。server是运行observer进程的物理机,一台物理机上可以部署一个或者多个OBServer。在OB数据库内部,server由其IP地址和服务端口唯一标识。

Macro Block
OB数据库将磁盘切分为大小为2MB的定长数据块,称为宏块,宏块是数据文件写IO的基本单位,每个SSTable由若干个宏块构成,宏块2MB固定大小的长度不可更改,后续转储合并重用宏块以及复制迁移等任务都会以宏块为最基本粒度。

Tablet
分片(Tablet),ob v4.0.0引入Tablet概念表示实际的数据存储对象。它具备存储数据的能力,是数据均衡的最小单位。Tablet与分区一一对应。局部索引表的Tablete与主表的Tablet会强制绑定,保证存储在一台机器上。

SSTable
SSTable, Sorted StringsTable,静态数据,存储在磁盘上。用于存储基线数据或转储数据,行数据有序存储。

Baseline Data
基线数据,每日合并生成的存储于持久化介质上只读有序数据。

以下简图是个人对OB集群备份的理解,可能不完全正确,会随时修改。
在这里插入图片描述

1. 查看集群信息

# 查看所有集群
obd cluster list

# 启动集群ob3cluster
obd cluster start ob3cluster

# 停止集群
obd cluster stop ob3cluster

2. 登录数据库

# root用户的sys租户登录数据库
obclient -hxxx.xxx.xxx.xxx -uxxx:sys:root -P2883 -pxxxxxx -c -A -DOceanbase

3. NFS 配置

NFS服务端

/etc/exports

/data/nfs_server/ xx.xx.xx.xx/16(rw,sync,all_squash)

NFS客户端

mount -tnfs4 -o rw,nfsvers=4.1,sync,lookupcache=positive,hard,timeo=600,wsize=1048576,rsize=1048576,namlen=255 192.168.xx.xx:/storage/ob421 /storage/ob421  

nfsvers=4.1 :由于备份依赖 nfs 4 原生的文件锁,建议使用 nfs 4.1 及以上版本。nfs 4.0 有一个已知 Bug,在重命名文件以后可能会读到旧文件。

sync: 使用同步写保证数据能及时刷到服务端,从而保证数据的一致性.

lookupcache=positive: 用于避免并发访问目录或者文件时误报目录或文件不存在的问题,保证数据的一致性。

hard: 在 NFS 不可用的情况下,系统会卡住应用的读写请求,以保证数据的一致性。不能使用 soft 选项,会有数据错误的风险。

timeo :用于指定重试的等待时间,单位为 0.1s。在设置时,建议不要设置得过大,建议值为 600 。

wsize :表示写的数据块大小,建议设置为 1048576 。

rsize :表示读的数据块大小,建议设置为 1048576 。

namlen :建议设置为 255 。

192.168.xx.xx :表示 NFS 服务器的 IP 地址。

4. 日志归档

4.1 设置日志归档目录

ALTER SYSTEM SET LOG_ARCHIVE_DEST='LOCATION=file:///storage/ob421/archive/mysqlt' TENANT = mysqlt;

设置好之后的目录情况:

[root@localhost mysqlt]# pwd
/storage/ob421/archive/mysqlt
[root@localhost mysqlt]# ll
total 8
drwx------ 2 nfsnobody nfsnobody 4096 Dec 14 09:56 check_file
-rw------- 1 nfsnobody nfsnobody  148 Dec 14 09:56 format.obbak
[root@localhost mysqlt]# ll check_file/
total 4
-rw------- 1 nfsnobody nfsnobody 145 Dec 14 09:56 1002_connect_file_20231214T095621.obbak
[root@localhost mysqlt]# 

4.2 开启日志归档模式

ALTER SYSTEM ARCHIVELOG TENANT = mysqlt;

但日志归档状态为BEGINNING,多了目录piece_d1001r0p1, rounds:

[root@localhost mysqlt]# ll
total 16
drwx------ 2 nfsnobody nfsnobody 4096 Dec 14 09:56 check_file
-rw------- 1 nfsnobody nfsnobody  148 Dec 14 09:56 format.obbak
drwx------ 4 nfsnobody nfsnobody 4096 Dec 14 10:01 piece_d1001r1p1
drwx------ 2 nfsnobody nfsnobody 4096 Dec 14 10:01 rounds
[root@localhost mysqlt]#

当日志归档状态变成DOING,目录情况:

[root@localhost mysqlt]# ll
total 20
drwx------ 2 nfsnobody nfsnobody 4096 Dec 14 09:56 check_file
-rw------- 1 nfsnobody nfsnobody  148 Dec 14 09:56 format.obbak
drwx------ 5 nfsnobody nfsnobody 4096 Dec 14 10:03 piece_d1001r1p1
drwx------ 2 nfsnobody nfsnobody 4096 Dec 14 10:03 pieces
drwx------ 2 nfsnobody nfsnobody 4096 Dec 14 10:01 rounds
[root@localhost mysqlt]#

4.3 关闭日志归档模式

ALTER SYSTEM NOARCHIVELOG TENANT = mysqlt;

4.4 查看日志归档进度

SELECT * FROM oceanbase.CDB_OB_ARCHIVELOG\G

刚开始的归档状态是BEGINING:

obclient [Oceanbase]> SELECT * FROM oceanbase.CDB_OB_ARCHIVELOG\G
*************************** 1. row ***************************
                   TENANT_ID: 1002
                     DEST_ID: 1001
                    ROUND_ID: 1
                 INCARNATION: 1
                     DEST_NO: 0
                      STATUS: BEGINNING
                   START_SCN: 1702519281626895202
           START_SCN_DISPLAY: 2023-12-14 10:01:21.626895
              CHECKPOINT_SCN: 1702519281626895202
      CHECKPOINT_SCN_DISPLAY: 2023-12-14 10:01:21.626895
                  COMPATIBLE: 1
               BASE_PIECE_ID: 1
               USED_PIECE_ID: 1
       PIECE_SWITCH_INTERVAL: 86400000000
                   UNIT_SIZE: 1
                 COMPRESSION: none
                 INPUT_BYTES: 0
         INPUT_BYTES_DISPLAY: 0.00MB
                OUTPUT_BYTES: 0
        OUTPUT_BYTES_DISPLAY: 0.00MB
           COMPRESSION_RATIO: 0.00
         DELETED_INPUT_BYTES: 0
 DELETED_INPUT_BYTES_DISPLAY: 0.00MB
        DELETED_OUTPUT_BYTES: 0
DELETED_OUTPUT_BYTES_DISPLAY: 0.00MB
                     COMMENT: 
                        PATH: file:///storage/ob421/archive/mysqlt
1 row in set (0.004 sec)

obclient [Oceanbase]>

过一会归档完成,状态就变成DOING了:

obclient [Oceanbase]> SELECT * FROM oceanbase.CDB_OB_ARCHIVELOG\G
*************************** 1. row ***************************
                   TENANT_ID: 1002
                     DEST_ID: 1001
                    ROUND_ID: 1
                 INCARNATION: 1
                     DEST_NO: 0
                      STATUS: DOING
                   START_SCN: 1702519281626895202
           START_SCN_DISPLAY: 2023-12-14 10:01:21.626895
              CHECKPOINT_SCN: 1702519401550565270
      CHECKPOINT_SCN_DISPLAY: 2023-12-14 10:03:21.550565
                  COMPATIBLE: 1
               BASE_PIECE_ID: 1
               USED_PIECE_ID: 1
       PIECE_SWITCH_INTERVAL: 86400000000
                   UNIT_SIZE: 1
                 COMPRESSION: none
                 INPUT_BYTES: 69213550
         INPUT_BYTES_DISPLAY: 66.01MB
                OUTPUT_BYTES: 69213550
        OUTPUT_BYTES_DISPLAY: 66.01MB
           COMPRESSION_RATIO: 1.00
         DELETED_INPUT_BYTES: 0
 DELETED_INPUT_BYTES_DISPLAY: 0.00MB
        DELETED_OUTPUT_BYTES: 0
DELETED_OUTPUT_BYTES_DISPLAY: 0.00MB
                     COMMENT: 
                        PATH: file:///storage/ob421/archive/mysqlt
1 row in set (0.003 sec)

obclient [Oceanbase]> 

4.5 查看归档参数

SELECT * FROM oceanbase.CDB_OB_ARCHIVE_DEST\G

5. 数据备份

5.1 设置数据备份目录

ALTER SYSTEM SET DATA_BACKUP_DEST= 'file:///storage/ob421/data/mysqlt' TENANT = mysqlt;

-- 如果想清空备份目录配置,将DATA_BACKUP_DEST置为空即可。 
ALTER SYSTEM SET DATA_BACKUP_DEST='' TENANT=mysqlt;

设置数据备份目录之后的目录情况:

[root@localhost mysqlt]# pwd
/storage/ob421/data/mysqlt
[root@localhost mysqlt]# ll
total 8
drwx------ 2 nfsnobody nfsnobody 4096 Dec 14 10:07 check_file
-rw------- 1 nfsnobody nfsnobody  145 Dec 14 10:07 format.obbak
[root@localhost mysqlt]# ll check_file/
total 4
-rw------- 1 nfsnobody nfsnobody 142 Dec 14 10:07 1002_connect_file_20231214T100726.obbak
[root@localhost mysqlt]#

5.2 集群转储与合并

Oceanbase数据分为MemTable(内存数据)和SSTable(静态数据)两部分。

当MemTable的大小超过一定阈值时,需要将MemTable中的数据转存到SSTable中以释放内存,这一过程称为转储

转储的前置动作: 内存冻结。
租户MemTable的内存分为两种:Active MemTable和Frozen MemTable,当一个租户MemTable内存的使用量达到阈值时,会自动触发冻结,生成新的Active MemTable,原来的Active MemTable成为Frozen MemTable,然后再自动调度转储,转储完成后释放Frozen MemTable部分的内存。

转储生成新的SSTable,当转储次数超过一定阈值时,或在业务低峰期,会将基线SSTable与之后转储的增量SSTable合并为一个SSTable,这一过程称为合并

发起转储

系统租户对本租户发起转储

alter system minor freeze

系统租户对所有租户发起转储

ALTER SYSTEM MINOR FREEZE TENANT = all_user;
-- 或
ALTER SYSTEM MINOR FREEZE TENANT  = all;

系统租户对指定租户发起转储

ALTER SYSTEM MINOR FREEZE TENANT = {tenant1, tenant2};

查看转储进度

SELECT * FROM oceanbase.GV$OB_TABLET_COMPACTION_PROGRESS WHERE TYPE='MINI_MERGE'

发起合并

系统租户对本租户发起合并

ALTER SYSTEM MAJOR FREEZE TENANT;

系统租户对所有用户租户发起合并

ALTER SYSTEM MAJOR FREEZE TENANT = all_user;
-- 或
ALTER SYSTEM MAJOR FREEZE TENANT = all;

系统租户对指定租户发起合并

ALTER SYSTEM MAJOR FREEZE TENANT = {tenant1, tenant2};

获取合并进度

SELECT * FROM oceanbase.CDB_OB_MAJOR_COMPACTION;

5.3 发起全量数据备份

ALTER SYSTEM BACKUP TENANT=mysqlt;

发起全量数据备份之后的目录结构:

[root@localhost mysqlt]# ll
total 16
drwx------ 5 nfsnobody nfsnobody 4096 Dec 14 10:14 backup_set_1_full
drwx------ 2 nfsnobody nfsnobody 4096 Dec 14 10:14 backup_sets
drwx------ 2 nfsnobody nfsnobody 4096 Dec 14 10:07 check_file
-rw------- 1 nfsnobody nfsnobody  145 Dec 14 10:07 format.obbak

备份rootserver.log日志分析

1. advance status: next_status=1
2. advance status: __all_backup_task, status = 'BACKUP_SYS_META'
3. advance status: __all_backup_task, status = 'BACKUP_USER_META'
4. advance status: __all_backup_task, status = 'BACKUP_DATA_MINOR'
5. advance status: __all_backup_task, status = 'BACKUP_DATA_MAJOR'
6. advance status: __all_backup_task, status = 'BACKUP_LOG'
7. advance status: __all_backup_task, status = 'COMPLETED'
8. advance status: next_status=2

5.4 发起增量数据备份

ALTER SYSTEM BACKUP INCREMENTAL TENANT=mysqlt;

增量数据备份之后的目录结构:

[root@localhost mysqlt]# ll
total 20
drwx------ 5 nfsnobody nfsnobody 4096 Dec 14 10:14 backup_set_1_full
drwx------ 5 nfsnobody nfsnobody 4096 Dec 14 10:21 backup_set_2_inc
drwx------ 2 nfsnobody nfsnobody 4096 Dec 14 10:21 backup_sets
drwx------ 2 nfsnobody nfsnobody 4096 Dec 14 10:07 check_file
-rw------- 1 nfsnobody nfsnobody  145 Dec 14 10:07 format.obbak

增量备份时会读取全备的部分数据文件

tablet_log_stream_info.obbak
ls_meta_infos.obbak
ls_meta_info.obbak
format.obbak
tablet_info.1.obbak
ls_attr_info.1.obbak
tenant_major_data_macro_range_index.0.obbak
tenant_minor_data_meta_index.0.obbak
macro_block_data.0.obbak
meta_index.obbak

5.5 停止备份

ALTER SYSTEM CANCEL BACKUP TENANT = mysqlt;

停止的时候,备份状态为:CANCELING -> CANCELED

5.6 查看数据备份进度

SELECT * FROM oceanbase.CDB_OB_BACKUP_JOBS\G

备份进度,状态会从 INIT -> DOING -> COMPLETED, 结束之后再查询 oceanbase.CDB_OB_BACKUP_JOBS会变为空。

obclient [Oceanbase]> SELECT * FROM oceanbase.CDB_OB_BACKUP_JOBS\G
*************************** 1. row ***************************
          TENANT_ID: 1
             JOB_ID: 1
        INCARNATION: 1
      BACKUP_SET_ID: 0
INITIATOR_TENANT_ID: 1
   INITIATOR_JOB_ID: 1
 EXECUTOR_TENANT_ID: 1002
    PLUS_ARCHIVELOG: OFF
        BACKUP_TYPE: FULL
          JOB_LEVEL: CLUSTER
    ENCRYPTION_MODE: NONE
             PASSWD: 
    START_TIMESTAMP: 2023-12-14 10:11:19.263166
      END_TIMESTAMP: NULL
             STATUS: DOING
             RESULT: 0
            COMMENT: 
        DESCRIPTION: 
               PATH: 
*************************** 2. row ***************************
          TENANT_ID: 1002
             JOB_ID: 1
        INCARNATION: 1
      BACKUP_SET_ID: 1
INITIATOR_TENANT_ID: 1
   INITIATOR_JOB_ID: 1
 EXECUTOR_TENANT_ID: 1002
    PLUS_ARCHIVELOG: OFF
        BACKUP_TYPE: FULL
          JOB_LEVEL: USER_TENANT
    ENCRYPTION_MODE: NONE
             PASSWD: 
    START_TIMESTAMP: 2023-12-14 10:11:19.273702
      END_TIMESTAMP: NULL
             STATUS: DOING
             RESULT: 0
            COMMENT: 
        DESCRIPTION: 
               PATH: file:///storage/ob421/data/mysqlt
2 rows in set (0.003 sec)

5.7 查看数据备份结果

SELECT * FROM oceanbase.CDB_OB_BACKUP_JOB_HISTORY\G

数据备份结果:

obclient [Oceanbase]> SELECT * FROM oceanbase.CDB_OB_BACKUP_JOB_HISTORY\G
*************************** 1. row ***************************
          TENANT_ID: 1
             JOB_ID: 1
        INCARNATION: 1
      BACKUP_SET_ID: 0
INITIATOR_TENANT_ID: 1
   INITIATOR_JOB_ID: 1
 EXECUTOR_TENANT_ID: 1002
    PLUS_ARCHIVELOG: OFF
        BACKUP_TYPE: FULL
          JOB_LEVEL: CLUSTER
    ENCRYPTION_MODE: NONE
             PASSWD: 
    START_TIMESTAMP: 2023-12-14 10:11:19.263166
      END_TIMESTAMP: 2023-12-14 10:14:19.320221
             STATUS: COMPLETED
             RESULT: 0
            COMMENT: 
        DESCRIPTION: 
               PATH: 
*************************** 2. row ***************************
          TENANT_ID: 1002
             JOB_ID: 1
        INCARNATION: 1
      BACKUP_SET_ID: 1
INITIATOR_TENANT_ID: 1
   INITIATOR_JOB_ID: 1
 EXECUTOR_TENANT_ID: 1002
    PLUS_ARCHIVELOG: OFF
        BACKUP_TYPE: FULL
          JOB_LEVEL: USER_TENANT
    ENCRYPTION_MODE: NONE
             PASSWD: 
    START_TIMESTAMP: 2023-12-14 10:11:19.273702
      END_TIMESTAMP: 2023-12-14 10:14:12.823506
             STATUS: COMPLETED
             RESULT: 0
            COMMENT: 
        DESCRIPTION: 
               PATH: file:///storage/ob421/data/mysqlt
2 rows in set (0.003 sec)

5.8 查看租户备份路径信息

SELECT * FROM oceanbase.CDB_OB_BACKUP_PARAMETER\G

返回信息:

obclient [Oceanbase]> SELECT * FROM oceanbase.CDB_OB_BACKUP_PARAMETER\G
*************************** 1. row ***************************
TENANT_ID: 1002
     NAME: data_backup_dest
    VALUE: file:///storage/ob421/data/mysqlt
1 row in set (0.009 sec)

obclient [Oceanbase]>

6. 备份集清理策略

-- 创建清理策略,名字叫policy_1, 可恢复窗口是7天,也可以设置其他比如:2h, 3w
ALTER SYSTEM ADD DELETE BACKUP POLICY 'policy_1' RECOVERY_WINDOW 
'7d' TENANT MySQL;

-- 查看清理策略
SELECT * FROM oceanbase.CDB_OB_BACKUP_DELETE_POLICY;

-- 删除清理策略
ALTER SYSTEM DROP DELETE BACKUP POLICY policy_name 
TENANT tenant_name;

7. 恢复数据

7.1 恢复前准备

恢复前需要创建出资源单元和资源池,恢复出来的新租户要使用该资源池。

7.2 发起恢复

-- 恢复到指定时间戳
ALTER SYSTEM RESTORE dest_tenant_name FROM uri UNTIL TIME={timestamp} WITH 'pool_list=restore_pool';

-- 恢复到指定SCN
ALTER SYSTEM RESTORE dest_tenant_name FROM uri UNTIL SCN={scn} WITH 'pool_list=restore_pool';

-- 恢复到最新位点
ALTER SYSTEM RESTORE mysqlt_restore FROM 'file:///storage/data/mysqlt, file:///storage/archive/mysqlt' WITH 'pool_list=restore_pool';

恢复rootservice.log日志分析

1. 读取备份集信息文件,解析出备份集目录、备份片路径, 日志归档目录
2. 生成恢复记录,往__all_restore_job表中插入一条记录
3. 切换job状态, 0 -> 9
4. 读取 ls_meta_infos.obbak
5. 读取 single_backup_set_info.1.obbak
6. 读取 ls_attr_info.1.obbak
7. 切换 job 状态, 1 -> 2
8. 读取 single_backup_set_info.obbak
9. 读取 ls_attr_info.1.obbak
10. 读取 ls_meta_infos.obbak
11. 切换 job 状态, 2 -> 3
12. 创建初始化ls
13. 切换 job 状态, 3 -> 4
14. 恢复, doing restore
15. 切换 job 状态, 4 -> 5
16. 恢复,doing restore
17. 切换 job 状态, 5 -> 6
18. post check
19. 切换 job 状态, 6 -> 7
20. upgrade pre finish
21. 将恢复记录插入到__all_restore_job_history
22. restore tenant success

7.3 取消恢复

ALTER SYSTEM CANCEL RESTORE tenant_name;

7.4 查看恢复进度

oceanbase.CDB_OB_RESTORE_PROGRESS这个视图只有在有恢复任务的时候才有数据,如果没有恢复任务,该视图内容为空。

SELECT * FROM oceanbase.CDB_OB_RESTORE_PROGRESS;

7.5 查看恢复结果

SELECT * FROM oceanbase.CDB_OB_RESTORE_HISTORY;

8. 其他命令

集群

查看集群节点

select * from DBA_OB_SERVERS;
字段名称字段含义
SVR_IP节点IP
SVR_PORT节点的RPC端口
ID
ZONE节点所在的Zone
SQL_PORT节点的 SQL 端口,可以使用该端口通过直连方式连接 OceanBase 数据库。
WITH_ROOT_SERVER该节点是否为集群 RS(RootServer),RS 负责处理集群管理操作。
STATUSACTIVE: 表示该节点为可用状态。
INACTIVE: 表示该节点为宕机状态.
DELETING: 表示该节点正在被删除
START_SERVICE_TIME节点开始服务的时间点。如果值为 NULL,表示节点未提供服务。
STOP_TIME节点停止服务的时间点。如果值为 NULL,表示节点服务正常运行。
BLOCK_MIGRATE_IN_TIME禁止副本迁入的开始时间点。如果为 NULL,表示副本正常迁入。
CREATE_TIME
MODIFY_TIME
BUILD_VERSIONOceanBase 数据库软件的版本号。
LAST_OFFLINE_TIME

ZONE

-- 获取集群zone信息
SELECT * FROM oceanbase.DBA_OB_ZONES;

租户

-- 查询租户
select tenant_id, tenant_name from __all_tenant;

-- 删除租户
drop tenant tenant_name1;

-- 强制删除租户
drop tenant {tenant_name} force;

资源单元

-- 获取资源单元
select * from DBA_OB_UnitS;
SELECT * FROM oceanbase.__all_unit_config;

-- 创建资源单元
CREATE RESOURCE UNIT restore_unit MAX_CPU 1.5, MEMORY_SIZE = '5G', MAX_IOPS 10240, MIN_IOPS=10240;

资源池

-- 获取资源池
SELECT * FROM DBA_OB_RESOURCE_POOLS;
SELECT * FROM oceanbase.__all_resource_pool;

-- 创建资源池
CREATE RESOURCE POOL restore_pool unit = 'restore_unit', unit_num = 1, zone_list = ('zone1');

配置

查看超时相关参数

show variables like '%timeout%';

9. 问题定位

定位方法:

  1. 查看日志 /home/admin/oceanbase/log/rootservice.log.*
tail -f  rootservice.log | grep "xxxxx" | grep -v "restore_key:{tenant_id:1,"
  1. 查看日志 /home/admin/oceanbase/log/observer.log.*

9.1 设置日志归档目录报错 ERROR 4009 (58030): IO error

检查目录是否存在

10. 参考资料

10.1 转储与合并

https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000639915

10.2 数据备份失败

https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000218331

10.3 OceanBase术语

https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000217915

10.4 手动触发转储

https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000640496

10.5 手动触发合并

https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000640487

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值