2017年11月18日 星期六

phpMyAdmin 載入資料庫逾時問題

今天繼續進行 PHP 主機改版, 在對 MySQL 資料庫進行大改版之前, 先備份 Hstinger 上的資料庫, 我想把它重建於本機 AppServ 下備查. 10MB 左右的 ZIP 檔解壓後大約是 76MB 的 .sql 檔, 剛好還在 phpMyAdmin 可載入的 81MB 範圍內. 開啟 localhost 下的 phpMyAdmin 點選載入, 選擇解開的 .sql 檔後按執行 :




結果執行一段時間 (約 5 分鐘) 卻出現下列錯誤訊息 :


Fatal error: Maximum execution time of 300 seconds exceeded in C:\AppServ\www\phpMyAdmin\libraries\import\sql.php on line 83


我找到 sql.php 的第 83 行, 是 while 迴圈中的一個呼叫 strpos() 的敘述 :

$p5 = strpos($buffer, '--', $i);

我以為是 php.ini 的設定太小所致, 所以就去 C:\AppServ\php5 下找 php.ini 檔, 但是卻找不到 php.ini, 而是找到 php.ini-dist 和 php.ini-recommended 這兩個檔, 到底 AppServ 的 php.ini 是哪一個呢? 後來在下面這篇看到, 原來在 Windows 下真正載入的 php.ini 位於 C:\Windows 下面 :

請問appserv v2.5.10 的php.ini在哪呢?

這可以在 http://localhost/phpinfo.php 訊息中搜尋 "Loaded Configuration File" 得知 :




開啟 C:\Windows\php.ini 檔後搜尋 max_execution_time (大約在 254 行左右) 可以找到 PHP 的程式最大執行時間限制, 預設是 30 秒 :

;;;;;;;;;;;;;;;;;;;
; Resource Limits ;
;;;;;;;;;;;;;;;;;;;

max_execution_time = 30     ; Maximum execution time of each script, in seconds
max_input_time = 60 ; Maximum amount of time each script may spend parsing request data
memory_limit = 24M   




我把它改成 1000 秒後重啟伺服器再執行 .sql 載入還是一樣 300 秒就逾時了. 咦? 原先預設是 30 秒, 錯誤訊息怎會報 300 秒, 而被我改成 1000 秒後不是應該報 1000 秒嗎? 可見這跟 max_execution_time 無關. 後來在下面這篇發現, 原來 phpMyAdmin 自己有一個計時器, 其預設值就是 300 秒 :

Maximum execution time in phpMyadmin

這個設定檔是 C:\AppServ\www\phpMyAdmin\config.inc.php, 開啟此檔搜搜尋 $cfg['ExecTimeLimit']  (大約在第 129 行左右), 即可看到其預設值正是 300 秒 :




/**
 * Other core phpMyAdmin settings
 */
$cfg['OBGzip']                  = 'FALSE'; 
$cfg['PersistentConnections']   = FALSE;  
$cfg['ForceSLL']                = FALSE;  
$cfg['ExecTimeLimit']           = 300;    // maximum execution time in seconds (0 for no limit)
$cfg['SkipLockedTables']        = FALSE;  


我把它改成 6000 秒 (100 分鐘) 後存檔, 重新執行 .sql 載入即順利完成了. 




這樣就能放心地進行大改版了.

2017-11-19 補充 :

雖然調整計時器後順利載入備份的 .sql 檔, 但是開啟 phpMyAdmin 時卻出現 "#2003-伺服器並無回應" 頁面 :




但專案網頁又可正常顯示, 表示 MySQL 伺服器其實有在跑, 只有 phpMyAdmin 異常而已. 參考了下列幾篇文章試圖恢復 phpMyAdin 運作仍然無效 :

【MySQL問題解決方案】#2003-伺服器並無回應
[appserv] #2003 -伺服器並無回應
安装mysql服务出现Install/Remove of the Service Denied!错误

看來只好重裝 AppServ 工具包了.

2017-11-19 補充 :

我今天改用 XAMPP 工具包, 因為想試試看不一樣的介面, 而且 XAMPP 有一直在更新. 不過 XAMPP 的 phpMyAdmin 預設上傳 .sql 檔限制只有 2MB, 更改上傳設定須編輯 xampp\php 下的 php.ini 檔, 參考 :

How to Increase Import Size Limit in phpMyAdmin using Xampp server?
http://localhost/phpmyadmin/doc/html/faq.html#faq1-16

我照其設定 :

post_max_size = 800M
upload_max_filesize = 800M
max_execution_time = 5000
max_input_time = 5000
memory_limit = 1000

結果有成功匯入, 但可能我資料表太多, 而上面 max_execution_time 設 5000秒可能還是不夠, 結果只匯入了 245 個資料表 (到 w1907). 後來我在 phpMyAdmin 的 FAQ 裡看到下面這段話 :

If you have shell (command line) access, use MySQL to import the files directly. You can do this by issuing the “source” command from within MySQL:

source filename.sql

原來 MySQL 還可以利用命令列操作資料庫, 以前都沒用過, 其語法參考 :

mysql命令行的基本用法(通用linux和windows)
https://dev.mysql.com/doc/refman/5.7/en/mysql-commands.html

由於我下載的是免安裝版的 XAMPP,  其 MySQL 可執行檔路徑在 xampp\mysql\bin 下, 因此匯入 .sql 資料檔的指令如下 :

E:\xampp\mysql\bin>mysql -uroot -pmysql twstock < e:\hostinger\project\twstock.sql

這裡第一參數 -uroot 表示 user 為 root; -pmysql 表示 password 為 mysql; 第三參數 twstock 為要匯入之資料庫名稱 (我預先建立的一個空資料庫). 指令執行了大約十幾分鐘就結束了, 進入 phpMyAdmin 檢查確定全部資料表都有完整匯入. 一道指令就可完成的事, 費了這麼多功夫繞遠路竟然還徒勞無功! 或許之前的 AppServ 中的 MySQL 用命令列就能搞定了. 不過我覺得還是改用 XAMPP 好, 因為 AppServ 實在太舊了.

2017-11-23 補充 :

今天嘗試在家裡 PC 的 AppServ 上用 MySQL 命令列指令匯入從 Hostinger 下載的備份資料庫 :

mysql -uroot -pmysql twstock < d:\hostinger\twstock.sql

結果在 7 分鐘內就順利載入完成了, 用瀏覽器存取網頁可以看到應該是全部的資料, 但是進入 phpMyAdmin 開啟所匯入的資料庫就是一片白色網頁, 似乎無法載入這麼多的資料表. 可見 AppServ 真的太老舊了, 我這台 PC 也要移除, 改用免安裝的 XAMPP.

2 則留言 :

太陽袁袁Yuan Yuan 提到...

您寫得很好,可是我改掉時間後,還是連接很慢

太陽袁袁Yuan Yuan 提到...

請問可以請教您怎麼解決嗎? 建立資料庫目錄後要件表格 就一直顯示"載入中"一整個晚上爬文都無解....