# New backup and recovery approaches

嘿！我们有一些好消息要与你分享，关于最近作为[Manticore Search 6](https://manticoresearch.com/blog/manticore-search-6-0-0/)一部分发布的**Manticore**备份工具。如果你重视数据并希望确保其安全性和安全性，那么这 definitely 是你想要了解的内容。

该工具在备份你的 Manticore 数据方面是一个游戏规则改变者。你不再需要担心由于系统崩溃或其他意外事件而丢失重要信息。有了新工具，你可以通过将其添加到 cron 作业中轻松自动化备份过程。这意味着你可以安心休息，知道你的数据得到了保护。

## 历史

过去，保护你的数据是一项艰巨的任务，需要手动备份，这通常耗时且容易出错。让我们回忆一下当时有多困难。

**Manticore Search** 支持两种类型的表：`RT`（实时）和 `plain`。虽然两者有不同的用途，但值得注意的是，备份 plain 表相对容易，而 RT 表则需要更细致的方法。

### RT 表备份

你可能长期以来一直为备份 **Manticore Search** 的 RT 表数据而苦恼，没有可靠的工具使这个过程无缝进行。如果你好奇，让我带你回顾一下以前手动备份过程是怎样的：

- 首先，重要的是停止 **Manticore Search** 并确保所有数据已正确刷新，程序已正确退出。
- 接下来，你需要通过参考 Manticore 配置找到 `data_dir` / `path` 文件夹，并从其中复制所有数据。这确保了所有数据都被保存，必要时可以恢复。需要注意的是，当处理大量数据时，备份过程可能需要一些时间，导致实例停止时的停机时间。然而，这一步是必要的，以确保你的数据安全和可用。
- 最后，你必须重新启动 **Manticore Search**。

或者，你可以执行 `set global maintenance=1` 然后进行备份，或者将你的应用程序切换到 `_readonly` 监听器并确保任何写入操作都停止。

### Plain 表备份

当你在 Manticore Search 中使用 plain 表时，磁盘上的文件仅在你运行索引器或通过 SQL 查询更新属性时才会更新。这种简单的方法使得备份索引变得容易。虽然这不是一项困难的任务，但我们仍计划将其包含在备份工具中。你可以关注并查看相关 [问题](https://github.com/manticoresoftware/manticoresearch-backup/issues/48) 的更新。

新的备份工具提供了一种显著更简便的方式来处理备份。有了它，一切都被简化并变得直接。你甚至可以安排定期备份，这样你总能随时获得最新版本的数据，而无需停机或麻烦。

## 开发备份工具的进展

为了开发该工具，我们必须向现有的 Manticore 系统添加额外的功能：`FREEZE` 和 `UNFREEZE` 命令，在备份过程中起着确保数据一致性的重要作用。

**Manticore Search** 中的 `FREEZE` 和 `UNFREEZE` 命令与 **MySQL** 的传统锁定和解锁表功能略有不同。使用 `FREEZE` 时，它会停止将数据刷新到磁盘，但仍允许向表中写入并从表中选择更新后的数据。需要注意的是，如果在执行涉及大量插入的长时间备份操作时，RAM 块的大小超过 `rt_mem_limit` 阈值，可能会导致数据被刷新到磁盘。只有在刷新完成后，写入操作才会被阻止。不过，这种方法在完全锁定表、保持数据一致性以及在表被冻结时确保数据库写入可用性之间取得了平衡。

这些功能对于可靠的 **在线** 备份解决方案至关重要。没有它们，恢复数据可能会导致不一致或损坏的数据，造成重大头痛并耗费你的时间和资源。为了确保正确的备份逻辑，我们首先对所有表进行 FREEZE。接下来，我们逐个备份每个表，并在每次备份后执行 UNFREEZE。此外，该工具还有一种保护措施，如果进程失败或被用户终止，会自动为所有表执行 UNFREEZE。

在确保我们拥有安全实现数据复制逻辑所需的命令后，下一个问题是——我们应该使用哪种编程语言来实现该工具？我们的团队已经决定使用 PHP 作为 [Manticore Buddy 项目](https://manticoresearch.com/blog/manticoresearch-buddy-intro/) 的首选语言。因此，对我们来说，使用 PHP 实现数据备份过程是一个轻松的决定：

- 首先，与通常用于类似工具的 Bash 相比，PHP 提供了更大的灵活性。这对于我们项目的具体要求至关重要。例如，它允许在 Windows 环境中使用该工具，而使用 Bash 则不可能。
- 其次，更重要的是，我们设计它的方式使得我们可以以相同的灵活性在 Manticore Buddy 中重用相同的代码。

备份工具需要某些外部模块，包括压缩。为了简化其使用，我们静态编译 PHP 并在其中包含所有扩展。这个合并的实体被称为 `manticore-executor`。本质上，它就像 PHP，但包含了一切以运行各种 Manticore Search PHP 项目：Manticore Buddy 和备份工具。你可以查看我们关于 [Manticore Buddy 的开发以及我们在其中如何使用 PHP](https://manticoresearch.com/blog/manticoresearch-buddy-challenges-and-solutions/) 的故事。

这使得不仅可以从命令行使用该工具，还可以在 Manticore 中作为新的 SQL 命令使用相同的代码库。

现在，让我们学习如何通过使用 CLI 和 SQL 接口备份您的数据！

## manticore-backup - CLI 版本

新的备份工具在 [Manticore 6](https://manticoresearch.com/blog/manticore-search-6-0-0/) 中发布，因此如果您遵循 Manticore [安装指南](https://manticoresearch.com/install/) 页面，安装它非常简单。

假设您已经成功安装了备份工具，现在您应该可以访问 `manticore-backup` 可执行文件。让我们看一些您可以在日常工作中使用该工具的真实示例。首先，确保您已创建一个 `/backup` 文件夹来存储所有备份。此文件夹将在以下所有示例中使用，以说明该工具的工作原理，但当然它不必完全是 `/backup`，您可以选择任何您想要的路径。

1. **场景 1**：您想备份整个 Manticore 实例：

```bash
manticore-backup --config=/etc/manticore/manticore.conf --backup-dir=/backup
```

1. **场景 2**：您只想备份几个表：

```bash
manticore-backup --config=/etc/manticore/manticore.conf --backup-dir=/backup --tables=users,messages,products
```

请记得定期备份您的数据，以确保一切安全。此外，建议将其镜像到不同的服务器或数据中心，以确保所有数据始终可用。

查看 [备份帮助部分](https://manual.manticoresearch.com/Securing_and_compacting_a_table/Backup_and_restore) 以深入了解如何使用该工具。

## 如何使用 SQL BACKUP 命令？

[Manticore 6](https://manticoresearch.com/blog/manticore-search-6-0-0/) 还允许您使用 SQL 接口进行备份，而无需安装任何东西或遵循特殊说明。您可以使用上一节中讨论的相同方法备份整个实例或特定表。

1. 对于整个实例备份，请使用此命令：

```sql
BACKUP TO /backup
```

1. 对于特定表备份，请使用此：

```sql
BACKUP TABLES users, messages, products TO /backup

```

请记住，备份大量数据可能需要一些时间。为了避免在运行 BACKUP 命令时担心失去与 Manticore 的连接，您可以异步执行查询。您将立即收到一个查询 ID，并可以通过发送命令 `SHOW QUERIES` 来检查备份过程状态。以下是一个示例：

```sql
BACKUP TO /backup OPTION async=1
```

就是这么简单！

现在，您可能会想，“*恢复备份的数据怎么办？*”

## 恢复

我们已经成功使用两种不同的方法创建了备份，确保您的数据安全可靠。但是，您如何恢复数据呢？别担心，我们会为您提供帮助。

目前，`manticore-backup` 仅支持在 Manticore Search 守护进程停止时恢复完整备份，但我们在 [计划](https://github.com/manticoresoftware/manticoresearch-backup/issues/58) 中添加单个表的恢复。

假设您已将数据备份到 `/backup`，并且备份工具创建并存储了一个名为 `backup-20230305121400` 的文件夹。您需要停止 Manticore Search 实例，删除所有数据和配置，并运行命令：

```bash
 manticore-backup --config=/etc/manticore/manticore.conf --backup-dir=/backup --restore=backup-20230305121400
```

如果您仍想恢复特定表，可以在 SQL 模式下使用 [IMPORT TABLE](https://manual.manticoresearch.com/Data_creation_and_modification/Adding_data_from_external_storages/Adding_data_to_tables/Importing_table)。例如，如果您在备份中有一个名为 `users` 的表，您只需发送如下查询：

```sql
IMPORT TABLE users FROM '/backup/backup-20230305121400/data/users'
```

您可以在文档中找到有关 `manticore-backup --restore` 的更多信息 [这里](https://manual.manticoresearch.com/Securing_and_compacting_a_table/Backup_and_restore#Restore) 和关于 `IMPORT` 命令 [这里](https://manual.manticoresearch.com/Data_creation_and_modification/Adding_data_from_external_storages/Adding_data_to_tables/Importing_table#Importing-table)。

## 总结

在生产环境中运行事务时，备份数据绝对是必须做的事情。现在，借助 `manticore-backup` 和 `BACKUP` 命令，您可以轻松完成。

要开始使用新的备份工具，请访问我们的 [文档](https://manual.manticoresearch.com/Securing_and_compacting_a_table/Backup_and_restore#Backup-and-restore)。我们相信您会喜欢它！如果您有任何功能请求，请通过 [GitHub Issues](https://github.com/manticoresoftware/manticoresearch-backup) 与我们分享。

最好的祝福，**Manticore** 团队 ❤️
