Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
每周使用PHP归档MySQL数据_Php_Mysql_Archiving_Mysql Backup - Fatal编程技术网

每周使用PHP归档MySQL数据

每周使用PHP归档MySQL数据,php,mysql,archiving,mysql-backup,Php,Mysql,Archiving,Mysql Backup,我有一个MySQL数据库,它每周在一周中的某一天,在给定的时间从一个源接收一次大量数据,大约120万行,并将其存储在live表中 我想将live table中的所有数据复制到存档中,并截断live table,以便为下周将出现的下一个当前数据腾出空间 有人能提出一个有效的方法吗。我真的在试图避免-插入到存档_表选择*从live-。我想能够运行这个档案使用PHP,所以我不能使用Maatkit。有什么建议吗 编辑:此外,存档数据需要易于访问。由于每个插入都有时间戳,如果我想查找上个月的数据,我可以在

我有一个MySQL数据库,它每周在一周中的某一天,在给定的时间从一个源接收一次大量数据,大约120万行,并将其存储在live表中

我想将live table中的所有数据复制到存档中,并截断live table,以便为下周将出现的下一个当前数据腾出空间

有人能提出一个有效的方法吗。我真的在试图避免-插入到存档_表选择*从live-。我想能够运行这个档案使用PHP,所以我不能使用Maatkit。有什么建议吗


编辑:此外,存档数据需要易于访问。由于每个插入都有时间戳,如果我想查找上个月的数据,我可以在存档中搜索它

编写一个脚本作为cron作业运行,以便:

从live表转储存档数据从shell脚本使用mysqldump可能更有效 截断活动表 修改转储文件中的INSERT语句,使表名引用存档表而不是活动表 再次将归档数据追加到归档表中,可以通过shell脚本从转储文件导入,例如mysql dbname这将取决于您在归档数据后对数据所做的操作,但您是否考虑过使用MySQL复制

您可以将另一台服务器设置为复制从属服务器,在复制完所有数据后,在删除或截断之前设置一个BIN-LOG 0,以避免该语句也被复制。

偷偷摸摸的方法:

不要把记录复制过来。那太花时间了

相反,只需重新命名活动表,然后重新创建:

RENAME TABLE live_table TO archive_table;
CREATE TABLE live_table (...);
它应该是非常快速和无痛的

编辑:如果您希望每个轮换周期都有一个存档表,那么我描述的方法最有效。如果您想维护一个归档表,可能需要更加复杂。然而,如果您只是想对历史数据进行特殊查询,您可能只需要使用UNION

如果您只想保存几段时间的数据,那么可以以类似于日志循环的方式进行几次重命名。然后可以定义一个视图,将归档表合并为一个大的honkin'表

EDIT2:如果您想维护自动递增功能,您可能希望尝试:

RENAME TABLE live TO archive1; 
CREATE TABLE live (...); 
ALTER TABLE LIVE AUTO_INCREMENT = (SELECT MAX(id) FROM archive1);

但遗憾的是,这行不通。但是,如果您使用PHP来驱动流程,这很容易解决。

那么,cron job会如何处理?它会将mysqldump转储到PHP可以获取的文件中?我已经考虑过复制,但目前还不能选择另一台服务器:而且,存档的数据需要易于访问。由于每个插入都有时间戳,如果我想查找上个月的数据,我可以只搜索它没有一个服务器可以使用是一个有点作秀的障碍我必须承认:如果你把所有的东西都放在一个表中,尽管我不认为可服务性会是一个很大的问题,除非我遗漏了什么。live表有一个自动递增的主键,并且将数据从live转储到sql文件中,然后截断活动表将重置自动增量,然后下一次存档插入将失败。@Rohit-在步骤3中,从insert语句中删除主键,并允许存档表自动分配主键。此外,删除行不会影响表的自动增量值。修改自动增量的唯一方法是DDL:我只是尝试了一下,以确保,TRUNCATE TABLE“x”将自动增量重置为1我是否可以对一个每秒可能获得大约100行的活动表执行此操作,然后将重命名的表移动到另一个数据库,而新表仍在活动数据库中,并且不会丢失任何插入,它是否会开始自动增量,我只是在研究做正确的事情,谢谢: