侧边栏壁纸
博主头像
码途 博主等级

行动起来,活在当下

  • 累计撰写 72 篇文章
  • 累计创建 0 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

oceanbase - 笔记

htmltoo
2024-03-20 / 0 评论 / 0 点赞 / 36 阅读 / 0 字

管理数据库

1-登录 OceanBase 租户

2-集群管理

在 OceanBase 数据库中通过配置项的设置可以控制集群的功能行为,例如负载均衡、合并时间、合并方式、资源分配和模块开关等功能。

OceanBase 数据库的 observer 进程首次启动时需要指定某些必需配置项。除了必需配置项以外,如果没有指定,则使用系统指定的 Default 值。进程启动成功后,参数值将持久化到 /home/admin/oceanbase/etc/observer.config.bin 文件中,可以通过 strings observer.config.bin 命令来查看文件中的内容。非首次启动时,系统会读取持久化文件中的配置项,如果无需修改,则无需再次指定任何配置项。

OceanBase 数据库的配置项分为集群级配置项和租户级配置项。

集群级配置项:作用范围为整个集群所有 OBServer 节点。

租户级配置项:作用范围为当前租户在集群内所在的 OBServer 节点。

名称以 "" 开头的配置项称为隐藏配置项,如:ob_max_thread_num。仅供开发人员在故障排查或紧急运维时使用。

配置项一般分为动态生效和重启生效两种方式,大部分配置项为动态生效方式,即不需要重启 OBServer 即可生效。

查询某个配置项的方式如下:

obclient [(none)]> SHOW PARAMETERS LIKE 'max_syslog_file_count';

查询结果如下:

 +-------+----------+----------------+----------+-----------------------+
 | zone  | svr_type | svr_ip         | svr_port | name                  | data_type | value | info                                                                                                                                                                                                                                             | section  | scope   | source  | edit_level        | default_value | isdefault |
 +-------+----------+----------------+----------+-----------------------+-----------+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------+---------+---------+-------------------+---------------+-----------+
 | zone1 | observer | 172.xx.xxx.xxx |     2882 | max_syslog_file_count | NULL      | 0     | specifies the maximum number of the log files that can co-exist before the log file recycling kicks in. Each log file can occupy at most 256MB disk space. When this value is set to 0, no log file will be removed. Range: [0, +∞) in integer   | OBSERVER | CLUSTER | DEFAULT | DYNAMIC_EFFECTIVE | 0             |         1 |
 +-------+----------+----------------+----------+-----------------------+
 1 row in set

其中:

查询结果中的相关字段说明如下:

列名

含义

zone

所在的 Zone。

svr_type

服务器类型。

svr_ip

服务器 IP。

svr_port

服务器的端口。

name

配置项名。

data_type

配置项的数据类型,包括 STRINGCAPACITY 等。

value

配置项的值。说明由于在修改配置项值时,支持修改指定 Zone 或 Server 的配置项值,故不同 Zone 或 Server 对应的配置项的值可能不同。

info

配置项的说明信息。

section

配置项所属的分类:SSTABLE:表示 SSTable 相关的配置项。OBSERVER:表示 OBServer 相关的配置项。ROOT_SERVICE:表示 Root Service 相关的配置项。TENANT:表示租户相关的配置项。TRANS:表示事务相关的配置项。LOAD_BALANCE:表示负载均衡相关的配置项。DAILY_MERGE:表示合并相关的配置项。CLOG:表示 Clog 相关的配置项。LOCATION_CACHE:表示 Location Cache 相关的配置项。CACHE:表示缓存相关的配置项。RPC:表示 RPC 相关的配置项。OBPROXY:表示 OBProxy 相关的配置项。

scope

配置项范围属性:TENANT:表示该配置项为租户级别的配置项CLUSTER:表示该配置项为集群级别的配置项

source

当前值来源:TENANT``CLUSTER``CMDLINE``OBADMIN``FILE``DEFAULT

edit_level

定义该配置项的修改行为:READONLY:表示该参数不可修改。STATIC_EFFECTIVE:表示该参数可修改但需要重启 OBServer 才会生效。DYNAMIC_EFFECTIVE:表示该参数可修改且修改后动态生效。

default_value

配置项的默认值。

isdefault

当前值是否为默认值。0:表示当前值不是默认值。1:表示当前值为默认值。

3.1-集群常见操作

3.1.1-查看 Zone

OceanBase 集群由若干个 Zone 组成。从物理层面来讲,一个 Zone 通常是一个独立的物理部署单元,可以是一个数据中心(IDC)或者云上的一个 Zone(可用区),也可以是一个单独的机架(Rack)。通过将 OceanBase 集群部署于不同的 Zone,实现单个 Zone 故障时的故障隔离及快速恢复。

使用 root 用户登录到集群的 sys 租户

-查询 oceanbase.DBA_OB_ZONES 视图,获取集群中的 Zone 信息

 SELECT * FROM oceanbase.DBA_OB_ZONES;

查询结果中的字段说明如下:

ZONE: Zone 名称。

STATUS: Zone 状态。

ACTIVE :表示该 Zone 为可用状态。

INACTIVE :表示该 Zone 为不可用状态。用于客户端识别该状态并将业务流程路由到其他 Zone。

新增 Zone 或对 Zone 执行隔离命令(Stop Zone/Force Stop Zone/Isolate Zone)后,该 Zone 的状态会变为 INACTIVE。通常出现在故障隔离或运维变更等场景。

IDC:Zone 所在的机房名。

REGION:Zone 所在的区域,通常为城市名(例如,上海)或者区域名(例如,华东)。

TYPE:Zone 类型,ReadWrite 表示读写类型,当前版本仅支持读写类型的 Zone。

3.1.2-查看节点

OceanBase 数据库是单进程软件,进程名为 observer。通常一台物理或者虚拟服务器运行一个 observer 进程,由 IP 和端口作为唯一标识,称之为节点

-查询 DBA_OB_SERVERS 视图,获取集群中的所有节点信息。

 SELECT * FROM oceanbase.DBA_OB_SERVERS;

查询结果中的相关字段说明如下:

SVR_IP:节点 IP。

SVR_PORT:节点的 RPC 端口。

ZONE:节点所在的 Zone。

SQL_PORT:节点的 SQL 端口,可以使用该端口通过直连方式连接 OceanBase 数据库。

WITH_ROOTSERVER:该节点是否为集群 RS(RootServer),RS 负责处理集群管理操作。

STATUS:节点的状态。

ACTIVE:表示该节点为可用状态。

INACTIVE:表示该节点为宕机状态。

DELETING:表示该节点正在被删除。

STOP_TIME:节点停止服务的时间点。如果值为 NULL,表示节点服务正常运行。

START_SERVICE_TIME:节点开始服务的时间点。如果值为 NULL,表示节点未提供服务。

BLOCK_MIGRATE_IN_TIME:禁止副本迁入的开始时间点。如果为 NULL,表示副本正常迁入。

BUILD_VERSION:OceanBase 数据库软件的版本号。

3.1.3-重启节点

重启是常见运维动作之一,适用于对机器进行短暂维修,以及修改系统配置项后需要重启生效的场景。重启过程中节点的下线时间需要在配置项 server_permanent_offline_time 设置的时间以内,否则会被永久下线。如果机器长时间维修,需要走机器替换流程,有关机器替换的详细操作请参见 替换节点。

集群级配置项 server_permanent_offline_time 用于设置节点心跳中断的时间阈值,即节点心跳中断多久后认为其被永久下线,永久下线的节点上的数据副本需要被自动补足。默认为 3600s。有关该配置项的更多详细信息,请参见 server_permanent_offline_time。

重启节点的主要流程为:停止服务 -> 转储 -> 关闭进程 -> 启动进程 -> 启动服务。

-执行以下命令,进行节点隔离, svr_port:表示待停止的节点的 RPC 端口,默认为 2882。

  ALTER SYSTEM STOP SERVER 'svr_ip:svr_port';

执行成功后,可以查询 oceanbase.DBA_OB_SERVERS 视图中该 Server 的 STATUS 字段,可以看到字段值仍为 ACTIVE 不变,但 STOP_TIME 字段的值由 NULL 变为停止服务的时间点。

查询 oceanbase.DBA_OB_SERVERS 视图的具体操作可参见 查看节点

-对待重启的节点进行转储操作,以便缩短重启后回放 Redo Log 的时间,加速重启。

 ALTER SYSTEM MINOR FREEZE SERVER = ('svr_ip:svr_port');

-查看转储进度

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

查询结果中的部分字段说明如下:

TYPE:表示 Compaction 任务的类型。

MINOR_MERGE:表示 Minor,多个 Mini SSTable 合成一个 Minor SSTable。

MINI_MERGE:表示转储,冻结 MemTable 通过转储变成 Mini SSTable。

MEDIUM_MERGE:表示分区级合并。

MAJOR_MERGE:表示合并。

META_MAJOR_MERGE :Buffer 表转储。

STATUS:表示任务状态。任务正在运行中时,该字段值为 NODE_RUNNING。

DATA_SIZE:表示需要转储的总数据量。

UNFINISHED_DATA_SIZE:表示转储未完成的数据量。

ESTIMATED_FINISH_TIME:表示预计完成时间。

-查看转储历史

 SELECT * FROM oceanbase.GV$OB_TABLET_COMPACTION_HISTORY WHERE TYPE='MINI_MERGE' TABLET_ID=200001\G

-使用 admin 用户登录待停止进程的节点所在的机器

cd /home/admin/oceanbase/bin

ps -ef | grep observer | grep -v grep

kill -9 pid

-如果需要维修机器,在本步骤对机器进行短暂的维修

-登录待启动进程的节点所在的机器

cd /home/admin/oceanbase && ./bin/observer

-启动节点服务

ALTER SYSTEM START SERVER 'svr_ip:svr_port';

3.1.4-添加节点

可以向 OceanBase 集群中添加节点,添加节点适用于弹性扩容场景和调整部署场景。

弹性扩容场景:扩容后,Zone 内有更多的节点容纳 Unit,从而可以执行后续的迁移 Unit、调整租户的 UNIT_NUM、新建租户等操作。

调整部署场景:调整部署场景,包括将集群的部署方式从同城三中心调整为三地五中心,以及机房裁撤场景下将 Zone 从一个机房搬迁到另一个机房。该场景需要先增加 Zone,再在该 Zone 内增加节点,然后调整租户的 Locatity 属性。

1)初始化 OceanBase 数据库的目录
2)启动节点 observer 进程
 /home/admin/oceanbase/bin/observer -I xx.xx.xx.xx -P XXXX -p YYYY -z zone1 -d /home/admin/oceanbase/store/obdemo -r 'xx.xx.xx.xx:xxxx:yyyy' -c 20190716 -n obdemo -o "system_memory=30GB,datafile_size=100G,config_additional_dir=/data/1/obdemo/etc3;/data/log1/obdemo/etc2"
 -
 /home/admin/oceanbase/bin/observer -I xx.xx.xx.1 -c 20221216 -p 2881 -P 2882 -z zone4 -n obdemo -d /home/admin/oceanbase/store/obdemo -r 'xx.xx.xx.1:2882:2881' -l WARN -o "system_memory=30GB,datafile_size=100G,config_additional_dir=/data/1/obdemo/etc3;/data/log1/obdemo/etc2"

相关参数说明如下:

