我试图研究这个但却找不到任何东西,所以我回来问集体。
在一个相当繁忙的MySQL数据库中,我有一个access_log表,每天可以获得大约1000万条记录。目标是获取昨天的记录并将它们移动到不同服务器上的不同数据库。有没有办法只从昨天的表中热备份昨天的数据?
感谢您的投入, 凯特
答案 0 :(得分:1)
鉴于您只有一个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表重命名为yesterday_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表会有一段很短的时间,但它远远不到一秒钟。我们的想法是将所有内容设置得很好,然后快速翻转日志文件。
这可能是一个非常好的策略;它可以让你使用便宜的写入和昂贵的搜索ARCHIVE存储引擎为你的live access_log表。
如果您可以选择重新调整access_log表,则可以选择按日进行分区,这样您就可以简单地换出每日分区表。但这是一个较长的话题。
答案 1 :(得分:0)
是的,您可以使用cron作业来完成。
创建cron作业并编写查询以将数据发送到其他数据库。
以下是cron作业的示例:http://docs.phplist.com/CronJobExamples.html
以下是教程:http://net.tutsplus.com/tutorials/php/managing-cron-jobs-with-php-2/
答案 2 :(得分:0)
SELECT rows
INTO OUTFILE '/tmp/backup.txt'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM test_table WHERE date=curdate()-1;
如果您没有日期,请考虑为他们提供自动增量ID并按ID
进行拆分