programing

MySQL 서버가 60초 만에 사라졌습니다.

bestcode 2022. 9. 18. 12:52
반응형

MySQL 서버가 60초 만에 사라졌습니다.

얼마 전에 정상적으로 실행하던 SQL 쿼리가 60초 후에 타임아웃되어 에러가 발생하고 있는 것을 발견했습니다.쿼리는 느리지만 야간 작업의 일부로 실행되므로 그것 자체로는 문제가 되지 않습니다(최적화를 제안하지 마십시오).

아래와 같이 PHP에서 "select SLEEP (120);"를 실행하여 에러를 일관되게 재현할 수 있습니다.그러나 MySQL 클라이언트에서 동일한 문을 실행하면 성공합니다(0을 반환).wait_timeout(28800으로 설정)을 조정하려고 했지만, 잘 되지 않았습니다.또한 DB 서버와 시스템 자체를 모두 재부팅했습니다.

항상 정확히 60초에 타임아웃이 된다는 것은 한정된 자원의 문제가 아니라 설정일 가능성이 높다는 것을 시사합니다.

:는달:::::::
Server 2003 Windows Server 2003
5. MySql 5.1.36
PHP 5.3

아래는 테스트 코드, 출력 및 SHOW VARIES 결과입니다.

감사합니다!

코드:

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

출력:

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

변수 표시:

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

옵션 php 。mysql.connect_timeout로부터의 첫 접속 타임아웃뿐만 아니라 서버로부터의 첫 번째 응답을 기다리는 경우에도 사용됩니다.을 사용하다

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

이 문제가 발생했을 때는 wait_timeout(기본값은 8시간으로 설정되어 있음)이 아니라 큰 INSERT 문이 있는 max_allowed_packet이 원인입니다.PHP에서 max_allowed_packet을 변경해도 아무런 영향이 없었지만 /etc/my.cnf의 mysqld 섹션에서 변경하고 MySQL 서버를 재시작하자 문제가 사라졌습니다.

많은 것들이 원인이 될 수 있어요이걸 다 읽고 하나씩 써봤는데

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

저는 몇 년 동안 여러 웹 호스팅 회사에서 근무해 왔습니다만, 일반적으로는 서버 측에서 wait_timeout을 하고 있는 것 같습니다만, 여기에서는 그렇지 않은 것 같습니다.

해결책을 찾으면 올려주셨으면 좋겠습니다.나는 알고 싶다.

이것은 제가 하는 일입니다(일반적으로 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

이 경우 SQL-Wait-Timeout을 늘리는 것이 효과가 있었습니다.이 경우 다음을 시도해 보십시오.

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

SQL 쿼리를 처음 "일반"하기 전에 먼저 실행합니다.

mysql에서 myisam에 DB를 두고 5.0.x에서 5.1.x로 마이너업그레이드 한 후 데이터베이스가 파손된 경우입니다.쿼리의 동일한 줄: MySQL 서버가 사라졌습니다 결과 집합의 헤더를 읽는 동안 오류가 발생했습니다.

mysqlcheck를 사용하여 복구 및 최적화한 후 소켓타임아웃을 변경할 필요 없이 정상으로 돌아왔습니다.

나는 이 문제를 해결했다.

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

저도 mysqli에 대해 같은 문제가 있습니다.저의 솔루션은 https://www.php.net/manual/en/mysqli.configuration.php 입니다.

mysqli.reconnect = On

뭔가 관련이 있는 걸 알아챘어요

두 개의 스크립트를 실행하고 있었는데 둘 다 느린 쿼리를 실행하고 있었습니다.그들 중 한 명은 테이블을 잠그고 다른 한 명은 기다려야 했다.대기하고 있던 것은 default_syslog_syslog = 300 입니다.="MySQL Server has away"로 종료되었습니다.그러나 mysql 프로세스 목록에는 느린 쿼리와 잠긴 쿼리가 모두 계속 표시됩니다.

그래서 나는 mysqld가 범인이 아니라고 생각한다.php mysql 클라이언트에서 뭔가 변경되었습니다.default_socket_timeout이 변경되었는지 확인하기 위해 -1로 설정합니다.

최근에 이런 문제가 있었어요. 선택지를 했다: 연히히 i i i i i i i i i i i i i i i i i 。default_authentication_plugin

인지 그것은 을 떤떤유이 it it it for for it it로 했다.caching_sha2_password, 을 ,, 을, 을니니다다 , 、 을 、 을 、 , 、 。mysql_native_password 모르겠지만 하지만 어떤 차이가 있는지 잘 모르니 조심하세요!

이게 누군가에게 도움이 되길 바라!

mysqldumper(php 프로그램)를 사용한 데이터베이스 복원에 문제가 있었습니다.php.ini의 "mssql.timeout" 설정을 변경하여 동작시킬 수 있었습니다.기본값은 60이고 300으로 변경했습니다.

이 경우 원인은 글로벌('로컬'이 아닌) MySQL 변수 "wait_timeout"입니다.

다음 쿼리 결과를 비교합니다.

SHOW VARIABLES LIKE '%wait%';

로.

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

이 경우 첫 번째 쿼리는 wait_timeout 28800을 나타냈지만 두 번째 쿼리는 10(초)의 값을 나타냈습니다.

글로벌 변수를 변경하면 문제가 해결된다는 것을 확인했습니다.다음은 우리의 상태를 재현한 간단한 PHP 스크립트입니다.

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

sleep 시간이 글로벌 wait_timeout 값을 초과하면 "Warning: mysqli_query(): MySQL server has away"라는 오류가 나타납니다.

값을 변경하려면 Amazon RDS 대시보드에서 설정을 편집해야 했습니다.

내 경험에 의하면 가벼운 질문에서 그것이 발생할 때 문제를 해결할 방법이 있다. 시작할 때 것 요.mysql 후에apache은 " "의 ."php과정.해결 방법:

  1. 첫 번째 mysql 서비스 재시작

  2. 그런 다음 Apache 서비스를 다시 시작합니다.

연결이 잠시 동안 열려 있었지만 MySQL 서버에서 작업이 수행되지 않은 경우 발생합니다.이 경우 "MySQL Server has away" 오류와 함께 연결 시간 초과가 발생합니다.위의 답변은 유효할 수도 있고 무효일 수도 있습니다.받아들여진 대답도 나에게는 통하지 않았다.그래서 나는 속임수를 써봤지만 잘 먹혔어.논리적으로 이 오류를 피하기 위해서는 MySQL 접속을 실행 상태로 유지하거나 간단히 말하면 활성 상태로 유지해야 합니다.25k 레코드를 일괄 삽입하려고 합니다.일반적으로 어딘가에서 해석 데이터를 생성하여 일괄 쿼리를 만든 후 삽입하는 데 시간이 걸립니다.이 시나리오에서는 대부분 루프를 사용하여 SQL 문자열을 만듭니다.반복 횟수를 세어 특정 반복 후 더미 데이터베이스 호출을 실시합니다.이렇게 하면 연결이 유지됩니다.

for(int i = 0, size = somedatalist.length; i < size; ++i){

     // build the Bulk insert query string

     if((i%10000)==0){
         // make a dummy call like `SELECT * FROM log LIMIT 1`
         // it will keep the connection alive
     }
}
// Execute bulk insert

이 링크 http://bugs.php.net/bug.php?id=45150는 PHP5.3의 네이티브 MYSQL 지원으로 이동한 것 같습니다.IPV6에서는 동작에 문제가 있습니다."localhost" 대신 "127.0.0.1"을 사용해 보십시오.

언급URL : https://stackoverflow.com/questions/1644432/mysql-server-has-gone-away-in-exactly-60-seconds

반응형