# 检查备份文件是否存在 if [ ! -f "$RESTORE_FILE" ]; then echo"错误:恢复文件不存在:$RESTORE_FILE" exit 1 fi
# 提取文件名(不含路径) FILENAME=$(basename"$RESTORE_FILE")
# 检查文件是否为 .gz 压缩格式 if [[ "$FILENAME" == *.gz ]]; then echo"检测到压缩文件,开始解压..." UNZIPPED_FILE="$TEMP_DIR/${FILENAME%.gz}"# 移除 .gz 后缀 # 解压文件 gunzip -c "$RESTORE_FILE" > "$UNZIPPED_FILE" if [ $? -ne 0 ]; then echo"错误:解压文件失败!" exit 1 fi echo"文件已解压至:$UNZIPPED_FILE" else # 如果不是压缩文件,直接使用原文件 UNZIPPED_FILE="$RESTORE_FILE" fi
# 检查目标数据库是否已存在 echo"检查数据库 '$DB_NAME' 是否存在..." if psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -lqt | cut -d \| -f 1 | grep -qw "$DB_NAME"; then echo"数据库 '$DB_NAME' 已存在,将清空数据库并继续恢复操作..." # 清空数据库(危险操作!) PGPASSWORD="$DB_PASS" psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -c " BEGIN; -- 关闭所有连接(避免锁表) SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '$DB_NAME' AND pid <> pg_backend_pid(); -- 清空所有模式下的对象(注意:会删除所有数据!) DROP SCHEMA public CASCADE; CREATE SCHEMA public; GRANT ALL ON SCHEMA public TO public; GRANT ALL ON SCHEMA public TO $DB_USER; COMMIT; " if [ $? -ne 0 ]; then echo"错误:清空数据库失败!" exit 1 fi else echo"数据库 '$DB_NAME' 不存在,将创建新数据库..." # 创建新数据库 PGPASSWORD="$DB_PASS" createdb -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER""$DB_NAME" if [ $? -ne 0 ]; then echo"错误:创建数据库失败!" exit 1 fi fi