Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > mysql全量之增量备份与恢复

mysql全量之增量备份与恢复方式

作者:阿萨德791

这篇文章主要介绍了mysql全量之增量备份与恢复方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

mysql数据库备份

在当今数据驱动的时代,数据库作为企业和个人数据存储与管理的核心,其安全性至关重要。数据一旦丢失,可能会给企业带来巨大的经济损失和声誉损害,因此,数据库备份成为保障数据安全的关键环节。

MySQL 作为一款广泛使用的开源关系型数据库管理系统,深入了解其备份相关知识,对数据库管理员和开发者而言都十分必要。

数据备份的重要性

数据是企业的核心资产,它包含了业务运营、客户信息、交易记录等关键内容。数据备份是应对数据丢失风险的重要手段,它能够在数据库遭遇硬件故障、软件错误、人为误操作、恶意攻击(如勒索软件)等情况时,快速恢复数据,确保业务的连续性。

例如,一家电商企业如果因为数据库崩溃而丢失了用户订单和支付记录,不仅会导致客户不满,还可能面临法律纠纷和经济赔偿。而定期进行数据备份,就可以在灾难发生后,将数据库恢复到正常状态,减少损失。

数据库备份类型

从物理与逻辑角度分类

从数据库的备份策略角度分类

常见的备份方法

物理冷备份

物理冷备份是在数据库处于关闭状态下,直接复制数据库的物理文件。

这种方式适用于对数据库可用性要求不高的场景。在进行物理冷备份前,需要确保数据库服务已停止,以保证数据的一致性。

备份完成后,可以将文件存储在安全的存储设备中,如磁盘阵列或云存储。

专用的备份工具musqldump或mysqlhotcopy

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

MySQL 的二进制日志记录了数据库的所有更改操作,启用二进制日志后,可以利用它进行增量备份。通过定期备份二进制日志文件,并结合完全备份,可以实现基于时间点的恢复。

这种方式能够在数据丢失时,将数据库恢复到指定的时间点,最大程度地减少数据损失。

通过第三方工具备份

除了 MySQL 自带的备份工具,还有许多第三方备份工具可供选择,如 XtraBackup、Backup,Exec 等。

这些工具通常提供了更强大的功能,如图形化界面、自动化备份策略、数据压缩等,可以满足不同用户的需求。

数据库完全备份操作

物理冷备份与恢复

备份数据库

备份数据库:首先停止 MySQL 服务,在 Linux 系统下可以使用命令service mysql stop。然后将数据库的数据目录(通常是/var/lib/mysql)复制到备份目录中,例如使用命令cp -r /var/lib/mysql /backup/mysql_backup。

创建一个/backup 目录作为备份数据存储路径,使用tar创建备份文件。

[root@localhost ^]# systemctl stop mysqld
[root@localhost~]# mkdir /backup
[root@localhost~]# tar zcf /backup/mysql_all-$(date +%F).tar.gz /usr/local/mysql/data/
[root@localhost~]# 1s -1 /backup/

恢复数据库

恢复数据库:先停止 MySQL 服务,删除当前的数据目录内容,然后将备份目录中的数据文件复制回原来的数据目录,最后启动 MySQL 服务。

执行下面操作将数据库文件/usr/local/mysql/data/转移至bak 目录下,模拟故障。

