Bootstrap

mysql 备份最佳实践_MySQL备份的最佳实践

MySQL相关事物的最佳实践,除了性能调优、查询优化和复制配置之外,另一个重要的主题是备份。让我们深入讨论一下关于MySQL备份的一些基础知识和最佳实践。

逻辑MySQL备份

在MySQL中,可以用两种不同的形式进行备份。第一种形式,逻辑,是最普遍的。本质上,您需要创建所有必要的INSERT语句来重新填充表数据。该地区最流行的两个工具是mysqldump和my dump。

mysqldump

这个工具从一开始就存在,并且支持许多不同的选项,太多了,在这篇文章中无法讨论。

这里有一个简单的例子,在对结果进行压缩的同时,对“成员”数据库进行逻辑备份。

mysqldump --single-transaction members | gzip - >members.sql.gz

如果您想对所有数据库中的所有表进行完整备份,您可以这样做:

mysqldump --single-transaction --all-databases | gzip - >full_backup.sql.gz

请注意–单笔交易标志的使用。此标志“通过转储中的所有表来创建一致的快照

单一交易。"如果不使用此标志,则完整的备份可能包含相关表之间的不一致。

矛盾

mysqldump最大的缺点之一是缺乏并行性。该工具从第一个数据库开始,按字母顺序排列,然后一次转储一个表。考虑一个将数据插入表“alpha”和“zeta”的事务。现在备份开始了。当备份到达表“增量”时,另一个事务从“zeta”中删除。你的备份现在在阿尔法和泽塔之间不一致。

这就是为什么–单笔交易标志很重要。

mydumper

这mydumper工具是一个开源的第三方工具,最初由Domas Mituzas,现在由马克斯·布比维护。该工具的功能类似于mysqldump,但提供了许多改进,如并行备份、一致读取和内置压缩。mydumper的另一个好处是每个单独的表都被转储到一个单独的文件中。这使得单个表的恢复大大优于MySQL dump(MySQL dump将所有内容压缩到一个文件中)。

mydumper --compress

上述命令将连接到您的本地MySQL服务器,并开始所有数据库中所有表的一致转储。如上所述,每个表都将在转储目录中创建一个单独的文件,该文件以此模式命名为“export-YYYYYMMDD-HHMMSS”。每个转储文件都将使用gzip单独压缩。

配套工具myloader也包括在内。该工具允许并行恢复表;mysqldump做不到的事情。

物理MySQL备份

物理备份将表数据文件从一个位置复制到另一个位置,最好是以在线、一致的方式。Percona XtraBackup符合这个描述。还有MySQL企业备份和设备快照,前者是甲骨文的付费产品。应该注意的是,Percona XtraBackup是免费的、开源的,可以做企业选件可以做的一切,等等。

Percona XtraBackup

xtrabackup --backup --parallel 4 --compress --target-dir /var/backup/

上述命令将连接到您的MySQL服务器,并执行一个压缩(使用qpress)并行备份,将结果数据文件存储到/var/backup/。在这个目录中,你会找到所有熟悉的文件,比如ibdata1、mysql.ibd和所有其他文件。ibd文件,代表你的数据。

您还可以将物理备份“流式传输”到单个归档:

xtrabackup --backup --parallel 4 --stream=xbstream > mybackup.xbstream

OR

xtrabackup --backup --stream=tar > mybackup.tar

注意:“tar”存档不支持并行性)

还有,多亏了佩尔孔纳xbcloud工具,您可以直接流向任何S3兼容桶:

xtrabackup --backup --stream=xbstream | xbcloud put --storage=s3 mybackup_s3.blob

卷快照

在某些情况下,备份所需的数据量太大,无法导出物理备份(更不用说逻辑转储)。考虑数据集大于1TB的MySQL服务器。即使使用快速磁盘,执行物理备份也可能需要很多很多小时。

在这些情况下,使用底层文件系统或磁盘设备的快照功能执行物理备份要快得多。

LVM和ZFS都有本地快照。在拍摄快照之前,请确保MySQL已停止写操作,并将大部分内存信息刷新到磁盘。这是一个使用ZFS的例子伊夫·特鲁多:

mysql -e 'FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS; ! zfs snapshot -r mysqldata/mysql@my_first_snapshot'

上面的例子将锁定MySQL中的所有表,防止来自其他事务的写入,打印出当前的二进制日志位置信息,然后转义到执行ZFS快照命令的外壳。一旦快照返回,到MySQL的连接退出并解锁所有表。

大多数云提供商还支持其数据块设备的本机快照功能(即EC2、GPD)。该过程类似于上面的ZFS例子。

验证MySQL备份

所以你有一个很好的备份程序,遵循所有的最佳实践。你怎么知道备份成功了?你看了文件的大小了吗?您是否只检查了创建的文件?也许你只看了你使用的工具的退出代码?

Shlomi Noach之前告诉我的Percona实时会议"在验证备份之前,您还没有进行备份。"好建议。换句话说,您进行的每个备份都可以被视为薛定谔的备份;直到你验证它,它工作吗?

这里的最佳实践是使用您创建的备份简单地恢复MySQL服务器;然而,是你创造了它。处理此恢复的机器不需要像源一样强大;一个简单的虚拟机可以管理这个任务,并且可以很好地实现自动化。

您可以使用mysql客户端本身恢复mysqldump:

zcat my_full_backup.sql.gz | mysql

使用mydumper/myloader:

myloader --directory dump_dir --overwrite-tables --verbose=3

Percona XtraBackup:

# Prepare the backup

xtrabackup --prepare --parallel 4 --use-memory 4G --target-dir /var/backup

# Copy backup to original location (ie: /var/lib/mysql), assuming backup taken on same host

xtrabackup --copy-back --target-dir /var/backup

# Fix file permissions if necessary

chown -R mysql:mysql /var/lib/mysql

# Start MySQL

systemctl start mysql

# Prepare the backup

xtrabackup --prepare --parallel 4 --use-memory 4G --target-dir /var/backup

# Copy backup to original location (ie: /var/lib/mysql), assuming backup taken on same host

xtrabackup --copy-back --target-dir /var/backup

# Fix file permissions if necessary

chown -R mysql:mysql /var/lib/mysql

# Start MySQL

systemctl start mysql

是的,Percona XtraBackup确实需要更多步骤,但物理备份始终是最快的备份方式和最快的恢复方式。

总结

有许多不同的方法来进行MySQL备份。希望这篇文章能让您在选择备份方法时对一些最佳实践有所了解。

还要考虑几件事:

上述大多数工具都支持加密备份。请务必备份您的加密密钥的副本!

本文不涉及时间点恢复(PITR)。但是,为了实现PITR,您还需要备份您的二进制日志。rsync可以对此提供帮助,或者mysqlbinlog工具本身可以是一个实时binlog备份工具。

一定要备份一份 my.cnf

文章来源:https://www.percona.com/blog/2020/05/27/best-practices-for-mysql-backups/

;