如何使用mysqldump还原单个MySQL表?

发布于:2020-12-19 17:52:54

0

202

0

mysqldump 还原 MySQL

Mysqldump是MySQL最流行的逻辑备份工具。它包含在MySQL发行版中,因此可以在所有MySQL实例上使用。 

但是,逻辑备份不是备份MySQL数据库的最快也是最节省空间的方法,但是与物理备份相比,它们具有巨大的优势。 

物理备份通常是全部备份或不备份。尽管可以使用Xtrabackup创建部分备份(我们在以前的博客文章之一中对此进行了描述),但是还原这种备份既棘手又费时。 

基本上,如果要还原单个表,则必须停止整个复制链,并立即在所有节点上执行恢复。这是一个主要问题-如今,您很少负担停止所有数据库的费用。 

另一个问题是表级别是Xtrabackup可以实现的最低粒度级别:您可以还原单个表,但不能还原其中的一部分。但是,可以通过运行SQL语句的方式来恢复逻辑备份,因此可以在正在运行的群集上轻松地执行逻辑备份,并且您可以(虽然我们不容易称呼它,但仍然可以)选择要运行的SQL语句,因此您可以对表进行部分还原。 

让我们看一下如何在现实世界中做到这一点。

使用mysqldump还原单个MySQL表

刚开始时,请记住,部分备份不能提供一致的数据视图。当您备份单独的表时,即使您要从备份中还原所有数据,也无法及时将这种备份还原到已知位置(例如,配置复制从属)。有了这些,让我们继续吧。

我们有一个主人和一个奴隶:

数据集包含一个模式和几个表:

{xunruicms_img_title}

现在,我们必须备份。有几种方法可以解决此问题。我们可以对整个数据集进行一致的备份,但这将生成一个包含所有数据的大型单个文件。要恢复单个表,我们将不得不从该文件中提取表的数据。当然可以,但是这很耗时,可以手动编写脚本,但是如果没有适当的脚本,那么当数据库宕机并且承受沉重压力时编写临时代码是非常困难的。不一定是最安全的主意。

取而代之的是,我们可以通过将每个表存储在单独文件中的方式来准备备份:

1个

root@vagrant:~/backup# d=$(date +%Y%m%d) ; db='sbtest'; for tab in $(mysql -uroot -ppass -h127.0.0.1 -e "SHOW TABLES FROM ${db}" | grep -v Tables_in_${db}) ; do mysqldump --set-gtid-purged=OFF --routines --events --triggers ${db} ${tab} > ${d}_${db}.${tab}.sql ; done

请注意,我们设置--set-gtid-purged = OFF。如果以后要将此数据加载到数据库中,则需要它。否则,MySQL将尝试设置@@ GLOBAL.GTID_PURGED,这很可能会失败。MySQL最好将SET @@ SESSION.SQL_LOG_BIN = 0设置为; 这绝对不是我们想要的。如果我们要对整个数据集进行一致的备份,并且我们想使用它来设置新节点,则需要这些设置。在我们的案例中,我们知道这不是一致的备份,因此我们无法从中重建任何内容。我们只需要生成一个转储文件,然后将其加载到主服务器上,然后将其复制到从服务器上即可。

该命令生成了一个不错的sql文件列表,可以将其上传到生产集群:

{xunruicms_img_title}

当您想要还原数据时,您所需要做的就是将SQL文件加载到主节点中:

1个

root@vagrant:~/backup# mysql -uroot -ppass sbtest < 20200318_sbtest.sbtest11.sql

数据将被加载到数据库中并复制到所有从站。

如何使用ClusterControl还原单个MySQL表?

当前,ClusterControl不能提供一种简单的方法来恢复单个表,但是仍然可以通过一些手动操作来恢复它。您可以使用两个选项。首先,适用于少量表,基本上可以创建计划,在该计划中对一个单独的表进行部分备份:

在这里,我们正在备份sbtest.sbtest1表。我们可以轻松地为sbtest2表安排另一个备份:

或者,我们可以执行备份并将数据从单个模式放入单独的文件中:

现在,您可以在文件中手动找到丢失的数据,将此备份还原到单独的服务器,或者让ClusterControl进行:

您可以保持服务器正常运行,并且可以使用mysqldump或SELECT…INTO OUTFILE提取要还原的数据。这样提取的数据将准备好应用于生产集群。