Mysql 只备份一个表中昨天的数据

Mysql 只备份一个表中昨天的数据,mysql,Mysql,我试图对此进行研究,但什么也找不到,所以我又回到集体提问 在一个相当繁忙的MySQL数据库中,我有一个access_log表,它每天获得大约1000万条记录。目标是获取昨天的记录并将其移动到不同服务器上的不同数据库。有没有办法只从该表中热备份昨天的数据 谢谢你的意见, Kate是的,您可以使用cron作业来完成 制作cron作业并编写查询,将数据发送到其他数据库 下面是cron作业的示例: 以下是教程: 如果你没有日期,考虑给他们一个自动增量ID,并用ID 分裂。假设你只有一个Access日志表

我试图对此进行研究,但什么也找不到,所以我又回到集体提问

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

谢谢你的意见,
Kate

是的,您可以使用cron作业来完成

制作cron作业并编写查询,将数据发送到其他数据库

下面是cron作业的示例:

以下是教程:


如果你没有日期,考虑给他们一个自动增量ID,并用ID

分裂。假设你只有一个Access日志表,那么直接选择这些记录是很简单的。您必须将它们拉入客户端程序,然后将它们推到另一个表中

SELECT * 
  FROM access_log
 WHERE logtime >= CURRENT_DATE() - INTERVAL 1 DAY
   AND logtime < CURRENT_DATE();
或者,如果您能承受午夜时一两秒钟的停机时间,您可以将access\u log表重命名为昨天的access\u 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语句,速度非常快。有一段很短的时间没有访问日志表,但这远远少于一秒钟。我们的想法是把一切都安排得很好,然后快速翻转日志文件

这可能是一个非常好的策略;它可以让您使用便宜的编写和昂贵的搜索存档存储引擎来搜索live access_日志表


如果您可以选择重新构造access_日志表,您可以选择按天对其进行分区,这样您就可以简单地交换每日分区表。但这是一个较长的主题。

如果日期列是时间戳,我担心您建议的WHERE子句将不起作用。WHERE datetimestamp=curdate-1Ollie,感谢您的输入和其他想法。。。我喜欢按天划分表的概念。我确实考虑过使用两张桌子,但我负担不起任何停机时间,在白天的某段时间里有一个慢下来,但我仍然会损失数以千计的条目;我还考虑根据日期mod time/24*60*60%2在表0和表1之间进行交换,但是这也会影响性能,但在web服务器端,必须在每次插入时检查mod;可以写为curdate-interval 1 day和curdate-interval 1 day之间的日期这不是等效表达式@AdrianBR,除非要比较的日期列中没有除午夜以外的任何时间。如果你的意思是DATElogtime使用一个函数会阻止在logtime列上使用索引,这在一个大表中是一件坏事。啊,明白了,奥利,你打算在字段是timestamp时使用索引。我的错误再次感谢Ollie:因为我确实可以选择重新构造access_表,所以我可以开始使用一个新的表,我一直在研究分区选项,我非常喜欢它,因为它将使数据移动到分区变得非常简单。从那里我只运行我的统计数据,我想,由于数据将被分区,我甚至不需要将任何内容移动到另一个归档表中。
DELETE
  FROM access_log
 WHERE logtime >= CURRENT_DATE() - INTERVAL 1 DAY
   AND logtime < CURRENT_DATE();
SELECT * 
  FROM access_log
 WHERE logtime >= CURRENT_DATE() - INTERVAL 1 DAY + INTERVAL 1 HOUR
   AND logtime < CURRENT_DATE() - INTERVAL 1 DAY + INTERVAL 2 HOUR
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;