无法升级PostgreSQL中的Hive Metastore及修复方案咨询
解决Hive 2.3.2升级至3.1.3的Metastore Schema兼容问题及元数据修复方案
一、解决Schema升级表已存在的报错
1. 临时重命名冲突表
针对升级时提示已存在的表(如METASTORE_DB_PROPERTIES),不要直接删除,先重命名保留数据:
ALTER TABLE "METASTORE_DB_PROPERTIES" RENAME TO "METASTORE_DB_PROPERTIES_OLD";
再重新执行升级命令:
schematool -upgradeSchema -dbType postgres -verbose
升级完成后,确认新表数据正常即可删除旧表。
2. 校验并修改升级脚本
如果仍有其他表冲突,先通过dryRun查看升级脚本的执行逻辑:
schematool -upgradeSchema -dbType postgres -dryRun -verbose
找到报错的CREATE TABLE语句,打开Hive 3.1.3安装目录下对应版本的升级脚本(路径:scripts/metastore/upgrade/postgres/upgrade-2.3.0-to-3.0.0.postgres.sql),将CREATE TABLE修改为CREATE TABLE IF NOT EXISTS,仅改动冲突的语句,避免破坏其他逻辑。
3. 确保使用对应版本的schematool
注意报错中显示Hive版本为3.1.0,需确认使用的是3.1.3版本的schematool,执行时指定正确的HIVE_HOME:
export HIVE_HOME=/your/hive-3.1.3/path $HIVE_HOME/bin/schematool -upgradeSchema -dbType postgres -verbose
二、修复Metastore不一致状态
- 执行完整元数据校验:
schematool -validate -dbType postgres -verbose
根据校验结果处理失败项:若为版本不兼容,升级成功后VERSION表的SCHEMA_VERSION会自动更新;若为表结构不一致,对比Hive 3.1.3的基准schema脚本(scripts/metastore/upgrade/postgres/hive-schema-3.1.3.postgres.sql),手动修正字段、约束等。
- 修复分区关联:
如果存在分区元数据缺失,执行:
# 修复单表分区 MSCK REPAIR TABLE your_db.your_table; # 批量修复所有表分区(按需使用) MSCK REPAIR ALL TABLES;
三、Metastore备份与重新初始化
备份方式
1. 数据库级备份(推荐)
使用PostgreSQL自带工具备份整个元数据库:
# 普通备份 pg_dump -U hivesrv -d hive -f hive_metastore_backup.sql # 压缩备份 pg_dump -U hivesrv -d hive | gzip > hive_metastore_backup.sql.gz
2. Hive元数据导出
导出指定表或库的元数据(含分区)到HDFS:
# 导出单表 EXPORT TABLE your_db.your_table TO 'hdfs://your-cluster/path/to/export/your_table'; # 导出整个库 EXPORT DATABASE your_db TO 'hdfs://your-cluster/path/to/export/your_db';
重新初始化备份的Metastore
- 停止所有Hive服务,清空当前元数据库:
DROP DATABASE hive CASCADE; CREATE DATABASE hive; GRANT ALL PRIVILEGES ON DATABASE hive TO hivesrv;
- 恢复数据库备份:
psql -U hivesrv -d hive -f hive_metastore_backup.sql # 若为压缩备份 gzip -d hive_metastore_backup.sql.gz && psql -U hivesrv -d hive -f hive_metastore_backup.sql
- 启动Metastore服务即可,无需重新执行
initSchema(若为全新初始化则执行):
schematool -initSchema -dbType postgres -verbose
- 若使用Hive导出的元数据,通过IMPORT恢复:
# 恢复单表 IMPORT TABLE your_db.your_table FROM 'hdfs://your-cluster/path/to/export/your_table'; # 恢复整个库 IMPORT DATABASE your_db FROM 'hdfs://your-cluster/path/to/export/your_db';
参考错误信息
校验命令输出
schematool -validate -dbType postgres
Starting metastore validation Validating schema version Metastore schema version is not compatible. Hive Version: 3.1.0, Database Schema Version: 2.3.0 Failed in schema version validation. [FAIL] Validating sequence number for SEQUENCE_TABLE Succeeded in sequence number validation for SEQUENCE_TABLE. [SUCCESS] Validating metastore schema tables Succeeded in schema table validation. [SUCCESS] Validating DFS locations Succeeded in DFS location validation. [SUCCESS] Validating columns for incorrect NULL values. Succeeded in column validation for incorrect NULL values. [SUCCESS] Done with metastore validation: [FAIL]
升级命令输出
schematool -upgradeSchema -dbType postgres -verbose
Metastore connection URL: jdbc:postgresql://PostgreSQL-V1.hadoop.com/hive?useSSL= Metastore Connection Driver : org.postgresql.Driver Metastore connection User: hivesrv Starting upgrade metastore schema from version 2.3.0 to 3.1.0 Upgrade script upgrade-2.3.0-to-3.0.0.postgres.sql Connecting to jdbc:postgresql://PostgreSQL-V1.hadoop.com/hive?useSSL= Connected to: PostgreSQL (version 13.9) Driver: PostgreSQL Native Driver (version PostgreSQL 9.4.1208.jre7) Transaction isolation: TRANSACTION_READ_COMMITTED 0: jdbc:postgresql://PostgreSQL-V1> !autocommit on Autocommit status: true 0: jdbc:postgresql://PostgreSQL-V1> SELECT 'Upgrading MetaStore schema from 2.3.0 to 3.0.0' +-------------------------------------------------+ | ?column? | +-------------------------------------------------+ | Upgrading MetaStore schema from 2.3.0 to 3.0.0 | +-------------------------------------------------+ 1 row selected (0.042 seconds) 0: jdbc:postgresql://PostgreSQL-V1> CREATE TABLE "METASTORE_DB_PROPERTIES" ( "PROPERTY_KEY" VARCHAR(255) NOT NULL, "PROPERTY_VALUE" VARCHAR(1000) NOT NULL, "DESCRIPTION" VARCHAR(1000) ) Error: ERROR: relation "METASTORE_DB_PROPERTIES" already exists (state=42P07,code=0) Closing: 0: jdbc:postgresql://PostgreSQL-V1.hadoop.com/hive?useSSL= org.apache.hadoop.hive.metastore.HiveMetaException: Upgrade FAILED! Metastore state would be inconsistent !! Underlying cause: java.io.IOException : Schema script failed, errorcode 2 org.apache.hadoop.hive.metastore.HiveMetaException: Upgrade FAILED! Metastore state would be inconsistent !! at org.apache.hive.beeline.HiveSchemaTool.doUpgrade(HiveSchemaTool.java:553) at org.apache.hive.beeline.HiveSchemaTool.doUpgrade(HiveSchemaTool.java:517) at org.apache.hive.beeline.HiveSchemaTool.main(HiveSchemaTool.java:1512) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.hadoop.util.RunJar.run(RunJar.java:323) at org.apache.hadoop.util.RunJar.main(RunJar.java:236) Caused by: java.io.IOException: Schema script failed, errorcode 2 at org.apache.hive.beeline.HiveSchemaTool.runBeeLine(HiveSchemaTool.java:1226) at org.apache.hive.beeline.HiveSchemaTool.runBeeLine(HiveSchemaTool.java:1204) at org.apache.hive.beeline.HiveSchemaTool.doUpgrade(HiveSchemaTool.java:548) ... 8 more *** schemaTool failed ***
内容的提问来源于stack exchange,提问作者uds0128
相关产品推荐
相关产品推荐

