归档 MySQL 表数据(大数据)的最佳方式

Best way to archive MySQL tables data (huge data)

故事是这样的。

Table 模式

item ` `on_date` `value1` `value2` `value3` `value4` ... `value10`   

所有的值都是我的table中的重要参数,每天为每个项目存储。每天我捕获 100,000 行的数据,这又在一个月内变成大约 3,000,000 行。

table 很好,因为创建了索引和键来处理数据,我没有问题,因为我在 30 天后不断删除数据。

现在,我想将我删除的数据存储在MySQL table 中,这将纯粹用于历史数据分析。

因此,我尝试了一种技术,将所有列连接成 1 列并存储在 table 中,管道分隔 | .

item | on_date |value1 | value2 .....| value10  

但这并不能解决问题,而且数据量很大

我浏览了社区和 MySQL 文档,但没有任何帮助。 请建议我什么是解决我的问题的最佳模式或技术。

不清楚你在问什么。

"Archive"表示将数据复制到别处,然后从这里删除

"Backup"表示把数据复制到别处,保留这里

你说你想要 "store the data",然后 "delete" 它并用于 "historical..."。如果删除了,怎么用呢?也许你的意思是你已经 "archived" 它从主 table 进入另一个 table?

情况一:每日备份,存档或30天后删除。请参阅分区和备份。

案例二:只保留一天。好吧,一种方法是使用案例 1,但如果每天都做,则每小时做一次。

案例 3:您有两个 table:当前 30 天,加上更大的 table 旧数据。这可能涉及分区和 "transportable table spaces".

分区:参见 http://mysql.rjweb.org/doc.php/partitionmaint(参见案例 1 和 4)

备份:参见 mysqldump(在手册中)或 Xtrabackup (Percona.com)

注意可以做到

INSERT INTO db2.History
    SELECT * FROM db1.Current
        WHERE ...

这会将行从一个数据库中的 table 复制到另一个数据库中的 table。但是,分区并使用 "transportable tablespaces" 在分区上移动会快得多。

(我的意见:)一个月内 300 万行(第 86 个百分位数)的大小为 "medium"。一年后(第 94 个百分位数),我可能会称之为 "large",但还不是 "huge"。

(评论后...)

计划 A - 零中断:

pt-archiver 可能是将几个月前的数据删除到其他机器的核心工具。 (另见 http://mysql.rjweb.org/doc.php/deletebig#deleting_in_chunks

计划 B - 转换为分区:

这涉及向 table 添加分区的重大一次性中断。好处是分割一个月的数据几乎为零。

决定归档前的时间,按周或月划分,这样您就有大约 20-50 个分区。然后我们"transportable tablespaces" 将最旧的分区断开并移动到另一台机器。并且 REORGANIZE PARTITION 每周或每月添加一个新分区。一些细节在上面的第一个link中。

请注意,在添加(或删除)PARTITIONing 时需要重新考虑索引。建议您试验大量数据,以确保获得最佳索引。 (如果你想在这里讨论它,开始一个新问题并包括主要查询,加上 SHOW CREATE TABLE 现在和添加 PARTITION BY RANGE(..) 之后。)