我在 128Gb SSD 上运行 MySQL 及其数据目录。我正在处理每周加载和处理的大型数据集(~20Gb),每个数据集都存储在单独的数据库中以进行时间点比较。将所有数据放入单个数据库中是不可行的,因为如此大型数据库的性能已经是一个问题。但是,我无法一次在 SSD 上保存超过 6 个数据集。现在我每周手动将最旧的数据转储到更大的 2Tb 旋转磁盘,并删除数据库以便为新数据库腾出空间。但如果我需要其中一个“存档”数据库(半定期发生),我必须删除当前数据库(转储后),重新加载它,执行我需要的操作,然后反转结果。
有没有办法配置 MySQL 以使用多个数据目录,比如一个在 SSD 上,一个在 2Tb 旋转磁盘上,并透明地“合并”它们?如果我能做到这一点,那么归档就不再意味着“完全移出数据库”,而是意味着“移到慢速物理设备上”。在旋转磁盘上执行查询所花费的时间将少于完全转储、删除、加载、删除、重新加载两个整个数据库所花费的时间,所以这是一个胜利。
我考虑过使用类似 unionfs 的东西,但我想不出办法来控制哪个数据库存储在哪个物理驱动器上,因为它是通过在目录级别合并来工作的(据我所知),所以我仍然只能使用多个目录。
任何帮助表示感谢,提前致谢
答案1
首先,我认为我们应该考虑到,对于每个数据库db_name
,它将存储一个文件夹在其 datadir 中(例如/var/lib/mysql
)。因此,理论上,您可以只使用指向不同磁盘上的文件夹的符号链接。但是,这还有另一个问题:如果您使用 InnoDB 存储引擎,它确实不是将其数据存储在文件夹内。相反,它使用单个日志文件ibdata*
。
我认为这很重要:正如您所指出的,unionfs
如果您想要的只是两个文件系统的简单结合,那么这很好,但是在写入数据时它不理解(或不欣赏)后端存储的底层语义。
从我的想法来看,我无法告诉您有一个文件系统可以完全满足您的要求 - 我还认为它可能太小众了。
然而,我认为你可以研究以下几件事,以达到你想要的目标:
- 运行两个 MySQL 副本,它们各自有独立的数据目录。然后,您可以使用
FEDERATED
表类型来“模拟”将所有数据放在单个 MySQL 实例中的效果。 - 更简单一点:符号链接,使用 MyISAM 表类型(这在删除表时需要进行一些广泛的测试,也许你只能截断它们以防止链接丢失)