hive表元数据修复脚本

背景:由于历史问题,之前有些业务使用hive表数据,直接通过脚本将表数据目录整体移走,导致元数据一直存在,随着时间增长,impala每次写入数据后,刷新元数据,随着元数据越来越多,加载catalog的内存就会oom,之前历史任务都是连接在同一台的impala上,连接impala执行刷新分区的连接线程一直closdwait,链接不中断,导致连接数越来越多,不释放,任务资源不释放,集群资源占满,任务都在pending,通过执行drop partition命令会报错分区目录不存在,针对这些历史表,在之前移动完分区后,同时执行下面删除元数据脚本可以避免元数据过大的问题

查看所有表分区总数命令

 select  count(*) sum ,TBL_NAME  FROM PARTITION_PARAMS par_params join 
	 (
	 select 
     par.PART_ID,
	 TBL_NAME
     FROM 
	 TBLS tbl join PARTITIONS par on tbl.tbl_id = par.tbl_id 
	 ) t on par_params.PART_ID=t.PART_ID group by   TBL_NAME order by sum desc 
#!/bin/bash
set -e  # 开启“出错即退出”模式(可选,增强安全性)

# -------------------------- 1. 交互式输入 --------------------------
# 静默输入MySQL密码(安全,不显示在终端)
read -s -p "请输入Hive元数据库(hive)的密码: " MYSQL_PASS
echo  # 换行
 

# 输入要删除的分区day值(如:20231218,对应PART_NAME中的day=20231218)
read -p "请输入要删除的分区day值(会删除PART_NAME包含'day=$DAY'的记录): " DAY
[ -z "$DAY" ] && {
   
    echo "错误:DAY不能为空!"; exit 1; }

# 输入目标表名(如:ads.dec_g_cdr )
read -p "请输入要操作的Hive表名(格式:库名.表名): " TABLE_NAME
[ -z 
<think> 嗯,用户现在是想了解Hive表数据恢复的方法。之前的历史对话中,用户已经提到了星环Inceptor的闪回功能,但这次明确转向了Hive的场景。看来用户可能遇到了实际的数据误删问题需要解决。 用户提供的三个引用很有价值: 第一个引用展示了用户实操时误用TRUNCATE命令清空了test1表,这是典型的生产事故场景[^1]。第二个引用给出了普通表和分区表的重建示例[^2],第三个引用则提到通过MSCK REPAIR修复分区表以及重建外部表的操作[^3]。这些线索说明用户需要的是操作层面的具体指导,而不是理论说明。 考虑到Hive本身没有内置闪回功能这点必须强调,避免用户产生误解。应该分场景给出方案: 1. 对于TRUNCATE场景,HDFS回收站是首选方案,但需要确认回收站是否开启以及保留周期。要提醒用户回收站默认关闭。2. 对于DROP TABLE场景,如果是外部表只需重建表结构就可以恢复数据。3. 对于分区表要特别说明MSCK REPAIR的重要性。 用户可能没意识到备份策略的关键性,这点需要补充说明。另外运维规范建议也很实用,比如回收站配置参数和权限控制,这些都能避免未来再次发生类似问题。 注意到用户引用的案例中有使用JDBC连接Hive的操作记录,说明可能是开发或运维人员。回复时要侧重命令行操作而非界面操作,分区表恢复的部分要详细说明,因为其分区目录的特性容易导致恢复不完整。 最后生成的问题很有必要:回收站机制和分区表恢复是高频痛点,时间点恢复则是用户可能存在的进阶需求——虽然Hive原生不支持,但可以介绍通过快照技术的变通方案。 </think> 根据引用内容及Hive特性,以下是完整的表数据恢复方案,分为不同场景处理: --- ### 一、不同删除场景的恢复方法 #### 1. **TRUNCATE 表恢复(引用[1]场景)** ```sql -- 1. 检查HDFS回收站(需开启回收站功能) hdfs dfs -ls /user/hive/.Trash/Current/warehouse/<db_name>/<table_name> -- 2. 从回收站恢复数据目录 hdfs dfs -mv /user/hive/.Trash/.../<table_path> /warehouse/<db>/<table> -- 3. 执行元数据修复 MSCK REPAIR TABLE <table_name>; -- 非分区表可跳过 ``` > **条件**:需满足 > (1) `fs.trash.interval > 0`(默认0关闭)[^1] > (2) 删除时间在回收站保留期内 #### 2. **DROP TABLE 恢复** ```sql -- 场景1:外部表(引用[3]) CREATE EXTERNAL TABLE <table_name> (...) LOCATION 'hdfs://原路径'; -- 重建表结构指向原数据位置[^3] -- 场景2:内部表(需回收站有数据) hdfs dfs -mv /Trash/.../table_path /warehouse/... -- 恢复数据 CREATE TABLE <table_name> (...); -- 重建同名表 MSCK REPAIR TABLE <table_name>; -- 刷新元数据 ``` #### 3. **分区数据误删** ```sql -- 1. 恢复分区目录到HDFS hdfs dfs -mv /Trash/.../partition_dir /warehouse/table/path/ -- 2. 执行分区修复(关键步骤!) MSCK REPAIR TABLE <table_name>; -- 自动识别新分区[^3] ``` --- ### 二、无回收站时的恢复方案 #### 1. **通过备份恢复** ```bash # 1. 查找备份文件(需提前存在) hdfs dfs -ls /backup/hive/<table_name> # 2. 还原数据到原位置 hdfs dfs -cp /backup/<table_path> /warehouse/... # 3. 重建表并修复 CREATE TABLE <table_name> (...); MSCK REPAIR TABLE <table_name>; ``` #### 2. **利用快照功能(HDFS高级特性)** ```bash # 1. 创建目录快照(需管理员操作) hdfs dfsadmin -allowSnapshot /warehouse/<table_path> hdfs dfs -createSnapshot /warehouse/<table_path> backup_v1 # 2. 从快照恢复 hdfs dfs -cp /warehouse/<table_path>/.snapshot/backup_v1/* /warehouse/<table_path> ``` --- ### 三、恢复成功率关键因素 | 影响因素 | 恢复可能性 | 说明 | |----------------|------------|--------------------------| | 回收站开启 | ★★★★★ | 必须设置`fs.trash.interval>0` | | 删除时间≤保留期 | ★★★★☆ | 默认保留周期6小时 | | 外部表 | ★★★★☆ | 数据独立存储 | | 有分区备份 | ★★★☆☆ | 可部分恢复 | | 无备份且回收站关闭 | ☆☆☆☆☆ | 极难恢复 | --- ### 四、永久性数据丢失的替代方案 1. **源系统重导** 协调业务系统重新生成数据文件 2. **增量补偿** 通过Binlog或CDC工具修补丢失时段的数据 3. **冷备恢复** 从离线磁带/NAS存储恢复历史副本 --- ### 五、运维规范建议 1. **必开配置** ```xml <!-- core-site.xml --> <property> <name>fs.trash.interval</name> <value>1440</value> <!-- 保留24小时(分钟) --> </property> ``` 2. **定期备份** ```bash # 每日全量备份脚本 hdfs dfs -cp -p /warehouse/<table> /backup/hive/$(date +%F) ``` 3. **权限控制** ```sql REVOKE DROP ON TABLE <table> FROM USER dev_user; -- 禁止开发执行DROP ``` > **注**:TRUNCATE/DROP操作前务必确认: > ```sql > SELECT * FROM <table> LIMIT 10; -- 二次校验表内容 > SHOW TBLPROPERTIES <table>; -- 确认表类型 > ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值