如何编写Shell脚本自动查找符合命名规范的空Hive数据库
Hive空数据库自动识别Shell脚本实现方案
前置要求
- 运行环境已配置可用Hive客户端,可正常执行
hive -e命令 - 脚本执行用户拥有所有目标Hive数据库的元数据查询权限
完整可运行脚本
#!/bin/bash # -------------------------- 配置项 请按需修改 -------------------------- # 固定的environment字段值 ENVIRONMENT="your_env_value" # 固定的area字段值 AREA="your_area_value" # 输出结果文件路径,默认当前目录带日期后缀 OUTPUT_FILE="./empty_hive_dbs_$(date +%Y%m%d).txt" # ---------------------------------------------------------------------- # 初始化输出文件 > ${OUTPUT_FILE} echo ">>> 开始扫描符合 ${ENVIRONMENT}_${AREA}_* 命名规则的Hive数据库" # 获取所有匹配命名规则的数据库,过滤Hive执行日志干扰 db_list=$(hive -e "show databases;" 2>/dev/null | grep -v -E "WARN|INFO|Logging initialized|Time taken|OK" | grep "^${ENVIRONMENT}_${AREA}_") if [ -z "${db_list}" ]; then echo "未找到符合命名规则的数据库,脚本退出" exit 0 fi total_db_num=$(echo "${db_list}" | wc -l) echo "共匹配到 ${total_db_num} 个目标数据库,开始逐一校验..." current_idx=0 empty_db_num=0 for db_name in ${db_list} do current_idx=$((current_idx+1)) echo "正在校验 ${current_idx}/${total_db_num}:${db_name}" # 统计数据库内表数量,过滤日志后计数 table_num=$(hive -e "use ${db_name}; show tables;" 2>/dev/null | grep -v -E "WARN|INFO|Logging initialized|Time taken|OK" | wc -l) if [ ${table_num} -eq 0 ]; then echo "${db_name} 为空数据库,已记录" # 如需直接生成可执行的DROP语句,注释下行,打开下下行即可 echo "${db_name}" >> ${OUTPUT_FILE} # echo "DROP DATABASE \`${db_name}\`;" >> ${OUTPUT_FILE} empty_db_num=$((empty_db_num+1)) fi done echo ">>> 扫描完成,共找到 ${empty_db_num} 个空数据库,结果已保存至 ${OUTPUT_FILE}"
使用步骤
- 将上述脚本内容保存为
find_empty_hive_dbs.sh - 修改脚本开头
ENVIRONMENT和AREA两个配置项为你实际的固定字段值 - 给脚本赋予执行权限:
chmod +x find_empty_hive_dbs.sh - 执行脚本:
./find_empty_hive_dbs.sh - 执行结束后,当前目录生成的txt文件即为空数据库列表
注意事项
- 若Hive集群开启Kerberos认证,需在脚本开头配置段后添加kinit认证命令,示例:
kinit -kt /path/to/your/user.keytab your_username@YOUR_REALM.COM - 若目标数据库数量较多,建议后台执行避免SSH断开:
nohup ./find_empty_hive_dbs.sh & - 首次使用建议先修改配置项匹配1-2个已知空库、非空库测试校验逻辑准确性,再全量执行
内容的提问来源于stack exchange,提问作者Gdata0data0
相关产品推荐
相关产品推荐