-I:参数用于指定待启动的节点 IP。在多机部署场景下,不能指定 127.0.0.1 作为目标 IP。

通过指定网卡名来启动节点(例如 -i eth0)的方式在当前版本依然可以使用,但建议使用指定 IP(例如,-I 10.10.10.1)来启动。此外,通过同时指定 IP 和网卡名(例如 -I 10.10.10.1 -i eth0)来启动节点也可以,但不建议这么用。

-c:用于指定集群 ID。其值可通过 SHOW PARAMETERS LIKE 'cluster_id'; 语句获取。

-p:用于指定 SQL 端口号。一般为 2881,除非有明确目的,一般不建议修改。

-P:用于指定 RPC 端口号。一般为 2882,除非有明确目的,不建议修改。

-n:用于指定集群名。其值可通过 SHOW PARAMETERS LIKE 'cluster'; 语句获取。本示例中集群名为 obdemo。

-z:用于指定待加入的 Zone。可通过视图 DBA_OB_ZONES 查看集群中的 Zone 名。

-d:用于指定数据目录。

-r:用于指定待添加的 OceanBase 集群的 RS 地址列表。

-l:用于指定日志的级别,本示例中为 WARN,表示日志级别为 WARNING 级别。

有关 OceanBase 数据库日志级别的详细介绍,请参见 日志级别。

-o:用于指定集群的启动配置项,需要根据实际情况配置。

使用 -o 参数时,需满足以下条件:

不分大小写,但是推荐按照 observer.config.bin 中的名称来写。

配置项名不能包含以下特殊字符:空格、\r、\n、\t

配置项名和配置项值中间必须有等号(=)。

配置项之间使用英文逗号(,)进行分割。

语句中:

system_memory:用于指定 OceanBase 数据库内部保留内存,默认是 30G。 datafile_size:用于指定 OceanBase 数据库数据文件 SSTable 的大小(一次性初始化),根据 /data/1/ 可用空间评估,建议不少于 100G,同时又保留一些剩余空间。 config_additional_dir:用于指定参数文件的冗余目录。

3)向集群中添加节点
 ALTER SYSTEM ADD SERVER 'svr_ip:svr_port' [,'svr_ip:svr_port'...] [ZONE [=] 'zone_name'];
 -
 ALTER SYSTEM ADD SERVER '10.xx.xx.xx:2882','10.xx.xx.xx:2882' ZONE 'zone4';
4)查询 DBA_OB_SERVERS 视图进行确认
 SELECT * FROM oceanbase.DBA_OB_SERVERS;
5)后续操作

增加节点主要用于弹性扩容场景和调整部署场景

对于弹性扩容场景,增加节点后,节点所在的 Zone 内有更多的节点容纳 Unit,从而可以执行后续的迁移 Unit、调整租户的 UNIT_NUM 以及新建租户等操作

调整部署场景:调整部署场景,包括将集群的部署方式从同城三中心调整为三地五中心,以及机房裁撤场景下将 Zone 从一个机房搬迁到另一个机房。该场景需要先增加 Zone,再在该 Zone 内增加节点,然后调整租户的 Locality 属性。

5-1)Unit 迁移

Unit 迁移,描述的是在单个 Zone 内部,Unit 在节点之间的迁移。副本迁移只涉及副本在 Zone 内部的位置变更,不涉及副本个数、副本类型的变更。适用于节点故障场景和负载均衡场景。本文介绍如何进行副本迁移。

将租户 mq_t1 中 UNIT_ID = 1006 的 Unit 迁移到同 Zone 的另一个节点。

-oceanbase 数据库。

use oceanbase;

-查询租户 mq_t1 的 tenant_id, 租户 mq_t1 的 tenant_id 为 1004

SELECT * FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME = 'mq_t1';

-查看对应租户 mq_t1 的 Unit 信息, UNIT_ID = 1006 的 Unit 位于 Zone sa128_obv4_3 的 xx.xx.xx.19 节点中

SELECT * FROM oceanbase.DBA_OB_UNITS WHERE TENANT_ID = 1004;

-查看要迁移的 Unit 所在 Zone 中 OBServer 节点的服务器 IP。Zone sa128_obv4_3 中包含两个 OBServer 节点,xx.xx.xx.19 和 xx.xx.xx.158。

SELECT * FROM oceanbase.DBA_OB_SERVERS;

-将租户 mq_t1 中 UNIT_ID = 1006 的 Unit 迁移到同 Zone 的另一个节点

ALTER SYSTEM migrate unit = 1006 destination = 'xx.xx.xx.158:2882';

-查看 Unit 迁移状态

SELECT * FROM oceanbase.DBA_OB_UNIT_JOBS WHERE JOB_TYPE = 'MIGRATE_UNIT';

-查看 Unit 迁移后的信息

SELECT * FROM oceanbase.DBA_OB_UNITS WHERE UNIT_ID = 1006;

5-2)调整 Unit Number

租户扩容和缩容本质上是提高和降低租户的服务能力,包括计算能力和存储容量。可以通过提高单节点的服务能力达成,也可以通过增加服务节点达成。本文介绍如何通过修改 Unit Number,从而增加或减少服务节点,达到租户总服务能力的提升或降低,实现租户的扩容或缩容。

-负载均衡策略

ALTER SYSTEM SET enable_rebalance = true TENANT = all; ALTER SYSTEM SET enable_transfer = true TENANT = all;

-调整

use oceanbase;

-查看租户 mysql001 信息,获取其 TENANT_ID。UNIT_NUM 的值为 1 表示租户的 Unit Number 数为1

SELECT * FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME = 'mysql001';

-查看租户 mysql001 所拥有的 Unit。根据查询结果可知,租户 mysql001 的每个 Zone 均有 1 个 Unit,且这 3 个 Unit 属于同一个 Unit Group。

SELECT * FROM oceanbase.DBA_OB_UNITS WHERE TENANT_ID = 1006;

-把租户 mysql001 的 UNIT_NUM 修改为 2。

ALTER RESOURCE TENANT mysql001 UNIT_NUM = 2;

-查看调大 Unit Number 任务的执行状态。

SELECT * FROM oceanbase.DBA_OB_TENANT_JOBS WHERE JOB_TYPE='ALTER_RESOURCE_TENANT_UNIT_NUM' AND TENANT_ID=1006;

-查看租户 mysql001 修改后的 Unit。将租户 mysql001 的 Unit Number 从 1 变更为 2。变更前租户在每个 Zone 的 Unit 个数为 1;变更后租户在每个 Zone 的 Unit 个数为 2,从而实现了租户扩容

SELECT * FROM oceanbase.DBA_OB_UNITS WHERE TENANT_ID = 1006;

-调小

ALTER RESOURCE TENANT mysql001 UNIT_NUM = 1;

-通过删除指定 UNIT_GROUP 的方式来调小 UNIT_NUM 的数量

ALTER RESOURCE TENANT mysql001 UNIT_NUM = 1 DELETE UNIT_GROUP =(1006);

5-3)创建租户

在同一个数据库中可以同时运行多个数据库实例,第一步往往需要创建一个租户(数据库实例),然后像使用传统单机数据库那样使用数据库实例

USE oceanbase;

5.3.1-创建资源规格

-获取资源池的配置信息

 SELECT * FROM oceanbase.DBA_OB_UNIT_CONFIGS;

-创建资源规格

 CREATE RESOURCE UNIT S1_unit_config
                 MEMORY_SIZE = '5G',
                 MAX_CPU = 1, MIN_CPU = 1,
                 LOG_DISK_SIZE = '6G',
                 MAX_IOPS = 10000, MIN_IOPS = 10000, IOPS_WEIGHT=1;

创建资源规格时,MAX_CPU 和 MEMORY_SIZE 必选。

unit_name:资源规格名称。

MEMORY_SIZE:内存规格,其最小值由隐藏配置项 __min_full_resource_pool_memory 控制,默认为 5G,支持最小可以调整为 4G。OceanBase 数据库 V4.0 开始不支持内存超卖。

MAX_CPU:CPU 规格上限,MIN_CPU 是 CPU 规格下限,单位是核数。如果用户没有指定 MIN_CPU,默认等于 MAX_CPU 值。

MIN_CPU:最小的 CPU 规格,所有租户的 MIN_CPU 的总和不能超过该节点 CPU 总容量 CPU_CAPACITY。

MAX_IOPS 和 MIN_IOPS: 指定当前 Unit 可使用的 IOPS 资源的上限和下限,最小值均为 1024,并且要求 MAX_IOPS >= MIN_IOPS。

由于 MAX_IOPS 和 MIN_IOPS 设置后,OceanBase 数据库内部会统一按照 16 KB 读的 IOPS 值作为有效值进行处理,建议将 MAX_IOPS 和 MIN_IOPS 的值设置为当前磁盘计算出来的 16 KB 读对应的 IOPS 值,以便后续进行租户内的资源隔离。有关 IOPS 基准值的计算,请参见 磁盘性能校准;有关租户内资源隔离的详细介绍及操作,请参见 资源隔离概述。

如果 IOPS 相关参数未指定,其内部取值规则如下:

如果 MIN_IOPS 和 MAX_IOPS 均未指定,则系统根据 IOPS_WEIGHT 自动分配 IOPS 资源,此时:

MIN_IOPS 和 MAX_IOPS 的值均为 INT64_MAX。

如果未指定 IOPS_WEIGHT 的值,则 IOPS_WEIGHT = MIN_CPU。

如果指定了 IOPS_WEIGHT的值,则以指定的值为准。

如果仅指定了 MAX_IOPS 的值,则 MIN_IOPS 的值取 MAX_IOPS 的值;同样,如果仅指定了 MIN_IOPS 的值,则 MAX_IOPS 的值取 MIN_IOPS 的值。此时:

如果 IOPS_WEIGHT 的值未指定,则默认为 0。 LOG_DISK_SIZE:日志盘空间,OceanBase 数据库 V4.0 会按租户管理日志盘空间,系统为各个租户预留日志盘空间,实现按租户隔离。当用户没有指定时,LOG_DISK_SIZE 默认值是内存规格的 3 倍大小,最小为 2G。

OceanBase 数据库 V4.0 支持租户间 IOPS 隔离,通过 MAX_IOPS、MIN_IOPS、IOPS_WEIGHT 三个参数决定。IOPS 规格参数默认不需要指定,系统根据 CPU 规格自动计算。

-查询 DBA_OB_UNIT_CONFIGS 视图,确认资源规格创建成功

SELECT * FROM oceanbase.DBA_OB_UNIT_CONFIGS WHERE NAME = 'S1_unit_config';

5.3.2-创建资源池

创建资源规格后,可以在创建资源池时指定资源规格,从而使用相应大小的资源单元,并最终分配给相应的租户。

确认集群是否有足够的可用资源来创建资源池。详细操作,参见 查看租户和资源信息。 创建资源池时需要指定其资源规格。在执行创建资源池操作前,请确认是否有可用的资源规格。有关创建资源规格的详细操作,参见 创建资源规格。

USE oceanbase;

SELECT * FROM oceanbase.DBA_OB_RESOURCE_POOLS;

CREATE RESOURCE POOL mq_pool_01 UNIT='S1_unit_config', UNIT_NUM=1, ZONE_LIST=('zone1','zone2');

SELECT * FROM DBA_OB_RESOURCE_POOLS WHERE NAME = 'mq_pool_01';