[root@localhost `]# mkdir bak
[root@localhost ^]# mv/usr/local/mysql/data//root/bak/
[root@localhost ^]# mkdir restore

[root@localhost ^]# tar zxf /backup/mysql_all-2025-03-22. tar. gz -C restore/
[root@localhost ^]# mv restore/usr/local/mysql/data/ /usr/llocal/mysql/
[root@localhost ^]# systemctl start mysqld

mysqldump备份与恢复

备份数据库

备份数据库:使用命令mysqldump -u [用户名] -p [数据库名] > backup_file.sql,输入密码后即可将指定数据库备份为 SQL 文件。

例如

mysqldump -u root -p mydatabase > mydatabase_backup.sql。

查看备份文件

查看备份文件:可以使用文本编辑器打开备份的 SQL 文件,查看其中的 SQL 语句和数据。

通过 mysqldump工具导出的SQL脚本是文本文件,其中"/*......./部分或以"一"开头的行表示注释信息。使用 grep、less、cat等文本工具可以查看脚本内容。例如,执行以下操作可以过滤出test.sql脚本中的数据库操作都

[root@localhost ^]# grep -v ^--" test.sql | grep -v "^/" | grep -v
ČREATE DATABASE /*!32312 IF NOT EXISTS*/ 'test`
/*!40100 DEFAULT
CHARACTER SET utf8mb3 */ /*!80016 DEFAULT ENCRYPTICN='N' */:
USE `test`;
DROP TABLE IF EXISTS
employee";
CREATE TABLE employee
id` int NOT NULL AUTO_INCREMENT,

恢复数据库

恢复数据库:先创建一个空的数据库,然后使用命令mysql -u [用户名] -p [数据库名] < backup_file.sql,输入密码后即可将备份数据导入到新创建的数据库中。

例如,执行以下操作可以从备份文件mysql-user.sql中将表导入test库。其中"-e"选项是用于指定连接 MySQL后执行的命令,命令执行完后自动退出。

[root@localhost ^]# mysql -u root -p test < mysql-user.sq1
Enter password:
[root@localhost ^]# mysql -u root -p -e 'SHOW TABLESFROM test;

Enter password:

Tables_in_test|
user

mysql增量备份与恢复

增量备份的特点

增量备份只备份变化的数据,因此备份速度快,占用空间小,适合对数据变化频繁的数据库进行备份。但增量备份的恢复过程依赖于之前的备份文件,需要按照顺序依次应用多个备份文件,增加了恢复的复杂性和时间成本。

mysql二进制日志对备份的意义

MySQL 的二进制日志记录了数据库的所有更改操作,包括数据的插入、更新、删除等。通过分析二进制日志文件,可以获取到数据库在某个时间段内的所有变化,从而实现基于时间点的恢复。在进行增量备份时,结合二进制日志文件,可以确保备份数据的完整性和一致性。

列:log-bin=/usr/local/mysql/mysql-bin,然后重启MySQL服务就可以在指定路径下查看二进制日志文件了。默认情况下,二进制日志文件的扩展又是一个六位的数字,如mysql-bin.0000001。

[root@localhost ^]# vim /etc/my.cnf
[mysqld]
log-bin=/usr/local/mysql/data/mysql-bin

binlog_format = MIXED
server-id=1
[root@localhost^]# systemctl restart mysqld

[root@localhost ^]# ls -1 /usr/local/mysql/data/mysql-bin.*

mysql增量恢复

在进行增量恢复时,首先需要恢复上次的完全备份,然后依次应用后续的增量备份文件和二进制日志文件。

例如,先恢复完全备份文件,然后按照时间顺序应用增量备份 1、增量备份 2,最后通过二进制日志文件将数据库恢复到指定的时间点。

msyql企业备份案例

一般恢复

假设企业的数据库因为硬件故障导致数据丢失,首先使用上次的完全备份文件进行恢复。如果完全备份之后还有增量备份,再依次应用增量备份文件,使数据库恢复到接近故障发生时的状态。

这种恢复方式适用于大多数常规的数据丢失情况,能够快速恢复数据库的基本功能。

格式:mysqlbinlog[--no-defaults]增量备份文件 | mysql-u用户名-p密码

基于位置恢复

在某些情况下,企业可能需要将数据库恢复到特定的操作位置。例如,发现某个错误的 SQL 语句执行后导致数据异常,此时可以通过二进制日志文件定位到该 SQL 语句执行的位置,然后从上次完全备份开始,应用备份文件和二进制日志文件直到该位置,实现基于位置的恢复,避免错误操作带来的影响扩散。

基于时间点恢复

当企业需要将数据库恢复到某个特定的时间点时,如误删除数据前的时刻,可以利用二进制日志文件和备份文件实现基于时间点的恢复。

首先恢复完全备份,然后根据时间戳应用增量备份和二进制日志文件,将数据库恢复到指定的时间点,最大程度地减少数据丢失。

制定企业备份策略的思路

制定企业备份策略需要综合考虑多个因素,包括数据的重要性、业务的连续性要求、备份和恢复的时间成本、存储成本等。对于关键业务数据库,应采用高频次的完全备份和增量备份相结合的方式,以确保数据的安全性和快速恢复能力。同时,要定期测试备份的有效性和恢复过程,避免在实际需要恢复时出现问题。此外,还应考虑将备份数据存储在不同的地理位置,以防止自然灾害等不可抗力因素导致备份数据也丢失。

需要注意的是,不是备份完就万事大吉,最好确认备份是否可用,所以备份之后的恢复测试是非常有必要的。同时备份时间也要灵活调整,如

mysql的GTID

GTID(Global Transaction Identifier)是 MySQL 5.6 版本引入的新特性,它为每个事务分配一个唯一的标识符,用于标识事务在整个复制环境中的唯一性。GTID 使得复制和恢复操作更加简单和可靠,它可以确保在主从复制环境中,事务的执行顺序和一致性。

配置GTID并进行恢复全量等操作

在 MySQL 配置文件中启用 GTID,添加配置项gtid_mode=ON和enforce_gtid_consistency=ON。启用 GTID 后,在进行全量恢复时,可以更方便地确定事务的执行顺序,确保恢复的数据一致性。例如,在从库故障后恢复时,通过 GTID 可以快速定位到主库上的事务位置,从正确的位置开始复制数据,提高恢复效率和准确性。

通过下面的实验,了解基于gtid的增量备份和恢复

配置my.cnf开启gtid

[root@localhost ^]# vim /etc/my.cnf
[mysqld]
gtid_mode = ON
enforce_gtid_consistency=ON

[root@localhost ^]# systemctl restart mysqld

[root@localhost ^]# mysql -uroot -p
mysql> SHOW GLOBAL VARIABLES LIKEgtid_mode';

创建基本测试库、表、数据

mysql>resetmaster;
mysql> show master status;

xtrabackup应用在恢复操作中的案例

XtraBackup 是一款开源的 MySQL 热备份工具,它可以在数据库运行时进行物理备份,支持 InnoDB 和 XtraDB 存储引擎。以下是一个 XtraBackup 应用在恢复操作中的案例:​

TypeScript

取消自动换行复制

innobackupex --apply-log /backup/full_backup​
innobackupex --copy-back /backup/full_backup​

--apply-log选项用于准备备份数据,使其可以用于恢复;--copy-back选项用于将备份数据复制到数据库的数据目录中。最后,启动 MySQL 服务,数据库即可恢复到备份时的状态。​

如果需要基于时间点进行恢复,可以结合二进制日志文件。在进行全量备份后,继续备份二进制日志文件。在恢复时,先进行全量恢复,然后通过二进制日志文件将数据库恢复到指定的时间点,实现更精确的数据恢复。​

总之,MySQL 数据库备份是保障数据安全的重要环节,通过了解不同的备份类型、方法和恢复操作,以及制定合理的备份策略,企业可以有效地保护数据,确保业务的连续性和稳定性。同时,合理运用 GTID 和 XtraBackup 等工具,可以进一步提高备份和恢复的效率与可靠性。

全量备份:执行以下命令进行全量备份

xtrabackup --defaults-file=/etc/my.cnf --user=root --password=123456 --backup --target-dir=/root/backup/full

模拟数据变更:在数据库中创建一个测试表并插入一些数据

CREATE TABLE test_table (id INT PRIMARY KEY, name VARCHAR(20));
INSERT INTO test_table VALUES (1, 'John'),(2, 'Alice');

增量备份:执行以下命令进行增量备份

xtrabackup --defaults-file=/etc/my.cnf --user=root --password=123456 --incremental --incremental-basedir=/root/backup/full --target-dir=/root/backup/incr1

再次模拟数据变更:向测试表中插入新的数据。

INSERT INTO test_table VALUES (3, 'Bob');

再次增量备份:执行以下命令进行第二次增量备份

xtrabackup --defaults-file=/etc/my.cnf --user=root --password=123456 --incremental --incremental-basedir=/root/backup/incr1 --target-dir=/root/backup/incr2

模拟数据丢失:误删除测试表

DROP TABLE test_table;

恢复操作

停止数据库服务执行systemctl stop mysqld命令

备份当前数据目录和 binlog 文件:将当前的数据目录进行备份,执行mv /var/lib/mysql /var/lib/mysql.bak命令。同时,备份 binlog 文件,使用cp /var/lib/mysql/mysql - bin.* /path/to/binlog_backup/命令,将 binlog 文件复制到指定的备份目录

准备全量备份:执行以下命令准备全量备份

xtrabackup --prepare --apply-log-only --target-dir=/root/backup/full

应用增量备份:按照顺序应用增量备份。先应用第一次增量备份:

xtrabackup --prepare --apply-log-only --target-dir=/root/backup/full --incremental-dir=/root/backup/incr1

再应用第二次增量备份(最后一个增量备份不需要--apply - log - only参数)

xtrabackup --prepare --target-dir=/root/backup/full --incremental-dir=/root/backup/incr2

将数据恢复到 MySQL 数据目录:执行以下命令将恢复后的数据复制回 MySQL 的数据目录

xtrabackup --copy-back --target-dir=/root/backup/full

执行systemctl start mysqld命令启动 MySQL 服务,查询测试表,确认数据是否恢复成功。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文