我有一个mysql数据库,我正在尝试迁移到另一个数据库。它有不同的模式,我为旧数据库的每个表编写了一个php脚本,以便将其数据填充到新数据库中。脚本工作正常,但问题是它不会移动所有数据。例如,如果我有一个表,并且所有信息都被选中,然后插入到新表中,但只完成了一半。我这样做的方式我打开一个数据库选择*并将其放在一个关联数组中。然后我关闭数据库连接并连接到另一个连接遍历数组的每个元素并将它们插入到新数组中。数组的大小是否有限制?这有什么不对?
答案 0 :(得分:4)
您应该以块(例如1000行)读取第一个数据库中的行,将这些行写入第二个数据库,清理数组(使用unset()或空数组)并重复此过程直到您阅读所有的行。 这克服了内存限制。
另一个问题可能是脚本运行的时间太长(如果表太大),请尝试使用函数set_time_limit()。此函数重置脚本的超时,之后应终止该脚本。我建议在处理完每个块后调用它。
答案 1 :(得分:3)
首先,我没有看到编写脚本来执行此操作的重点。为什么不从phpMyAdmin获取SQL转储并编辑它以使其适合其他数据库?或者他们有什么不同?
但回答你的问题:我的第一个想法就像其他人已经说过的那样,问题将是时间限制。在尝试对此做一些事情之前,您应该检查php.ini中的max_execution_time
的值(大多数情况下这大约是30秒)以及脚本执行所需的时间。如果它在大约30秒后终止(或max_execution_time
的值,如果它不同),那么这可能就是问题,尽管php应该抛出错误(或者至少是警告)。
我认为php中的数组大小没有限制。但是,php.ini中有一个指令,即memory_limit
,它定义了脚本可以使用的内存量。
如果您有权访问php.ini文件,我建议将max_execution_time
和memory_limit
设置为更高的值。如果您没有访问php.ini,则无法更改memory_limit
指令。您将不得不解决这个问题,例如在SQL中使用LIMIT
。请务必取消设置已使用的变量,否则可能会遇到同样的问题。
答案 2 :(得分:2)
目标数据库中可能存在拒绝某些尝试插入的约束。
答案 3 :(得分:1)
为什么不通过sql脚本执行此操作?
如果您更喜欢通过php进行,那么您可以打开与两个数据库的连接,并在从源读取时插入目标。这样你可以避免使用太多内存。
答案 4 :(得分:1)
使用php来执行转换/转换逻辑是可能的。我会这样做,如果你正在做复杂的转换,如果你的PHP技能比你的mysql技能组好得多。
如果你的php脚本需要更多内存,请使用:
memory_limit = 2048M max_execution_time = 3600
这将为您提供2gig的阵列空间和大约一个小时的处理时间。但是如果你的数据库真的很大,那么使用起来要快得多(实际上很多):
1。 mysqldump,用于转储源服务器
在此处查看:http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html
2。 上传dumpfile并输出它。 mysql文档页面上有很多例子。 (另见评论)。
在此之后,您可以通过CREATE / SELECT语句转换数据库。
CREATE TABLE 1 SELECT * FROM two;
作为替代方案,您可以使用UPDATE语句。什么是最好的在很大程度上取决于你正在做的工作。
祝你好运!答案 5 :(得分:1)
最好在命令行执行mysql转储:
mysqldump -a -u USER_NAME -p SOURCE_DATABASE_NAME> DATA.mysql
您也可以将文件gzip缩小以便传输到另一台服务器:
gzip DATA.mysql
转移后,解压缩文件:
gunzip -f DATA.mysql.gz
导入它:
mysql -u USER_NAME -p TARGET_DATABASE_NAME< DATA.sql
答案 6 :(得分:0)
您的服务器(与所有服务器一样)将具有PHP的内存限制 - 如果您使用的数量超过指定的限制,则脚本将失败。
是否可以将当前的MySQL数据库转储为文本文件,执行查找和替换或基于RegExp的替换以更改文本文件中的模式,然后将修改后的测试文件重新加载到MySQL中以完成更改?如果这是一次性迁移,那么这可能是更好的方法。
答案 7 :(得分:0)
您可能正在运行PHP的执行时间或内存限制。确保php.ini
中的相应设置足够高,以允许脚本完成执行。