赞
踩
认识术语
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集群备份的理解,可能不完全正确,会随时修改。
# 查看所有集群
obd cluster list
# 启动集群ob3cluster
obd cluster start ob3cluster
# 停止集群
obd cluster stop ob3cluster
# root用户的sys租户登录数据库
obclient -hxxx.xxx.xxx.xxx -uxxx:sys:root -P2883 -pxxxxxx -c -A -DOceanbase
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 地址。
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]#
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]#
ALTER SYSTEM NOARCHIVELOG TENANT = mysqlt;
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]>
SELECT * FROM oceanbase.CDB_OB_ARCHIVE_DEST\G
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]#
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;
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
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
ALTER SYSTEM CANCEL BACKUP TENANT = mysqlt;
停止的时候,备份状态为:CANCELING -> CANCELED
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)
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)
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]>
-- 创建清理策略,名字叫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;
恢复前需要创建出资源单元和资源池,恢复出来的新租户要使用该资源池。
-- 恢复到指定时间戳
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
ALTER SYSTEM CANCEL RESTORE tenant_name;
oceanbase.CDB_OB_RESTORE_PROGRESS
这个视图只有在有恢复任务的时候才有数据,如果没有恢复任务,该视图内容为空。
SELECT * FROM oceanbase.CDB_OB_RESTORE_PROGRESS;
SELECT * FROM oceanbase.CDB_OB_RESTORE_HISTORY;
查看集群节点
select * from DBA_OB_SERVERS;
字段名称 | 字段含义 |
---|---|
SVR_IP | 节点IP |
SVR_PORT | 节点的RPC端口 |
ID | |
ZONE | 节点所在的Zone |
SQL_PORT | 节点的 SQL 端口,可以使用该端口通过直连方式连接 OceanBase 数据库。 |
WITH_ROOT_SERVER | 该节点是否为集群 RS(RootServer),RS 负责处理集群管理操作。 |
STATUS | ACTIVE: 表示该节点为可用状态。 INACTIVE: 表示该节点为宕机状态. DELETING: 表示该节点正在被删除 |
START_SERVICE_TIME | 节点开始服务的时间点。如果值为 NULL,表示节点未提供服务。 |
STOP_TIME | 节点停止服务的时间点。如果值为 NULL,表示节点服务正常运行。 |
BLOCK_MIGRATE_IN_TIME | 禁止副本迁入的开始时间点。如果为 NULL,表示副本正常迁入。 |
CREATE_TIME | |
MODIFY_TIME | |
BUILD_VERSION | OceanBase 数据库软件的版本号。 |
LAST_OFFLINE_TIME |
-- 获取集群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%';
定位方法:
tail -f rootservice.log | grep "xxxxx" | grep -v "restore_key:{tenant_id:1,"
检查目录是否存在
https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000639915
https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000218331
https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000217915
https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000640496
https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000640487
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。