OceanBase 数据库日志盘满,会对业务产生一定的影响,当自清理机制无法触发时,需要用户进行手动处理。
场景描述
事务日志盘 /data/log1 包含 OceanBase 数据库的 redo log,而 redo log 主要包括 clog 和 ilog 两部分。clog 全称 commit log,位于 store/xxx/clog目录下,xxx 是集群名 ,记录数据库中数据所做的更改操作,提供数据持久性保证。ilog 全称 index log,位于 store/xxx/ilog目录下, 是 clog 的索引,本质上是一种优化,ilog 的文件删除不会影响数据持久性,但可能会影响系统的恢复时间。该盘空间满,会产生业务无法写数据等影响。
这两种文件均按需自动创建和清除,磁盘写到 80% 会触发自清除逻辑,但前提是这部分日志数据对应的内存数据已经转储到了磁盘中;若该部分数据尚未转储,有撑爆日志盘的风险。因此有时需要手动处理。
解决方案
1. 调整事务日志的磁盘 I/O 最大使用百分比。
clog 盘达到 95% 之后自动停写,无法再接收日志,该阈值由配置项 clog_disk_usage_limit_percentage 控制,可以调整该配置项的值为 98。可以指定只修改盘满的 server。
使用 root@sys 登录,执行以下命令:
obclient> ALTER system SET clog_disk_usage_limit_percentage = 98 server ='[ip地址]:2882';
复制
2. 修改之后,落后的副本会立即触发追日志。如果落后很多会触发 rebuild(从 leader 拷贝 data+clog)。可以通过如下方式观察恢复过程。
执行如下 SQL 语句,检查 clog 不同步的分区数是否有不断减少。
obclient> SELECT svr_ip, count(*) FROM __all_virtual_clog_stat WHERE is_offline = 0 and is_in_sync = 0 group by 1;
复制
a. 如果没有快速减少,则可能有副本触发了 rebuild(rebuild 是一种落后太多情况下追赶的方式,会拷贝基线+增量),继续执行如下 SQL 查询是否有正在做 rebuild 的副本。
obclient> SELECT svr_ip, count(*) FROM __all_virtual_partition_migration_status WHERE action != 'END' group by 1;
复制
b. 观察上述查询结果是否在逐渐减小,如果是在减小,说明 rebuild 副本在进行中。
3. 执行以下命令,观察之前盘满的 server 的 clog 盘空间当前容量。
df -lh
复制
如果 clog 盘空间自动下降到 95% 以下,说明 OBServer 恢复顺利,继续等待所有副本达到 sync 状态即可。如果又达到了 98%,则说明这次调整没有恢复成功,请联系 OceanBase 技术支持人员处理。
4. 待 is_in_sync= 0 的副本数量降为 0 之后,将上述所有改过的配置项恢复原值。
评论
