我试图对此进行研究,但找不到任何东西,因此我要回问集体。
在一个非常繁忙的MySQL数据库中,我有一个access_log表,每天可获取约1000万条记录。目的是获取昨天的记录并将其移至其他服务器上的其他数据库。有没有办法仅从该表中热备份昨天的数据?
谢谢您的投入,凯特
假设您只有一个access_log表,那么选择这些记录就很简单。您必须将它们拉入客户端程序,然后将它们推入另一个表。
SELECT *
FROM access_log
WHERE logtime >= CURRENT_DATE() - INTERVAL 1 DAY
AND logtime < CURRENT_DATE();
然后
DELETE
FROM access_log
WHERE logtime >= CURRENT_DATE() - INTERVAL 1 DAY
AND logtime < CURRENT_DATE();
(避免使用BETWEEN
选择时间/日期范围;在您选择的范围的末尾会做错事。)
但这有点像性能猪。一方面,该表应该使用MyISAM存储引擎,而不是InnoDB,因此您不必为事务开销感到烦恼。
如果它是InnoDB,并且您无法更改它,则可能需要编写程序以读取然后删除较小的数据块。例如,这些块之一可能是:
SELECT *
FROM access_log
WHERE logtime >= CURRENT_DATE() - INTERVAL 1 DAY + INTERVAL 1 HOUR
AND logtime < CURRENT_DATE() - INTERVAL 1 DAY + INTERVAL 2 HOUR
或者,如果您可以承受午夜一两秒的停机时间,则可以将access_log表重命名为昨天_access_log,并为今天创建一个新表。然后,您可以保存昨天的表格而不会影响生产性能。
您可以使用以下语句执行该午夜日志交换操作:
CREATE TABLE `access_log_new` (
/* whatever columns you have in your access_log table, I made this stuff up */
`log_id` INT(11) NOT NULL AUTO_INCREMENT,
`item` VARCHAR(255) NOT NULL,
`logtime` TIMESTAMP NOT NULL ,
PRIMARY KEY (`log_id`)
) ENGINE=MYISAM;
DROP TABLE access_log_old;
RENAME TABLE access_log TO access_log_old;
RENAME TABLE access_log_new TO access_log;
这里的最后两个语句RENAME TABLE
非常快。没有access_log表的时间很少,但是远远少于一秒钟。这样做的想法是很好地设置所有内容,然后快速翻转日志文件。
那可能是一个非常好的策略。它将使您可以为实时access_log表使用廉价写入和昂贵搜索的ARCHIVE存储引擎。
如果您可以选择重组access_log表,则可以选择按天对它进行分区,因此只需换出每日分区表即可。但这是一个更长的话题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句