2009-10-29 26 views
61

Recientemente descubrí que una consulta sql que se estaba ejecutando correctamente antes ahora se agota después de 60 segundos y arroja un error. La consulta es lenta pero se ejecuta como parte de un trabajo nocturno, por lo que no es un problema en sí mismo (así que no sugiera que lo optimice).El servidor MySQL se ha ido - en exactamente 60 segundos

Puedo reproducir el error constantemente ejecutando "seleccionar SLEEP (120);" de PHP como se muestra a continuación. Sin embargo, ejecutar la misma declaración desde un cliente MySQL es exitoso (devuelve 0). Intenté ajustar wait_timeout (establecido en 28800), pero no tuve suerte. También reinicié el servidor db y la máquina.

El hecho de que siempre se agota en exactamente 60 segundos me sugiere que es probable que sea un problema de configuración y no de recursos limitados.

estoy corriendo:
Windows Server 2003
MySQL 5.1.36-comunidad
PHP 5.3

A continuación se presentan mi código de prueba, la salida y los resultados de SHOW VARIABLES

, gracias!

CÓDIGO:

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(); 
} 

SALIDA:

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 VARIABLES:

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

¿Qué ocurre si ejecuta la consulta SHOW VARIABLES a través de un script php? ¿Cambian los valores de tiempo de espera? –

+0

Ejecuto SHOW VARIABLES de PHP y la configuración de tiempo de espera es la misma – Bill

+0

¿Se muestra algo en el registro de MySQL cuando esto sucede? –

Respuesta

65

La opción php mysql.connect_timeout es la razón de esto. No solo se usa para el tiempo de espera de conexión, sino también para esperar la primera respuesta del servidor. Puede aumentarlo así:

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

Pensé que iba a funcionar, pero no cambió nada. – Bill

+0

¿Lo configuró antes o después de conectar? –

+0

antes. Primera línea de la secuencia de comandos – Bill

6

Hay un montón de cosas que pueden causar esto. Había leído a través de estos y tratar cada uno de ellos

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

He trabajado para varias empresas de alojamiento web en los últimos años y, en general, cuando veo esto, es el wait_timeout en el extremo del servidor, aunque este doesn Parece ser el caso aquí.

Si encuentra la solución, espero que la publique. Me gustaría saber.

+1

Revisé esa página varias veces antes de publicarla aquí. Nada parece funcionar. Gracias aunque – Bill

0

Noté algo que quizás sea relevante.

Tenía dos scripts en ejecución, ambos haciendo consultas bastante lentas. Uno de ellos cerró una mesa y el otro tuvo que esperar. El que estaba esperando tenía default_socket_timeout = 300. Finalmente se cerró con "El servidor MySQL se ha ido". Sin embargo, la lista de procesos de mysql continuó mostrando ambas consultas, la lenta sigue ejecutándose y la otra bloqueada y esperando.

Así que no creo que mysqld sea el culpable. Algo ha cambiado en el cliente php mysql. Muy posiblemente el default_socket_timeout que ahora estableceré en -1 para ver si eso cambia algo.

2

Mi caso era una corrupción de base de datos después de una actualización menor en mysql básicamente 5.0.x a 5.1.x con la base de datos en myisam. Las mismas líneas de consulta: servidor MySQL se ha apagado error cabecera del conjunto de resultados de lectura

Después de reparar & optimizarlo con mysqlcheck, se volvió a la normalidad, sin la necesidad de cambiar el tiempo de espera de socket.

-3

Consulte este enlace http://bugs.php.net/bug.php?id=45150 Parece que se movieron al soporte MYSQL nativo en PHP5.3 y tiene algunos problemas para trabajar con IPV6. Trate de usar "127.0.0.1" en lugar de "localhost"

+1

-1 ¿para qué? para presentar un punto de vista diferente? Me encanta SO – rjha94

+3

Estoy de acuerdo -2 es un poco duro pero el OP dijo esto: "La consulta es lenta pero se ejecuta como parte de un trabajo nocturno, así que no es un problema en sí mismo (así que no sugiera que lo optimice) " – alexg

4

Esto es algo que hago, (pero generalmente con la clase 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

Esta respuesta funciona para mí, pero en la sección "si" tenemos que volver a poner mysql_select_db porque de otra manera hay un error de mysql que no se selecciona db. –

2

He resuelto este problema con

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

¿Está * realmente seguro * de que tiene el problema exacto por el que OP pregunta? ¿También puede nombrar el inconveniente (contras) que tiene su solución? – hakre

6

Cuando me encontré con este problema, que no fue causada por wait_timeout (que se establece en el valor predeterminado de 8 horas), sino por max_allowed_packet con una gran INSERT declaración. Cambiar el paquete max_allowed_packet de PHP no tuvo ningún efecto, pero cuando lo cambié en la sección mysqld de /etc/my.cnf y reinicié el servidor MySQL, el problema desapareció.

0

Estaba teniendo problemas para restaurar una base de datos usando mysqldumper (programa php). Pude hacerlo funcionar cambiando la configuración "mssql.timeout" en php.ini. Fue predeterminado a 60 y lo cambié a 300.

0

Por mis experiencias cuando sucede en las consultas de luz hay una manera de resolver el problema. Parece que al iniciar o reiniciar mysql después de apache este problema comienza a aparecer y el origen del problema son los sockets abiertos confusos en el proceso php. para resolverlo:

  1. servicio MySQL primer reinicio

  2. A continuación, reinicie el servicio de Apache

3

El aumento de SQL-Espera-tiempo de espera trabajó para mí en este caso, intente esto:

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

antes que las primeras consultas SQL "normales".

+1

Me gustó esta respuesta. Me pregunto cómo puedo agregarlo a una consulta global de wp: $ posts = $ wpdb-> get_results ("SELECT ID, bla, bla, bla ... ¿Es posible agregarlo a $ wpdb o al $ link/$ conn? ? Muchas gracias de antemano por cualquiera que pueda aclarar esto más .. – Amit

+0

Creo que no hay una configuración especial para los comandos 'on_connect'. pero cou puede simplemente escribir una función de conexión propia, lo que está creando la conexión básica y enviando su cambios de configuración de conexión. – Radon8472

0

En nuestro caso, el culpable fue el mundial (no "local") variable de MySQL"wait_timeout".

comparar los resultados de las consultas siguientes:

SHOW VARIABLES LIKE '%wait%'; 

a

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

En nuestro caso la primera consulta mostró un wait_timeout de 28800, pero la consulta segundo mostró un valor de 10 (segundos).

Verificamos que al cambiar la variable global se solucionó el problema. Aquí es un simple script PHP que reproduce nuestra condición:

<?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); 

Tan pronto como el tiempo de sueño supera el valor global de wait_timeout, obtendríamos el error: "Advertencia: mysqli_query(): el servidor MySQL se ha apagado".

Para cambiar el valor, tuvimos que editar la configuración en nuestro panel de Amazon RDS.

Cuestiones relacionadas