一、备份的核心意义

数据库备份是保障数据安全的关键手段,主要作用在于防范数据丢失风险,应对硬件故障、人为误操作、SQL注入、数据误删、服务器宕机等突发情况,同时满足数据迁移、版本回滚、故障排查、合规审计等需求,是运维工作中必不可少的环节。

二、MySQL备份类型划分

1. 按备份方式划分

  • 物理备份:直接复制数据库的物理文件(数据文件、日志文件、配置文件等),备份速度快、恢复快,适合大数据量场景,缺点是跨平台兼容性差。常见工具:ibbackup、XtraBackup、MySQL Enterprise Backup。

  • 逻辑备份:导出数据库的SQL语句(建库、建表、插入数据等),备份文件体积小、可读性强、跨平台兼容,缺点是备份和恢复速度较慢,大数据量下效率低。常见工具:mysqldump、mysqlpump、mydumper。

2. 按备份范围划分

  • 全量备份:备份整个数据库的所有数据和结构,备份完整,恢复简单,但耗时久、占用空间大,适合作为基础备份。

  • 增量备份:仅备份上一次全量备份或增量备份后变化的数据,备份速度快、占用空间小,恢复时需要依赖全量备份和历次增量文件,步骤繁琐。

  • 差异备份:备份上一次全量备份后变化的数据,恢复比增量简单,只需全量+最新差异文件,空间占用介于全量和增量之间。

3. 按备份状态划分

  • 热备份:数据库正常运行,读写不受影响,业务无中断,适合生产环境。

  • 温备份:数据库运行中,仅加读锁,禁止写入,会短暂影响业务写入。

  • 冷备份:数据库停止服务后备份,数据一致性最高,但会导致业务停机。

三.专用备份工具

1.mysqldump 或 mysqlhotcopy

mysqldump 程序和 mysqlhotcopy 都可以做备份。mysqldump 是客户端常用

逻辑备份程序,能够产生一组被执行以后再现原始数据库对象定义和表数据的

SQL 语句。它可以转储一个到多个 MySQL 数据库,对其进行备份或传输到远程

SQL 服务器。mysqldump 更为通用,因为它可以备份各种表。mysqlhotcopy 仅

适用于某些存储引擎。

mysqlhotcopy 是 由

Tim Bunce 最 初 编 写 和 贡 献 的

Perl 脚 本 。

mysqlhotcopy 仅用于备份 MyISAM 和 ARCHIVE 表。它只能运行在 UNIX 或 Linux

上。因为使用范围小,因此本文中不做详细介绍,如果同学们有兴趣可以在课下

研究。

2.通过启用二进制日志进行增量备份

MySQL 支持增量备份,进行增量备份时必须启用二进制日志。二进制日志文

件为用户 提供复制,对执行备份点后进行的数据库更改所需的信息进行恢复。

如果进行增量备份(包含自上次完全备份或增量备份以来发生的数据修改),需

要刷新二进制日志。

四.实验操作

1.物理冷备份

创建需要所需的库和表

create database auth;
use auth;
create table users (user_name char(16),user_passwd char(65) default '');
insert into users values('zhangsan',SHA2('123456',256));
insert into users values('lisi',SHA2('123456',256));

备份数据库

[root@localhost ~]# systemctl stop mysqld
[root@localhost ~]# mkdir /backup

[root@localhost ~]# cd /usr/local/
[root@localhost local]# tar zcvf /backup/mysql_$(date +%F).tar.gz mysql/
[root@localhost local]# cd /backup/
[root@localhost backup]# ls
mysql_2023-06-08.tar.gz

模拟故障

[root@localhost backup]# systemctl start mysqld
[root@localhost backup]# mysql -u root -p -e 'drop database auth;'
[root@localhost backup]# mysql -u root -p -e 'select * from auth.users;'

恢复数据库

[root@localhost ~]# systemctl stop mysqld
[root@localhost ~]# cd /backup/
[root@localhost backup]# tar zxvf mysql_2023-06-08.tar.gz

[root@localhost backup]# cd /usr/local/
[root@localhost local]# mv mysql/ mysql.bak

[root@localhost local]# cd /backup/
[root@localhost backup]# mv mysql /usr/local/
[root@localhost backup]# systemctl start mysqld
[root@localhost backup]# mysql -u root -p -e 'select * from auth.users;'

2.mysqldump备份与恢复     

在服务启动状态下使用

①导出数据

[root@localhost ~]# mysqldump -u root -p auth users > /opt/auth-users.sql       \\导出数据表
[root@localhost ~]# mysqldump -u root -p auth > /opt/auth.sql         \\导出数据库
[root@localhost ~]# mysqldump -u root -p --opt --all-databases >/opt/all-data.sql     ##备份所有库

②导入表

[root@localhost ~]# mysql -u root -p -e 'create database test;'  
[root@localhost ~]# mysql -u root -p test < /opt/auth-users.sql   ##导入到其他库
[root@localhost ~]# mysql -u root -p auth < /opt/auth-users.sql   ##导入到原始所在的库
[root@localhost ~]# mysql -u root -p -e 'show tables from test;' 

