«

MySQL数据库备份和恢复,mysqldump完整教程

时间:2026-10-9 07:41     作者:emer     分类: 无


前言

数据库备份是每个站长的基本功。MySQL最常用的备份工具就是mysqldump,简单好用。本文讲怎么用mysqldump备份和恢复数据库,包括完整命令和常见坑。

一、mysqldump是什么

mysqldump是MySQL自带的备份工具,把数据库导出成SQL文件,需要的时候再导入回去。

特点:

二、备份数据库

备份单个数据库

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 协助处理

标签: MySQL 运维 mysqldump 数据库备份 数据库恢复