programing

MySQL 오류 2006: mysql 서버가 사라졌습니다.

shortcode 2023. 1. 8. 14:45
반응형

MySQL 오류 2006: mysql 서버가 사라졌습니다.

사무실에서 서버를 실행하여 파일을 처리하고 결과를 원격 MySQL 서버에 보고합니다.

파일 처리에는 다소 시간이 걸리고 프로세스 도중에 다음 오류가 발생합니다.

2006, MySQL server has gone away

MySQL 설정인 wait_timeout에 대해 들어본 적이 있는데, 사무실 서버나 리모트 MySQL 서버에서 변경할 필요가 있습니까?

이 문제는 몇 번인가 발생하고 있습니다만, 통상, 의 디폴트 설정은 매우 낮습니다.

로 키우다/etc/my.cnf(아래(아래).[mysqld] 5은 (MySql 5.7의 경우)에서 8 또는 됩니다.4194304

[mysqld]
max_allowed_packet=16M

주의: 존재하지 않는 경우 라인을 작성합니다.

참고: 이 설정은 실행 중인 서버에서 설정할 수 있습니다.

주의: Windows 에서는, my.ini 또는 my.cnf 파일을 UTF-8이 아닌 ANSI 인코딩으로 보존할 필요가 있습니다.

set global max_allowed_packet=104857600. 100MB로

도 같은 , ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★.max_allowed_packet my.ini/my.cnf[mysqld]릭을만만 만만만다다

행을 추가하다

max_allowed_packet=500M

restart the MySQL service아아아아아아아아아아아아아아아아아아아아.

MySQL 명령줄에서 7GB가 넘는 MySQL 데이터베이스를 복원하기 위해 다음 명령을 사용했는데 작동합니다.

set global max_allowed_packet=268435456;

연결이 존재하는지 확인하고 필요에 따라 다시 설정하는 것이 더 쉬울 수 있습니다.

자세한 내용은 PHP:mysqli_ping을 참조하십시오.

이 에러의 원인은 몇 가지 있습니다.

MySQL/MariaDB 관련:

  • wait_timeout- 초 단위 - 서버가 연결을 때까지 기다립니다
  • interactive_timeout- 시간().- 서버가 인터랙티브 초단위).
  • max_allowed_packet 문자열의 단위). - "/" "/" "/" "/" "" ("")BLOB는 1024입니다.

my.cnf의 예:

[mysqld]
# 8 hours
wait_timeout = 28800
# 8 hours
interactive_timeout = 28800
max_allowed_packet = 256M

서버 관련:

  • 에 메모리가 찼습니다. 하십시오.메모리에 대한 정보를 확인합니다.free -h

프레임워크 관련:

  • 프레임워크 설정을 확인합니다.를 사용합니다.CONN_MAX_AGE(문서 참조)

디버깅 방법:

  • MySQL/MariaDB는 MySQL/MariaDB입니다.
    • : sql :SHOW VARIABLES LIKE '%time%';
    • "command line: " 명령어라인:mysqladmin variables
  • 오류에 대한 자세한 내용 켜기:
    • 마dbDB:log_warnings = 4
    • MySQL:log_error_verbosity = 3
  • 오류에 대한 자세한 내용은 문서를 참조하십시오.

오류: 2006(CR_SERVER_GONE_ERROR)

메시지:MySQL 서버가 사라졌습니다.

일반적으로 이 문제를 해결하기 위해 연결을 다시 시도했다가 다시 쿼리를 실행할 수 있습니다. 완전히 포기하기 전에 3~4회 정도 시도합니다.

PDO를 사용하고 있다고 가정합니다.이 경우 PDO 예외를 검출하고 카운터를 증가시킨 후 카운터가 임계값 미만일 경우 다시 시도합니다.

타임아웃의 원인이 되는 쿼리가 있는 경우 다음을 실행하여 이 변수를 설정할 수 있습니다.

SET @@GLOBAL.wait_timeout=300;
SET @@LOCAL.wait_timeout=300;  -- OR current session only

여기서 300은 쿼리에 소요되는 최대 시간(초)입니다.

Mysql 접속 문제에 대한 자세한 정보.

그 할 수 두 가지 은 른 you you you you you you른 you you you you you you you you you you you you 、 edit edit edit edit edit edit 。net_write_timeout ★★★★★★★★★★★★★★★★★」net_read_timeout.

MAMP(비프로 버전)에서 추가

--max_allowed_packet=268435456

로로 합니다....\MAMP\bin\startMysql.sh

크레딧 및 자세한 내용은 이쪽