③导入库

[root@localhost ~]# mysql -u root -p -e 'drop database auth;'  
[root@localhost ~]# mysql -u root -p -e 'show databases;' 
[root@localhost ~]# mysql -u root -p -e 'create database auth;' 
[root@localhost ~]# mysql -u root -p auth</opt/auth.sql

[root@localhost ~]# mysql -u root -p -e 'show databases;' 
[root@localhost ~]# mysql -uroot -p -e 'select * from auth.users;'

④全库还原

保证至少已经创建了这些库

[root@localhost ~]# mysql -u root -p </opt/all-data.sql

3.增量备份与恢复

1.启用二进制日志功能

(1)修改主配置文件

[root@localhost ~]# vim /etc/my.cnf

在[mysqld]模块中添加

log-bin=mysql-bin

server-id=1

binlog_format = MIXED

[root@localhost ~]# systemctl restart mysqld

(2)生成新的日志文件

[root@localhost ~]# cd /usr/local/mysql/data/
[root@localhost data]# mysqladmin -u root -p flush-logs

(3)查看日志内容

mysqlbinlog --no-defaults mysql-bin.000002

如果sql语句被加密就是用以下命令

mysqlbinlog --no-defaults --base64-output=DECODE-ROWS mysql-bin.000002

2.向表添加数据(多添加一些)

mysql> use auth;

为了验证效果,逐个添加新的数据,并生成一个日志文件

use auth;

insert into users values('aaa','123456');

insert into users values('bbb','123456');

insert into users values('ccc','123456');

insert into users values('ddd','123456');

insert into users values('eee','123456');

insert into users values('fff','123456');

3.模拟误操作将auth.users表删掉
[root@localhost data]# mysql -u root -p -e 'drop table auth.users;'
[root@localhost data]# mysql -u root -p -e 'select * from auth.users;'  ##查看表,已经不存在
4.常规恢复操作

①先恢复完全备份

[root@localhost data]# mysql -u root -p auth </opt/auth.sql 
[root@localhost data]# mysql -u root -p -e 'select * from auth.users;'   ##查看表,已经存在,但数据不全

②再恢复增量备份

[root@localhost mysql]# mysqlbinlog --no-defaults --base64-output=DECODE-ROWS mysql-bin.000002
注意:要先查看日志内容,确定是需要恢复的数据

[root@localhost mysql]# mysqlbinlog --no-defaults mysql-bin.000002 | mysql -u root -p
[root@localhost mysql]# mysql -u root -p -e 'select * from auth.users;'    ##查看表的内容
5.基于位置的恢复

①模拟误操作

[root@localhost mysql]# mysql -uroot -p -e 'drop table auth.users;'
[root@localhost mysql]# mysql -u root -p -e 'select * from auth.users;'   ##没有了数据

②恢复完全备份

[root@localhost mysql]# mysql -u root -p auth < /opt/auth.sql

③查看日志内容

[root@localhost mysql]# mysqlbinlog --no-defaults mysql-bin.000002
[root@localhost mysql]# mysqlbinlog --no-defaults --stop-position='521' mysql-bin.000002 | mysql -u root -p

④恢复到指定位置

[root@localhost mysql]# mysqlbinlog --no-defaults --stop-position='521' mysql-bin.000002 | mysql -u root -p      ##恢复到521之前的一个数据,不包含521

⑤从指定的位置向后开始恢复

[root@localhost mysql]# mysqlbinlog --no-defaults --start-position='521' mysql-bin.000002 | mysql -u root -p     ##从521之后开始恢复,包含521

⑥恢复指定范围内的数据

[root@localhost mysql]# mysqlbinlog --no-defaults --start-position='521' --stop-position='729' mysql-bin.000002  | mysql -u root -p
6.基于时间点恢复

①恢复到指定的时间

[root@localhost mysql]# mysqlbinlog --no-defaults --stop-datetime='2019-03-08 21:01:55' mysql-bin.000002  | mysql -u root -p

②从指定的时间开始恢复

[root@localhost mysql]# mysqlbinlog --no-defaults --start-datetime='2019-03-08 21:01:53' mysql-bin.000002  | mysql -u root -p

③恢复指定时间范围内的数据

[root@localhost mysql]# mysqlbinlog --no-defaults --start-datetime='2019-03-08 21:01:53' --stop-datetime='2019-03-08 21:01:55' mysql-bin.000002  | mysql -u root -p

五.总结

MySQL备份与恢复的核心是“防患于未然”:合理选择备份类型(全量+增量/差异结合)、使用合适的备份工具(中小数据量mysqldump,大数据量xtrabackup)、设计科学的备份策略,同时定期校验备份文件、执行恢复测试,才能在故障发生时快速恢复数据,最大限度减少业务损失。

实际应用中,需结合业务数据量、可用性要求(如7×24小时运行)、存储资源等因素,灵活调整备份策略,确保数据安全与业务连续性。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