MySQL 数据库备份与恢复
MySQL 数据库备份与恢复
一、 常用备份方案概述
备份方案 | 特点 | 优点 | 缺点 |
---|---|---|---|
全量备份 | 对某一时间点的所有数据进行完整拷贝 | 数据恢复速度快,操作简单 | 备份时间长,占用存储空间大 |
增量备份 | 备份自上次全备或增备以来变化的数据 | 备份时间短,占用空间小 | 恢复时需要按顺序逐一恢复所有增量备份,恢复过程复杂且慢 |
差异备份 | 备份自上次全备以来变化的所有数据 | 恢复时只需恢复一次全备 + 最后一次差异备份,速度和复杂度介于全量和增量之间 | 占用空间比增量备份大,比全量备份小 |
二、 备份工具:mysqldump
mysqldump
是 MySQL 自带的逻辑备份工具,生成 SQL 语句集合。
1、常用语法
# 备份单个数据库(不包含 CREATE DATABASE 语句)
mysqldump [OPTIONS] database [tables] > backup_file.sql# 备份单个或多个数据库(包含 CREATE DATABASE 语句)
mysqldump [OPTIONS] --databases DB1 [DB2 DB3...] > backup_file.sql# 备份所有数据库(包含 CREATE DATABASE 语句)
mysqldump [OPTIONS] --all-databases > backup_file.sql
2、连接选项 (OPTIONS)
-uUSERNAME
: 指定数据库用户名-hHOST
: 指定服务器主机地址-pPASSWORD
: 指定数据库用户密码-P#
: 指定数据库端口号 (例如:-P3307)
三、备份操作示例
创建并进入 backup 目录
1、备份所有数据库(全备)
mysqldump -uroot -p --all-databases > all-202509171809.sql
2、备份指定库的指定表
mysqldump -uroot -p yanyvhang student123 > student123-202509171815.sql
3、备份整个 yanyvhang 数据库(推荐包含建库语句)
mysqldump -uroot -p --databases yanyvhang > yanyvhang-202509171818.sql
四、数据恢复操作
语法
mysql -uroot -p [database_name] < backup_file.sql
1、恢复整个数据库
模拟误删数据库
# 模拟误删数据库
mysql -uroot -p -e "drop database yanyvhang;"# 查看
mysql -uroot -p -e "show databases;"
恢复备份方法一
# 使用之前 --databases 选项的备份文件恢复,无需指定库名
mysql -uroot -p < /backup/yanyvhang-202509171818.sql# 验证
mysql -uroot -p -e "show databases;"
恢复备份方法二
# 使用之前 --all-databases 选项的备份文件恢复,无需指定库名
mysql -uroot -p < /backup/all-202509171809.sql# 验证
mysql -uroot -p -e "show databases;"
2、恢复特定表
模拟误删表
# 模拟误删表
mysql -uroot -p yanyvhang -e "drop table student123;"# 查看
mysql -uroot -p yanyvhang -e "show tables;"
恢复备份
# 使用之前的备份文件恢复,需要指定库名
mysql -uroot -p yanyvhang < /backup/student123-202509171815.sql# 查看
mysql -uroot -p yanyvhang -e "show tables;"
五、基于二进制日志的差异备份与恢复
此方法需要开启二进制日志 (Binary Log),结合全量备份实现
1、开启 MySQL 二进制日志
修改 MySQL 配置文件 my.cnf
vim /etc/my.cnf
# 追加内容
server-id=1
log-bin=mysql_bin
修改后重启 MySQL 服务使配置生效
systemctl restart mysqld.service
2、进行全量备份并刷新日志
使用 mysqldump
进行全备时,使用特定选项记录二进制日志位置
mysqldump -uroot -p --single-transaction --flush-logs --master-data=2 --all-databases --delete-master-logs > /backup/all-202509172022.sql
--single-transaction
:对 InnoDB 表进行一致性备份,不锁表--flush-logs
:备份完成后刷新日志,生成新的二进制日志文件--master-data=2
:将备份对应的二进制日志位置信息以注释形式写入备份文件--all-databases
:指定备份 MySQL 服务器上的所有数据库--delete-master-logs
:备份成功完成后,立即删除备份文件中所记录的二进制日志位置之前的所有二进制日志文件(高风险参数,请谨慎使用)
3、模拟数据变化
update student set age = 40 where id = 3;
4、模拟故障
mysql -uroot -p -e "drop database yanyvhang;"
5、恢复流程
刷新创建新的二进制日志
mysqladmin -uroot -p flush-logs
ll /opt/data/
恢复完全备份
mysql -uroot -p < /backup/all-202509172022.sql
检查误删数据库的位置在什么地方
show binlog events in 'mysql bin.000004';
使用mysqlbinlog恢复差异备份
mysqlbinlog --stop-position=513 /opt/data/mysql_bin.000002 | mysql -uroot -p