xampp 서버를 사용하는 경우:

xampp -> mysql -> bin -> my.ini로 이동합니다.

아래 매개 변수 변경:

max_allowed_module = 500M

innodb_log_file_size = 128M

이것이 큰 도움이 되었습니다. :)

이 에러는 wait_timeout의 기한이 만료되기 때문에 발생합니다.

mysql 서버로 이동하여 wait_timeout을 확인합니다.

mysql> 변수 표시('wait_timeout' 등)

mysql > global wait_displays = 600 # 10분 또는 필요한 최대 대기시간 초과 설정

http://sggoyal.blogspot.in/2015/01/2006-mysql-server-has-gone-away.html

Digital Ocean Ubuntu 서버에서 동일한 오류가 발생했습니다.

max_allowed_packet 및 wait_timeout 설정을 변경하려고 했지만 둘 다 수정하지 않았습니다.

서버의 메모리가 부족했던 것이 판명되었습니다.1GB 스왑 파일을 추가해서 문제가 해결되었습니다.

free -h그게 원인인지 확인하려고요

Windows 에서는, xampp 를 사용하고 있는 유저는, 이 패스 xampp/mysql/bin/my.ini 를 사용해, max_allowed_packet(섹션아래 [mysqld])를 선택한 사이즈로 변경할 필요가 있습니다.

max_allowed_packet=8M

다시 php.ini(xampp/php/php.ini)에서 upload_max_filesize 선택 크기를 변경합니다.

upload_max_filesize=8M

이걸 발견하기 전까지 한동안 머리가 아팠어요도움이 됐으면 좋겠다.

그것은 나에게 RAM의 문제였어요.

12개의 CPU 코어와 32GB RAM을 탑재한 서버에서도 같은 문제가 발생하고 있었습니다.저는 더 알아보고 RAM을 비우려고 노력했습니다.다음은 Ubuntu 14.04에서 RAM을 해방하기 위해 사용한 명령어입니다.

sync && echo 3 | sudo tee /proc/sys/vm/drop_caches

그리고 모든 것을 고쳤다.cron에서 1시간마다 실행되도록 설정했습니다.

crontab -e

0 * * * * bash /root/ram.sh;

또한 다음 명령을 사용하여 사용 가능한 빈 RAM 용량을 확인할 수 있습니다.

free -h

그리고 다음과 같은 결과를 얻을 수 있습니다.

             total       used       free     shared    buffers     cached
Mem:           31G        12G        18G        59M       1.9G       973M
-/+ buffers/cache:       9.9G        21G
Swap:         8.0G       368M       7.6G

.open_files_limit파일 입니다.mysqld는 mysqld에 접근을 차단합니다.

확인했습니다.

mysql> SHOW VARIABLES LIKE 'open%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| open_files_limit | 1185  |
+------------------+-------+
1 row in set (0.00 sec)

변수를 큰 값으로 변경한 후 서버가 다시 활성화되었습니다.

[mysqld]
open_files_limit = 100000

일반적으로 MySQL 서버 연결 문제 또는 시간 초과를 나타냅니다.일반적으로 my.cnf 등에서 wait_timeoutmax_allowed_packet을 변경하여 해결할 수 있습니다.

다음과 같은 값을 제안합니다.

wait_timeouts = 28800

max_allowed_module = 8M

64비트 WAMPSERVER를 사용하는 경우 max_allowed_packet이 여러 개 있는지 검색해 주세요.WAMP는 [mysqld64]에서 설정된 값이 아니라 [mysqldump]에서 설정된 값을 사용하기 때문입니다.이것이 문제였습니다.이 값을 max_allowed_module = 64M과 같은 값으로 설정합니다.

이것이 다른 Wampserver 사용자에게 도움이 되기를 바랍니다.

Mysql 서버의 로그를 체크하는 것은 항상 좋은 방법입니다.

말해 줄 거야.

XAMPP를 사용하다XAMPP "mysql " config " " " " 。
여기에 이미지 설명 입력

my.ini를 클릭하면 에디터에서 열립니다.max_allowed_packet을 필요한 크기로 업데이트합니다.

여기에 이미지 설명 입력

그런 다음 mysql 서비스를 재시작합니다.Mysql 서비스에서 stop을 클릭해 다시 start를 클릭합니다.몇 분간 기다립니다.여기에 이미지 설명 입력 여기에 이미지 설명 입력

그런 다음 Mysql 쿼리를 다시 실행해 보십시오.효과가 있기를 바랍니다.

