2009-10-29 115 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仪表板中编辑设置。

相关问题