一体机环境下,meta db 数据目录所在磁盘故障,数据目录被清理,需要换盘操作。
适用版本
Oceanbase 数据库 V2.x 和 V3.x 版本。
操作方法
备份数据
- 备份数据,避免误操作无法恢复(OCP、OMS、ODC 等存放在 meta db 租户的数据)。
- 备份 antman,重建接管时需要,避免换盘误操作,将其他盘数据清理。
- 备份admin目录,重建接管时需要,避免换盘误操作,将其他盘数据清理。
检查集群状态
检查集群状态:确认集群不在合并状态,预计为空。
obclient> select gmt_modified,zone,name,info from __all_zone where name='merge_status' and info !='IDLE';检查 server 是否均在线,预期状态为 active、start_service_time 大于 last_offline_time 时间。
obclient> select svr_ip,gmt_modified,zone,usec_to_time(start_service_time),usec_to_time(last_offline_time),status from __all_server检查三节点是否缺副本,预期为空。
obclient> select table_id, partition_id, count(*)c from gv$partition group by table_id, partition_id having c != 3;检查 clog 状态,预期为空。
obclient> SELECT svr_ip, svr_port, table_id, partition_idx FROM __all_virtual_clog_stat WHERE (is_in_sync = 0 AND is_offline = 0 AND replica_type != 16);检查 primary_zone,记录结果并保存。
obclient> select primary_zone,tenant_name,zone_list from __all_tenant;
检查切换主副本
查看下线节点是不是 RS 节点。
obclient> select svr_ip,zone from __all_root_table where tenant_id=1 and role=1 group by svr_ip;若下线节点为 RS 节点,需要切换到其他节点再进行后续操作。
obclient> alter tenant sys set primary_zone='META_OB_ZONE_2';检查下线节点有没有主副本。
obclient> select t.tenant_id,t.svr_ip,t.role,p.tenant_name from __all_virtual_meta_table t,__all_tenant p where t.tenant_id=p.tenant_id and t.svr_ip='100.xx.xxx.xx' group by t.svr_ip,t.tenant_id asc;三节点预计会有 ocp_meta 和 ocp_monitor 在,有其他的也一并切了,切 ocp_monitor 和 ocp_meta 副本,到其他节点,切换完成后检查切换结果。
obclient> alter tenant ocp_monitor primary_zone='META_OB_ZONE_2;META_OB_ZONE_1,META_OB_ZONE_3'; obclient> alter tenant ocp_meta primary_zone='META_OB_ZONE_2;META_OB_ZONE_1,META_OB_ZONE_3';
永久下线副本
通过修改下线永久下线时间,把问题机器上的副本永久下线。
obclient> show parameters like 'server_permanent_offline_time'; obclient> alter system set server_permanent_offline_time = '60s';停止节点 OCP 相关容器,此处停掉后,另外两个节点还是可以正常访问的。
docker stop META_OB_ZONE_1 obproxy ocp
3. 使用 admin 用户挪走配置文件。
```
mv /home/admin/oceanbase/etc/observer.config.bin /tmp
```
执行换盘操作
检查节点状态 确认非
/data目录未发生变化,IP 网卡信息未发生变化。重做 LVM,按之前分盘规划新盘的 LVM。
注意和
/etc/fstab配置的信息一致。完成为
/data/1、/data/log1的挂载。注意目录权限和属组和其他节点一致。
检查网络延迟和时钟同步,确保与其他节点偏差在 20ms 以内。
换盘后的恢复
启动容器。
docker start META_OB_ZONE_1 obproxy ocp检查 server 状态。
obclient> select svr_ip,gmt_modified,zone,usec_to_time(start_service_time),usec_to_time(last_offline_time),status from __all_server;
如果启动的节点是 inactice 状态,则执行以下检查:
检查
/data/log1/obcluster/clog下,是不是只有名为 1 的 1 个 clog 文件。检查配置文件是否存在。
ls -l /home/admin/oceanbase/etc/observer.config.bin查看日志,是否有 -8002 的报错。
[2022-11-11 17:54:35.504357] WARN [SHARE.PT] get (ob_partition_location_cache.cpp:2503) [8713][2176][Y0-0000000000000000] [lt=5] [dc=0] get partition location failed(ret=-8002, partition={tid:1099511628002, partition_id:0, part_cnt:0}, expire_renew_time=0) [2022-11-11 17:54:35.504362] WARN [SHARE.PT] get_strong_leader (ob_partition_location_cache.cpp:2616) [8713][2176][Y0-0000000000000000] [lt=5] [dc=0] get failed(partition={tid:1099511628002, partition_id:0, part_cnt:0}, force_renew=false, expire_renew_time=0, ret=-8002) [2022-11-11 17:54:35.504367] WARN [STORAGE.TRANS] get_cluster_service_master_ (ob_tenant_weak_read_service.cpp:248) [8713][2176][Y0-0000000000000000] [lt=4] [dc=0] get tenant weak read cluster service partition leader from location cache fail(ret=-8002, pkey={tid:1099511628002, partition_id:0, part_cnt:0}, force_renew=false) [2022-11-11 17:54:35.504372] WARN [STORAGE.TRANS] post_cluster_heartbeat_rpc_ (ob_tenant_weak_read_service.cpp:622) [8713][2176][Y0-0000000000000000] [lt=4] [dc=0] get cluster service master fail(ret=-8002, tenant_id_=1, cluster_service_pkey={tid:1099511628002, partition_id:0, part_cnt:0}) [2022-11-11 17:54:35.504377] WARN [STORAGE.TRANS] process_cluster_heartbeat_rpc_cb (ob_tenant_weak_read_service.cpp:391) [8713][2176][Y0-0000000000000000] [lt=4] [dc=0] tenant weak read service cluster heartbeat RPC fail(rcode={code:-8002, msg:"post cluster heartbeat rpc failed, tenant_id=1", warnings:[]}, tenant_id_=1, dst="100.xx.xxx.xx:2882", cluster_service_pkey={tid:1099511628002, partition_id:0, part_cnt:0}) [2022-11-11 17:54:35.504384] WARN [STORAGE.TRANS] do_cluster_heartbeat_ (ob_tenant_weak_read_service.cpp:581) [8713][2176][Y0-0000000000000000] [lt=6] [dc=0] post cluster heartbeat rpc fail(ret=-8002, tenant_id_=1, local_server_version=1668160470987016, valid_part_count=0, total_part_count=0, generate_timestamp=1668160475504262) [2022-11-11 17:54:35.504389] WARN [STORAGE.TRANS] do_cluster_heartbeat_ (ob_tenant_weak_read_service.cpp:591) [8713][2176][Y0-0000000000000000] [lt=4] [dc=0] tenant weak read service do cluster heartbeat fail(ret=-8002, tenant_id_=1, last_post_cluster_heartbeat_tstamp_=1668160475454159, cluster_heartbeat_interval_=1000000, cluster_service_pkey={tid:1099511628002, partition_id:0, part_cnt:0}, cluster_service_master="0.0.0.0")
如果启动的节点是 inactice 状态,且有以上报错,则按下面的步骤进行恢复。
停止停机节点 meta 容器。
删除日志文件。
删除
/home/admin/oceanbase/store/cluster_name/clog下仅有的名为 1 的文件,软连接不动。删除
/home/admin/oceanbase/store/cluster_name/clog_shm。删除
/home/admin/oceanbase/store/cluster_name/ilog_shm。重新启动 meta 容器。
docker start META_OB_ZONE_1重新检查 server 状态。
obclient> select svr_ip,gmt_modified,zone,usec_to_time(start_service_time),usec_to_time(last_offline_time),status from __all_server;检查系统中是否有副本迁移的任务执行。因为该 server 上的副本不存在且永久下线,OBServer 应该会主动进行副本迁移的任务,在 RS 事件表中应该能看到重启 meta 后的 event = tenant_balance_finished 的记录。
obclient> select * from __all_rootservice_event_history where event like '%balance%'order by gmt_create desc limit 10;等待副本迁移任务完成,并等待 clog 同步完成。通过以下语句检查 clog 同步状态。
obclient> SELECT svr_ip, svr_port, table_id, partition_idx FROM __all_virtual_clog_stat WHERE (is_in_sync = 0 AND is_offline = 0 AND replica_type != 16);调整永久下线时间为原来值。
obclient> alter system set server_permanent_offline_time = '3600s'; --s是秒单位调整租户的 primary zone 为原来的值。
obclient> alter tenant ocp_monitor primary_zone='META_OB_ZONE_1;META_OB_ZONE_2,META_OB_ZONE_3'; obclient> alter tenant ocp_meta primary_zone='META_OB_ZONE_1;META_OB_ZONE_2,META_OB_ZONE_3'; obclient> alter tenant sys set primary_zone='META_OB_ZONE_1';检查各个功能是否正常,web 页面是否正常,三个节点 OCP 各个租户是否都可以连接。