5.3.3-创建租户

SELECT * FROM oceanbase.DBA_OB_TENANTS;

CREATE TENANT IF NOT EXISTS mq_t1 PRIMARY_ZONE='zone1', RESOURCE_POOL_LIST=('mq_pool_01') set OB_TCP_INVITED_NODES='%';

-Oracle 兼容模式租户

CREATE TENANT IF NOT EXISTS oracle_tenant1 PRIMARY_ZONE='zone1', RESOURCE_POOL_LIST=('mq_pool_01') SET OB_TCP_INVITED_NODES='%', ob_compatibility_mode='oracle';

SELECT * FROM DBA_OB_TENANTS WHERE TENANT_NAME = 'mq_t1';

-MySQL

obclient -h172.30.xx.xx -P2883 -uroot@mq_t1#cluster -A

ALTER USER root IDENTIFIED BY '';

-Oracle

obclient -h172.30.xx.xx -P2883 -usys@oracle_tenant1#cluster -A

ALTER USER sys IDENTIFIED BY ;

-

obclient -h172.30.xx.xx -P2883 -uroot@mq_t1#cluster -p -A

obclient -h172.30.xx.xx -P2883 -usys@oracle_tenant1#cluster -p -A

3.1.5-删除节点

-查看当前 Unit 分布,获取待迁移的 Unit 的 ID。

SELECT UNIT_ID,TENANT_ID,STATUS,ZONE,SVR_IP FROM oceanbase.DBA_OB_UNITS;

-根据查询结果,执行以下命令,手动迁移 Uni

ALTER SYSTEM MIGRATE UNIT = unit_id DESTINATION = 'svr_ip:svr_port';

-删除节点

ALTER SYSTEM DELETE SERVER "172.xx.xx.xx:2882" zone='zone1'

-查询 oceanbase.DBA_OB_SERVERS 视图

SELECT * FROM oceanbase.DBA_OB_SERVERS;

-如果确认是 Unit 迁移失败,则需要执行 Cancel Delete Server 操作,然后向 Zone 内添加节点对集群扩容后再重新删除节点

ALTER SYSTEM CANCEL DELETE SERVER '172.xx.xx.xx:2882' zone='zone1';

3.1.6-隔离节点

当节点发生异常或者需要运维变更时,可以隔离节点。隔离后,新的读写请求不会路由到该节点上,从而可以隔离故障或者无损的执行运维变更动作。

故障隔离场景:节点发生异常时,需要将异常节点与业务流量隔离开来。例如,某机房内有交换机异常,此时某些节点出现丢包、重传,甚至无主选举。为了快速恢复,可以直接隔离这些异常节点。节点恢复后执行 Start 操作恢复节点流量。

运维变更场景:节点需要运维变更时,需要保证对业务流量的透明无感。例如,某节点服务器需要重启时,为了保证重启过程中不影响业务流量,可以执行节点隔离动作,从而将待重启服务器上的业务流量切到其他节点。重启动作完成后执行 Start 操作恢复节点流量。

-最安全的隔离命令

ALTER SYSTEM STOP SERVER 'svr_ip1:svr_port1', 'svr_ip2:svr_port2', ...;

-跳过了日志同步检查, 会破坏 Paxos 多数派,造成租户无主,影响数据库服务的连续性

ALTER SYSTEM FORCE STOP SERVER 'svr_ip1:svr_port1', 'svr_ip2:svr_port2', ...;

-最为宽松,响应速度最快

ALTER SYSTEM ISOLATE SERVER 'svr_ip1:svr_port1', 'svr_ip2:svr_port2', ...;

3.1.7-替换节点

SELECT * FROM oceanbase.DBA_OB_SERVERS;

SELECT unit_id FROM oceanbase.DBA_OB_UNITS WHERE SVR_IP = 'svr_ip';

-修改

ALTER SYSTEM MIGRATE UNIT unit_id DESTINATION 'svr_ip:svr_port';

-进度

SELECT * FROM oceanbase.DBA_OB_UNIT_JOBS WHERE JOB_TYPE = 'MIGRATE_UNIT';

-删除旧节点

ALTER SYSTEM DELETE SERVER "172.xx.xx.xx:2882" zone='zone1'

SELECT * FROM oceanbase.DBA_OB_SERVERS;

3.1.8-启动 Zone

-启动 Zone

ALTER SYSTEM START ZONE zone4;

-确认

SELECT * FROM oceanbase.DBA_OB_ZONES;

3.1.9-添加 Zone

-在集群中添加 Zone

ALTER SYSTEM ADD ZONE zone_name [IDC [=] 'idc_name', REGION [=] 'region_name', ZONE_TYPE [=] 'ReadWrite'];

相关参数说明如下:

zone_name:待添加的 Zone 的名称,每条语句每次仅支持添加一个 Zone。如果需要添加多个 Zone,需要重复执行该语句。

idc_name:指定 Zone 所在机房的名称。如果不指定,默认为空。

region_name:指定 Zone 所在 Region 的名称,如果不指定,默认值为 default_region。

ZONE_TYPE:指定 Zone 的类型,当前版本仅支持读写 Zone(ReadWrite)。如果不指定,默认为读写 Zone。

-添加

ALTER SYSTEM ADD ZONE zone4 IDC 'hz1', REGION 'hangzhou';

-确认

SELECT * FROM oceanbase.DBA_OB_ZONES;

-启动

ALTER SYSTEM START ZONE zone_name;

3.1.10-删除 Zone

ALTER SYSTEM DELETE ZONE zone4;

SELECT * FROM oceanbase.DBA_OB_ZONES;

3.1.11-修改 Zone

当前不支持修改 Zone 的 ZONE_TYPE

ALTER SYSTEM {ALTER|CHANGE|MODIFY} ZONE zone_name SET [IDC [=]'idc_name', REGION [=]'region_name'];

zone_name:表示待修改的 Zone 的名称。每条语句每次仅支持修改一个 Zone。

idc_name:指定 Zone 所在机房的名称。

region_name:指定 Zone 所在 Region 的名称。

ALTER SYSTEM ALTER ZONE zone4 SET REGION 'shanghai',IDC 'sh1';

SELECT * FROM oceanbase.DBA_OB_ZONES;

3.1.12-隔离 Zone

-最安全的隔离命令

ALTER SYSTEM STOP ZONE 'zone_name';

-跳过了日志同步检查

ALTER SYSTEM FORCE STOP ZONE zone_name;

-检查最为宽松,响应速度最快

ALTER SYSTEM ISOLATE ZONE zone_name;

3.1.13-查看集群配置项

-可以查看集群中除隐藏配置项(_xx_xx 格式的配置项)以外的所有配置项及其所有属性描述

SHOW PARAMETERS LIKE '%syslog_level%';

-通过 GV$OB_PARAMETERS 视图可以查看集群中的所有配置项

USE oceanbase;

SELECT * FROM GV$OB_PARAMETERS WHERE NAME LIKE '%syslog_level%';

3.1.14-修改集群配置项

SCOPE 用于指定本次配置项修改的生效范围,默认值为 BOTH。其中:

SPFILE:表示仅修改配置表中的配置项值,当 OBServer 服务器重启以后才生效。

BOTH:表示既修改配置表,又修改内存值,修改后立即生效,且 OBServer 重启以后配置值仍然生效。

scope 值为 CLUSTER 则表示为集群级别的配置项。

scope 值为 TENANT 则表示为租户级别的配置项

ALTER SYSTEM SET syslog_level='ERROR' SCOPE = SPFILE;

TENANT:用于系统租户修改所有用户租户、所有 Meta 租户或指定租户的租户级配置项。

all 和 all_user:所有用户租户 all_meta:所有 Meta 租户。tenant_name:指定租户的租户名。

ALTER SYSTEM SET syslog_level='ERROR' SCOPE = SPFILE;

ALTER SYSTEM SET log_disk_utilization_threshold = 20 TENANT = all_user;

ALTER SYSTEM SET memory_limit = '250G' SERVER='xx.xx.xx.238:2882';

-通过 SHOW PARAMETERS 语句验证配置项的值是否修改成功

SHOW PARAMETERS LIKE 'system_memory';

3.1.15-单机在线转分布式部署

1)部署 OBServer 节点

-I:指定待启动的节点 IP

-p: 指定服务端口号,一般指定为 2881 -P: 指定 RPC 端口号,一般指定为 2882

-n: 指定集群名称。可自定义,不同集群名称不要重复即可

-z: 指定启动的 observer 进程所属的 Zone

-d: 指定集群主目录,初始化目录时创建的目录。除集群名字 $cluster_name 外,其他不要变动

-c: 指定集群 ID。为一组数字,可以自定义,不同集群不要重复即可

-l: 指定日志级别

-r 指定 RS 列表,格式是 $ip:2882:2881,分号分割,表示 Root Service 信息, docker: 127.0.0.1:2882:2881

-o: 指定集群启动参数,需要根据实际情况设置

system_memory:指定 OceanBase 内部保留内存,默认是 30G,机器内存比较少的情况下把这个调小

datafile_size:指定 OceanBase 数据文件 sstable 的大小(一次性初始化),根据 /data/1/ 可用空间评估,建议不少于 100G,同时又保留一些剩余空间

config_additional_dir 指定参数文件的冗余目录

-启动 10.10.10.2 机上的 observer 进程

observer -I 10.10.10.2 -P 2882 -p 2881 -z zone2 -d /home/admin/oceanbase/store/obdemo -r '10.10.10.2:2882:2881' -c 10001 -n obdemo -o "system_memory=30G,datafile_size=500G,config_additional_dir=/data/1/obdemo/etc3;/data/log1/obdemo/etc2"

-启动 10.10.10.3 机上的 observer 进程

observer -I 10.10.10.3 -P 2882 -p 2881 -z zone3 -d /home/admin/oceanbase/store/obdemo -r '10.10.10.3:2882:2881' -c 10001 -n obdemo -o "system_memory=30G,datafile_size=500G,config_additional_dir=/data/1/obdemo/etc3;/data/log1/obdemo/etc2"

-查看 observer 进程是否启动成功

netstat -ntlp

ps -ef|grep observer

2)集群扩容

---向集群中增加 Zone

-新增名为 zone2 和 zone3 的 Zone

ALTER SYSTEM ADD ZONE zone2;

ALTER SYSTEM ADD ZONE zone3;

---启动 zone2 和 zone3

ALTER SYSTEM START ZONE zone2;

ALTER SYSTEM START ZONE zone3;

---向集群中添加 OBServer 节点

ALTER SYSTEM ADD SERVER '10.10.10.2:2882' ZONE 'zone2';

ALTER SYSTEM ADD SERVER '10.10.10.3:2882' ZONE 'zone3';

---查看 OBServer 节点是否添加成功

-将新增加的 Zone 添加进租户的资源池中

SELECT SVR_IP,SVR_PORT,ID,ZONE,SQL_PORT,STATUS,START_SERVICE_TIME FROM oceanbase.DBA_OB_SERVERS;

-增加租户的副本, 对租户修改 Locality 增加副本时,需要一个一个增加

ALTER TENANT tenant_oracle001 LOCALITY='F@zone1,F@zone2';

ALTER TENANT tenant_oracle001 LOCALITY='F@zone1,F@zone2,F@zone3';

3)租户扩副本

---修改资源池的 ZONE_LIST

