2009-10-29 42 views
61

我最近發現一個早期運行良好的sql查詢現在在60秒後超時並拋出一個錯誤。查詢很慢,但作爲夜間工作的一部分運行,所以這本身不是問題(所以請不要建議我優化它)。MySQL服務器已經消失 - 正好在60秒內

我可以通過運行「select SLEEP(120);」來一致地重現錯誤;「來自PHP,如下所示。但是,從MySQL客戶端運行相同的語句是成功的(返回0)。我試過調整wait_timeout(設置爲28800),但沒有運氣。我也重新啓動了數據庫服務器和機器本身。

事實上,它總是在60秒時間內超時,這一事實表明,這很可能是一種設置,而不是有限的資源問題。

我運行:
Windows Server 2003的
的MySQL 5.1.36社區
PHP 5.3

下面是我的測試代碼,輸出和SHOW變量的結果

謝謝!

CODE:

set_error_handler("sqlErrorHandler"); 
set_time_limit(12000); 


$link = mysql_connect("$MYSQL_Host","$MYSQL_User","$MYSQL_Pass"); 
mysql_select_db($MYSQL_db, $link); 

echo "mysql_ping = " . (mysql_ping($link) ? "LIVE" : "DEAD") . "<br /><br />"; 

$sql = "SELECT SLEEP(120);"; 

$start = microtime(true); 
mysql_query($sql, $link); 

echo "**query done**<br />"; 
allDone(); 

function allDone(){ 
global $start, $sql; 

$end = microtime(true); 
echo "sql : $sql<br />"; 
echo "elapsed : " . ($end - $start) . "<br />"; 
echo "<br />"; 
} 

function sqlErrorHandler($errno, $errstr, $errfile, $errline){ 
global $link; 
echo "Error : $errno<br />$errstr<br />"; 
echo "mysql_ping : " . (mysql_ping($link) ? "LIVE" : "DEAD") . "<br />"; 
echo "<br />"; 

allDone(); 
} 

OUTPUT:

mysql_ping = LIVE 

Error : 2 
mysql_query() [function.mysql-query]: MySQL server has gone away 
mysql_ping : DEAD 

sql : SELECT SLEEP(120); 
elapsed : 60.051116943359 

Error : 2 
mysql_query() [function.mysql-query]: Error reading result set's header 
mysql_ping : DEAD 

sql : SELECT SLEEP(120); 
elapsed : 60.0511469841 

**query done** 
sql : SELECT SLEEP(120); 
elapsed : 60.051155090332 

SHOW變量:

Variable_name=Value 
auto_increment_increment=1 
auto_increment_offset=1 
autocommit=ON 
automatic_sp_privileges=ON 
back_log=50 
basedir=C:\\Program Files\\MySQL\\MySQL Server 5.1\\ 
big_tables=OFF 
binlog_cache_size=32768 
binlog_format=STATEMENT 
bulk_insert_buffer_size=8388608 
character_set_client=utf8 
character_set_connection=utf8 
character_set_database=latin1 
character_set_filesystem=binary 
character_set_results=utf8 
character_set_server=latin1 
character_set_system=utf8 
character_sets_dir=C:\\Program Files\\MySQL\\MySQL Server 5.1\\share\\charsets\\ 
collation_connection=utf8_general_ci 
collation_database=latin1_swedish_ci 
collation_server=latin1_swedish_ci 
completion_type=0 
concurrent_insert=1 
connect_timeout=10 
datadir=C:\\Documents and Settings\\All Users\\Application Data\\MySQL\\MySQL Server 5.1\\Data\\ 
date_format=%Y-%m-%d 
datetime_format=%Y-%m-%d %H:%i:%s 
default_week_format=0 
delay_key_write=ON 
delayed_insert_limit=100 
delayed_insert_timeout=300 
delayed_queue_size=1000 
div_precision_increment=4 
engine_condition_pushdown=ON 
error_count=0 
event_scheduler=OFF 
expire_logs_days=0 
flush=OFF 
flush_time=1800 
foreign_key_checks=ON 
ft_boolean_syntax=+ -><()~*:""&| 
ft_max_word_len=84 
ft_min_word_len=4 
ft_query_expansion_limit=20 
ft_stopword_file=(built-in) 
general_log=OFF 
general_log_file=C:\\Documents and Settings\\All Users\\Application Data\\MySQL\\MySQL Server 5.1\\Data\\p1.log 
group_concat_max_len=1024 
have_community_features=YES 
have_compress=YES 
have_crypt=NO 
have_csv=YES 
have_dynamic_loading=YES 
have_geometry=YES 
have_innodb=YES 
have_ndbcluster=NO 
have_openssl=DISABLED 
have_partitioning=YES 
have_query_cache=YES 
have_rtree_keys=YES 
have_ssl=DISABLED 
have_symlink=YES 
identity=0 
ignore_builtin_innodb=OFF 
init_connect= 
init_file= 
init_slave= 
innodb_adaptive_hash_index=ON 
innodb_additional_mem_pool_size=2097152 
innodb_autoextend_increment=8 
innodb_autoinc_lock_mode=1 
innodb_buffer_pool_size=96468992 
innodb_checksums=ON 
innodb_commit_concurrency=0 
innodb_concurrency_tickets=500 
innodb_data_file_path=ibdata1:10M:autoextend 
innodb_data_home_dir=D:\\MySQL Datafiles\\ 
innodb_doublewrite=ON 
innodb_fast_shutdown=1 
innodb_file_io_threads=4 
innodb_file_per_table=OFF 
innodb_flush_log_at_trx_commit=1 
innodb_flush_method= 
innodb_force_recovery=0 
innodb_lock_wait_timeout=50 
innodb_locks_unsafe_for_binlog=OFF 
innodb_log_buffer_size=1048576 
innodb_log_file_size=19922944 
innodb_log_files_in_group=2 
innodb_log_group_home_dir=.\\ 
innodb_max_dirty_pages_pct=90 
innodb_max_purge_lag=0 
innodb_mirrored_log_groups=1 
innodb_open_files=300 
innodb_rollback_on_timeout=OFF 
innodb_stats_on_metadata=ON 
innodb_support_xa=ON 
innodb_sync_spin_loops=20 
innodb_table_locks=ON 
innodb_thread_concurrency=8 
innodb_thread_sleep_delay=10000 
innodb_use_legacy_cardinality_algorithm=ON 
insert_id=0 
interactive_timeout=28800 
join_buffer_size=131072 
keep_files_on_create=OFF 
key_buffer_size=50331648 
key_cache_age_threshold=300 
key_cache_block_size=1024 
key_cache_division_limit=100 
language=C:\\Program Files\\MySQL\\MySQL Server 5.1\\share\\english\\ 
large_files_support=ON 
large_page_size=0 
large_pages=OFF 
last_insert_id=0 
lc_time_names=en_US 
license=GPL 
local_infile=ON 
log=OFF 
log_bin=OFF 
log_bin_trust_function_creators=OFF 
log_bin_trust_routine_creators=OFF 
log_error=C:\\Documents and Settings\\All Users\\Application Data\\MySQL\\MySQL Server 5.1\\Data\\p1.err 
log_output=FILE 
log_queries_not_using_indexes=OFF 
log_slave_updates=OFF 
log_slow_queries=OFF 
log_warnings=1 
long_query_time=10.000000 
low_priority_updates=OFF 
lower_case_file_system=ON 
lower_case_table_names=1 
max_allowed_packet=1048576 
max_binlog_cache_size=4294963200 
max_binlog_size=1073741824 
max_connect_errors=10 
max_connections=800 
max_delayed_threads=20 
max_error_count=64 
max_heap_table_size=16777216 
max_insert_delayed_threads=20 
max_join_size=18446744073709551615 
max_length_for_sort_data=1024 
max_prepared_stmt_count=16382 
max_relay_log_size=0 
max_seeks_for_key=4294967295 
max_sort_length=1024 
max_sp_recursion_depth=0 
max_tmp_tables=32 
max_user_connections=0 
max_write_lock_count=4294967295 
min_examined_row_limit=0 
multi_range_count=256 
myisam_data_pointer_size=6 
myisam_max_sort_file_size=107374182400 
myisam_recover_options=OFF 
myisam_repair_threads=1 
myisam_sort_buffer_size=12582912 
myisam_stats_method=nulls_unequal 
myisam_use_mmap=OFF 
named_pipe=OFF 
net_buffer_length=16384 
net_read_timeout=30 
net_retry_count=10 
net_write_timeout=80 
new=OFF 
old=OFF 
old_alter_table=OFF 
old_passwords=OFF 
open_files_limit=2048 
optimizer_prune_level=1 
optimizer_search_depth=62 
optimizer_switch=index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on 
pid_file=C:\\Documents and Settings\\All Users\\Application Data\\MySQL\\MySQL Server 5.1\\Data\\p1.pid 
plugin_dir=C:\\Program Files\\MySQL\\MySQL Server 5.1\\lib/plugin 
port=3306 
preload_buffer_size=32768 
profiling=OFF 
profiling_history_size=15 
protocol_version=10 
pseudo_thread_id=3230 
query_alloc_block_size=8192 
query_cache_limit=1048576 
query_cache_min_res_unit=4096 
query_cache_size=33554432 
query_cache_type=ON 
query_cache_wlock_invalidate=OFF 
query_prealloc_size=8192 
rand_seed1= 
rand_seed2= 
range_alloc_block_size=4096 
read_buffer_size=65536 
read_only=OFF 
read_rnd_buffer_size=262144 
relay_log= 
relay_log_index= 
relay_log_info_file=relay-log.info 
relay_log_purge=ON 
relay_log_space_limit=0 
report_host= 
report_password= 
report_port=3306 
report_user= 
rpl_recovery_rank=0 
secure_auth=OFF 
secure_file_priv= 
server_id=0 
shared_memory=OFF 
shared_memory_base_name=MYSQL 
skip_external_locking=ON 
skip_networking=OFF 
skip_show_database=OFF 
slave_compressed_protocol=OFF 
slave_exec_mode=STRICT 
slave_load_tmpdir=C:\\WINDOWS\\TEMP 
slave_net_timeout=3600 
slave_skip_errors=OFF 
slave_transaction_retries=10 
slow_launch_time=2 
slow_query_log=OFF 
slow_query_log_file=C:\\Documents and Settings\\All Users\\Application Data\\MySQL\\MySQL Server 5.1\\Data\\p1-slow.log 
sort_buffer_size=262144 
sql_auto_is_null=ON 
sql_big_selects=ON 
sql_big_tables=OFF 
sql_buffer_result=OFF 
sql_log_bin=ON 
sql_log_off=OFF 
sql_log_update=ON 
sql_low_priority_updates=OFF 
sql_max_join_size=18446744073709551615 
sql_mode= 
sql_notes=ON 
sql_quote_show_create=ON 
sql_safe_updates=OFF 
sql_select_limit=18446744073709551615 
sql_slave_skip_counter= 
sql_warnings=OFF 
ssl_ca= 
ssl_capath= 
ssl_cert= 
ssl_cipher= 
ssl_key= 
storage_engine=InnoDB 
sync_binlog=0 
sync_frm=ON 
system_time_zone=Eastern Daylight Time 
table_definition_cache=256 
table_lock_wait_timeout=50 
table_open_cache=619 
table_type=InnoDB 
thread_cache_size=38 
thread_handling=one-thread-per-connection 
thread_stack=196608 
time_format=%H:%i:%s 
time_zone=SYSTEM 
timed_mutexes=OFF 
timestamp=1256827484 
tmp_table_size=16777216 
tmpdir=C:\\WINDOWS\\TEMP 
transaction_alloc_block_size=8192 
transaction_prealloc_size=4096 
tx_isolation=REPEATABLE-READ 
unique_checks=ON 
updatable_views_with_limit=YES 
version=5.1.36-community 
version_comment=MySQL Community Server (GPL) 
version_compile_machine=ia32 
version_compile_os=Win32 
wait_timeout=28800 
warning_count=0 
+0

