归档 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(..)
之后。)
故事是这样的。
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(..)
之后。)