ALTER RESOURCE POOL pool001 ZONE_LIST=('zone1','zone2','zone3');

3.1.16-集群升级

1)社区版升级, 使用 OBD 升级 OceanBase 数据库

1.1)在线升级

-开启远程镜像仓库

obd mirror enable remote

-升级 OBD 到最新版本

obd update

-查询远程镜像仓库中 OceanBase 数据库版本

obd mirror list oceanbase.community.stable | grep oceanbase-ce

-(可选)查看集群中租户的 primary_zone 配置

select * from __all_tenant;

-输出中需关注除 sys 租户外其他租户对应 primary_zone 列的值是否为 RANDOM,若是则需执行如下命令为租户中的 Zone 配置不同的优先级

ALTER TENANT ocp primary_zone='zone1';

-对 OceanBase 数据库进行合并操作

ALTER SYSTEM MAJOR FREEZE;

select name,value from oceanbase.__all_zone where name='frozen_version' or name='last_merged_version';

-升级 OceanBase 数据库

obd cluster upgrade obtest -c oceanbase-ce -V 4.2.0.0 --usable=790596d146bd22abfbd87faf6bcacddd0d6936dafe0ff6958640bdb833256a48

-查看数据库版本

SELECT version();

1.2)离线升级

tar -xzf oceanbase-all-in-one-*.tar.gz cd oceanbase-all-in-one/bin/ ./install.sh source ~/.oceanbase-all-in-one/bin/env.sh

-关闭远程镜像仓库

obd mirror disable remote

-查询本地镜像仓库中 OceanBase 数据库版本

obd mirror list local | grep oceanbase-ce

...雷同1)...

2)企业版升级

OceanBase 集群版本升级时,需要确保先升级仲裁服务版本,然后再升级 OceanBase 集群版本

3.2-集群常见故障

3.2.1-少数派节点故障

介绍不影响任何日志流的多数派副本的节点故障。例如,三副本部署架构下,可以容忍任意一个节点故障而不影响多数派;五副本部署架构下,可以任意两个节点故障而不影响多数派。

如果是 OceanBase 数据库的 Bug 导致的 observer 进程异常,首先应尽快隔离节点,隔离节点的相关操作请参见 隔离节点。如果不影响服务,可以保留现场并联系 OceanBase 技术支持人员协助处理。如果已经影响服务,需要尽快重启进程或者拉起进程,然后联系 OceanBase 技术支持人员协助处理

如果由于硬件异常导致节点异常,或者怀疑硬件异常时,需要隔离并替换该异常节点

3.2.2-多数派节点故障

多数派节点故障会导致部分日志流长时间无主,恢复服务是第一要务,需要尽快确认多节点异常的原因,是否由于网络故障、机器硬件故障等原因引起,并尝试恢复。由于删除 Clog 或者硬件故障等原因导致的多数派故障,集群不可恢复。只能通过物理备份恢复的方式或者物理备库 Failover 的方式来恢复

3-租户管理

3.1-查看租户和资源信息

如何通过视图查看租户以及资源的相关信息。

OceanBase 数据库提供了租户和资源信息相关的视图,可以在系统租户 oceanbase 数据库中通过这些视图查询相关信息。

DBA_OB_UNIT_CONFIGS:展示所有的资源规格信息,包括资源规格 ID、名称、资源配置等。 DBA_OB_RESOURCE_POOLS:展示所有的资源池信息,包括资源池 ID、名称、绑定租户、Zone 列表等。 DBA_OB_TENANTS:展示所有租户的配置信息,包括租户 ID、名称、类型、资源等。 GVOB_UNITS:展示节点的 Unit 信息,包括节点 IP、端口、资源规格 ID、租户 ID、资源配置等。 GVOB_SERVERS:展示节点的资源分配信息,包括节点 IP、端口、归属的 Zone、资源使用情况等。

1)查看所有资源规格信息

SELECT * FROM DBA_OB_UNIT_CONFIGS;

 +----------------+-------------------------------+
 | UNIT_CONFIG_ID | NAME | CREATE_TIME | MODIFY_TIME | MAX_CPU | MIN_CPU | MEMORY_SIZE | LOG_DISK_SIZE | MAX_IOPS | MIN_IOPS | IOPS_WEIGHT |
 +----------------+-------------------------------+
 |              1 | sys_unit_config               | 2022-12-20 17:50:17.035504 | 2022-12-20 17:50:17.035504 |       1 |       1 | 14495514624 |   14495514624 |    10000 |    10000 |           1 |
 |           1001 | config_mysql001_zone1_S1_okz  | 2022-12-20 18:04:31.547715 | 2022-12-20 18:04:31.547715 |     1.5 |     1.5 |  6442450944 |   19327352832 |    15000 |    15000 |           1 |
2)查看所有的资源池信息

SELECT * FROM DBA_OB_RESOURCE_POOLS;

 +------------------+--------------------------+
 | RESOURCE_POOL_ID | NAME | TENANT_ID | CREATE_TIME| MODIFY_TIME | UNIT_COUNT | UNIT_CONFIG_ID | ZONE_LIST | REPLICA_TYPE |
 +------------------+--------------------------+
 |                1 | sys_pool                 |         1 | 2022-12-20 17:50:17.038641 | 2022-12-20 17:50:17.045453 |          1 |              1 | zone1;zone2;zone3 | FULL         |
 |             1001 | pool_mysql001_zone3_jsu  |      1002 | 2022-12-20 18:04:31.607227 | 2022-12-20 18:04:31.692836 |          1 |           1003 | zone3             | FULL         |
3)查看所有租户信息

SELECT * FROM DBA_OB_TENANTS;

 +-----------+-------------+-------------+
 | TENANT_ID | TENANT_NAME | TENANT_TYPE | CREATE_TIME                | MODIFY_TIME                | PRIMARY_ZONE | LOCALITY                                    | PREVIOUS_LOCALITY | COMPATIBILITY_MODE | STATUS | IN_RECYCLEBIN | LOCKED | TENANT_ROLE | SWITCHOVER_STATUS | SWITCHOVER_EPOCH | SYNC_SCN            | REPLAYABLE_SCN      | READABLE_SCN        | RECOVERY_UNTIL_SCN  | LOG_MODE     | ARBITRATION_SERVICE_STATUS |
 +-----------+-------------+-------------+
 |         1 | sys         | SYS         | 2023-05-17 18:10:19.940353 | 2023-05-17 18:10:19.940353 | RANDOM       | FULL{1}@zone1                               | NULL              | MYSQL              | NORMAL | NO            | NO     | PRIMARY     | NORMAL            |                0 |                NULL |                NULL |                NULL |                NULL | NOARCHIVELOG | DISABLED                   |
 |      1001 | META$1002   | META        | 2023-05-17 18:15:21.455549 | 2023-05-17 18:15:36.639479 | zone1;zone2  | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | NULL              | MYSQL              | NORMAL | NO            | NO     | PRIMARY     | NORMAL            |                0 |                NULL |                NULL |                NULL |                NULL | NOARCHIVELOG | DISABLED                   |
4)查看租户资源配置

SELECT c.TENANT_ID, e.TENANT_NAME, concat(c.NAME, ': ', d.NAME) pool:conf,concat(c.UNIT_COUNT, ' unit: ', d.min_cpu, 'C/', ROUND(d.MEMORY_SIZE/1024/1024/1024,0), "G") unit_info FROM DBA_OB_RESOURCE_POOLS c, DBA_OB_UNIT_CONFIGS d, DBA_OB_TENANTS e WHERE c.UNIT_CONFIG_ID=d.UNIT_CONFIG_ID AND c.TENANT_ID=e.TENANT_ID AND c.TENANT_ID>1000 ORDER BY c.TENANT_ID;

 +-----------+-------------+
 | TENANT_ID | TENANT_NAME | pool:conf                                               | unit_info       |
 +-----------+-------------+
 |      1002 | mysql001    | pool_mysql001_zone1_okz: config_mysql001_zone1_S1_okz   | 1 unit: 1.5C/6G |
 |      1002 | mysql001    | pool_mysql001_zone2_pme: config_mysql001_zone2_S1_pme   | 1 unit: 1.5C/6G |
5)查看租户的资源单元部署位置

SELECT a.TENANT_NAME,a.TENANT_ID,b.SVR_IP FROM DBA_OB_TENANTS a,GV$OB_UNITS b WHERE a.TENANT_ID=b.TENANT_ID;

 +-------------+-----------+----------------+
 | TENANT_NAME | TENANT_ID | SVR_IP         |
 +-------------+-----------+----------------+
 | sys         |         1 | xx.xx.xx.237   |
 | META$1002   |      1001 | xx.xx.xx.237   |
 | mysql001    |      1002 | xx.xx.xx.237   |
6)查看节点的 Unit 信息

SELECT * FROM GV$OB_UNITS;

 +----------------+----------+
 | SVR_IP         | SVR_PORT | UNIT_ID | TENANT_ID | ZONE  | ZONE_TYPE | REGION         | MAX_CPU | MIN_CPU | MEMORY_SIZE | MAX_IOPS | MIN_IOPS | IOPS_WEIGHT | LOG_DISK_SIZE | LOG_DISK_IN_USE | DATA_DISK_IN_USE | STATUS | CREATE_TIME                |
 +----------------+
 | xx.xx.xx.218   |     2882 |       3 |         1 | zone3 | ReadWrite | default_region |       1 |       1 | 14495514624 |    10000 |    10000 |           1 |   14495514624 |     11566462821 |       6069157888 | NORMAL | 2022-12-20 17:49:25.705363 |
 | xx.xx.xx.218   |     2882 |    1001 |      1001 | zone3 | ReadWrite | default_region |   NULL  |    NULL |  1073741824 |     NULL |     NULL |        NULL |    1932735283 |      1520602567 |       7325351936 | NORMAL | 2022-12-20 18:04:31.693819 |
7)查看节点的资源分配信息

SELECT * FROM GV$OB_SERVERS;

 +----------------+----------+-------+
 | SVR_IP         | SVR_PORT | ZONE  | SQL_PORT | CPU_CAPACITY | CPU_CAPACITY_MAX | CPU_ASSIGNED | CPU_ASSIGNED_MAX | MEM_CAPACITY | MEM_ASSIGNED | LOG_DISK_CAPACITY | LOG_DISK_ASSIGNED | LOG_DISK_IN_USE | DATA_DISK_CAPACITY | DATA_DISK_IN_USE | DATA_DISK_HEALTH_STATUS | MEMORY_LIMIT | DATA_DISK_ABNORMAL_TIME | SSL_CERT_EXPIRED_TIME |
 +----------------+----------+-------+
 | xx.xx.xx.238   |     2882 | zone2 |     2881 |           64 |               64 |            5 |                5 |  57982058496 |  29527900160 |      179583320064 |       59592671232 |     23622320128 |       179593805824 |      20283654144 | NORMAL                  |  68719476736 | NULL                    | NULL                  |

3.2-查看和设置租户白名单

租户白名单指的是该租户允许登录的客户端列表,通过租户系统变量 ob_tcp_invited_nodes 的值来确定。您可以根据业务需要自定义租户的白名单,系统支持以下多种租户白名单格式:

IP 地址的形式:10.10.10.10,10.10.10.11

子网/掩码的形式:10.10.10.0/24

模糊匹配的形式:10.10.10.% 或者 10.10.10._

