[版本] 社区版和企业版都可以
[需求1] 查看机器资源状态
select a.zone,concat(a.svr_ip,’:’,a.svr_port) observer, cpu_total, (cpu_total-cpu_assigned) cpu_free, round(mem_total/1024/1024/1024) mem_total_gb, round((mem_total-mem_assigned)/1024/1024/1024) mem_free_gb, usec_to_time(b.last_offline_time) last_offline_time, usec_to_time(b.start_service_time) start_service_time, b.status, usec_to_time(b.stop_time) stop_time, b.build_version from __all_virtual_server_stat a join __all_server b on (a.svr_ip=b.svr_ip and a.svr_port=b.svr_port) order by a.zone, a.svr_ip ; ±------±------------------±----------±---------±-------------±------------±---------------------------±---------------------------±-------±---------------------------±------------------------------------------------------------------------------------+ | zone | observer | cpu_total | cpu_free | mem_total_gb | mem_free_gb | last_offline_time | start_service_time | status | stop_time | build_version | ±------±------------------±----------±---------±-------------±------------±---------------------------±---------------------------±-------±---------------------------±------------------------------------------------------------------------------------+ | zone1 | 11.166.85.38:2882 | 22 | 1 | 24 | 7 | 1970-01-01 08:00:00.000000 | 2021-08-10 04:01:20.307242 | active | 1970-01-01 08:00:00.000000 | 3.1.2_20210705184323-9ef0e2bedb953c5bf0a4a21d6419845d25e0d719(Jul 5 2021 19:13:56) | ±------±------------------±----------±---------±-------------±------------±---------------------------±---------------------------±-------±---------------------------±------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
备注:
- cpu_total , mem_total_gb 表示该 OB 节点可分配的总资源。
- cpu_free , mem_free_gb 表示该 OB 节点可分配的剩余资源。但是这个不是特别精确,因为有默认租户分配资源的时候 max_cpu 跟 min_cpu、max_memory 跟 min_memory 不对等。
- status 表示节点状态。inactive, 表示节点已经掉线或者进程退出了。节点掉线常见原因是节点时钟偏差过大、网络延时过大、clog空间盘满(used大于等于95%)。如果进程刚刚启动,则是进程在跟 rootserver 通信沟通。正常情况下启动几秒就能变 active,异常宕机后的再启动可能需要几十秒变 acitve,最长不超过2分钟。
- start_service_time 表示节点开始提供服务时间。如果是默认值 1970-1-1 ,则表示进程还在应用clog、刷新schema等。通常如果要应用的clog不多的时候,这个几秒钟就好了。如果是此前内存中大量数据还没有合并落盘就宕机了,这个恢复时间就长一些,可能会要十几分钟。
- stop_service_time 表示停止服务时间。如果是默认值 1970-1-1 ,表示没有停止服务。如果时间大于默认值(在当前时间附近),表示手动发起过 stop server 或 stop zone 命令。则需要手动发起 start server 或者 start zone 命令恢复服务。
- 只有这三个列都正常了,节点才是正常的。observer 重启过程请参考官网文档:OceanBase 企业级分布式关系数据库
8 个赞
[需求2] 查看机器资源分配细节
select t1.name resource_pool_name, t2.`name` unit_config_name, t2.max_cpu, t2.min_cpu, round(t2.max_memory/1024/1024/1024) max_mem_gb, round(t2.min_memory/1024/1024/1024) min_mem_gb, t3.unit_id, t3.zone, concat(t3.svr_ip,':',t3.`svr_port`) observer,t4.tenant_id, t4.tenant_name
from __all_resource_pool t1 join __all_unit_config t2 on (t1.unit_config_id=t2.unit_config_id)
join __all_unit t3 on (t1.`resource_pool_id` = t3.`resource_pool_id`)
left join __all_tenant t4 on (t1.tenant_id=t4.tenant_id)
order by t1.`resource_pool_id`, t2.`unit_config_id`, t3.unit_id
;
+--------------------+------------------+---------+---------+------------+------------+---------+-------+-------------------+-----------+-------------+
| resource_pool_name | unit_config_name | max_cpu | min_cpu | max_mem_gb | min_mem_gb | unit_id | zone | observer | tenant_id | tenant_name |
+--------------------+------------------+---------+---------+------------+------------+---------+-------+-------------------+-----------+-------------+
| sys_pool | sys_unit_config | 5 | 2.5 | 7 | 5 | 1 | zone1 | 11.166.85.38:2882 | 1 | sys |
| mysql_pool | my_unit_config | 8 | 8 | 5 | 5 | 1002 | zone1 | 11.166.85.38:2882 | 1002 | obmysql |
| my_pool2 | my_unit_config | 8 | 8 | 5 | 5 | 1003 | zone1 | 11.166.85.38:2882 | 1003 | oboracle |
+--------------------+------------------+---------+---------+------------+------------+---------+-------+-------------------+-----------+-------------+
3 rows in set (0.01 sec)
备注:
- 默认情况下 sys_unit_config 的 min_cpu 和 min_memory 跟 max_cpu 和 max_memory 不相等,导致上面第一个需求查询里统计的剩余可用 cpu 和 memory 有少量的误差。这里先纠正过来: alter resource unit sys_unit_config min_cpu=5,min_memory='7G';
- 如果 tenant_name 是空(NULL),表示该资源池没有关联到租户。则这个资源池就没法被利用,需要删除(回收)掉。
- 每个租户在每个zone 只能有一个资源池,在不同的zone 可以分别有一个资源池,也可以共用一个资源池(资源规格一样)。不同 zone 有多个资源池的时候,每个资源池的资源规格可以不等。
1 个赞
[需求3] 查看 OB 集群发生了什么事件?
SELECT DATE_FORMAT(gmt_create, '%b%d %H:%i:%s') gmt_create_ , module, event, name1, value1, name2, value2, rs_svr_ip,name3,value3,name4,value4
FROM __all_rootservice_event_history
WHERE 1 = 1
-- AND module IN ('daily_merge')
-- AND module NOT IN ('leader_coordinator')
-- and event not like '%finish_backup%'
ORDER BY gmt_create DESC
LIMIT 100;
OB 的事件类型非常多,涉及到 集群节点掉线/重启、新增/删除、ddl、分区切换、分区迁移、转储/合并、备份/恢复等等。所以,OB不正常了,首先看[需求1] 那个 SQL和 这个 SQL 。
3 个赞
[需求4] 观察OB 合并进度
SELECT DATE_FORMAT(gmt_create, '%b%d %H:%i:%s') gmt_create_ , module, event, name1, value1, name2, value2, rs_svr_ip,name3,value3,name4,value4
FROM __all_rootservice_event_history
WHERE 1 = 1
AND module IN ('daily_merge')
-- AND module NOT IN ('leader_coordinator')
-- and event not like '%finish_backup%'
ORDER BY gmt_create DESC
LIMIT 100;
SELECT ZONE,svr_ip,major_version,ss_store_count,merged_ss_store_count,modified_ss_store_count,merge_start_time,merge_finish_time,merge_process
FROM __all_virtual_partition_sstable_image_info
order by major_version desc ;
+-------+--------------+---------------+----------------+-----------------------+-------------------------+----------------------------+----------------------------+---------------+
| ZONE | svr_ip | major_version | ss_store_count | merged_ss_store_count | modified_ss_store_count | merge_start_time | merge_finish_time | merge_process |
+-------+--------------+---------------+----------------+-----------------------+-------------------------+----------------------------+----------------------------+---------------+
| zone1 | 11.166.85.38 | 19 | 1843 | 1843 | 108 | 2021-08-17 02:00:21.176881 | 2021-08-17 02:03:16.836808 | 52 |
| zone1 | 11.166.85.38 | 18 | 1712 | 1712 | 92 | 2021-08-16 19:53:25.177119 | 2021-08-16 19:55:34.677565 | 100 |
+-------+--------------+---------------+----------------+-----------------------+-------------------------+----------------------------+----------------------------+---------------+
2 rows in set (0.05 sec)
备注:
- 先查合并的事件。集群会有一笔开始合并(merging)的事件。然后每个zone 会两笔开始合并(set_zone_merging 和 start_merge)和两笔结束合并(merge_succeed 和 all_partition_merged )的事件。然后集群层面结束合并(global_merged)的事件。
- __all_virtual_partition_sstable_image_info 会记录最近2次 的合并事件记录(开始和结束时间),包括正在合并中的版本算一次。
4 个赞
[Q5] 查看某个实例(租户)下库表分区主副本的位置和大小
SELECT t.tenant_id, a.tenant_name, t.table_name, d.database_name, tg.tablegroup_name , t.part_num , t2.partition_id, t2.ZONE, t2.svr_ip , round(t2.data_size/1024/1024/1024) data_size_gb
, a.primary_zone , IF(t.locality = '' OR t.locality IS NULL, a.locality, t.locality) AS locality
FROM oceanbase.__all_tenant AS a
JOIN oceanbase.__all_virtual_database AS d ON ( a.tenant_id = d.tenant_id )
JOIN oceanbase.__all_virtual_table AS t ON (t.tenant_id = d.tenant_id AND t.database_id = d.database_id)
JOIN oceanbase.__all_virtual_meta_table t2 ON (t.tenant_id = t2.tenant_id AND (t.table_id=t2.table_id OR t.tablegroup_id=t2.table_id) AND t2.ROLE IN (1) )
LEFT JOIN oceanbase.__all_virtual_tablegroup AS tg ON (t.tenant_id = tg.tenant_id and t.tablegroup_id = tg.tablegroup_id)
WHERE a.tenant_id IN (1006 ) AND t.table_type IN (3)
-- AND d.database_name = 'T_FUND60PUB'
-- and table_name in ('BMSQL_HISTORY')
ORDER BY t.tenant_id, tg.tablegroup_name, d.database_name, t.table_name, t2.partition_id
;
备注:
- role : 1 表示 主副本; 2 表示备副本
- tablegroup_name 为空,表示没有用到表分组。
5 个赞
[Q6] 查看集群节点的可用空间大小和实际分配大小、剩余空间。
select svr_ip, round(total_size/1024/1024/1024) total_size_gb, round(free_size/1024/1024/1024) free_size_gb, round(used_size/1024/1024/1024) used_size_gb from __all_virtual_disk_stat;
+--------------+---------------+--------------+--------------+
| svr_ip | total_size_gb | free_size_gb | used_size_gb |
+--------------+---------------+--------------+--------------+
| 11.166.85.38 | 100 | 96 | 4 |
+--------------+---------------+--------------+--------------+
1 row in set (0.00 sec)
备注:
[Q7] 查看某个租户近期执行过的 SQL
SELECT /*+ read_consistency(weak) ob_querytimeout(100000000) */ substr(usec_to_time(request_time),1,19) request_time_, s.svr_ip, s.client_Ip, s.sid,s.tenant_id, s.tenant_name, s.user_name, s.db_name, s.query_sql, s.affected_rows, s.return_rows, s.ret_code, s.event, s.elapsed_time, s.queue_time, s.execute_time, round(s.request_memory_used/1024/1024/1024,2) req_mem_mb, plan_type, is_executor_rpc, is_inner_sql, TRANSACTION_HASH
FROM gv$sql_audit s
WHERE 1=1 and s.tenant_id = 1003
-- and user_name='sys'
-- AND ret_code = 0
-- AND query_sql LIKE '%dual%'
-- and query_sql like '%TBTATRANSACCOUNTSYNC%'
-- and query_sql like '%SELECT%'
ORDER BY request_time DESC
LIMIT 100;
备注:
- 默认集群的 SQL 审计是开启的。查看参数 enable_sql_audit值。如果关闭了,需要打开才能使用这个 SQL 查询。
- ret_code 为0 表示 SQL 正常,如果业务 SQL 报错了,这里会记录错误号(小于0)。
- 视图的定义可以查看官网文档。这里给出的常用字段。包含影响行数、返回行数、执行时间、等待时间、排队时间等等。
[Q8] 查看租户的增量内存使用情况
SELECT tenant_id, ip, round(active/1024/1024/1024) active_gb, round(total/1024/1024/1024) total_gb, round(freeze_trigger/1024/1024/1024) freeze_trg_gb, round(mem_limit/1024/1024/1024) mem_limit_gb
, freeze_cnt , round((active/freeze_trigger),2) freeze_pct, round(total/mem_limit, 2) mem_usage
FROM `gv$memstore`
WHERE tenant_id =1003
ORDER BY tenant_id, ip;
+-----------+--------------+-----------+----------+---------------+--------------+------------+------------+-----------+
| tenant_id | ip | active_gb | total_gb | freeze_trg_gb | mem_limit_gb | freeze_cnt | freeze_pct | mem_usage |
+-----------+--------------+-----------+----------+---------------+--------------+------------+------------+-----------+
| 1003 | 11.166.85.38 | 0 | 0 | 2 | 4 | 0 | 0.13 | 0.05 |
+-----------+--------------+-----------+----------+---------------+--------------+------------+------------+-----------+
1 row in set (0.01 sec)
备注:
- total_gb 表示总内存,active_gb 表示当前未转储的内存,freeze_trg_gb 表示内存转储的阈值,mem_limit_gb 表示能用的最大的增量内存(超过就报内存不足),freeze_cnt 表示转储次数。freeze_pct表示未转储的内存占转储阈值的比例,mem_usage 表示增量内存总的使用比例(到100% 就报内存不足)。
2 个赞
[Q9] 查看分区副本延时
select t.table_id, t.table_name, p.partition_idx, usec_to_time(min_log_service_ts), TIME_TO_SEC( now())-TIME_TO_SEC(usec_to_time(min_log_service_ts)) delta_time
from __all_virtual_partition_info p join __all_virtual_table t on (p.tenant_id=t.tenant_id and p.table_id=t.table_id)
join __all_virtual_meta_table p2 on (p.tenant_id=p2.tenant_id and p.table_id=p2.table_id and p.partition_idx=p2.partition_id)
WHERE p.tenant_id=1003 and p2.role in (2) ;
备注:
- role 是副本的角色,1 表示主副本, 2 表示备副本。
- OB 里主备同步的粒度不是实例,而是分区级别(分区是表的子集)。
- 由于三副本是强同步(多数派成功即返回),备副本的延时通常都很小。
1 个赞
[Q10] 查看租户所有会话
select id, user, host,tenant,db, command, svr_ip, proxy_sessid,user_client_ip
from __all_virtual_processlist
where proxy_sessid is not null
;
备注:
- proxy_sessid : obproxy的会话id。如果有值,表示这个会话是通过 OBPROXY 连接过来的。host 里的 IP 就是 OBPROXY 的 IP;如果为NULL,表示这个会话是直连 OBSERVER 的。
- svr_ip 表示这个会话发生在哪个 OBSERVER 上。不管这个会话是通过 OBPROXY 还是 直连 OBSERVER 的。
- host 表示 OBSERVER 会话的客户端。如果这个会话是通过 OBPROXY 建立的,这个地址就是 OBPROXY 的地址;如果这个会话是直连 OBSERVER 的,这个地址就是发起直连会话的客户端地址。
- user_client_ip 表示这个会话的实际客户端。如果这个会话是通过 OBPROXY 建立的,这个地址就是向 OBPROXY 发起连接的客户端;如果这个会话是直连 OBSERVER 的,则这个地址跟 host 是一致的。
有趣的是,有些客户端有多个 IP 的时候,host 和 user_client_ip会显示跟 OBPROXY 或 OBSERVER 能建立连接的那个 IP 。
1 个赞
上面的 [Q5] 查看某个实例(租户)下库表分区主副本的位置和大小 就是看数据分布。
我这里的round 有四舍五入,可能会放大实际值。大家留意。 😓️
[Q10] 查看隐藏参数
select * from __all_virtual_sys_parameter_stat where name like '%_hash_area_size%';
+-------+----------+---------------+----------+-----------------+-----------+-------+--------------+--------------------------------------------------------------------------+-------------+----------+---------------+--------+---------+-------------------+
| zone | svr_type | svr_ip | svr_port | name | data_type | value | value_strict | info | need_reboot | section | visible_level | scope | source | edit_level |
+-------+----------+---------------+----------+-----------------+-----------+-------+--------------+--------------------------------------------------------------------------+-------------+----------+---------------+--------+---------+-------------------+
| zone1 | observer | 172.20.249.53 | 2882 | _hash_area_size | NULL | 100M | NULL | size of maximum memory that could be used by HASH JOIN. Range: [4M,+∞) | NULL | OBSERVER | NULL | TENANT | DEFAULT | DYNAMIC_EFFECTIVE |
| zone3 | observer | 172.20.249.56 | 3882 | _hash_area_size | NULL | 100M | NULL | size of maximum memory that could be used by HASH JOIN. Range: [4M,+∞) | NULL | OBSERVER | NULL | TENANT | DEFAULT | DYNAMIC_EFFECTIVE |
| zone2 | observer | 172.20.249.55 | 2882 | _hash_area_size | NULL | 100M | NULL | size of maximum memory that could be used by HASH JOIN. Range: [4M,+∞) | NULL | OBSERVER | NULL | TENANT | DEFAULT | DYNAMIC_EFFECTIVE |
| zone2 | observer | 172.20.249.55 | 3882 | _hash_area_size | NULL | 100M | NULL | size of maximum memory that could be used by HASH JOIN. Range: [4M,+∞) | NULL | OBSERVER | NULL | TENANT | DEFAULT | DYNAMIC_EFFECTIVE |
| zone1 | observer | 172.20.249.53 | 3882 | _hash_area_size | NULL | 100M | NULL | size of maximum memory that could be used by HASH JOIN. Range: [4M,+∞) | NULL | OBSERVER | NULL | TENANT | DEFAULT | DYNAMIC_EFFECTIVE |
| zone3 | observer | 172.20.249.56 | 2882 | _hash_area_size | NULL | 100M | NULL | size of maximum memory that could be used by HASH JOIN. Range: [4M,+∞) | NULL | OBSERVER | NULL | TENANT | DEFAULT | DYNAMIC_EFFECTIVE |
+-------+----------+---------------+----------+-----------------+-----------+-------+--------------+--------------------------------------------------------------------------+-------------+----------+---------------+--------+---------+-------------------+
6 rows in set (0.178 sec)
1 个赞