MAMP 5.3에서는 my.cnf를 찾을 수 없습니다.max_allowed_packet이 변수에 저장되어 있기 때문에 my.cnf를 추가할 수 없습니다.

다음과 같은 솔루션이 있습니다.

  1. http://localhost/phpmyadmin으로 이동합니다.
  2. SQL 탭으로 이동
  3. SHOW VARIULES를 실행하여 값을 확인하고, 작으면 큰 값으로 실행합니다.
  4. 다음 쿼리를 실행하여 max_allowed_packet을 7gb로 설정합니다.

    global max_allowed_set=268435456을 설정합니다.

일부의 경우는, 다음의 값도 늘릴 필요가 있습니다.

set global wait_timeout = 600;
set innodb_log_file_size =268435456;

Vagrant Box의 경우 상자에 충분한 메모리를 할당해야 합니다.

config.vm.provider "virtualbox" do |vb|
  vb.memory = "4096"
end

이는 .sql 파일 크기의 문제일 수 있습니다.

xampp를 사용하는 경우.xampp 제어판으로 이동합니다.-> MySql config -> Open my.ini 를 클릭합니다.

패킷 크기를 늘립니다.

max_allowed_packet = 2M -> 10M

클라이언트와 서버 사이에 방화벽이 있어 TCP가 강제로 접속에 리셋되는 경우는 거의 없습니다.

이 문제가 있었습니다만, 5분 이상 아이돌 상태가 되어 있는 비활성 세션을 종료하도록 사내 F5 방화벽이 설정되어 있었습니다.

다시 한 번 말씀드리지만, 이것은 있을 수 없는 시나리오입니다.

를 해제해 주세요.my.ini/my.cnf 큰 이 작은

# binary logging format - mixed recommended
# binlog_format=mixed

로.

# binary logging format - mixed recommended
binlog_format=mixed

이 에러에 대해서, 「#2006 - MySQL server has away」의 솔루션을 찾았습니다.해결책은 두 개의 파일을 확인하는 것입니다.

  1. config.inc.displaces
  2. config.sample.inc.disples

윈도에서 이러한 파일의 경로는 다음과 같습니다.

C:\wamp64\apps\phpmyadmin4.6.4

다음 2개의 파일에서 이 값은 다음과 같습니다.

$cfg['Servers'][$i]['host']must be 'localhost' .

내 경우, 다음과 같습니다.

$cfg['Servers'][$i]['host'] = '127.0.0.1';

다음으로 변경합니다.

"$cfg['Servers'][$i]['host']" = 'localhost';

양쪽에서 확인합니다.

  1. config.inc.displaces
  2. config.sample.inc.inc.config 파일은 'localhost'여야 합니다.

그리고 마지막 세트:

$cfg['Servers'][$i]['AllowNoPassword'] = true;

그런 다음 Wampserver를 재시작합니다.


phpmyadmin 사용자 이름 및 암호를 변경하려면

config.in.php 파일을 통해 phpmyadmin의 사용자 이름과 비밀번호를 직접 변경할 수 있습니다.

이 두 줄

$cfg['Servers'][$i]['user'] = 'root';
$cfg['Servers'][$i]['password'] = '';

여기서 새 사용자 이름과 암호를 지정할 수 있습니다.변경 후 파일을 저장하고 WAMP 서버를 재시작합니다.

Ubuntu 데스크톱의 다른 MySQL 클라이언트 소프트웨어에서 오류 2006 메시지가 표시되었습니다.알고 보니 JDBC 드라이버 버전이 너무 오래된 것 같아요.

에 있어서도 같은 문제가 .docker-compose.yml:

db:
    image: mysql:8.0
    command: --wait_timeout=800 --max_allowed_packet=256M --character-set-server=utf8 --collation-server=utf8_general_ci --default-authentication-plugin=mysql_native_password
    volumes:
      - ./docker/mysql/data:/var/lib/mysql
      - ./docker/mysql/dump:/docker-entrypoint-initdb.d
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}

을 사용하다하지만 증가해도max_allowed_packet "의 "my.cnf에러가 아직 발생.

데이터베이스의 트러블 슈팅을 실시했습니다.

  • 오류가 지속되고 있는 표를 확인했습니다.
  • 그리고 각 열을 확인했습니다.
  • 가져올 수 있는 행과 오류만 표시되는 행이 있습니다.
  • 이 에러의 원인이 되는 값이 이러한 행에 있는 것 같습니다.
  • 기본 표시됩니다(단, 프, 프프 프 but , but but but but but but but but but 단 but 단 but 단 but 단 but 단 but ) SELECT primary_id FROM table)

