mysql备份指定表

23 阅读1分钟
#!/bin/bash

# ====================== 配置项(只改这里)======================
MYSQL_HOST="127.0.0.1"
MYSQL_PORT="3306"
MYSQL_USER="root"
MYSQL_PASS="your_pass_password"

# Socket 连接配置(可选)
CONN_SOCKET_ENABLED=true  # 开启则为 true,关闭则为 false
MYSQL_SOCKET="/usr/local/mysql/temp/mysql.sock"

# 备份根目录
BACKUP_ROOT="mysql-backup"
# ===============================================================

# 检查参数
if [ $# -ne 2 ]; then
    echo "用法: $0 <数据库名> <表名>"
    echo "示例: $0 test_db user_table"
    exit 1
fi

# 接收参数
DB_NAME="$1"
TABLE_NAME="$2"

# 备份目录 & 日志
BACKUP_DIR="${BACKUP_ROOT}/$(date +%Y%m%d_%H%M%S)_${DB_NAME}_${TABLE_NAME}"
LOG_FILE="${BACKUP_DIR}/backup.log"
mkdir -p "${BACKUP_DIR}"

# 日志函数
log() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "${LOG_FILE}"
}

log "===== 开始【无锁】单表备份 ====="
log "数据库:${DB_NAME}"
log "表名:${TABLE_NAME}"
log "备份目录:${BACKUP_DIR}"

# 构建 socket 参数(可选)
SOCKET_PARAM=""
if [ "${CONN_SOCKET_ENABLED}" = "true" ]; then
    SOCKET_PARAM="--socket=${MYSQL_SOCKET}"
    log "[INFO] 已启用 socket 连接:${MYSQL_SOCKET}"
fi

# 1. 检查数据库是否存在
DB_EXISTS=$(mysql -h"${MYSQL_HOST}" -P"${MYSQL_PORT}" -u"${MYSQL_USER}" -p"${MYSQL_PASS}" ${SOCKET_PARAM} \
-e "SHOW DATABASES LIKE '${DB_NAME}';" -sN 2>/dev/null)

if [ -z "${DB_EXISTS}" ]; then
    log "[ERROR] 数据库 ${DB_NAME} 不存在!"
    exit 1
fi

# 2. 检查表是否存在
TABLE_EXISTS=$(mysql -h"${MYSQL_HOST}" -P"${MYSQL_PORT}" -u"${MYSQL_USER}" -p"${MYSQL_PASS}" ${SOCKET_PARAM} \
-e "SHOW TABLES FROM \`${DB_NAME}\` LIKE '${TABLE_NAME}';" -sN 2>/dev/null)

if [ -z "${TABLE_EXISTS}" ]; then
    log "[ERROR] 表 ${DB_NAME}.${TABLE_NAME} 不存在!"
    exit 1
fi

log "[INFO] 库表验证通过,开始备份..."

# 3. 备份文件路径
BACKUP_FILE="${BACKUP_DIR}/${TABLE_NAME}.sql"

# 4. 执行【无锁】单表备份(已加入你要求的3个参数)
mysqldump \
    -h"${MYSQL_HOST}" \
    -P"${MYSQL_PORT}" \
    -u"${MYSQL_USER}" \
    -p"${MYSQL_PASS}" \
    ${SOCKET_PARAM} \
    --single-transaction \
    --lock-tables=FALSE \
    --add-locks=FALSE \
    --hex-blob \
    --opt \
    --set-gtid-purged=OFF \
    --default-character-set=utf8mb4 \
    "${DB_NAME}" "${TABLE_NAME}" > "${BACKUP_FILE}" 2>> "${LOG_FILE}"

# 5. 检查备份结果
if [ $? -eq 0 ]; then
    FILE_SIZE=$(stat -c%s "${BACKUP_FILE}" 2>/dev/null || stat -f%z "${BACKUP_FILE}")
    if [ "${FILE_SIZE}" -lt 100 ]; then
        log "[WARN] 备份完成,但文件过小(可能是空表):${FILE_SIZE} 字节"
    else
        log "[SUCCESS] 无锁备份成功!文件大小:${FILE_SIZE} 字节"
        log "[SUCCESS] 备份文件:${BACKUP_FILE}"
    fi
else
    log "[ERROR] 备份失败!查看日志:${LOG_FILE}"
    exit 1
fi

log "===== 单表备份全部完成 ====="