多种格式混合的形式:10.10.10.10,10.10.10.11,10.10.10.%,10.10.10._,10.10.10.0/24

-租户管理员登录数据库。

obclient -h172.30.xx.xx -P2883 -uroot@mq_t1#cluster -A

-查看租户白名单

SHOW VARIABLES LIKE 'ob_tcp_invited_nodes';

-修改租户的白名单配置

ALTER TENANT mq_t1 VARIABLES ob_tcp_invited_nodes = '10.10.10.%';

-用户租户管理员修改本租户白名单

SET GLOBAL ob_tcp_invited_nodes='10.10.10.%';

SHOW VARIABLES LIKE 'ob_tcp_invited_nodes';

3.3-租户锁定和解锁

USE oceanbase;

-通过 DBA_OB_TENANTS 视图,查看租户信息

SELECT TENANT_ID,TENANT_NAME,LOCKED FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME = 'mq_t1';

-通过 ALTER TENANT 语句,锁定租户

ALTER TENANT mq_t1 LOCK;

-查看 DBA_OB_TENANTS 视图,确认租户是否锁定成功

SELECT TENANT_ID,TENANT_NAME,LOCKED FROM DBA_OB_TENANTS WHERE TENANT_NAME = 'mq_t1';

-通过 ALTER TENANT 语句,解锁租户

ALTER TENANT mq_t1 UNLOCK;

3.4-删除租户,恢复租户,重命名租户

USE oceanbase;

-通过 DBA_OB_TENANTS 视图,查看租户信息。根据租户的 ID、创建时间、资源分配等基本信息,确认是需要执行删除的租户

SELECT * FROM DBA_OB_TENANTS WHERE TENANT_NAME = 'mq_t1';

-租户级的回收站功能,从而支持租户级的数据的快速恢复功能

SHOW RECYCLEBIN;

-删除租户

DROP TENANT mq_t1;

SELECT * FROM DBA_OB_TENANTS WHERE TENANT_NAME = 'mq_t1';

-恢复回收站中的租户

FLASHBACK TENANT mq_t1 TO BEFORE DROP;

-查看 DBA_OB_TENANTS 视图和回收站确认执行结果

SHOW RECYCLEBIN;

SELECT * FROM DBA_OB_TENANTS WHERE TENANT_NAME = 'mq_t1';

-将租户 tenant1 的租户名修改为 tenant2

ALTER TENANT tenant1 RENAME GLOBAL_NAME TO tenant2;

3.4-管理资源池

---查看集群中的资源池信息

SELECT * FROM oceanbase.DBA_OB_RESOURCE_POOLS\G

---将资源池分配给租户, 创建租户时,您可以将未使用的资源池分配给租户

CREATE TENANT IF NOT EXISTS test_tenant charset='utf8mb4',primary_zone='zone1;zone2,zone3', resource_pool_list=('pool1');

---修改租户资源池列表时分配资源池

假设集群中当前仅有 z1、z2、z3 三个 Zone,且三个 Zone 都属于同一个 Region,每个 Zone 内一台 OBServer 节点。集群中有一个普通租户 tenant1,当前副本分布情况 locality='F@z1,F@z2,F@z3', resource_pool_list=('pool1');,根据业务需要,需要将租户 tenant1 由三副本调整为五副本,即租户的 Locality 由 F@z1,F@z2,F@z3 变为 F@z1,F@z2,F@z3,F@z4,F@z5。

-添加资源需要先有可用的资源单元和资源池

CREATE RESOURCE UNIT unit2 MAX_CPU 1, MIN_CPU 1, MEMORY_SIZE '5G', MAX_IOPS 1024, MIN_IOPS 1024, IOPS_WEIGHT 0,LOG_DISK_SIZE '2G';

CREATE RESOURCE POOL pool2 unit = 'unit2', unit_num = 1, zone_list=('z4','z5');

-完成后,为租户在 z4、z5 上添加资源

ALTER TENANT tenant1 RESOURCE_POOL_LIST =('pool1', 'pool2') ;

---通过修改租户 Locality 来增加副本。

-根据 Locality 的变更规则,每次只能增加一个 Zone 内的 Locality,Locality 的变更规则相关信息请参见 修改 Locality

ALTER TENANT tenant1 LOCALITY='F@z1,F@z2,F@z3,F@z4';

ALTER TENANT tenant1 LOCALITY='F@z1,F@z2,F@z3,F@z4,F@z5';

---从租户中移除资源池

-假设集群中当前有 z1、z2、z3、z4、z5 共 5 个 Zone,且 5 个 Zone 都属于同一个 Region,每个 Zone 内一台 OBServer。集群中有一个普通租户 tenant1,当前副本分布情况 locality='F@z1,F@z2,F@z3,F@z4,F@z5', resource_pool_list=('pool1','pool2'),资源池的资源分布情况 CREATE RESOURCE POOL pool1 UNIT 'uc1', UNIT_NUM 1, ZONE_LIST ('z1', 'z2', 'z3') 和 CREATE RESOURCE POOL pool2 UNIT 'uc2', UNIT_NUM 1, ZONE_LIST ('z4', 'z5')。

根据业务需要,需要将租户 tenant1 由 5 副本调整为 3 副本,且资源池调整为 1 个,即租户的 Locality 变成 locality='F@z1,F@z2,F@z3,', resource_pool_list=('pool1')。

-通过修改租户 tenant1 的 Locality 来删除副本。

-根据 Locality 的变更规则,每次只能删除一个 Zone 内的 Locality,Locality 的变更规则相关信息请参见 修改 Locality。

ALTERTENANT tenant1 LOCALITY='F@z1,F@z2,F@z3,F@z4';

ALTER TENANT tenant1 LOCALITY='F@z1,F@z2,F@z3';

-删除 z4、z5 上的资源池 pool2

ALTER TENANT tenant1 RESOURCE_POOL_LIST =('pool1') ;

---合并资源池

ALTER RESOURCE POOL MERGE ('pool0','pool1','pool2') INTO ('pool3');

---创建资源池

CREATE RESOURCE POOL pool1 UNIT='uc0', UNIT_NUM=1, ZONE_LIST=('z1','z2','z3');

-资源池 pool1 的当前使用范围是 z1、z2、z3,而资源配置规格均为 uc0,由于 z1、z2、z3 等 3 个 Zone 上的物理机规格可能有较大差别,3 个 Zone 内如果使用同一个资源规格 uc0,无法充分利用每个 Zone 内物理机的资源。分裂资源池可以将一个多 Zone 资源池分裂为多个单 Zone 资源池,再为每个单 Zone 资源池配置各自的资源配置规格

---分裂资源池

-将资源池 pool1 分裂为 pool10、pool11 和 pool12,并为新的资源池指定新的资源单元配置

ALTER RESOURCE POOL pool1 SPLIT INTO ('pool10','pool11','pool12') ON ('z1','z2','z3');

ALTER RESOURCE POOL pool10 UNIT='uc1';

ALTER RESOURCE POOL pool11 UNIT='uc2';

ALTER RESOURCE POOL pool12 UNIT='uc3';

分裂完成后,分裂出来的资源池的默认资源配置仍然为原资源配置,您可以根据各 Zone 的资源使用情况自行调整各新资源池的资源配置

--确认资源池的配置信息。其中 TENANT_ID 为 NULL,说明资源池未被分配,可以执行删除

SELECT TENANT_ID,NAME FROM DBA_OB_RESOURCE_POOLS WHERE NAME = 'mq_pool_02';

--删除资源池

DROP RESOURCE POOL mq_pool_02;

---管理资源规格, 查看集群中所有的资源规格

SELECT * FROM oceanbase.DBA_OB_UNIT_CONFIGS\G

---修改资源规格

-仅 sys 租户可以修改资源规格

-修改资源单元 unit1 的示例如下:

ALTER RESOURCE UNIT unit1 MAX_CPU 15, MEMORY_SIZE '20G', LOG_DISK_SIZE '4G';

-通过 DBA_OB_UNIT_CONFIGS 和 DBA_OB_RESOURCE_POOLS 视图,确认资源规格的使用信息

SELECT a.UNIT_CONFIG_ID, a.NAME AS UNIT_NAME, b.NAME AS POOL_NAME FROM oceanbase.DBA_OB_UNIT_CONFIGS a,oceanbase.DBA_OB_RESOURCE_POOLS b WHERE b.UNIT_CONFIG_ID=a.UNIT_CONFIG_ID

-删除资源规格

DROP RESOURCE UNIT S2_unit_config;

-查看 DBA_OB_UNIT_CONFIGS 视图,确认资源规格删除成功

SELECT * FROM DBA_OB_UNIT_CONFIGS WHERE NAME = 'S2_unit_config';

5-副本管理

副本是 OceanBase 数据库存储引擎中的概念,同一份数据在不同节点的拷贝称为副本,这里的数据是一个用户层面的概念。

在 OceanBase 数据库层面,我们指数据分区,每个数据分区根据租户的 Locality 属性冗余有多份,从而提供良好的水平扩展性和更高级别的容灾能力。

数据分区是指根据一定的建表规则,把一个表或者索引分解成多个更小的、更容易管理的部分。每个数据分区都是一个独立的对象,具有自己的名称和可选的存储特性。

5.1-副本分布

5.1.1-修改 Locality

Locality 的设置通常用于租户的副本数增加、减少或调整副本分布

租户副本分布调整

对集群内的某个租户通过若干次 Locality 变更,调整租户的机房分布。例如,租户原来的 Locality 为 F@z1,F@z2,F@z3,由于 z3 机房到期,需要调整为 z4,Locality 需要变更为 F@z1,F@z2,F@z4,需要做两次 Locality 变更,从 F@z1,F@z2,F@z3 变更为 F@z1,F@z2,F@z3,F@z4,再由 F@z1,F@z2,F@z3,F@z4 变更为 F@z1,F@z2,F@z4。

将租户 mq_t1 的 Locality 由 FULL{1}@sa128_obv4_1,FULL{1}@sa128_obv4_2 修改为 F{1}@sa128_obv4_1,F{1}@sa128_obv4_2,F{1}@sa128_obv4_3

use oceanbase;

-查看修改前的 Locality。

SELECT TENANT_ID,TENANT_NAME,TENANT_TYPE,PRIMARY_ZONE,LOCALITY FROM oceanbase.DBA_OB_TENANTS;

-修改租户 mq_t1 的 Locality。

obclient>ALTER TENANT mq_t1 locality="F{1}@sa128_obv4_1,F{1}@sa128_obv4_2,F{1}@sa128_obv4_3";

-查看 Locality 变更任务的执行状态。

SELECT * FROM oceanbase.DBA_OB_TENANT_JOBS WHERE JOB_TYPE = 'ALTER_TENANT_LOCALITY';

-查看修改后的 Locality。

SELECT TENANT_ID,TENANT_NAME,TENANT_TYPE,PRIMARY_ZONE,LOCALITY FROM oceanbase.DBA_OB_TENANTS;

多副本架构是 OceanBase 数据库相比于传统数据库的架构优势,多副本架构是 OceanBase 数据库具备多级无损容灾能力的基础,包括单机级无损容灾、机房级无损容灾、城市级无损容灾等能力。OceanBase 数据库支持灵活的调整集群部署架构,从而可以满足业务场景的技术演进。

OceanBase 数据库的灵活的部署架构正是通过 Locality 属性体现的,Locality 除了描述副本类型,还描述了副本在 Zone 间的分布策略。Zone 具有 Region 属性,可通过 oceanbase.DBA_OB_ZONES 视图的 REGION 字段查看,描述了该 Zone 的地域分布。通过调整租户的多个副本在不同 Region 的 不同 Zone 间的分布,从而达到灵活的部署模式。

OceanBase 数据库典型的部署模式有三种,分别是同城三中心、两地五中心、三地五中心,其 Locality 属性举例如下:

部署模式

Locality 属性

Zone 分布

同城三中心

F@z1,F@z2,F@z3

z1、z2、z3 分别位于 Region R1 的 IDC idc1、idc2、idc3

两地五中心

F@z1,F@z2,F@z3,F@z4,F@z5

z1、z2 位于 Region R1 的 IDC idc1; z3、z4 位于 Region R1 的 IDC idc2; z5 位于 Region R2

三地五中心

F@z1,F@z2,F@z3,F@z4,F@z5

z1、z2 位于 Region R1 的 IDC idc1 和 IDC idc2; z3、z4 位于 Region R2 的 IDC idc3 和 IDC idc4; z5 位于 Region R3

5.1.2-调整副本

增加副本之前,首先需要确认租户在目标 Zone 上是否有资源池,如果没有,则需要调整现有资源池的 Zone 列表,或者新增一个资源池给租户,如果新增资源池,要求资源池的 Unit 个数与租户已有的资源池一致,调整资源池或新增资源池的详细操作,参见 修改资源池属性 或 创建资源池。

同时还需要确认待变更的 Zone 上各节点的资源分配情况。如果 Zone 上的节点资源不足导致无法存放租户需要的资源单元,将导致无法进行 Locality 变更。

有关 Zone 上各节点的资源分配情况,请参见 查看租户和资源信息。

use oceanbase;

-查看租户 mysql001 修改前的 Locality。

SELECT TENANT_ID,TENANT_NAME,TENANT_TYPE,PRIMARY_ZONE,LOCALITY FROM oceanbase.DBA_OB_TENANTS;

-修改(增加或减少)租户 mysql001 的 Locality。

ALTER TENANT mysql001 locality="FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3";

-查看 Locality 变更任务的执行状态。

SELECT * FROM oceanbase.DBA_OB_TENANT_JOBS WHERE JOB_TYPE = 'ALTER_TENANT_LOCALITY';

-查看租户 mysql001 修改后的 Locality。

SELECT TENANT_ID,TENANT_NAME,TENANT_TYPE,PRIMARY_ZONE,LOCALITY FROM oceanbase.DBA_OB_TENANTS;

通过增加副本会导致租户 Locality 与租户 Primary Zone 不匹配,如果增加的 Zone 参与切主,则需要修改 Primary Zone,关于修改 Primary Zone 的操作,参见 调整 Primary Zone;如果增加的 Zone 不参与切主,则不需要修改 Primary Zone

5.1.3-调整副本分布

修改集群中某个租户的 Locality 来调整租户下 Partition 的副本分布

变更 Locality 之前,需要确认待变更的 Zone 上各节点的资源分配情况。如果 Zone 上的节点资源不足导致无法存放租户需要的资源单元,将导致无法进行 Locality 变更

use oceanbase;

-查看租户 mysql001 修改前的 Locality。

SELECT TENANT_ID,TENANT_NAME,TENANT_TYPE,PRIMARY_ZONE,LOCALITY FROM oceanbase.DBA_OB_TENANTS;

-修改租户 mysql001 的 Locality,增加一个 zone4 的副本。

ALTER TENANT mysql001 locality="FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3, FULL{1}@zone4";

-查看 Locality 变更任务的执行状态。

SELECT * FROM oceanbase.DBA_OB_TENANT_JOBS WHERE JOB_TYPE = 'ALTER_TENANT_LOCALITY';

-修改租户 mysql001 的 Locality,减少 zone3 的副本。

ALTER TENANT mysql001 locality="FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone4";

-查看 Locality 变更任务的执行状态。

SELECT * FROM oceanbase.DBA_OB_TENANT_JOBS WHERE JOB_TYPE = 'ALTER_TENANT_LOCALITY';

-查看租户 mysql001 修改后的 Locality。

SELECT TENANT_ID,TENANT_NAME,TENANT_TYPE,PRIMARY_ZONE,LOCALITY FROM oceanbase.DBA_OB_TENANTS;

在步骤 4 执行过后,增加副本会导致租户 Locality 与租户 Primary Zone 不匹配,如果增加的 Zone 参与切主,则需要修改 Primary Zone,关于修改 Primary Zone 的操作,参见 调整 Primary Zone;如果增加的 Zone 不参与切主,则不需要修改 Primary Zone

5.1.4-Unit 迁移

Unit 迁移,描述的是在单个 Zone 内部,Unit 在节点之间的迁移。副本迁移只涉及副本在 Zone 内部的位置变更,不涉及副本个数、副本类型的变更。适用于节点故障场景和负载均衡场景。本文介绍如何进行副本迁移。

将租户 mq_t1 中 UNIT_ID = 1006 的 Unit 迁移到同 Zone 的另一个节点。

-oceanbase 数据库。

use oceanbase;

-查询租户 mq_t1 的 tenant_id, 租户 mq_t1 的 tenant_id 为 1004

SELECT * FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME = 'mq_t1';

-查看对应租户 mq_t1 的 Unit 信息, UNIT_ID = 1006 的 Unit 位于 Zone sa128_obv4_3 的 xx.xx.xx.19 节点中

SELECT * FROM oceanbase.DBA_OB_UNITS WHERE TENANT_ID = 1004;

-查看要迁移的 Unit 所在 Zone 中 OBServer 节点的服务器 IP。Zone sa128_obv4_3 中包含两个 OBServer 节点,xx.xx.xx.19 和 xx.xx.xx.158。

SELECT * FROM oceanbase.DBA_OB_SERVERS;

-将租户 mq_t1 中 UNIT_ID = 1006 的 Unit 迁移到同 Zone 的另一个节点

ALTER SYSTEM migrate unit = 1006 destination = 'xx.xx.xx.158:2882';

-查看 Unit 迁移状态

SELECT * FROM oceanbase.DBA_OB_UNIT_JOBS WHERE JOB_TYPE = 'MIGRATE_UNIT';

-查看 Unit 迁移后的信息

SELECT * FROM oceanbase.DBA_OB_UNITS WHERE UNIT_ID = 1006;

5.2-流量分布

Leader 承担事务中的读写请求,因此每个分区 Leader 的分布决定了流量在每个节点上的分布

数据库系统在应用架构中承担了数据存储和查询的功能,应用的读写请求称为数据库流量。数据库流量分为写流量、强一致读流量和弱一致读流量,写流量和强一致读流量由 OceanBase 数据库的 Leader 副本提供服务,弱一致读流量由 Leader 副本和 Follower 副本提供服务。ODP 提供了数据库流量的路由选择能力,ODP 实现了一个简单的 SQL Parser 模块,解析出 SQL 中的库名、表名及 hint,从而根据业务 SQL、路由规则、及 OBServer 节点的状态,选择最合适的一个 OBServer 节点转发请求

---Primary Zone

流量分布通过 Primary Zone 来描述,Primary Zone 描述了 Leader 副本的偏好位置,而 Leader 副本承载了业务的强一致读写流量,即 Primary Zone 决定了 OceanBase 数据库的流量分布。假设某张表 t1 的 primary_zone="Zone1",则 RootService 会尽量将 t1 表的 Leader 调度到 Zone1 上来

副本描述的对象是数据,而 Primary Zone 描述的对象是承载数据的容器,从而该容器下的数据继承容器的 Primary Zone 属性所描述的 Leader 偏好位置。OceanBase 数据库当前版本仅支持租户级别的 Primary Zone,而 OceanBase 数据库 V3.x 还支持表级、DB级、Table Group 级别配置 Primary Zone

Primary Zone 实际上是一个 Zone 的列表,列表中包含多个 Zone。该列表用如下方式为 Zone 配置优先级:

当 Primary Zone 列表包含多个 Zone 时,用 ';' 分隔的具有从高到低的优先级;用 ',' 分隔的具有相同优先级,表示流量打散在多个 Zone 上,这几个 Zone 同时提供服务。

例如:'hz1,hz2;sh1,sh2;sz1' 表示 hz1 和 hz2 具有相同的优先级,并且优先级高于 sh1/sh2 和 sz1;sh1 和 sh2 具有相同优先级,并且优先级高于 sz1。

OceanBase 数据库当前版本仅支持租户级别的 Primary Zone,不再支持表级、DB 级、Table Group 级配置 Primary Zone。如果创建租户时未指定 primary_zone,默认填写为 RANDOM,表示各个 Zone 优先级相同

-租户的 Primary Zone 属性可以通过系统租户下 oceanbase.DBA_OB_TENANTS 视图的 PRIMARY_ZONE 字段查看

SELECT * FROM oceanbase.DBA_OB_TENANTS limit 10;

---Region 属性

在 OceanBase 数据库中,Zone 有一个 Region 属性(DBA_OB_ZONES 视图的 REGION 字段),表示该 Zone 所处的地区,每个 Zone 仅能配置一个 Region,但一个 Region 内可包含多个 Zone。Primary Zone 的设置隐含的包含了 Leader 偏好的 Region 位置。具体指用户设置 Primary Zone 时包含两层语义:

被指定的 Primary Zone 为 Leader 的偏好 Zone 的 Region。

被指定 Primary Zone 所在的 Region 为 Leader 偏好的 Region。

具体地,Leader 会被优先调度到最高优先级的 Zone 上去,如果最高优先级的 Zone 上的副本不能成为 Leader,会优先选择同一个 Region 内的其他 Zone 作为 Leader 的位置,从而保证业务访问 OceanBase 数据库尽量不跨城

5.3-数据分布

数据分区是基于建表语句创建的逻辑对象,是划分和管理表数据的一种机制。每个租户由若干个 Unit 组成,日志流根据一定的规则分布于这些 Unit 上,从而决定了归属于日志流的数据分区在 Unit 上的分布。本小节介绍数据及其流量的分布规则。

OceanBase 数据库支持普通表和分区表。分区表又分为一级分区表和二级分区表,分区表由一个或多个分区组成。普通表由一个分区组成,可以看做分区表的特例。OceanBase 数据库的基本分区策略包括范围(Range)分区、列表(List)分区、哈希(Hash)分区、Key 分区等

---Unit Group

-通过 oceanbase.DBA_OB_UNITS 视图可以查询所有的 Unit,及其所归属的 Unit Group

select UNIT_ID,TENANT_ID,UNIT_GROUP_ID,ZONE,SVR_IP,SVR_PORT from DBA_OB_UNITS where TENANT_ID = 1004;

---日志流组介绍

-通过 oceanbase.CDB_OB_LS 视图可以查看集群所有租户的日志流,及其所归属的日志流组

select TENANT_ID,LS_ID,STATUS,PRIMARY_ZONE,UNIT_GROUP_ID,LS_GROUP_ID from CDB_OB_LS where TENANT_ID=1004;

5.4-数据负载均衡

提供了水平扩缩容和数据动态均衡等负载均衡能力

---水平扩缩容

1)Unit Number,即每个 Zone 上提供服务的 Unit 个数

通过增加或减少 Unit Number,从而增加或减少服务节点,实现读写服务和存储容量的水平扩缩容。

