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,关闭则为 falseMYSQL_SOCKET="/usr/local/mysql/temp/mysql.sock"# 备份根目录BACKUP_ROOT="mysql-backup"# ===============================================================# 检查参数if [ $# -ne 2 ]; then echo "用法: $0 <数据库名> <表名>" echo "示例: $0 test_db user_table" exit 1fi# 接收参数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 1fi# 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 1filog "[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}" fielse log "[ERROR] 备份失败!查看日志:${LOG_FILE}" exit 1filog "===== 单表备份全部完成 ====="
对MySQL数据库而言,备份是保证数据安全与可恢复性的关键举措。不同业务规模、数据重要程度及恢复需求要求选择各异备份方案。以下归纳了四种常见MySQL表备份方法,覆盖从简易命令行到二进制日志等不同场景。
mysqldump为MySQL内置命令行工具,可将数据库中表结构与数据输出为SQL文件。该方式无需中断数据库服务,在线即可执行,操作简洁,因此广泛用于中小型数据库。
命令格式:
mysqldump -u用户名 -p密码 数据库名 表名> 导出的文件名.sql
命令解释:
-u用户名:指定连接MySQL的用户名。-p密码:指定用户密码,若密码较长可暂不输入,运行后手动键入。数据库名:待备份的数据库名称。表名:目标备份的表名称。> 导出的文件名.sql:将备份结果写入指定SQL文件。优点:
缺点:
适用场景:
MySQL Workbench是官方提供的图形化管理工具,界面直观,尤其适合不熟悉命令行的用户。通过该工具可选定具体库或表进行备份。
备份步骤:
优点:
缺点:
适用场景:
SELECT INTO OUTFILE通过SQL语句直接将表数据导出到文件,可控制格式与路径,但仅导出数据,不包含表结构。
语法格式:
SELECT * INTO OUTFILE '/path/to/file.csv'FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY ''FROM 表名;
命令解释:
OUTFILE '/path/to/file.csv':指定导出文件路径及名称。FIELDS TERMINATED BY ',':定义字段分隔符,此处为逗号。OPTIONALLY ENCLOSED BY '"':可选字段用双引号包围。LINES TERMINATED BY ' ':记录间分隔符,这里为换行符。FROM 表名:指定待备份的表。优点:
缺点:
适用场景:
二进制日志(Binary Log)记录所有修改数据库的SQL操作,通过回放这些日志可实现数据恢复。此方式属于增量备份,尤其适用于大型库及高频率备份场景。
启用二进制日志:
在MySQL配置my.cnf中添加以下行以启用:
log-bin=/var/log/mysql/mysql-bin.log
保存后重启MySQL服务使生效。
备份步骤:
cp /var/log/mysql/mysql-bin.* /path/to/backup/mysqlbinlog /path/to/mysql-bin.000001 | mysql -u用户名 -p密码优点:
缺点:
适用场景:
实际运维或开发中,经常只需备份某几张表而非全库,以节省空间或提升效率。以下是几种主流备份方式:
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 usersINTO OUTFILE '/tmp/users.csv'FIELDS TERMINATED BY ',' ENCLOSED BY '"'LINES TERMINATED BY 'n';
注意:
FILE 权限。mysql 用户可写。LOAD DATA INFILE。3. 使用 MySQL Workbench(图形化)
适合少量操作或开发环境。
.sql、.csv 等)和导出路径。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/bashDB="mydb"TABLES="users orders products"for t in $TABLES; do mysqldump -u root -p$PASS $DB $t > ${t}.sqldone
MySQL的备份方法丰富多样,各有优劣。针对中小型数据库,mysqldump与MySQL Workbench操作简单且支持结构与数据同步备份;若仅需数据导出分析,SELECT INTO OUTFILE颇为适用;而大型库或实时备份场景,Binary Log增量备份则是高效之选。
总而言之,应根据业务规模、数据价值及恢复时效要求选择最匹配的备份策略,并定期开展备份有效性检验,从而筑牢数据安全防线。