如何获取&从另一个DB向DB存储超过100k条记录

时间:2016-02-08 08:45:22

标签: php mysql

我有学校数据库谁有超过8万条记录,我想更新并使用php插入我的newSchool数据库,每当我尝试运行查询更新或插入近2 000条记录,并在一段时间后自动停止请帮助

2 个答案:

答案 0 :(得分:1)

您可以(应该)执行完整转储并稍后导入该转储。我不确定如何用php做到这一点 - 并且认为你最好用cli上的那些命令来做这件事:

mysqldump -u <username> -p -A -R -E --triggers --single-transaction > backup.sql

在你的本地主机上:

mysql -u <username> -p < backup.sql 

备份语句标记含义from the docs

-u 
  

DB_USERNAME

-p
  

DB_PASSWORD

     

请勿在此处粘贴密码,但在mysql要求输入密码后输入密码。在命令行界面上使用密码可能不安全。

-A 
  

转储所有数据库中的所有表。这与使用--databases选项并在命令行上命名所有数据库相同。

-E
  

在输出中包含转储数据库的事件计划程序事件。   此选项需要这些数据库的EVENT权限。

     

使用--events生成的输出包含CREATE EVENT   用于创建事件的语句。但是,这些陈述没有   包括诸如事件创建和修改之类的属性   时间戳,所以当重新加载事件时,它们是用。创建的   时间戳等于重新加载时间。

     

如果您要求使用原始时间戳创建活动   属性,不要使用--events。而是转储并重新加载内容   直接使用mysql.event表,使用具有的MySQL帐户   适用于mysql数据库的权限。

-R
  

包含转储的存储例程(过程和函数)   输出中的数据库。使用此选项需要SELECT   mysql.proc表的特权。

     

使用--routines生成的输出包含CREATE PROCEDURE和   CREATE FUNCTION语句来创建例程。但是,这些   语句不包括例程创建和   修改时间戳,所以当重新加载例程时,它们是   创建时间戳等于重新加载时间。

     

如果您需要使用原始时间戳创建例程   属性,不要使用--routines。相反,转储并重新加载   mysql.proc表的内容直接使用MySQL帐号   具有适当的mysql数据库权限。

--single-transaction
  

此选项将事务隔离模式设置为REPEATABLE READ和   在转储之前向服务器发送START TRANSACTION SQL语句   数据。它仅适用于InnoDB等事务表,   因为那时它会转储数据库的一致状态   发布START TRANSACTION时没有阻止任何应用程序。

如果您只需要数据并且不需要例程或事件,请跳过这些标记。

答案 1 :(得分:0)

确保在几个命令之后执行提交,例如在500行之后。节省内存但存在的问题是,在回滚的情况下只返回到最后一次提交。