通过调整 Unit Number 实现租户扩缩容的详细操作,请参见 通过调整 Unit Number 实现租户扩缩容。

2)Primary Zone,即提供读写服务的 Zone 列表

通过增加或减少第一优先级的 Primary Zone 的个数,从而增加或减少提供读写服务的 Zone,实现读写服务在 Zone 间的水平扩缩容。

通过调整 Primary Zone 实现租户扩缩容的详细操作

用户通过动态调整 Unit Number 和 Primary Zone,可以实现租户的读写服务能力在 Zone 内和 Zone 间的水平扩缩容。负载均衡功能将根据用户服务能力的配置自适应调整日志流和分区分布

---分区均衡

分区均衡是指在表和分区动态变化的情况下,通过动态调整分区分布,实现分区个数以及存储空间在服务节点上的均衡。

OceanBase 数据库支持多种表类型,包括非分区表、一级分区表和二级分区表。不同类型的表的均衡策略不一样。为了方便描述均衡效果,OceanBase 数据库为不同的表分区划分了均衡组,在各个均衡组内要实现分区个数均衡和存储空间均衡。均衡组之间没有关系,内部自适应调整均衡组之间的分布关系。默认情况下,OceanBase 数据库的分区均衡策略如下:

一级分区表:每个一级分区表是一个独立的均衡组,表的所有一级分区打散分布在各个服务节点上。

二级分区表:每个一级分区下的所有二级分区形成一个独立的均衡组,每个一级分区下的所有二级分区打散分布在各个服务节点上。

非分区表:所有的非分区表统一考虑,有且仅有一个均衡组,所有的非分区表打散分布在各个服务节点上。

为了更加灵活描述不同表数据之间的聚集和打散关系,OceanBase 数据库引入了表组(Table Group)的概念。

表组是一个逻辑概念,表示一组表的集合。表组内的表在物理存储上有临近关系,而多张具有关联关系的表往往具有相同的分区规则,通过将相同规则的分区聚集分布在一起,可以实现 Partition Wise Join,大大优化读写性能

6-高可用

6.1-多副本容灾

OceanBase 数据库基于 Paxos 协议实现了多副本容灾方案,对用户提供少数派故障时 RPO = 0,RTO < 8s 的高可用能力。

多副本容灾技术面向单个集群,事务日志持久化并在多个副本之间同步日志数据,基于 Paxos 协议保证日志数据在多数派副本持久化成功,同时通过成员变更提供容灾能力。

多副本容灾面向集群内少数派节点异常的场景,具备极好的故障恢复速度及数据零丢失能力。为了能够应对跨区域的异地容灾(无法接受三地五中心)以及更高的可用性需求(例如多数派节点异常、软件上的 Bug 等),可以采用物理备库容灾。

6.2-基于仲裁的容灾

基于仲裁的容灾方案,是 OceanBase 数据库以 Paxos 多副本容灾方案为基础创新性地提供的高可用解决方案。

在业务层面上,仲裁方案保证数据在多数派副本(4 个全功能型副本+ 1 个仲裁服务)或全部副本(2 个全功能型副本+ 1 个仲裁服务)上强同步,并在半数全功能型副本故障的情况下,自动进行故障降级,保证数据不丢失的同时业务持续可用。

基于仲裁的容灾同时解决了传统数据库最大保护或最大可用方案中,业务服务连续性和数据完整性不可兼得的问题,可以避免出现脑裂风险。同时,根据用户的 Locality 配置,OceanBase 数据库可以在多个全功能型副本所在的数据库节点上均提供读写服务。

与基于多数派的容灾方案类似,基于仲裁的容灾方案是集群内的解决方案,无法解决多数派或全部副本故障时的数据保护和可用性问题。

6.3-物理备库容灾

物理备库容灾是 OceanBase 数据库高可用解决方案的重要组成部分。

物理备库容灾技术面向多个集群,多集群间传输事务日志,建立基于日志的物理热备服务。在 OceanBase 数据库 V4.2.0 版本中,物理备库采用独立的主备库架构,主备关系存在于租户级别,主备之间通过网络直连或第三方日志服务建立传输渠道,只传输日志。不同于以前版本的集中式架构,独立主备库架构下,各个集群是是相互独立的,用户可以更加灵活地管理集群。

租户级主备由于异步同步日志,仅支持最大性能模式,不支持最大保护和最大可用模式,容灾切换时需要保证数据强一致的场景可以采用多副本容灾方案或基于仲裁的容灾方案。

6.4-回收站管理

SHOW VARIABLES LIKE 'recyclebin';

--针对整个租户(Global)开启或关闭回收站

SET GLOBAL recyclebin = on;

SET GLOBAL recyclebin = off;

-查看回收站对象

SHOW RECYCLEBIN

--恢复租户

FLASHBACK TENANT tenant_name TO BEFORE DROP;

-将回收站中的租户恢复为正常租户并重命名。

FLASHBACK TENANT tenant_name TO BEFORE DROP RENAME TO new_tenant_name;

--恢复数据库

FLASHBACK DATABASE object_name TO BEFORE DROP;

-从回收站中恢复数据库并重命名。

FLASHBACK DATABASE object_name TO BEFORE DROP RENAME TO new_database_name;

--恢复表

FLASHBACK TABLE object_name TO BEFORE DROP;

-从回收站中恢复表并重命名

FLASHBACK TABLE object_name TO BEFORE DROP RENAME To new_table_name;

-从回收站中将表恢复到指定的数据库或 Schema 对象并重命名

FLASHBACK TABLE object_name TO BEFORE DROP RENAME To database_name.new_table_name;

--清理回收站

PURGE TENANT tenant_name(用户);

PURGE DATABASE object_name(数据库);

PURGE TABLE object_name(表)

PURGE INDEX object_name(索引表);

-清除所有

PURGE RECYCLEBIN;

6.5-闪回查询

提供了记录级别的闪回查询(Flashback Query)功能,该功能允许用户获取某个历史版本的数据。

其中,Oracle 模式支持 AS OF SCN和 AS OF TIMESTAMP 两种语法来查询;

MySQL 模式支持通过 AS OF SNAPSHOT 语法来查询

假设 undo_retention 设置的时间为 T0,设置后对 T0 之前的数据不起作用,对 T0 之后的数据才起作用

闪回查询需要额外的存储空间来保留历史数据,如果调大 undo_retention 会导致存储空间的放大。建议调大 undo_retention 后,留意存储空间的变化

---修改租户级配置项 undo_retention 的值

ALTER SYSTEM SET undo_retention=900;

--mysql

通过 AS OF SNAPSHOT 指定历史时间并闪回查询单表在该历史时间点的状态的数据

SELECT * FROM table1 AS OF SNAPSHOT 1597306800000000000;

其中,1597306800000000000 为时间戳,单位为纳秒。时间戳的起点时间为北京时间 1970 年 08 点 00 分 00 秒。您可以根据需要将待查询的时间转换为时间戳格式。

例如,本示例中,需要闪回查询 2020 年 08 月 13 日 16 点 20 分 00 秒的表数据,转换时间的方法如下

SELECT time_to_usec('2020-08-13 16:20:00') * 1000;

+--------------------------------------------+

| time_to_usec('2022-01-01 00:00:00') * 1000 |

+--------------------------------------------+

| 1597306800000000000 |

+--------------------------------------------+

--Oracle

用户有 3 个表 table1、table2、expr1。闪回查询的使用示例如下:

通过 TIMESTAMP 指定的历史时间并闪回查询一张单表在该历史时间中的状态的数据。

SELECT * FROM table1 AS OF TIMESTAMP TO_TIMESTAMP('2020-08-13 16:20:00','yyyy-mm-dd hh24:mi:ss');

通过 TIMESTAMP 指定的历史时间并闪回查询多表在该历史时间中的状态的数据。

SELECT * FROM table1,table2 AS OF TIMESTAMP TO_TIMESTAMP('2020-08-13 16:20:00','yyyy-mm-dd hh24:mi:ss');

通过 SCN 指定历史时间并闪回查询单表在该历史时间点的状态的数据。

SELECT * FROM table1 AS OF SCN 1597306800000000000;

7-安全权限

OceanBase 数据库仅 Oracle 模式支持安全审计功能

8-备份恢复

8.1-部署nfs,oss

建议使用 OSS 作为备份的目的端,OSS 作为无状态的对象存储,比有状态的 NFS4 有更高的稳定性

ALTER SYSTEM SET LOG_ARCHIVE_DEST='LOCATION=file:///data/nfs/backup/archive';

obclient> ALTER SYSTEM SET LOG_ARCHIVE_DEST='LOCATION=oss://oceanbase-test-bucket/backup/archive?host=xxx.aliyun-inc.com&access_id=xxx&access_key=xxx&delete_mode=tagging';

oss:// 表示使用 OSS 作为归档目的端介质类型,存储桶名 oceanbase-test-bucket,在存储桶中的路径是 /backup/archive,同时使用 ? 来分隔路径的其他参数,host 用于设置存储桶的主机地址,access_id 和 access_key 用于设置 OSS 的访问密钥,清理模式设置为 tagging

8.2-日志归档

--查看集群中所有租户的归档历史信息

SELECT * FROM oceanbase.CDB_OB_ARCHIVELOG_SUMMARY\G

--查看本租户的日志归档历史

SELECT * FROM oceanbase.DBA_OB_ARCHIVELOG_SUMMARY\G

--数据备份优先选择 Follower 副本进行备份

ALTER SYSTEM SET DATA_BACKUP_DEST= 'data_backup_path' TENANT = mysql_tenant;

ALTER SYSTEM SET DATA_BACKUP_DEST='oss://oceanbase-test-bucket/backup/?host=xxx.aliyun-inc.com&access_id=xxx&access_key=xxx&delete_mode=delete';

8.3-数据备份

8.3.1-秘钥备份

在进行数据备份前,还需要考虑源租户的加密情况,如果源租户配置了透明加密,则还需要为源租户备份秘钥。

备份秘钥后,在恢复数据前,如果源租户的加密信息触发过秘钥轮转,则需要重新备份源租户的秘钥。

ALTER SYSTEM BACKUP KEY TENANT = tenant_name TO 'backup_key_path' ENCRYPTED BY 'password';

-查看秘钥备份路径

-系统租户

SELECT * FROM oceanbase.CDB_OB_BACKUP_STORAGE_INFO;

-用户租户

-mysql

SELECT * FROM oceanbase.DBA_OB_BACKUP_STORAGE_INFO;

-Oracle

SELECT * FROM SYS.DBA_OB_BACKUP_STORAGE_INFO;

8.3.2-发起全量数据备份

-设置备份的密码

SET ENCRYPTION ON IDENTIFIED BY '******' ONLY;

该密码为备份后的备份集的密码。如果设置了该选项,在使用该备份集进行恢复时,需要输入该密码,且该密码不能被删除

-设置集群中所有租户的备份并发度

ALTER SYSTEM SET ha_low_thread_score = 10 TENANT = all;

ALTER SYSTEM SET ha_low_thread_score = 10 TENANT = mysql_tenant;

-备份

ALTER SYSTEM BACKUP DATABASE

ALTER SYSTEM BACKUP DATABASE PLUS ARCHIVELOG; # 可以在数据备份过程中同时将归档日志一起备份

8.3.3-发起增量数据备份

