原文链接:www.gbase.cn/community/p…
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。
主要解决问题
(1)传统GBase8a数据库扫描空洞表需要扫描元数据表,效率较低。
(2)filefrag只读取操作系统元数据,效率较高。
使用方式
(1)将脚本部署在一个复合节点的/home/gbase/sweep下
(2)修改参数
user="gbase"
passwd="******"
threads_num=2 #并发数
suffix="n1" #一般只查一个分片即可
avg_sum=2 #一般每个分片文件2个以上碎片即认为有空洞
(3)直接运行脚本: sh sweep.sh
验证效果
程序会自动在/home/gbase/sweep/log下,创建若干找到的表的名称(命名方式): 库名.表名
参考文件
#!/bin/bash
#author: Bryan zhao
#date: 2025-07-29
user="gbase"
passwd="******"
threads_num=2 #并发数
suffix="n1" #一般只查一个分片即可
avg_sum=2 #一般每个分片文件2个以上碎片即认为有空洞
>tb.list
if [ ! -d "`pwd`/log" ]; then
mkdir -p "`pwd`/log"
else
rm -rf "`pwd`/log"
mkdir -p "`pwd`/log"
fi
cli="${GCLUSTER_HOME}/bin/gbase -u${user} -p${passwd} -N"
$cli -e"SELECT dbname,tbname FROM gbase.table_distribution where dbname not in ('information_schema','performance_schema','gbase','gctmpdb','gclusterdb')" > tb.list
child() {
local dbname=$1 tbname=$2 suffix=$3 avg_sum=$4
local mulu="${GBASE_BASE}/userdata/gbase/${dbname}/sys_tablespace/${tbname}_${suffix}"
[ ! -d "$mulu" ] && { echo "Error: Directory $mulu not found"; return 1; }
local avg_extents=$(find "$mulu" -type f -exec filefrag -v {} ; 2>/dev/null |
grep "extent" | awk '{sum+=$2} END {print (NR>0)? sum/NR : 0}')
if (( $(echo "$avg_extents > $avg_sum" | bc -l) )); then
touch "`pwd`/log/${dbname}.${tbname}"
fi
}
tmp_fifofile="/tmp/$$_`date +%N`.fifo"
mkfifo $tmp_fifofile
exec 6<>$tmp_fifofile
rm -rf $tmp_filofile
for i in `seq 1 ${threads_num}`
do
echo
done>&6
while read -r db table; do
read -u6
{
child ${db} ${table} ${suffix} ${avg_sum}
echo >&6
}&
done < tb.list
wait
exec 6>&-
原文链接:www.gbase.cn/community/p…
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。