本文为墨天轮数据库管理服务团队第85期技术分享,内容原创,作者为技术顾问邓涛,如需转载请联系小墨(VX:modb666)并注明来源。如需查看更多文章可关注【墨天轮】公众号。
一、mysqldump
mysqldump 是 MySQL 数据库管理系统中用于备份数据库的命令行工具。其备份原理主要涉及以下几个方面:
1、逻辑备份
SQL 语句生成: mysqldump
通过读取数据库的结构和数据,生成一系列 SQL 语句。
对于数据库结构(如表、视图、存储过程等),它会生成 CREATE
语句。
对于数据内容,它会生成 INSERT
语句。
转储文件: 这些生成的 SQL 语句会被保存到一个文本文件中,通常称为“转储文件”或“备份文件”。
2、数据一致性
锁定机制: 在备份过程中,mysqldump
可以使用 --lock-tables
或 --lock-all-tables
选项来确保数据的一致性。
--lock-tables 会锁定每个表在备份期间不被修改。
--lock-all-tables 会对整个数据库加锁,适用于小型数据库,但可能会导致长时间的服务不可用。
事务支持: 对于支持事务的存储引擎(如 InnoDB),可以使用 --single-transaction
选项。这个选项会在开始备份时启动一个事务,并在整个备份过程中保持数据库处于一致的状态,而无需锁定整个数据库。
3、增量备份
mysqldump 本身不直接支持增量备份,但可以通过结合其他工具和方法实现。
使用 --flush-logs
和 --master-data
选项可以在备份时记录二进制日志的位置,从而为后续的增量备份提供基准点。
结合 mysqlbinlog
工具可以解析和应用这些二进制日志来实现增量恢复。
以下是使用**mysqldump**
结合相关操作实现增量备份的实际操作示例:
1、初始全量备份
首先进行一次全量备份,假设备份整个实例,将备份文件保存为mydb\_full\_backup.sql。命令示例:
mysqldump -h -P -u -p --all-databases --master-data=2 --single-transaction --triggers --routines --events > mydb_full_backup.sql
这里的--single - transaction确保备份过程中数据库处于一致状态(适用于InnoDB等支持事务的存储引擎),--master - data = 2会在备份文件中记录二进制日志文件名和位置信息(以注释的形式)。
2、增量备份
假设全量备份完成后,数据库有了一些新的数据变更。要进行增量备份。首先确定上次全量备份或者增量备份时记录的二进制日志文件名和位置(从全量备份文件中的注释部分查找,例如CHANGE MASTER TO MASTER\_LOG\_FILE='mysql - bin.000007',MASTER\_LOG\_POS = 192;)。然后使用mysqlbinlog工具来获取从该位置之后的二进制日志内容作为增量备份。命令示例(假设上次记录的二进制日志文件为mysql - bin.000007,位置为192):
mysqlbinlog -h -P -u -p --start-position=192 mysql - bin.000007 > mydb_incremental_backup.sql
如果期间有多个二进制日志文件,则需要按照顺序依次获取每个文件中从指定位置开始的增量部分。例如,如果下一个二进制日志文件是mysql - bin.000002,并且要接着上一个增量备份继续获取增量内容,可以先确定在mysql - bin.000002中的起始位置(可以通过查看上一个mysqlbinlog输出中的end\_log\_pos等信息确定大概位置),然后使用类似命令获取增量内容并追加到增量备份文件中。
3、恢复数据
全量恢复如果要进行全量恢复,直接使用全量备份文件:
mysql -u root -p < mydb_full_backup.sql
增量恢复在进行了全量恢复之后,如果需要应用增量备份,将增量备份文件中的内容应用到数据库中:
mysql -u root -p mydb < mydb_incremental_backup.sql
需要注意的是,在实际操作中,要根据具体的数据库环境、业务需求和安全策略进行调整,并且要妥善管理备份文件和二进制日志文件。
4、压缩与加密压缩
可以使用管道将 mysqldump 的输出直接传递给压缩工具(如 gzip),以减小备份文件的大小。
mysqldump -h -P -u -p --all-databases --master-data=2 --single-transaction --triggers --routines --events |gzip > all_databases.gz 也可以指定其他压缩算法
加密: 可以在生成备份文件后使用加密工具(如 gpg)对其进行加密,以增强安全性。
mysqldump -u username -p database_name > backup.sql
5、恢复过程导入
SQL 文件: 恢复时,可以使用 mysql 命令行工具将备份文件中的 SQL 语句重新执行,从而恢复数据库到备份时的状态。
mysql -u username -p database_name < backup.sql
总结
mysqldump 的备份原理主要是通过生成并保存一系列 SQL 语句来实现数据库的逻辑备份。它提供了多种选项来确保数据的一致性和完整性,并且可以与其他工具结合使用以实现更高级的功能,如增量备份、压缩和加密。
通过理解这些原理和使用方法,可以更有效地管理和维护数据库的备份策略。
其他
single-transaction 保证在-个事务中所有相同的查询读取到相同的数据,只会在 dump开启时短暂获取 global read lock,否则备份中全场锁表
- master-data=[12] 生成整个备份文件的检查点,1表示执行,2表示不执行在导入时候
- add drop_database 导入数据时,如果数据库存在有两种策略,一种是使用drop database if exists ,另一种是直接忽略该操作,默认第一种
另外有以下默认值供设定和更改
all-databases false
all-tablespaces false
no-tablespaces false
add-drop-database false
add-drop-table true
triggers--routines -events 用于选择是否备份触发器和存储过程
order-by-primary 根据主键进行排序
skip-extended-insert 省略版插入语句
complete-insert 完整版插入语句
replace 把insert 转化成replace
二、xtrabackup 备份
xtrabackup 是一个用于 MySQL 和 MariaDB 数据库的备份工具,它提供了热备份(在线备份)的功能,这意味着可以在不中断数据库服务的情况下进行备份。以下是 xtrabackup 的备份原理:
1、基于 InnoDB 的备份
xtrabackup 主要针对 InnoDB 存储引擎进行备份,利用了 InnoDB 的日志机制(redo log 和 undo log)来实现一致性备份。
2、备份过程
准备阶段(Prepare Phase):xtrabackup 首先会复制数据文件(如 .ibd 文件)和系统表空间(通常是 ibdata1)。然后,它会应用备份期间产生的所有 redo 日志,以确保备份数据的一致性。最后,它会回滚未提交的事务,确保备份数据是干净的。
备份阶段(Backup Phase):在准备阶段完成后,xtrabackup 会将备份数据打包成一个压缩文件,便于存储和传输。
3、增量备份
xtrabackup 支持增量备份,这意味着可以基于之前的全量备份进行增量备份,只备份自上次备份以来发生变化的数据。这大大减少了备份所需的时间和存储空间。
4、恢复过程
准备恢复:将全量备份和所有相关的增量备份解压到指定目录。应用所有的增量备份到全量备份上,确保数据的一致性。
实际恢复:将准备好的数据文件复制回数据库的数据目录。修改相关的配置文件,如 my.cnf,确保指向正确的数据目录。启动数据库服务,完成恢复过程。
5、特点热备份
不需要停止数据库服务即可进行备份。一致性:通过应用 redo 日志和回滚未提交的事务,确保备份数据的一致性。增量备份:支持增量备份,减少备份时间和存储空间需求。灵活恢复:支持多种恢复场景,包括全量恢复和基于增量的恢复。
6、注意事项
xtrabackup 主要针对 InnoDB 存储引擎,对于其他存储引擎(如 MyISAM),需要额外的处理。在进行备份和恢复操作时,建议仔细阅读官方文档,确保操作的正确性和安全性。
通过以上原理,xtrabackup 能够在不影响数据库性能的情况下,提供高效、一致的备份解决方案。
备份命令示例
xtrabackup 提供了许多参数来定制备份过程。以下是一些常用的参数及其含义:
- 基本备份参数
--backup:执行备份操作。
--target-dir:指定备份数据存放的目标目录。
--user 和 --password:用于连接数据库的用户名和密码。
--host 和 --port:指定数据库服务器的主机名和端口号。
- 备份模式参数
--full:执行全量备份。
--incremental:基于之前的全量或增量备份执行增量备份。
--incremental-basedir:指定增量备份所基于的上一个备份目录。
- 日志和一致性参数
--redo-only:仅应用 redo 日志,不回滚未提交的事务(通常用于增量备份的准备阶段)。
--apply-log:应用 redo 日志并回滚未提交的事务,使备份数据达到一致状态。
--flush-logs:在备份开始前刷新所有日志文件,确保备份包含所有最新的数据变更。
- 性能优化参数
--compress:压缩备份数据以节省存储空间。
--compress-chunk-size:指定压缩数据块的大小。
--no-compress:禁用压缩。
- 其他常用参数
--backup-dir:与 --target-dir 类似,但更明确地指定备份目录。
--safe-slave-backup:在从库上执行备份时,确保备份过程中不会因为主库的数据变更而导致从库数据不一致。
--slave-info:在备份从库时,记录主库的二进制日志文件名和位置信息,以便后续的数据同步。
--databases 和 --tables-file:指定要备份的数据库或表。
--ignore-databases:指定要忽略的数据库。
--parallel:启用并行备份,加快备份速度。
--throttle:限制备份过程中 I/O 操作的速率,以减少对数据库性能的影响。
- 示例命令
以下以下是一个执行全量备份不压缩的示例命令:
xtrabackup --defaults-file=/data/teledb_database/mysql/etc/mysql10001.cnf --user=root --password='***' --host=*** --port=*** --backup --parallel=10 --target-dir=/data/backup/mysqlfull --datadir=/data/teledb_database/mysql/data
以下是一个执行全量备份并压缩的示例命令:
xtrabackup --backup --target-dir=/path/to/backup --user=root --password=secret --host=localhost --port=3306 --compress
以下是一个执行增量备份的示例命令:
xtrabackup --defaults-file=/app/mysql/mysql/mysql-5.7.39/etc/my8801.cnf --user=root --password=*** --host=*** --port=*** --parallel=10 --incremental-basedir=/app/xtrabackup/backup/full/ --target-dir=/app/xtrabackup/backup/incremental/ --backup
注意事项在使用 xtrabackup 进行备份时,确保数据库服务器配置正确,并且备份目录有足够的存储空间。定期检查和测试备份文件,确保备份数据的完整性和可恢复性。根据实际需求和环境调整参数,以达到最佳的备份效果和性能。
通过合理使用这些参数,可以灵活地控制 xtrabackup 的备份过程,满足不同的备份需求。
三、binlog 备份
备份binlog可以使用官方mysqlbinlog命令,有一个选项上stop-never 可以实时远程同步到备份服务器,一个基本备份命令如下
mysqlbinlog -read-from-remote-server --raw --host=192.168.*.* --port=3306 --user=mydbUser --password=xxx --stop-never mysql-bin.000001
四、xtrabackup 恢复
xtrabackup 是一个强大的备份工具,专为 MySQL 和 MariaDB 数据库设计,支持热备份(在线备份)和增量备份。以下是 xtrabackup 恢复的基本步骤:
1、准备恢复
解压备份文件: 如果备份文件是压缩的,首先需要解压。
xtrabackup --decompress --target-dir=/path/to/backup
应用日志: 应用备份期间产生的所有 redo 日志,并回滚未提交的事务,以确保备份数据的一致性。
xtrabackup --user=root --password='***' --host=*** --port=*** --parallel=10 --target-dir=/data/backup/mysqlfull --prepare --apply-log-only
准备增量备份(如果有): 如果有增量备份,需要先将增量备份应用到全量备份上。
xtrabackup --user=root --password=*** --host=*** --port=*** --parallel=10 --target-dir=/app/xtrabackup/backup/full/ --prepare --apply-log-only --incremental-dir=/app/xtrabackup/backup/incremental/
2、实际恢复
停止数据库服务: 在恢复数据之前,需要停止 MySQL 或 MariaDB 数据库服务。
systemctl stop mysql
复制数据文件: 将准备好的数据文件复制回数据库的数据目录。
## prepare 阶段 会应用备份阶段的relog
修改权限: 确保数据文件的权限正确。
启动数据库服务: 启动 MySQL 或 MariaDB 数据库服务。
systemctl start mysql
3、验证恢复
检查数据库状态: 登录到数据库,检查数据库是否正常运行,数据是否完整。
mysql -u root -p
验证数据: 运行一些查询,确保所有数据都已正确恢复。
注意事项
- 备份目录:确保备份目录有足够的存储空间,并且备份文件完整。
- 日志文件:在恢复过程中,确保所有相关的日志文件(redo log 和 undo log)都已正确应用。
- 权限:在复制数据文件时,确保文件权限和所有权设置正确,以避免数据库启动失败。
- 测试恢复:在生产环境中进行恢复操作之前,建议先在测试环境中进行恢复测试,确保备份和恢复过程无误。
墨天轮从乐知乐享的数据库技术社区蓄势出发,全面升级,提供多类型数据库管理服务。墨天轮数据库管理服务旨在为用户构建信赖可托付的数据库环境,并为数据库厂商提供中立的生态支持。