ALTER SYSTEM SET ha_low_thread_score = 10;

ALTER SYSTEM BACKUP INCREMENTAL DATABASE;

8.3.4-查看数据备份进度

SELECT * FROM oceanbase.CDB_OB_BACKUP_JOBS\G # JOB 级任务进度

SELECT * FROM oceanbase.CDB_OB_BACKUP_TASKS\G # Task 级任务进度

8.3.5-用户租户查看数据备份进度

-mysql

SELECT * FROM oceanbase.DBA_OB_BACKUP_JOBS\G

SELECT * FROM oceanbase.DBA_OB_BACKUP_TASKS\G

-Oracle

SELECT * FROM SYS.DBA_OB_BACKUP_JOBS\G

SELECT * FROM SYS.DBA_OB_BACKUP_TASKS\G

8.3.6-查看数据备份相关参数

SHOW PARAMETERS LIKE '%ha_low_thread_score%'\G

ALTER SYSTEM SET ha_low_thread_score = 4 TENANT = mysql_tenant;

8.3.7-开启租户的自动清理功能

ALTER SYSTEM ADD DELETE BACKUP POLICY 'default' RECOVERY_WINDOW '7d';

ALTER SYSTEM ADD DELETE BACKUP POLICY 'default' RECOVERY_WINDOW '7d' TENANT MySQL;

表示从当前时间起,7 天内的数据保证可恢复,且与这 7 天数据恢复无关的备份数据将被视为过期的数据

8.3.8-查看已设置的清理策略

-系统租户

SELECT * FROM oceanbase.CDB_OB_BACKUP_DELETE_POLICY;

-用户租户

mysql: SELECT * FROM oceanbase.DBA_OB_BACKUP_DELETE_POLICY;

Oracle: SELECT * FROM sys.DBA_OB_BACKUP_DELETE_POLICY;

8.4-数据恢复

-仅在数据备份时添加了密码的场景下才需要设置备份的恢复密码。全量备份密码放在前面,增量备份密码放在后面

SET DECRYPTION IDENTIFIED BY '******','******';

-设置加密信息

SET @kms_encrypt_info = '<加密string>';

8.4.1-执行物理恢复

-恢复到指定时间戳

ALTER SYSTEM RESTORE dest_tenant_name FROM uri UNTIL TIME='timestamp' WITH 'restore_option' [WITH KEY FROM 'backup_key_path' ENCRYPTED BY 'password'] [DESCRIPTION description];

-恢复到指定 SCN

ALTER SYSTEM RESTORE dest_tenant_name FROM uri UNTIL SCN=scn WITH 'restore_option' [WITH KEY FROM 'backup_key_path' ENCRYPTED BY 'password'] [DESCRIPTION description];

-恢复到最新位点

ALTER SYSTEM RESTORE dest_tenant_name FROM uri WITH 'restore_option' [WITH KEY FROM 'backup_key_path' ENCRYPTED BY 'password'] [DESCRIPTION description];

--

-nfs

从数据备份路径 file:///data/nfs/backup/data 与日志归档路径 file:///data/nfs/backup/archive 恢复租户 mysql 到指定时间戳 2020-06-01 00:00:00, 指定资源池为 restore_pool,同时恢复源租户的密钥信息。

ALTER SYSTEM RESTORE mysql FROM 'file:///data/nfs/backup/data,file:///data/nfs/backup/archive' UNTIL TIME='2020-06-01 00:00:00' WITH 'pool_list=restore_pool' WITH KEY FROM 'file:///data_backup_dest/key' ENCRYPTED BY '******';

从数据备份路径 file:///data/nfs/backup/data 与日志归档路径 file:///data/nfs/backup/archive 恢复租户 mysql 恢复到当前最新的归档位点, 指定资源池为 restore_pool,同时指定恢复的并发度 concurrency 为 50。

ALTER SYSTEM RESTORE mysql FROM 'file:///data/nfs/backup/data,file:///data/nfs/backup/archive' WITH 'pool_list=restore_pool&concurrency=50';

从数据备份路径 file:///data/nfs/backup/data 与日志归档路径 file:///data/nfs/backup/archive 恢复租户 mysql 到指定 scn 1658285759724047000, 指定资源池为 restore_pool。

ALTER SYSTEM RESTORE mysql FROM 'file:///data/nfs/backup/data,file:///data/nfs/backup/archive' UNTIL SCN=1658285759724047000 WITH 'pool_list=restore_pool';

从数据备份路径 file:///data/nfs/backup/data 与日志归档路径 file:///data/nfs/backup/archive 恢复租户 mysql 到指定时间戳 2020-06-01 00:00:00, 指定资源池为 restore_pool, 副本 Locality 为 F@z1,F@z2,F@z3。

ALTER SYSTEM RESTORE mysql FROM 'file:///data/nfs/backup/data,file:///data/nfs/backup/archive' UNTIL TIME='2020-06-01 00:00:00' WITH 'pool_list=restore_pool&locality=F@z1,F@z2,F@z3';

从数据备份路径 file:///data/nfs/backup/data 与日志归档路径 file:///data/nfs/backup/archive 恢复租户 mysql 到指定时间戳 2020-06-01 00:00:00, 指定资源池为 restore_pool, 副本 Locality 为 F@z1,F@z2,F@z3, 并指定 primary_zone 为 z1。

ALTER SYSTEM RESTORE mysql FROM 'file:///data/nfs/backup/data,file:///data/nfs/backup/archive' UNTIL TIME='2020-06-01 00:00:00' WITH 'pool_list=restore_pool&locality=F@z1,F@z2,F@z3&primary_zone=z1';

-oss

除 url 参数有所变更外, 其余参数的使用与 NFS 一致。

从 OSS 备份路径 oss://oceanbase-test-bucket/backup/data/?host=xxx.aliyun-inc.com&access_id=xxx&access_key=xxx 与 OSS 日志归档路径 oss://oceanbase-test-bucket/backup/archive/?host=xxx.aliyun-inc.com&access_id=xxx&access_key=xxx恢复租户 mysql 到指定时间戳 2020-06-01 00:00:00, 指定资源池为 restore_pool。

ALTER SYSTEM RESTORE mysql FROM 'oss://oceanbase-test-bucket/backup/data/?host=xxx.aliyun-inc.com&access_id=xxx&access_key=xxx,oss://oceanbase-test-bucket/backup/archive/?host=xxx.aliyun-inc.com&access_id=xxx&access_key=xxx' UNTIL TIME='2020-06-01 00:00:00' WITH 'pool_list=restore_pool';

--设置配置项 ha_high_thread_score

-用于设置高可用高优先级线程的当前工作线程数。默认值为 0,取值范围为 [0, 100],建议修改为 10

ALTER SYSTEM SET ha_high_thread_score =10 TENANT = mysql;

8.4.2-取消物理恢复

ALTER SYSTEM CANCEL RESTORE tenant_name;

8.4.3-查看物理恢复进度,结果

SELECT * FROM oceanbase.CDB_OB_RESTORE_PROGRESS\G

SELECT * FROM oceanbase.CDB_OB_RESTORE_HISTORY\G

8.4.4-备租户分段回放日志

恢复成功后,恢复后的租户均为备租户,您可执行 RECOVER 命令继续从租户恢复时指定的日志归档源端回放日志

物理恢复流程与物理备库统一,物理恢复后的租户为备租户,后续该租户可作为备租户提供相关服务,也可转为主租户提供服务

1)系统租户指定备租户回放日志

-回放日志到指定的时间戳,且包含该时间戳位点

ALTER SYSTEM RECOVER STANDBY TENANT tenant_name UNTIL TIME='timestamp';

--回放日志到指定的 scn,且包含该 scn 位点

ALTER SYSTEM RECOVER STANDBY TENANT tenant_name UNTIL SCN=scn;

--无终点,持续回放归档源端日志

ALTER SYSTEM RECOVER STANDBY TENANT tenant_name UNTIL UNLIMITED;

--取消备租户的日志回放

ALTER SYSTEM RECOVER STANDBY TENANT tenant_name CANCEL;

2)备租户触发自身日志回放

-回放日志到指定的时间戳,且包含该时间戳位点。

ALTER SYSTEM RECOVER STANDBY UNTIL TIME='timestamp';

-回放日志到指定的 SCN,且包含该 SCN 位点。

ALTER SYSTEM RECOVER STANDBY UNTIL SCN=scn;

-无终点,持续回放归档源端日志。

ALTER SYSTEM RECOVER STANDBY UNTIL UNLIMITED;

-可以取消备租户日志回放

ALTER SYSTEM RECOVER STANDBY CANCEL;

8.4.5-备租户转为主租户

1)系统租户将备租户转为主租户

恢复成功后, 恢复后的租户均为备租户,您可以通过 ACTIVATE STANDBY 命令将备租户转换为主租户

物理恢复流程与物理备库统一,物理恢复后的租户为备租户,后续该租户可作为备租户提供相关服务,也可转为主租户提供服务, 该命令每次只能切换一个租户,如果需要切换多个租户,需要重复执行该命令

ALTER SYSTEM ACTIVATE STANDBY TENANT tenant_name;

2)用户租户将备租户转为主租户

ALTER SYSTEM ACTIVATE STANDBY;

8.4.6-恢复完成后升级租户

将恢复出来的备租户转为主租户后,如果您是将低版本的备份数据恢复到高版本的集群中,则还需要对该租户进行升级

ALTER SYSTEM RUN UPGRADE JOB "UPGRADE_ALL" TENANT = tenant_name;

其中,tenant_name 为新恢复出来的租户名。支持同时升级多个恢复租户,多个租户名之间使用英文逗号(,)分隔

-确认租户是否升级成功

SELECT count(*) FROM oceanbase.DBA_OB_CLUSTER_EVENT_HISTORY WHERE event = 'UPTRADE_ALL' AND value3 ='4.2.1.1' AND value5 = '1004';

SELECT distinct(value) FROM oceanbase.GV$OB_PARAMETERS WHERE tenant_id =1004;

8.4.7-表恢复

ALTER SYSTEM

RECOVER TABLE infodb.tbl1,infodb.tbl2

TO TENANT oracle001

FROM 'file:///data/nfs/backup/data,file:///data/nfs/backup/archive'

UNTIL TIME='2023-09-30 00:00:00'

WITH 'pool_list=restore_pool'

REMAP TABLE infodb.tbl1:newtbl

REMAP TABLEGROUP tg1:newtg1

REMAP TABLESPACE ts1:newts1;

-取消

ALTER SYSTEM CANCEL RECOVER TABLE dest_tenant_name;

-进度

SELECT * FROM oceanbase.CDB_OB_RECOVER_TABLE_JOBS\G

-结果

SELECT * FROM oceanbase.CDB_OB_RECOVER_TABLE_JOB_HISTORY\G

9-监控指标

9.1-系统监控

9.2-SQL监控

10-日志

-仅对当前集群中的所有租户生效,对于该操作之后所创建的租户,系统不会自动开启归档模式

ALTER SYSTEM ARCHIVELOG

-oceanbase.DBA_OB_TENANTS 视图中查看集群中所有租户的归档模式

SELECT TENANT_NAME, LOG_MODE FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_TYPE = 'USER'\G

11-性能调优

12-日常巡检

13-OBD 命令

14-问题排查

15-应急处理

仅在数据备份时添加了密码的场景下才需要设置备份的恢复密码。

0

评论区