仅从一个表中备份昨天的数据

时间:2013-09-20 14:08:36

标签: mysql

我试图研究这个但却找不到任何东西,所以我回来问集体。

在一个相当繁忙的MySQL数据库中,我有一个access_log表,每天可以获得大约1000万条记录。目标是获取昨天的记录并将它们移动到不同服务器上的不同数据库。有没有办法只从昨天的表中热备份昨天的数据?

感谢您的投入, 凯特

3 个答案:

答案 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

进行拆分