mysql备份指定表

bash 复制代码
#!/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 "===== 单表备份全部完成 ====="
相关推荐
凤山老林24 分钟前
Spring Boot 3.x AOT 编译实战:从原理、踩坑到生产落地
java·spring boot·后端
博傅36 分钟前
Spring 核心原理
java·后端·spring
用户938515635071 小时前
掘金风格后端数据库设计实战:从用户表到分布式架构,一文搞定
后端·sql
拾光师1 小时前
Hadoop 三种运行模式:从单机调试到生产集群,一路搭过来
后端
进阶的小名2 小时前
Spring AI 2.0 探索:多 OpenAI-Compatible 模型接入,以及下一代 Session 记忆管理
java·人工智能·后端·gpt·spring·ai·chatgpt
卷无止境2 小时前
FastAPI 的 Metadata 到底是什么,又牵动了哪些核心概念
后端·python
卷无止境2 小时前
FastAPI 调试实战,从断点到生产环境的排错心法
后端·python
敢敢のwings2 小时前
智元 GO-2 与 AgiBot-World 深度解读
开发语言·后端·golang
考虑考虑3 小时前
Java三元表达式注意
java·后端·java ee
stark张宇3 小时前
Go语言runtime全景图:从编译到GC,带你彻底吃透Go的底层血脉
后端·go