MySQL 서버가 사라-정확히 60 초 만에
최근에 잘 실행되던 SQL 쿼리가 이제 60 초 후에 시간 초과되어 오류가 발생 사실을 발견했습니다. 쿼리는 느리지 만 야간 작업의 일부로 실행되는 자체로드 문제가없는 것이 문제가 없습니다 (최적화를 제안하지 않고 실행).
"select SLEEP (120);"을 실행하여 오류를 일관되게 재현 할 수 있습니다. 그것은 같이 PHP에서. 그러나 MySQL 클라이언트에서 동일한 명령문을 실행하면 성공합니다 (0 반환). wait_timeout (28800으로 설정) 조정을 시도했지만 운이 없었습니다. 또한 db 서버와 머신 자체를 설치했습니다.
항상 정확히 60 초에 타임 아웃 문제는 사실은 리소스 문제가 아닌 설정일 가능성이 있음을 시합니다.
나는 실행하고있다 :
Windows Server 2003
MySql 5.1.36-community
PHP 5.3
아래는 내 테스트 코드, 출력 및 SHOW VARIABLES의 결과입니다.
감사합니다!
암호 :
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이 아니라 큰 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에서 기본적으로 5.0.x를 myisam의 DB를 사용하여 5.1.x로 마이너 업그레이드 한 후 데이터베이스가 손상되었습니다. 쿼리의 같은 줄 : MySQL 서버가 사라졌습니다. 결과 집합의 헤더를 읽는 동안 오류가 발생했습니다.
mysqlcheck로 수리 및 최적화 한 후 소켓 시간 초과를 변경할 필요없이 정상으로 돌아 왔습니다.
나는이 문제를
if( !mysql_ping($link) ) $link = mysql_connect("$MYSQL_Host","$MYSQL_User","$MYSQL_Pass", true);
나는 아마도 관련된 것을 발견했습니다.
두 개의 스크립트가 실행 중이며 둘 다 다소 느린 쿼리를 수행합니다. 그들 중 하나는 테이블을 잠그고 다른 하나는 기다려야했습니다. 대기 중이었던 것은 default_socket_timeout = 300이었습니다. 결국 "MySQL 서버가 사라졌습니다"라는 메시지와 함께 종료됩니다. 그러나 mysql 프로세스 목록에는 쿼리가 계속 표시되고 느린 쿼리는 여전히 실행 중이고 다른 쿼리는 잠겨 있고 대기 중입니다.
그래서 나는 mysqld가 범인이라고 생각하지 않습니다. PHP mysql 클라이언트에서 뭔가 변경되었습니다. 아마도 default_socket_timeout을 -1로 설정하여 변경 사항이 있는지 확인합니다.
mysqli와 동일한 문제가 있습니다. 내 솔루션은 http://php.net/manual/ru/mysqli.configuration.php입니다.
mysqli.reconnect = On
최근에이 문제가 발생했습니다. 옵션을 우연히 발견했습니다.default_authentication_plugin
어떤 이유로 그것을으로 설정 caching_sha2_password
했지만 값을 업데이트하여 mysql_native_password
나를 위해 수정했습니다. 하지만 차이점이 무엇인지 잘 모르겠으니 조심하세요!
이것이 누군가를 돕기를 바랍니다!
mysqldumper (php 프로그램)를 사용하여 데이터베이스 복원에 문제가있었습니다. php.ini에서 "mssql.timeout"설정을 변경하여 작동시킬 수있었습니다. 기본값은 60이고 300으로 변경했습니다.
우리의 경우 범인은 전역 ( "local"이 아님) MySQL 변수 " wait_timeout "이었습니다.
다음 쿼리의 결과를 비교하십시오.
SHOW VARIABLES LIKE '%wait%';
...에
SHOW GLOBAL VARIABLES WHERE Variable_name LIKE '%wait%';
우리의 경우 첫 번째 쿼리는 28800 의 wait_timeout 을 보여 주 었지만 두 번째 쿼리는 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);
절전 시간이 전역 wait_timeout 값을 초과하자마자 "경고 : mysqli_query () : MySQL 서버가 사라졌습니다"라는 오류 메시지가 표시됩니다.
값을 변경하려면 Amazon RDS 대시 보드에서 설정을 편집해야했습니다.
내 경험에 따르면 가벼운 쿼리에서 발생하는 문제를 해결할 수있는 방법이 있습니다. 이 문제가 나타나기 시작한 mysql
후 시작하거나 다시 시작 apache
하면 문제의 원인이 php
프로세스 에서 열린 소켓을 혼동하는 것 같습니다. 그것을 해결하려면 :
먼저 mysql 서비스를 다시 시작하십시오.
그런 다음 아파치 서비스를 다시 시작하십시오.
연결이 꽤 오랫동안 열려 있었지만 MySQL 서버에서 아무 작업도 수행되지 않은 경우 발생합니다. 이 경우 "MySQL 서버가 사라졌습니다"라는 오류와 함께 연결 시간 초과가 발생합니다. 위의 답변은 작동 할 수도 있고 작동하지 않을 수도 있습니다. 받아 들여진 대답조차도 나를 위해 작동하지 않았습니다. 그래서 나는 트릭을 시도했고 그것은 나를 위해 잘 작동했습니다. 논리적으로이 오류를 방지하려면 MySQL 연결을 계속 실행하거나 짧게 유지해야합니다 . 250k 레코드 를 대량 삽입 하려고한다고 가정합니다 . 일반적으로 어딘가에서 파싱 데이터를 생성하고 대량 생성하는 데 시간이 걸립니다.쿼리하고 삽입하십시오. 이 시나리오에서 우리 대부분은 루프를 사용하여 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
'ProgramingTip' 카테고리의 다른 글
git push가 Total 줄 나중에 중단됨 (0) | 2020.12.01 |
---|---|
Python Pandas read_csv 행은 건너 뛰기 뛰지 만 헤더는 유지 (0) | 2020.12.01 |
Nullable 열을 사용하여 NOT NULL로 변경 (0) | 2020.12.01 |
바이너리 파일 및 UTF16 grepping (0) | 2020.12.01 |
화면 해상도 가져 오기 오기 및 설정 (0) | 2020.12.01 |