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

总结

记住:

  1. 备份:mysqldump -uroot -p123456 数据库 > 备份.sql
  2. 恢复:mysql -uroot -p123456 数据库 < 备份.sql
  3. 大表加 --single-transaction 不锁表
  4. 用gzip压缩备份文件
  5. 定时备份要自动删旧备份
  6. 备份完要验证

最常用:

# 备份
mysqldump -uroot -p123456 --single-transaction test | gzip > test.sql.gz

# 恢复
gunzip < test.sql.gz | mysql -uroot -p123456 test

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-9 07:41 

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 参数。

总结

三步搞定自动备份:

  1. 写备份脚本
  2. 配crontab定时执行
  3. 定期清理旧备份

记住: 备份了不算数,能恢复才算数。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-8 07:39 

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:备份文件存在本地,服务器挂了备份也没了

很多同学备份文件直接放在服务器本地,觉得这样就安全了。其实不对,如果服务器磁盘坏了,或者被黑客删了,备份文件也没了。

正确的做法是:

  1. 每天备份完之后,把备份文件下载到本地电脑
  2. 或者上传到云存储(比如阿里云OSS、腾讯云COS)
  3. 重要的备份最好异地多存几份

总结

MySQL数据库备份和恢复的核心内容:

  1. 备份命令:mysqldump,常用参数有 --all-databases、--no-data、--lock-tables
  2. 恢复命令:mysql < 备份文件,或者用source命令
  3. 自动备份:写个shell脚本,配合crontab定时执行
  4. 备份文件一定要异地存储,不能只放在服务器本地

数据库备份是个大事,千万不要等出问题了才想起来备份。养成每天自动备份的好习惯,出问题的时候才能从容应对。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-5 08:41 
'); })();