solucion mysqli_real_connect has gone foreign_key_checks error documentación dicho code away php mysql timeout

php - foreign_key_checks - mysqli_real_connect(): mysql server has gone away



El servidor MySQL se ha ido, en exactamente 60 segundos (13)

Recientemente descubrí que una consulta sql que se ejecutaba bien 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).

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 expira 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

Debajo están mi código de prueba, el resultado 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

MOSTRAR 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


Aumentar SQL-Wait-Timeout me funcionó en este caso, intente esto:

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

antes de las primeras consultas SQL "normales".


Cuando me encontré con este problema, no fue causado por wait_timeout (que se estableció en las 8 horas predeterminadas) sino por max_allowed_packet con una instrucción INSERT grande. 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ó.


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

Compare los resultados de las siguientes consultas:

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 segunda consulta mostró un valor de 10 (segundos).

Verificamos que cambiar la variable global solucionó el problema. Aquí hay un script PHP simple 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 espera excedió el valor global de wait_timeout, obtendríamos el error: "Advertencia: mysqli_query (): el servidor MySQL se ha ido".

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


Estaba teniendo problemas en una restauración de 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.


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


Hay muchas cosas que pueden causar esto. Había leído todo esto y probaba cada uno de ellos

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

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

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


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. Puedes aumentarlo así:

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


Mi caso era una corrupción de la base de datos después de una pequeña actualización en mysql básicamente 5.0.x a 5.1.x con la base de datos en myisam. Las mismas líneas en la consulta: el servidor MySQL se ha ido Error al leer el encabezado del conjunto de resultados

Después de repararlo y optimizarlo con mysqlcheck, volvió a la normalidad, sin la necesidad de cambiar el tiempo de espera del socket.


Noté algo quizás 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.

Entonces, 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.


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


Resolví este problema con

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


Según mis experiencias cuando ocurre en consultas livianas, hay una manera de resolver el problema. Parece que cuando comienzas o reinicias mysql después de apache este problema comienza a aparecer y el origen del problema son los sockets abiertos confusos en el proceso de php . Para resolverlo:

  1. Primero reinicie el servicio de mysql

  2. Luego reinicie el servicio apache