回滚到 Nexus 3.76

Deprecated: Nexus 3.81 (nexus-ce-operator v3.81.1 and v3.81.2)

由于 Nexus 3.81 Community Edition 的限制性限制,该版本已被弃用。一旦使用达到配额限制(总组件数 100,000 和每天请求数 200,000),实例将无法正常运行。

如果您已经升级到版本 3.81,请按照本指南降级到版本 3.76。

有关 Community Edition 限制的更多信息,请参见 Community Edition Limitations

备份 Nexus 3.81 数据

请按照如何使用 Nexus 备份和恢复部分备份您的数据。

部署 Nexus 3.76.z 实例

部署 Nexus 3.76.z 实例时,请确保指定版本并根据需要配置存储、nodePort 和管理员账户。详细操作请参考Nexus 实例部署

回滚数据库

下载 H2 数据库 JAR 文件:

wget https://repo1.maven.org/maven2/com/h2database/h2/2.2.224/h2-2.2.224.jar -O h2.jar

解压 H2 数据库备份文件:

unzip nexus-backup/restore-from-backup/nexus-*.zip -d /tmp/nexus-restore

执行脚本将数据库回滚到版本 2.10(对应 Nexus 3.76):

cat > rollback_db_to_3.76.sh << 'EOF'
#!/bin/bash
# 自动将 Nexus H2 数据库回滚到 flyway_schema_history 版本 2.10(无需确认)

# 用法: ./rollback_db_to_3.76.sh <db_path> <h2_jar_path>
# 示例: ./rollback_db_to_3.76.sh ./nexus ./h2.jar

set -e

# 检查是否提供了必要参数
if [ $# -ne 2 ]; then
    echo "用法: $0 <db_path> <h2_jar_path>"
    echo "示例: $0 ./nexus ./h2.jar"
    echo ""
    echo "参数说明:"
    echo "  db_path      - H2 数据库路径(不含 .mv.db 扩展名)"
    echo "  h2_jar_path  - H2 JAR 文件路径"
    exit 1
fi

DB_PATH="$1"
H2_JAR="$2"

# 验证 H2 JAR 文件是否存在
if [ ! -f "$H2_JAR" ]; then
    echo "错误: 未找到 H2 JAR 文件: $H2_JAR"
    exit 1
fi

# 验证数据库文件是否存在
if [ ! -f "${DB_PATH}.mv.db" ]; then
    echo "错误: 未找到数据库文件: ${DB_PATH}.mv.db"
    exit 1
fi

echo "================================"
echo "开始回滚到版本 2.10"
echo "================================"
echo "数据库文件: ${DB_PATH}.mv.db"
echo "H2 JAR 文件: $H2_JAR"
echo ""

# 备份数据库文件
cp "${DB_PATH}.mv.db" "${DB_PATH}.mv.db.backup-$(date +%Y%m%d%H%M%S)"
echo "已创建备份: ${DB_PATH}.mv.db.backup-*"

# 1. 检查当前版本
echo "当前版本:"
java -cp "$H2_JAR" org.h2.tools.Shell -url "jdbc:h2:$DB_PATH" -user "" -password "" -sql 'SELECT "version", "description" FROM "flyway_schema_history" WHERE "version" IS NOT NULL ORDER BY "installed_rank" DESC LIMIT 1;'

# 2. 统计将被删除的记录数
echo ""
echo "将删除的迁移记录(installed_rank > 49):"
RECORDS_COUNT=$(java -cp "$H2_JAR" org.h2.tools.Shell -url "jdbc:h2:$DB_PATH" -user "" -password "" -sql 'SELECT COUNT(*) FROM "flyway_schema_history" WHERE "installed_rank" > 49;' | grep -E "^[0-9]+$" | head -1)
echo "待删除记录总数: $RECORDS_COUNT"

# 3. 显示将被删除的详细记录
echo ""
echo "详细记录:"
java -cp "$H2_JAR" org.h2.tools.Shell -url "jdbc:h2:$DB_PATH" -user "" -password "" -sql 'SELECT "installed_rank", "version", "description" FROM "flyway_schema_history" WHERE "installed_rank" > 49 ORDER BY "installed_rank" ASC;'

# 4. 执行删除操作
echo ""
echo "正在删除记录..."
java -cp "$H2_JAR" org.h2.tools.Shell -url "jdbc:h2:$DB_PATH" -user "" -password "" -sql 'DELETE FROM "flyway_schema_history" WHERE "installed_rank" > 49;'

# 5. 验证结果
echo ""
echo "================================"
echo "回滚完成!"
echo "================================"
echo ""
echo "当前版本:"
java -cp "$H2_JAR" org.h2.tools.Shell -url "jdbc:h2:$DB_PATH" -user "" -password "" -sql 'SELECT "version", "description", "installed_on" FROM "flyway_schema_history" WHERE "version" IS NOT NULL ORDER BY "installed_rank" DESC LIMIT 1;'

echo ""
echo "剩余迁移记录数:"
java -cp "$H2_JAR" org.h2.tools.Shell -url "jdbc:h2:$DB_PATH" -user "" -password "" -sql 'SELECT COUNT(*) as total_records FROM "flyway_schema_history";'

echo ""
echo "================================"
echo "重要提示:"
echo "1. ✅ flyway_schema_history 表已回滚至 2.10"
echo "2. ⚠️  请确保将回滚后的数据库文件恢复到您的 Nexus 3.76 实例中。"
echo "================================"
EOF

chmod +x rollback_db_to_3.76.sh
./rollback_db_to_3.76.sh /tmp/nexus-restore/nexus ./h2.jar
mkdir -p /tmp/nexus-restore/rolledback
cp /tmp/nexus-restore/nexus.mv.db /tmp/nexus-restore/rolledback/nexus.mv.db

恢复数据到 Nexus 3.76

Important

恢复数据时,请确保使用上一步回滚后的数据库文件:/tmp/nexus-restore/rolledback/nexus.mv.db

kubectl -n <nexus-namespace> cp /tmp/nexus-restore/rolledback/nexus.mv.db <pod-name>:/nexus-data/db/nexus.mv.db

完整恢复操作请参考如何使用 Nexus 备份和恢复部分。

故障排除

如果恢复过程中出现错误导致新实例无法启动,请彻底清理新实例,然后重新从头开始恢复操作。