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