在 MySQL 中使用 mysqldump进行备份时,默认情况下会锁定表以确保数据一致性,但这可能影响生产环境的读写操作。以下是 不锁表(或最小化锁表) 的备份方法及详细说明:
--single-transaction+ --skip-lock-tablesmysqldump -u [用户名] -p[密码] \
--single-transaction \ # 启用事务隔离
--skip-lock-tables \ # 不锁定表(可选)
--master-data=2 \ # 记录二进制日志位置(主从复制用)
--routines \ # 备份存储过程和函数
--triggers \ # 备份触发器
--events \ # 备份事件
[数据库名] > backup.sql关键参数:
--single-transaction:
在事务内执行备份,仅对 InnoDB 表有效,备份期间其他会话可正常读写。
START TRANSACTION WITH CONSISTENT SNAPSHOT获取一致性视图。--skip-lock-tables:
跳过锁表操作,但可能导致非 InnoDB 表(如 MyISAM)数据不一致。mysqldump -u [用户名] -p[密码] \
--single-transaction \
[数据库名] [表1] [表2] > backup.sql--quick+ --skip-add-locksmysqldump -u [用户名] -p[密码] \
--quick \ # 逐行读取,减少内存占用
--skip-add-locks \ # 跳过 LOCK TABLES 语句
[数据库名] > backup.sqlmydumper工具(替代方案)mydumper是高性能备份工具,支持多线程且默认不锁表:
mydumper -u [用户名] -p [密码] \
--trx-consistency-only \ # 类似 --single-transaction
--outputdir /backup/pathmysqldump更快,支持并行备份。--single-transaction仅适用于 InnoDB,对 MyISAM 表无效(仍需锁表)。--lock-tables=false+ --skip-lock-tables。--master-data=2记录 binlog位置,便于恢复后同步。--quick避免一次性加载全部数据到内存。#!/bin/bash
# 定义变量
DB_USER="root"
DB_PASS="your_password"
DB_NAME="your_database"
BACKUP_DIR="/backup/mysql"
DATE=$(date +%Y%m%d)
# 创建备份目录
mkdir -p $BACKUP_DIR
# 执行不锁表备份
mysqldump -u$DB_USER -p$DB_PASS \
--single-transaction \
--skip-lock-tables \
--master-data=2 \
--routines \
--triggers \
--events \
$DB_NAME > $BACKUP_DIR/${DB_NAME}_${DATE}.sql
# 压缩备份文件
gzip $BACKUP_DIR/${DB_NAME}_${DATE}.sql
# 保留最近7天备份
find $BACKUP_DIR -type f -name "*.gz" -mtime +7 -delete没有搜到相关的沙龙