Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL备份指定表

MySQL备份指定表的常见方法总结

作者:Oneslide

MySQL备份是数据库管理的核心环节之一,通过备份能够有效地防止数据丢失,确保数据的安全和恢复能力,下面我们就来看看如何使用MySQL备份指定表吧

MySQL备份是数据库管理的核心环节之一,通过备份能够有效地防止数据丢失,确保数据的安全和恢复能力。备份的方式多种多样,可以根据业务规模、数据的重要性和恢复时间要求来选择合适的备份方案

mysql备份指定表

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

MySQL备份表的四种方式

MySQL备份是数据库管理的核心环节之一,通过备份能够有效地防止数据丢失,确保数据的安全和恢复能力。备份的方式多种多样,可以根据业务规模、数据的重要性和恢复时间要求来选择合适的备份方案。以下是四种常见的MySQL备份表的方式,涵盖从简单的命令行工具到复杂的二进制日志备份,供不同场景下使用。

1. 使用mysqldump工具进行备份

mysqldump是MySQL自带的命令行工具,允许用户将数据库中的表结构和数据导出为SQL文件。mysqldump的备份方式简单直接,无需停止数据库服务,能够在数据库正常运行时备份数据,因而广泛应用于小型和中型数据库的备份。

命令格式:

mysqldump -u用户名 -p密码 数据库名 表名> 导出的文件名.sql

命令解释:

优点:

缺点:

适用场景:

2. 使用MySQL Workbench工具备份

MySQL Workbench是一款官方提供的图形化管理工具,提供了友好的用户界面,使得数据库管理更加直观,尤其适合不熟悉命令行操作的用户。通过MySQL Workbench,用户可以选择具体的数据库或表进行备份。

备份步骤:

  1. 打开MySQL Workbench,连接到数据库服务器。
  2. 在菜单中选择“Server” -> “Data Export”。
  3. 选择要备份的数据库或表,并选择备份位置。
  4. 点击“Start Export”开始备份。

优点:

缺点:

适用场景:

3. 使用SELECT INTO OUTFILE语句进行备份

SELECT INTO OUTFILE是通过SQL语句直接将表中的数据导出到文件中。这种备份方式相对灵活,用户可以控制导出数据的格式、路径等,但只能备份数据部分,无法导出表结构信息。

语法格式:

SELECT * INTO OUTFILE '/path/to/file.csv'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' 
LINES TERMINATED BY '
'
FROM 表名;

命令解释:

优点:

缺点:

适用场景:

4. 使用Binary Log备份

二进制日志(Binary Log)是MySQL记录所有对数据库进行修改的SQL语句的日志文件,通过回放这些日志可以实现数据恢复。使用二进制日志进行备份是一种增量备份方式,特别适合大型数据库和需要高频率备份的场景。

启用二进制日志:

在MySQL配置文件my.cnf中,添加以下行以启用二进制日志:

log-bin=/var/log/mysql/mysql-bin.log

保存后,重启MySQL服务使配置生效。

备份步骤:

优点:

缺点:

适用场景:

知识扩展

在实际运维或开发中,有时只需备份数据库中的某几张表(而非整个库),以节省空间或提高效率。以下是几种主流的备份方式:

1. 使用 mysqldump 工具(最常用)

mysqldump 是 MySQL 官方自带的逻辑备份工具,可以灵活指定库和表。

备份单张表(结构+数据)

mysqldump -u 用户名 -p 数据库名 表名 > 表名.sql

示例:备份 mydb 库中的 users 表

mysqldump -u root -p mydb users > users_backup.sql

备份多张指定表

mysqldump -u root -p mydb users orders products > multi_tables.sql

只备份表结构(不含数据)

mysqldump -u root -p --no-data mydb users > users_structure.sql

只备份数据(不含结构)

mysqldump -u root -p --no-create-info mydb users > users_data.sql

恢复备份(直接导入)

mysql -u root -p mydb < users_backup.sql

2. 使用 SELECT INTO OUTFILE 导出为文本文件

适合将表数据导出为 CSV 或 TSV 格式,仅数据,不含结构

-- 导出为 CSV(逗号分隔,字段可选引号)
SELECT * FROM users
INTO OUTFILE '/tmp/users.csv'
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n';

注意

3. 使用 MySQL Workbench(图形化)

适合少量操作或开发环境。

4. 使用 mysqlpump(MySQL 5.7+ 引入)

mysqlpump 支持并行导出,语法与 mysqldump 类似,也可指定表。

mysqlpump -u root -p mydb users > users.sql

5. 使用 pt-dump(Percona Toolkit)

Percona Toolkit 中的 pt-dump 功能更强,支持过滤表、正则匹配等。

pt-dump --user=root --password=xxx --database=mydb --tables='users,orders' > backup.sql

6. 使用存储过程或脚本循环备份

如果需要批量备份多张表(例如按表名前缀),可写一个脚本循环执行 mysqldump

Bash 示例

#!/bin/bash
DB="mydb"
TABLES="users orders products"
for t in $TABLES; do
    mysqldump -u root -p$PASS $DB $t > ${t}.sql
done

总结

MySQL的备份方式多种多样,不同的备份方式各有优缺点。对于中小型数据库,mysqldump和MySQL Workbench工具较为合适,操作简便,且支持表结构和数据的备份。对于只需要数据导出分析的情况,可以使用SELECT INTO OUTFILE语句。而对于大型数据库和实时备份的需求,Binary Log增量备份是一种高效的解决方案。

在实际应用中,应根据业务的规模、数据的重要性和恢复时间的需求选择合适的备份方式。同时,定期测试备份的有效性是确保数据安全的关键环节。

到此这篇关于MySQL备份指定表的常见方法总结的文章就介绍到这了,更多相关MySQL备份指定表内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文