如果通過php腳本運行SHOW VARIABLES查詢會發生什麼情況。超時值是否改變? – 2009-10-29 15:24:46

+0

我從PHP運行SHOW VARIABLES並且超時設置是相同的 – Bill 2009-10-29 15:49:50

+0

當這種情況發生時,mysql日誌中是否會顯示任何內容? – 2009-10-29 16:19:33

回答

65

PHP的選項mysql.connect_timeout是這樣做的原因。它不僅用於連接超時,而且還用於等待服務器的第一個答案。你可以像這樣增加它:

ini_set('mysql.connect_timeout', 300); 
ini_set('default_socket_timeout', 300); 
+1

我認爲這是可行的,但它沒有改變任何東西。 – Bill 2009-10-29 15:49:08

+0

你在連接之前還是之後設置了它? – 2009-10-29 15:59:09

+0

之前。腳本的第一行 – Bill 2009-10-29 16:00:54

6

有一大堆東西可以導致這種情況。我想通過這些閱讀和嘗試他們每個人的

http://dev.mysql.com/doc/refman/5.1/en/gone-away.html

我爲幾個Web託管公司合作,多年來,通常當我看到這一點,它是在服務器端,雖然這並未在WAIT_TIMEOUT在這裏似乎不是這種情況。

如果你找到解決方案,我希望你發佈。我想知道。

+1

在發佈這裏之前,我翻了幾頁。似乎沒有任何工作。感謝 – Bill 2009-10-29 16:47:31

0

我注意到了一些可能相關的東西。

我有兩個腳本運行,兩個腳本查詢都很慢。其中一人鎖了桌子,另一人不得不等待。那個正在等待的人有default_socket_timeout = 300.最後它退出「MySQL服務器已經消失」。但是,mysql進程列表繼續顯示查詢,緩慢的仍在運行,另一個鎖定並等待。

所以我不認爲mysqld是罪魁禍首。在php mysql客戶端中有所改變。很可能是我現在將設置爲-1的default_socket_timeout以查看是否改變了任何內容。