제가 생각한 해결책은 데이터베이스를 다시 가져오는 것입니다.다행인 건 이 데이터베이스에 대한 백업이 있다는 거야하지만 문제가 있는 테이블만 삭제하고 이 테이블의 백업을 가져옵니다.그것으로 내 문제는 해결되었다.


이 문제에 대한 나의 견해:

  • 항상 데이터베이스를 백업합니다.수동 또는 CRON 작업 통과
  • 해당 행에 특수 문자가 있는 것을 알 수 있었습니다. 했을 때 이 내용을 했습니다.latin1_swedish_ci로.utf8_general_ci
  • 그 전에, 데이타베이스는 정상적으로 동작하고 있었습니다만, 갑자기 시스템에 이 문제가 발생했습니다.호스팅 공급자의 MySQL 데이터베이스 업그레이드와도 관련이 있을 수 있습니다.따라서 빈번한 백업은 필수입니다.

XAMPP를 사용하는 사용자의 경우 C:\xampp\mysql\bin\my.ini에는 2개의 max_allowed_packet 파라미터가 있습니다.

이 에러는 기본적으로 두 가지 이유로 발생합니다.

  1. 메모리가 너무 적습니다.
  2. 연결을 시도하면 데이터베이스 연결이 닫힙니다.

아래에서 이 코드를 사용해 보십시오.

# Simplification to execute an SQL string of getting a data from the database
def get(self, sql_string, sql_vars=(), debug_sql=0):
    try:            
        self.cursor.execute(sql_string, sql_vars)
        return self.cursor.fetchall()
    except (AttributeError, MySQLdb.OperationalError):
        self.__init__()
        self.cursor.execute(sql_string, sql_vars)
        return self.cursor.fetchall()

그 이면에 있는 이유와 관계없이, 특히 두 번째 이유에서는, 에러가 경감됩니다.

RAM 부족이 원인인 경우 코드나 데이터베이스 구성에서 데이터베이스 연결 효율성을 높이거나 RAM만 높여야 합니다.

나는 그것이 한 사람의 빈정거리는 테이블의 손상된 색인 트리를 고치는 데 도움이 되었다.이 명령어로 이러한 테이블을 현지화했습니다.

mysqlcheck -uroot --databases databaseName 

결과

mysqlcheck: Got error: 2013: Lost connection to MySQL server during query when executing 'CHECK TABLE ...

mysqld logs /var/log/mysqld.log에서만 문제가 발생하고 있는 테이블을 확인할 수 있었습니다.

FIL_PAGE_PREV links 2021-08-25T14:05:22.182328Z 2 [ERROR] InnoDB: Corruption of an index tree: table `database`.`tableName` index `PRIMARY`, father ptr page no 1592, child page no 1234'

mysqlcheck 명령어는 수정하지 않았지만 공개에 도움이 되었습니다.결국 mysql CLI에서 일반 mysql 명령어를 실행한 후 수정했습니다.

OPTIMIZE table theCorruptedTableNameMentionedAboveInTheMysqld.log

혹시나 도움이 될 경우를 대비해서:

어플리케이션의 여러 부분에서 호출되는 함수의 연결을 열고 닫았을 때 이 오류가 발생했습니다.연결이 너무 많아서 기존 연결을 재사용하거나 폐기하고 다음과 같은 새 연결을 만드는 것이 좋을 수 있다고 생각했습니다.

public static function getConnection($database, $host, $user, $password){
    if (!self::$instance) {
        return self::newConnection($database, $host, $user, $password);
    } elseif ($database . $host . $user != self::$connectionDetails) {
        self::$instance->query('KILL CONNECTION_ID()');
        self::$instance = null;
        return self::newConnection($database, $host, $user, $password);
    }
    return self::$instance;
}

우리가 살인에 너무 철저했기 때문에 오래된 연결에서 중요한 일을 하는 프로세스는 결코 그들의 사업을 끝낼 수 없었습니다.그래서 우리는 이 선들을 삭제했다.

self::$instance->query('KILL CONNECTION_ID()');
self::$instance = null;

하드웨어와 머신의 셋업이 가능하게 되면, 서버상에서 허가되는 접속의 수를 늘립니다.

max_connections = 500

설정 파일로 이동합니다.이것으로 문제가 해결되어 mysql connections를 죽이는 것에 대해 알게 되었습니다.

언급URL : https://stackoverflow.com/questions/7942154/mysql-error-2006-mysql-server-has-gone-away

반응형