【问题标题】:Updating 11M rows database and my.cnf optimisation更新 11M 行数据库和 my.cnf 优化
【发布时间】:2012-11-16 08:15:42
【问题描述】:

我必须在 PHP 脚本中更新数据库中的 11M 行。

一段时间后,脚本冻结或崩溃。我必须重新启动 EasyPHP 12,然后重新加载它。

我的配置:

  • Windows 7 专业版 64 位
  • 英特尔酷睿 i7 860 2.8Ghz
  • 8G 内存

我的 my.cnf 文件:

port        = 3306
socket      = /tmp/mysql.sock

[mysqld]
port        = 3306
socket      = /tmp/mysql.sock
skip-external-locking
key_buffer_size = 384M
max_allowed_packet = 1M
table_open_cache = 512
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size = 32M
thread_concurrency = 8
log-bin=mysql-bin
server-id = 1

[mysqldump]
max_allowed_packet = 16M

[mysql]
no-auto-rehash

[myisamchk]
key_buffer_size = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout

这是崩溃的伪代码。

`For i to 100000 { do magic (check content on the web);    UPDATE table;    }`

【问题讨论】:

  • php与它有什么关系,你的php文件中的逻辑是什么?
  • 如果您正在进行交易,您可能会达到交易本身的限制。您是如何确定脚本冻结或崩溃的?
  • 你能写一个存储过程来实现你的目标吗?
  • check content on the web 部分要小心处理! Web 请求可能会超时,因此请为 wget/curl 设置合理的超时。还要在每个周期后加上echoprint,这样你就知道你在哪里。

标签: php mysql configuration sql-update easyphp


【解决方案1】:

你必须查看 php.ini,而不是 my.cnf。

我想您正在对单个记录执行一些逻辑并更新该记录,然后更新到下一个记录。在这种情况下,单个记录(或记录子集)的更新不应花费 那么 长。

冻结或崩溃是因为您的脚本达到了内存限制或其执行时间限制。

【讨论】:

  • 最大执行时间为“无限制模式”。我现在使用 CLI,即使它在脚本运行超过 8 小时时崩溃,它也会更好。我的脚本是这样的(就像 Jelmer 说的那样): SELECT * FROM TABLE limit n,100000 为每个 ID 更新一些东西我不知道这次崩溃在哪里(例如如何知道达到了什么限制)...
  • 那么,您接受的答案并没有解决您的问题?重写/编辑问题,将您的脚本放入其中(至少在伪代码中)...评论您已接受的解决方案,而不是其他任何地方。不要丢失上下文!
【解决方案2】:

您可能遇到了执行时间错误。您可以创建一个 shell 脚本并通过命令行运行它。

例如(伪):

<?php
SELECT * FROM table
LIMIT $x to $y

FOR every result
do some magic, SAVE to record with ID $id

如果您将此文件称为my_update.php,请键入php path/to/my_update.php 运行它,然后观看魔术。 (其中php 是 php 可执行文件)。

聪明点,记录每一个动作!所以当脚本失败时,你有一个很好的线索,不必重新开始!这正是我在查询中添加 LIMIT 的原因,因此它不必缓冲 11M 行,而只需缓冲几行。在第一组行之后,它将简单地转到下一个 LIMIT。有点像分页,但没有视觉输出。

来源:

【讨论】:

  • 我在我的问题帖中为我的长脚本添加了伪代码。最大执行时间为“无限制模式”。我现在使用 CLI,即使它在脚本运行超过 8 小时时崩溃,它也会更好。我的脚本是这样的: SELECT * FROM TABLE limit n,100000 为每个 ID 更新内容(检查内容网站)。我不知道这次崩溃在哪里(例如如何知道达到了什么限制)。 Mysql 和 Apache 的日志没有说什么相关的。
【解决方案3】:

您需要从 php.ini 文件中更改脚本的最大执行时间。

【讨论】:

  • 最大执行时间为“无限制模式”。我现在使用 CLI,即使它在脚本运行超过 8 小时时崩溃,它也会更好。我的脚本是这样的:SELECT * FROM TABLE limit n,100000
猜你喜欢
  • 2018-04-05
  • 2020-04-29
  • 2017-10-13
  • 2018-10-13
  • 1970-01-01
  • 1970-01-01
  • 2012-09-07
  • 1970-01-01
  • 2017-05-13
相关资源
最近更新 更多