MySQL数据库备份和恢复,mysqldump完整教程
前言
数据库备份是每个站长的基本功。MySQL最常用的备份工具就是mysqldump,简单好用。本文讲怎么用mysqldump备份和恢复数据库,包括完整命令和常见坑。
一、mysqldump是什么
mysqldump是MySQL自带的备份工具,把数据库导出成SQL文件,需要的时候再导入回去。
特点:
- 免费,MySQL自带
- 导出的是SQL文本,方便查看和编辑
- 适合小数据库(几十G以内)
二、备份数据库
备份单个数据库
mysqldump -u用户名 -p密码 数据库名 > 备份文件.sql
例子:
mysqldump -uroot -p123456 test > test.sql
注意: -p和密码之间没有空格。
备份多个数据库
mysqldump -uroot -p123456 --databases db1 db2 db3 > dbs.sql
备份所有数据库
mysqldump -uroot -p123456 --all-databases > all.sql
备份单个表
mysqldump -uroot -p123456 test users > users.sql
备份多个表
mysqldump -uroot -p123456 test users orders > tables.sql
三、常用参数
带删除表语句(--add-drop-table)
导出的SQL里会有 DROP TABLE IF EXISTS,恢复的时候先删表再建表。
mysqldump -uroot -p123456 --add-drop-table test > test.sql
默认就是开的。
不带建表语句(--no-create-info)
只导数据,不导表结构。
mysqldump -uroot -p123456 --no-create-info test > data.sql
只导表结构(--no-data)
只导表结构,不导数据。
mysqldump -uroot -p123456 --no-data test > structure.sql
压缩备份
mysqldump -uroot -p123456 test | gzip > test.sql.gz
解压:
gunzip test.sql.gz
指定端口
mysqldump -uroot -p123456 -P 3307 test > test.sql
指定主机
mysqldump -uroot -p123456 -h 1.2.3.4 test > test.sql
四、恢复数据库
方法1:用mysql命令
mysql -u用户名 -p密码 数据库名 < 备份文件.sql
例子:
mysql -uroot -p123456 test < test.sql
方法2:登录MySQL后source
mysql -uroot -p123456
mysql> use test;
mysql> source /root/test.sql;
恢复压缩备份
gunzip < test.sql.gz | mysql -uroot -p123456 test
五、定时备份脚本
写个备份脚本
#!/bin/bash
# 数据库配置
DB_USER="root"
DB_PASS="123456"
DB_NAME="test"
# 备份目录
BACKUP_DIR="/data/backup"
# 文件名(带日期)
DATE=$(date +%Y%m%d_%H%M%S)
FILE_NAME="${DB_NAME}_${DATE}.sql.gz"
# 备份
mysqldump -u${DB_USER} -p${DB_PASS} ${DB_NAME} | gzip > ${BACKUP_DIR}/${FILE_NAME}
# 删除7天前的备份
find ${BACKUP_DIR} -name "*.sql.gz" -mtime +7 -delete
echo "备份完成:${FILE_NAME}"
加执行权限
chmod +x /root/backup.sh
加到crontab
每天凌晨3点备份:
crontab -e
加一行:
0 3 * * * /root/backup.sh
六、常见坑
坑1:密码写在命令行里不安全
-p123456 会在进程列表里看到密码。
更安全的方法:
mysqldump -uroot -p test > test.sql
然后手动输入密码。
或者用配置文件:
# ~/.my.cnf
[mysqldump]
user=root
password=123456
然后直接:
mysqldump test > test.sql
坑2:大表备份很慢
数据多了以后,mysqldump会锁表,影响业务。
解决: 用 --single-transaction 参数:
mysqldump -uroot -p123456 --single-transaction test > test.sql
这个参数适合InnoDB,不锁表。
坑3:字符集不对
导出的SQL乱码。
加参数:
mysqldump -uroot -p123456 --default-character-set=utf8mb4 test > test.sql
坑4:自增ID不连续
恢复后自增ID变了。
正常现象,不用管。
坑5:备份文件太大
用gzip压缩:
mysqldump -uroot -p123456 test | gzip > test.sql.gz
七、备份验证
备份完了要验证一下能不能恢复。
看文件大小
ls -lh test.sql
不能是0字节。
看文件内容
head -20 test.sql
看开头是不是正常的SQL。
测试恢复
找个测试库恢复一下:
mysql -uroot -p123456 test_restore < test.sql
总结
记住:
- 备份:
mysqldump -uroot -p123456 数据库 > 备份.sql - 恢复:
mysql -uroot -p123456 数据库 < 备份.sql - 大表加
--single-transaction不锁表 - 用gzip压缩备份文件
- 定时备份要自动删旧备份
- 备份完要验证
最常用:
# 备份
mysqldump -uroot -p123456 --single-transaction test | gzip > test.sql.gz
# 恢复
gunzip < test.sql.gz | mysql -uroot -p123456 test
遇到问题加QQ23979811 协助处理
MySQL定时备份脚本,自动删除旧备份
前言
数据库数据很重要,必须每天自动备份。写个备份脚本,自动备份+自动删旧的,不用手动管。
一、备份脚本
完整脚本 backup_mysql.sh
#!/bin/bash
# MySQL配置
DB_USER="root"
DB_PASS="your_password"
DB_NAME="mydb"
# 备份目录
BACKUP_DIR="/data/backup/mysql"
# 保留天数
KEEP_DAYS=7
# 日期
DATE=$(date +%Y%m%d_%H%M%S)
# 备份文件名
BACKUP_FILE="$BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz"
# 创建目录
mkdir -p $BACKUP_DIR
# 备份并压缩
mysqldump -u$DB_USER -p$DB_PASS $DB_NAME | gzip > $BACKUP_FILE
# 检查备份是否成功
if [ $? -eq 0 ]; then
echo "[$(date)] 备份成功: $BACKUP_FILE"
else
echo "[$(date)] 备份失败!"
exit 1
fi
# 删除7天前的旧备份
find $BACKUP_DIR -name "*.sql.gz" -mtime +$KEEP_DAYS -delete
echo "[$(date)] 旧备份清理完成"
二、脚本说明
各部分解释
| 部分 | 说明 |
|---|---|
| DB_USER | 数据库用户名 |
| DB_PASS | 数据库密码 |
| DB_NAME | 要备份的数据库名 |
| BACKUP_DIR | 备份存放目录 |
| KEEP_DAYS | 保留几天的备份 |
| mysqldump | 备份命令 |
| gzip | 压缩,节省空间 |
| find -mtime +7 | 找7天前的文件删除 |
备份全部数据库
mysqldump -u$DB_USER -p$DB_PASS --all-databases | gzip > $BACKUP_FILE
备份多个数据库
mysqldump -u$DB_USER -p$DB_PASS --databases db1 db2 db3 | gzip > $BACKUP_FILE
三、设置执行权限
chmod +x /data/backup/backup_mysql.sh
四、测试脚本
/data/backup/backup_mysql.sh
看有没有备份文件生成:
ls -lh /data/backup/mysql/
五、设置定时任务
每天凌晨3点备份
crontab -e
添加:
0 3 * * * /data/backup/backup_mysql.sh >> /data/backup/backup.log 2>&1
说明:
0 3 * * *每天凌晨3点>> backup.log输出写到日志2>&1错误也写进去
查看定时任务
crontab -l
六、备份文件恢复
恢复步骤
# 解压
gunzip < mydb_20261008_030000.sql.gz | mysql -u root -p mydb
或者先解压再恢复
# 解压
gunzip mydb_20261008_030000.sql.gz
# 恢复
mysql -u root -p mydb < mydb_20261008_030000.sql
七、更完善的脚本
带日志和邮件通知的版本
#!/bin/bash
DB_USER="root"
DB_PASS="your_password"
DB_NAME="mydb"
BACKUP_DIR="/data/backup/mysql"
KEEP_DAYS=7
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="$BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz"
LOG_FILE="$BACKUP_DIR/backup.log"
mkdir -p $BACKUP_DIR
echo "========== $(date) 开始备份 ==========" >> $LOG_FILE
# 备份
mysqldump -u$DB_USER -p$DB_PASS $DB_NAME 2>>$LOG_FILE | gzip > $BACKUP_FILE
if [ $? -eq 0 ]; then
FILE_SIZE=$(ls -lh $BACKUP_FILE | awk '{print $5}')
echo "[$(date)] 备份成功,文件大小: $FILE_SIZE" >> $LOG_FILE
else
echo "[$(date)] 备份失败!" >> $LOG_FILE
# 这里可以加邮件通知
exit 1
fi
# 删除旧备份
find $BACKUP_DIR -name "*.sql.gz" -mtime +$KEEP_DAYS -delete
echo "[$(date)] 清理 $KEEP_DAYS 天前的旧备份完成" >> $LOG_FILE
echo "========== $(date) 备份结束 ==========" >> $LOG_FILE
常见坑
坑1:密码写在脚本里不安全
脚本里明文写了数据库密码。
解决: 用mysql配置文件:
# /root/.my.cnf
[client]
user=root
password=your_password
然后脚本里就不用写密码了:
mysqldump $DB_NAME | gzip > $BACKUP_FILE
设置权限:
chmod 600 /root/.my.cnf
坑2:备份文件太大
不压缩的话备份文件很大。
解决: 用gzip压缩,能压缩到原来的1/10。
坑3:定时任务不执行
cron里写了脚本,但没执行。
原因:
- 脚本没加执行权限
- 路径写错了
- 环境变量不对
解决: 脚本里用全路径,比如 /usr/bin/mysqldump。
坑4:备份完没验证
备份文件损坏了都不知道。
解决: 定期找个测试库恢复一下,看备份能不能用。
坑5:备份文件存在同一台服务器
服务器挂了,备份也没了。
解决: 把备份传到远程服务器或OSS。
# 传到远程服务器
scp $BACKUP_FILE root@192.168.1.20:/data/backup/
总结
备份三步走:
- 写备份脚本(mysqldump + gzip + find删旧)
- 加执行权限
- 加crontab定时任务
记住: 备份不是备份了就完了,要定期验证能不能恢复!
遇到问题加QQ23979811 协助处理
MySQL备份数据库,mysqldump定时备份
前言
数据库不备份,出事就完蛋。本文讲用mysqldump备份MySQL,再配crontab定时自动备份。
一、mysqldump基本用法
备份单个数据库
mysqldump -u root -p mydb > /backup/mydb.sql
输入密码后,就把mydb库备份到mydb.sql了。
备份多个数据库
mysqldump -u root -p --databases db1 db2 > /backup/mydbs.sql
备份所有数据库
mysqldump -u root -p --all-databases > /backup/all.sql
备份单个表
mysqldump -u root -p mydb users > /backup/users.sql
二、常用参数
| 参数 | 说明 |
|---|---|
--single-transaction |
InnoDB一致性备份,不锁表 |
--routines |
备份存储过程和函数 |
--triggers |
备份触发器 |
--events |
备份事件调度器 |
--master-data=2 |
记录binlog位置,用于主从 |
--default-character-set=utf8mb4 |
指定字符集 |
推荐完整命令
mysqldump -u root -p \
--single-transaction \
--routines \
--triggers \
--events \
--default-character-set=utf8mb4 \
mydb > /backup/mydb_$(date +%Y%m%d).sql
三、压缩备份
备份完太大,直接压缩:
mysqldump -u root -p mydb | gzip > /backup/mydb.sql.gz
恢复的时候:
gunzip < /backup/mydb.sql.gz | mysql -u root -p mydb
四、定时备份脚本
创建备份脚本:
vi /usr/local/bin/mysql_backup.sh
内容:
#!/bin/bash
# 备份目录
BACKUP_DIR=/backup/mysql
# 数据库配置
DB_USER=root
DB_PASS=你的密码
DB_NAME=mydb
# 创建备份目录
mkdir -p $BACKUP_DIR
# 备份文件名(带日期)
DATE=$(date +%Y%m%d_%H%M%S)
FILE=$BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz
# 执行备份
mysqldump -u$DB_USER -p$DB_PASS \
--single-transaction \
--routines \
--triggers \
--default-character-set=utf8mb4 \
$DB_NAME | gzip > $FILE
# 删除7天前的备份
find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete
echo "备份完成:$FILE"
加执行权限:
chmod +x /usr/local/bin/mysql_backup.sh
五、配置crontab定时任务
编辑crontab:
crontab -e
加上:
# 每天凌晨2点备份
0 2 * * * /usr/local/bin/mysql_backup.sh >> /var/log/mysql_backup.log 2>&1
六、恢复备份
恢复普通备份
mysql -u root -p mydb < /backup/mydb.sql
恢复压缩备份
gunzip < /backup/mydb.sql.gz | mysql -u root -p mydb
常见坑
坑1:密码写在命令行里不安全
mysqldump -u root -p123456 mydb > xxx.sql
这样密码会出现在进程列表里。
安全做法: 用配置文件存密码。
# /root/.my.cnf
[mysqldump]
user=root
password=你的密码
权限设600:
chmod 600 /root/.my.cnf
以后备份就不用输密码了:
mysqldump mydb > xxx.sql
坑2:备份时锁表
大库备份的时候,业务卡住了。
原因: 没加 --single-transaction。
解决: InnoDB库一定要加这个参数。
坑3:备份文件是空的
备份完一看,文件0字节。
原因: 密码错了,或者数据库名错了。
解决: 先手动执行一次,看报错。
坑4:备份没包含存储过程
备份后恢复,发现存储过程没了。
原因: mysqldump默认不备份存储过程。
解决: 加 --routines 参数。
总结
三步搞定自动备份:
- 写备份脚本
- 配crontab定时执行
- 定期清理旧备份
记住: 备份了不算数,能恢复才算数。
遇到问题加QQ23979811 协助处理
MySQL 备份恢复实战
MySQL 备份与恢复实战
数据库备份是运维的基本功,万一数据丢了,没有备份就完蛋了。这篇整理常用的备份恢复方法。
1. mysqldump 逻辑备份
最常用的备份工具,生成 SQL 文件。
备份整个数据库:
mysqldump -u root -p123456 blog > blog_$(date +%Y%m%d).sql
备份单张表:
mysqldump -u root -p123456 blog users > users.sql
备份所有数据库:
mysqldump -u root -p123456 --all-databases > all.sql
常用参数:
- --databases:指定多个数据库
- --single-transaction:InnoDB 一致性备份,不锁表
- --routines:备份存储过程和函数
- --triggers:备份触发器
2. 恢复数据
# 恢复整个数据库
mysql -u root -p123456 blog < blog_20261007.sql
# 登录后恢复
mysql -u root -p123456
mysql> use blog;
mysql> source /root/blog_20261007.sql;
3. 压缩备份
数据大的时候,直接存 SQL 太占空间,压缩一下:
# 备份并压缩
mysqldump -u root -p123456 blog | gzip > blog_$(date +%Y%m%d).sql.gz
# 恢复压缩备份
gunzip < blog_20261007.sql.gz | mysql -u root -p123456 blog
4. 全量+增量备份
大数据量不能每天全量备份,用 binlog 做增量。
全量备份:
mysqldump -u root -p123456 --single-transaction --master-data=2 blog > full.sql
增量恢复:
# 先恢复全量
mysql -u root -p123456 blog < full.sql
# 再按时间点恢复 binlog
mysqlbinlog --start-datetime="2026-10-07 10:00:00" \
--stop-datetime="2026-10-07 14:00:00" \
/var/lib/mysql/binlog.000001 | mysql -u root -p123456
5. 物理备份(冷备)
直接拷贝数据文件,速度快,但需要停库。
# 停库
systemctl stop mysqld
# 拷贝数据目录
cp -r /var/lib/mysql /backup/mysql_$(date +%Y%m%d)
# 启动
systemctl start mysqld
6. 定时备份脚本
写个脚本每天自动备份:
#!/bin/bash
BACKUP_DIR="/data/backup/mysql"
DATE=$(date +%Y%m%d)
USER="root"
PASS="123456"
# 创建目录
mkdir -p $BACKUP_DIR
# 备份并压缩
mysqldump -u$USER -p$PASS --single-transaction blog | gzip > $BACKUP_DIR/blog_$DATE.sql.gz
# 删除7天前的备份
find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete
加到 crontab:
0 3 * * * /bin/bash /root/mysql_backup.sh
7. 恢复注意事项
- 恢复前先测试备份文件能不能用,别等真出事了才发现备份坏了
- 大表恢复慢,别在线上高峰期操作
- 字符集要一致,恢复前先检查
- 恢复前先备份当前数据,防止恢复出错
总结
MySQL 备份三件事:
- 定期备份,别偷懒
- 备份后要测试能不能恢复
- 重要数据异地备份
数据无价,备份一定要做好。
MySQL数据库备份和恢复教程
前言
做运维或者开发的同学都知道,数据库是整个网站最核心的资产。一旦数据库出了问题,数据丢了,那损失可就大了。所以做好数据库备份是非常重要的一件事。
很多新手同学可能从来没做过数据库备份,等真的出问题了才后悔莫及。这篇文章就详细讲讲MySQL数据库怎么备份和恢复,包括常用的备份命令、恢复方法,还有自动定时备份的脚本。
一、备份方法
MySQL备份最常用的工具就是mysqldump,它是MySQL自带的备份工具,不需要额外安装。
1. 备份整个数据库
备份单个数据库是最常用的场景。比如你要把本地的testdb数据库备份成一个sql文件:
mysqldump -u root -p testdb > /root/testdb.sql
执行完之后输入MySQL的密码,就开始备份了。备份完之后会在/root/目录下生成一个testdb.sql文件。
2. 备份单张表
有时候你只需要备份数据库里的某一张表,比如只备份users表:
mysqldump -u root -p testdb users > /root/users.sql
3. 备份所有数据库
如果你想把MySQL里所有的数据库都备份下来,可以用 --all-databases 参数:
mysqldump -u root -p --all-databases > /root/all.sql
4. 只备份表结构,不备份数据
有时候你只需要备份表结构,不需要备份数据,这时候可以用 --no-data 参数:
mysqldump -u root -p --no-data testdb > /root/testdb_schema.sql
5. 备份的时候加锁保证数据一致性
备份大表的时候,为了保证备份过程中数据不被修改,可以加 --lock-tables 参数:
mysqldump -u root -p --lock-tables testdb > /root/testdb.sql
6. 备份的时候压缩文件
如果数据库很大,备份出来的sql文件也会很大,这时候可以用gzip压缩一下:
mysqldump -u root -p testdb | gzip > /root/testdb.sql.gz
二、恢复方法
备份完了,怎么恢复呢?
1. 恢复整个数据库
恢复整个数据库的命令:
mysql -u root -p testdb < /root/testdb.sql
注意:恢复之前一定要确保testdb这个数据库已经存在了。如果不存在,需要先创建数据库:
CREATE DATABASE testdb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
2. 恢复单张表
恢复单张表的话,先登录MySQL,然后选择对应的数据库,再用source命令恢复:
mysql -u root -p
USE testdb;
source /root/users.sql;
3. 恢复压缩的备份文件
如果你的备份文件是用gzip压缩过的,恢复的时候需要先解压:
gunzip < /root/testdb.sql.gz | mysql -u root -p testdb
三、自动定时备份脚本
手动备份太麻烦了,我们可以写个脚本,每天自动备份数据库。
备份脚本内容
创建一个备份脚本 /root/mysql_backup.sh:
#!/bin/bash
# 数据库配置
DB_USER="root"
DB_PASSWORD="你的MySQL密码"
DB_NAME="testdb"
BACKUP_DIR="/root/backup"
# 备份文件名,用日期命名
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="$BACKUP_DIR/testdb_$DATE.sql"
# 创建备份目录
mkdir -p $BACKUP_DIR
# 执行备份
mysqldump -u$DB_USER -p$DB_PASSWORD $DB_NAME > $BACKUP_FILE
# 压缩备份文件
gzip $BACKUP_FILE
# 删除7天前的备份文件
find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete
echo "备份完成:$BACKUP_FILE.gz"
给脚本加执行权限
chmod +x /root/mysql_backup.sh
添加到定时任务
用crontab添加定时任务,每天凌晨3点自动备份:
crontab -e
添加下面这行:
0 3 * * * /root/mysql_backup.sh
这样每天凌晨3点就会自动备份数据库了,而且只保留最近7天的备份,旧的会自动删除。
常见坑
坑1:备份的时候忘了加密码,执行的时候卡住了
很多同学写备份命令的时候,直接写 mysqldump -u root -p testdb > xxx.sql,然后执行的时候就会停下来让你输入密码。如果是在脚本里用的话,就会卡住。
解决方法是把密码直接写在命令里:mysqldump -u root -p你的密码 testdb > xxx.sql。注意-p和密码之间没有空格。
坑2:恢复的时候数据库不存在
很多同学恢复的时候直接执行 mysql -u root -p testdb < xxx.sql,结果报错说数据库不存在。记住恢复之前一定要先创建好对应的数据库。
坑3:备份文件太大,恢复的时候超时了
大文件恢复的时候很容易超时,或者因为各种原因中断。这时候可以用source命令在MySQL内部恢复,会稳定很多。
坑4:备份文件存在本地,服务器挂了备份也没了
很多同学备份文件直接放在服务器本地,觉得这样就安全了。其实不对,如果服务器磁盘坏了,或者被黑客删了,备份文件也没了。
正确的做法是:
- 每天备份完之后,把备份文件下载到本地电脑
- 或者上传到云存储(比如阿里云OSS、腾讯云COS)
- 重要的备份最好异地多存几份
总结
MySQL数据库备份和恢复的核心内容:
- 备份命令:mysqldump,常用参数有 --all-databases、--no-data、--lock-tables
- 恢复命令:mysql < 备份文件,或者用source命令
- 自动备份:写个shell脚本,配合crontab定时执行
- 备份文件一定要异地存储,不能只放在服务器本地
数据库备份是个大事,千万不要等出问题了才想起来备份。养成每天自动备份的好习惯,出问题的时候才能从容应对。
遇到问题加QQ23979811 协助处理
MySQL 备份与恢复:mysqldump 实战指南
前言
数据库备份是生产环境的生命线。很多人没出事的时候不备份,出事了才后悔。本文讲清楚 MySQL 最常用的备份工具 mysqldump。
一、为什么要备份
- 误操作:手滑删了表、删了数据
- 服务器挂了:硬盘坏了、机器报废
- 被攻击: ransomware 加密了数据库
- 升级失败:新版本不兼容,数据回退
记住:没有备份的数据库,就是在裸奔。
二、mysqldump 是什么
mysqldump 是 MySQL 自带的逻辑备份工具,把数据导出成 SQL 文件。
优点:简单、通用、跨版本
缺点:大数据量慢
适合:中小数据库(< 50G)
三、备份数据库
1. 备份整个数据库
mysqldump -u root -p 数据库名 > backup.sql
输入密码后,就会生成 backup.sql 文件。
2. 备份所有数据库
mysqldump -u root -p --all-databases > all_backup.sql
3. 备份单个表
mysqldump -u root -p 数据库名 表名 > table_backup.sql
4. 备份多个表
mysqldump -u root -p 数据库名 表1 表2 > multi_backup.sql
四、恢复数据库
1. 恢复整个数据库
mysql -u root -p 数据库名 < backup.sql
注意:数据库要先存在。
CREATE DATABASE 数据库名;
2. 恢复所有数据库
mysql -u root -p < all_backup.sql
五、常用参数
--single-transaction
InnoDB 引擎下,保证备份一致性,不锁表:
mysqldump -u root -p --single-transaction 数据库名 > backup.sql
生产环境一定要加这个!
--routines
备份存储过程和函数:
mysqldump -u root -p --routines 数据库名 > backup.sql
--triggers
备份触发器:
mysqldump -u root -p --triggers 数据库名 > backup.sql
--events
备份事件调度器:
mysqldump -u root -p --events 数据库名 > backup.sql
--no-data
只备份表结构,不备份数据:
mysqldump -u root -p --no-data 数据库名 > schema.sql
--where
按条件备份:
mysqldump -u root -p 数据库名 表名 --where="id > 100" > partial.sql
六、完整备份命令
生产环境推荐用这个:
mysqldump -u root -p \
--single-transaction \
--routines \
--triggers \
--events \
--default-character-set=utf8mb4 \
数据库名 > backup.sql
七、压缩备份
备份文件太大?压缩一下:
# 备份并压缩
mysqldump -u root -p 数据库名 | gzip > backup.sql.gz
# 解压并恢复
gunzip < backup.sql.gz | mysql -u root -p 数据库名
八、定时备份
写个脚本每天自动备份:
#!/bin/bash
# 备份目录
BACKUP_DIR="/data/backup/mysql"
DATE=$(date +%Y%m%d)
# 备份
mysqldump -u root -p密码 --single-transaction 数据库名 | gzip > $BACKUP_DIR/db_$DATE.sql.gz
# 删除 7 天前的备份
find $BACKUP_DIR -name "db_*.sql.gz" -mtime +7 -delete
加到 crontab:
# 每天凌晨 2 点备份
0 2 * * * /bin/bash /path/to/backup.sh
九、常见坑
- 备份不锁表:大表备份会锁表,一定要加 --single-transaction
- 字符集不对:备份文件乱码,加 --default-character-set=utf8mb4
- 没备份存储过程:导出后丢了,加 --routines
- 备份没验证:备份完一定要试恢复,不然真出事的时候哭都来不及
十、备份策略
- 每天全量备份:小数据库
- 每周全量 + 每天增量:大数据库
- 异地备份:备份文件要存到别的服务器
- 定期演练恢复:每个月测一次能不能恢复
总结
MySQL 备份的核心要点:
- mysqldump 是最常用的备份工具
- 生产环境加 --single-transaction,不锁表
- 备份要压缩,节省空间
- 定时备份,自动删除旧备份
- 备份一定要验证,能恢复才算备份成功
数据是公司最值钱的资产,备份这事儿千万别偷懒。