2012-11-16 43 views
0

我必須從PHP腳本中的數據庫更新11M行。更新11M行數據庫和my.cnf優化

經過一段時間,腳本凍結或崩潰。我必須重新啓動EasyPHP 12,然後重新加載它。

我的配置:

  • 的Windows 7專業版64位
  • 英特爾酷睿i7 860的2.8GHz
  • 8G RAM

我的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; }` 
+0

什麼是PHP與它做什麼,你的PHP文件中的邏輯是什麼? – Oerd

+0

如果您正在進行交易,您可能會觸及交易本身的限制。你是如何確定腳本凍結或崩潰的? –

+0

你能寫一個存儲過程來實現你的目標嗎? –

回答

0

您可能會遇到執行時間錯誤。你可以通過你的命令行創建一個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。有點像分頁,但沒有視覺輸出。

來源:

+0

我在我的問題文章中添加了我的長腳本的僞代碼。 最大執行時間爲「無限制模式」。我現在使用CLI,即使腳本運行時間超過8小時,它也會更好。我的腳本是這樣的:SELECT * FROM TABLE limit n,100000 UPDATE(檢查內容網站)每個ID。 我不知道這個崩潰在哪裏(如何知道例如達到了什麼限制)。 Mysql和Apache日誌說沒有關係。 – user1740613

0

你必須尋找到php.ini中,沒有在my.cnf。

我想你是在單個記錄上執行一些邏輯,然後更新該記錄,然後到下一個記錄。在這種情況下,單個記錄(或記錄的一個子集)的更新不應該花費長度爲

凍結或崩潰是因爲您的腳本遇到內存限制或其執行時間限制。

+0

最大執行時間爲「無限制模式」。 我現在使用CLI,即使腳本運行時間超過8小時,有時甚至會崩潰。 我的腳本是這樣的(一個喜歡說Jelmer): SELECT * FROM TABLE限制ñ100000 UPDATE東西給每個ID 我不知道這個崩潰(怎麼知道例如達到什麼極限)... – user1740613

+0

那麼,你接受了一個沒有解決你的問題的答案?重寫/編輯問題,將腳本放在其中(至少在僞代碼中)......對您接受的解決方案發表評論,而不是其他任何地方。不要鬆散的背景! – Oerd

+0

是的,實際上它效果更好,而不是100%。速度太快。 – user1740613

0

您需要從php.ini文件中更改腳本的最大執行時間。

+0

最大執行時間爲「無限制模式」。 我現在使用CLI,即使腳本運行時間超過8小時,有時甚至會崩潰。 我的腳本是這樣的: SELECT * FROM TABLE limit n,100000 – user1740613