PG导出数据库脚本

工作 · 30 天前
#!/bin/bash
# PostgreSQL 交互式数据库导出脚本
# 使用方式: ./export_db.sh

# 定义颜色代码
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # 恢复默认颜色

# 打印带颜色的状态消息
function echo_status() {
  echo -e "${YELLOW}[*] $1${NC}"
}

function echo_success() {
  echo -e "${GREEN}[√] $1${NC}"
}

function echo_error() {
  echo -e "${RED}[x] $1${NC}" >&2
}

# 清除敏感信息
function cleanup() {
  unset PGPASSWORD
  echo_status "已清除数据库凭据"
}

# 捕获退出信号
trap cleanup EXIT

# 交互式输入参数
echo_status "开始配置数据库导出参数"
read -p "请输入数据库主机 [默认 localhost]: " DB_HOST
DB_HOST=${DB_HOST:-localhost}

read -p "请输入数据库端口 [默认 5432]: " DB_PORT
DB_PORT=${DB_PORT:-5432}

while [[ -z "$DB_NAME" ]]; do
  read -p "请输入数据库名称 (必填): " DB_NAME
  [[ -z "$DB_NAME" ]] && echo_error "数据库名称不能为空!"
done

while [[ -z "$DB_USER" ]]; do
  read -p "请输入用户名 (必填): " DB_USER
  [[ -z "$DB_USER" ]] && echo_error "用户名不能为空!"
done

while [[ -z "$DB_PASS" ]]; do
  read -s -p "请输入密码 (输入不可见): " DB_PASS
  echo
  [[ -z "$DB_PASS" ]] && echo_error "密码不能为空!"
done

read -p "请输入导出目录 (绝对路径): " EXPORT_DIR
while [[ ! -d "$EXPORT_DIR" ]]; do
  read -p "目录不存在,是否要创建? [y/n]: " CREATE_DIR
  if [[ $CREATE_DIR =~ ^[Yy]$ ]]; then
    mkdir -p "$EXPORT_DIR" || {
      echo_error "目录创建失败,请检查权限!"
      exit 1
    }
    echo_success "目录已创建: $EXPORT_DIR"
    break
  else
    read -p "请重新输入有效目录: " EXPORT_DIR
  fi
done

# 选择压缩方式
read -p "是否压缩备份文件? [y/n, 默认 y]: " USE_COMPRESS
USE_COMPRESS=${USE_COMPRESS:-y}

# 生成文件名
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
FILENAME="${DB_NAME}_${TIMESTAMP}"

if [[ $USE_COMPRESS =~ ^[Yy]$ ]]; then
  FILENAME="$FILENAME.sql.gz"
  COMPRESS_CMD=" | gzip"
else
  FILENAME="$FILENAME.sql"
  COMPRESS_CMD=""
fi

FULL_PATH="$EXPORT_DIR/$FILENAME"

# 确认信息
echo -e "\n${YELLOW}======== 导出配置确认 ========${NC}"
echo "主机:        $DB_HOST"
echo "端口:        $DB_PORT"
echo "数据库:      $DB_NAME"
echo "用户名:      $DB_USER"
echo "导出路径:    $FULL_PATH"
echo "压缩:        $([[ $USE_COMPRESS =~ ^[Yy]$ ]] && echo "是" || echo "否")"
echo -e "${YELLOW}==============================${NC}"

read -p "确认开始导出? [y/n]: " CONFIRM
[[ ! $CONFIRM =~ ^[Yy]$ ]] && {
  echo_status "导出已取消"
  exit 0
}

# 执行导出命令
echo_status "开始导出数据库..."
export PGPASSWORD="$DB_PASS"

if eval "pg_dump -h '$DB_HOST' -p '$DB_PORT' -U '$DB_USER' -d '$DB_NAME' $COMPRESS_CMD > '$FULL_PATH'"; then
  echo_success "导出成功!文件保存在: ${FULL_PATH}"
  echo_success "文件大小: $(du -h "$FULL_PATH" | cut -f1)"
else
  echo_error "导出失败!错误码: $?"
  # 删除不完整文件
  [[ -f "$FULL_PATH" ]] && rm -f "$FULL_PATH"
  exit 1
fi

# 清理环境变量
unset PGPASSWORD
exit 0
pg
Theme Jasmine by Kent Liao