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 "===== 单表备份全部完成 ====="