2

我的情況是數據庫損壞後,MySQL基本上5.0.x升級到5.1.x 與數據庫在myisam。 上查詢相同的路線: MySQL服務器已消失 錯誤讀取結果集的頭

修復&與mysqlcheck的優化後,它會恢復正常,而無需改變套接字超時。

-3

請看這個鏈接http://bugs.php.net/bug.php?id=45150 好像他們在PHP5.3中移植到本地MYSQL支持,並且在使用IPV6時遇到了一些麻煩。 嘗試使用「127.0.0.1」而不是「localhost」

+1

-1爲了什麼?提出不同的觀點?我喜歡SO – rjha94 2012-02-11 15:31:24

+3

我同意-2有點苛刻,但OP確實這麼說:「查詢很慢,但作爲夜間工作的一部分運行,所以這本身不是問題(所以請不要建議我優化它) 「。 – alexg 2012-05-28 07:51:03

4

這是我所做的事情(但通常與MySQLi類別)。

$link = mysql_connect("$MYSQL_Host","$MYSQL_User","$MYSQL_Pass"); 
mysql_select_db($MYSQL_db, $link); 

// RUN REALLY LONG QUERY HERE 

// Reconnect if needed 

if(!mysql_ping($link)) $link = mysql_connect("$MYSQL_Host","$MYSQL_User","$MYSQL_Pass", true); 

// RUN ANOTHER QUERY 
+1

這個答案適用於我,但在「if」部分,我們必須再次放入mysql_select_db,因爲在其他方式中,存在沒有選中db的mysql錯誤。 – 2013-04-06 17:01:23

2

我解決了這個問題,

if(!mysql_ping($link)) $link = mysql_connect("$MYSQL_Host","$MYSQL_User","$MYSQL_Pass", true); 
+1

你真的確定*你有問題OP詢問的確切問題嗎?你也可以說出你的解決方案的缺點(缺點)嗎? – hakre 2012-09-26 08:48:00

6

當我遇到了這個問題,它不是WAIT_TIMEOUT造成的(這是設置爲默認值8小時),但通過與max_allowed_pa​​cket的大INSERT聲明。從PHP更改max_allowed_pa​​cket沒有任何作用,但是當我在/etc/my.cnf的mysqld部分中更改並重新啓動MySQL服務器時,問題消失了。

0

我在使用mysqldumper(php程序)進行數據庫恢復時遇到了麻煩。我可以通過更改php.ini中的「mssql.timeout」設置來實現它。它默認爲60,我將它改爲300.

0

根據我的經驗,當它發生在光的查詢有解決問題的方式。看起來當你啓動或重啓mysqlapache這個問題開始出現並且問題的根源在php進程中被打開的套接字弄混了。 要解決這個問題:

  1. 第一次重新啓動mysql服務

  2. 然後重新啓動Apache服務

3

提高SQL-等待超時在這種情況下,工作對我來說,試試這個:

mysql_query("SET @@session.wait_timeout=900", $link); 

之前你第一次「正常」的SQL查詢。

+1

喜歡這個答案。只是想知道如何將它添加到全局wp查詢:$ posts = $ wpdb-> get_results(「SELECT ID,blah,blah,blah ..是否可以將它添加到$ wpdb或$ link/$ conn本身?非常感謝你提前爲任何可以澄清這個更多.. – Amit 2017-02-24 18:10:59

+0

我認爲沒有特別的配置'on_connect'命令。 但cou可以簡單地寫一個自己的連接功能,什麼是創建基本連接,併發送您的連接設置的變化。 – Radon8472 2017-03-02 09:46:29

0

在我們的例子中,罪魁禍首是全球(不是 「本地」)的MySQL變量 「WAIT_TIMEOUT」。

比較下面的查詢結果:

SHOW VARIABLES LIKE '%wait%'; 

SHOW GLOBAL VARIABLES WHERE Variable_name LIKE '%wait%'; 

在我們的情況下,第一個查詢顯示了WAIT_TIMEOUT 28800,但第二個查詢顯示的值10 (秒)。

我們驗證了改變全局變量解決了問題。下面是轉載我們的條件一個簡單的PHP腳本:一旦睡眠時間超過了全球WAIT_TIMEOUT值

<?php  
$db = mysqli_connect('host', 'user', 'password', 'database'); 

sleep(10); // number of seconds to sleep 

// MySQL server has gone away? 
$obj = mysqli_query($db, 'SELECT * FROM some_table'); 

$results = mysqli_fetch_object($obj); 

print_r($results); 

,我們會得到錯誤:「警告:mysqli_query():MySQL服務器已消失」。

要更改此值,我們必須在我們的Amazon RDS儀表板中編輯設置。