私は自分のオフィスでサーバーを実行して、いくつかのファイルを処理し、その結果をリモートのMySQLサーバーに報告しています。
ファイルの処理には時間がかかり、プロセスは途中で終了し、次のエラーが発生します。
2006, MySQL server has gone away
MySQLの設定wait_timeoutについて聞いたことがありますが、オフィスのサーバーまたはリモートのMySQLサーバーで変更する必要がありますか?
私は自分のオフィスでサーバーを実行して、いくつかのファイルを処理し、その結果をリモートのMySQLサーバーに報告しています。
ファイルの処理には時間がかかり、プロセスは途中で終了し、次のエラーが発生します。
2006, MySQL server has gone away
MySQLの設定wait_timeoutについて聞いたことがありますが、オフィスのサーバーまたはリモートのMySQLサーバーで変更する必要がありますか?
私はこれに何度も遭遇しましたが、通常、答えは非常に低いデフォルト設定のであることがわかりましたmax_allowed_packet
。
/etc/my.cnf
(未満で[mysqld]
)8または16Mに上げると、通常は修正されます。(MySql 5.7のデフォルトは4194304
、4MBです。)
[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を参照してください。
エラー: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は、クエリにかかる最大時間と思われる秒数です。
編集:あなたがまた使用したいと思うかもしれない他の2つの設定はとnet_write_timeout
ですnet_read_timeout
。
このエラーにはいくつかの原因があります。
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
(ドキュメントを参照)SHOW VARIABLES LIKE '%time%';
mysqladmin variables
log_warnings = 4
log_error_verbosity = 3
このエラーは、wait_timeoutの有効期限が切れたために発生します。
mysqlサーバーに移動してwait_timeoutを確認してください:
mysql> SHOW VARIABLES LIKE'wait_timeout'
mysql> set global wait_timeout = 600#必要な10分または最大待機タイムアウト
http://sggoyal.blogspot.in/2015/01/2006-mysql-server-has-gone-away.html
xamppサーバーを使用している場合:
xampp-> mysql->bin->my.iniに移動します
以下のパラメーターを変更します。
max_allowed_packet = 500M
innodb_log_file_size = 128M
これは私を大いに助けました:)
Windowsでは、xamppを使用している人は、このパスxampp / mysql / bin / my.iniを使用し、max_allowed_packet(section [mysqld]の下)を選択したサイズに変更する必要があります。例えば
max_allowed_packet=8M
再びphp.ini(xampp / php / php.ini)でupload_max_filesizeを選択サイズに変更します。例えば
upload_max_filesize=8M
私がこれを発見するまで、しばらくの間私に頭痛を与えました。それが役に立てば幸い。
DigitalOceanUbuntuサーバーでこれと同じエラーが発生していました。
max_allowed_packetとwait_timeoutの設定を変更しようとしましたが、どちらも修正されませんでした。
サーバーのRAMが不足していることがわかりました。1GBのスワップファイルを追加したところ、問題は解決しました。
free -h
それが原因であるかどうかを確認するためにあなたの記憶をチェックしてください。
それは私にとってRAMの問題でした。
12個のCPUコアと32GBのRAMを搭載したサーバーでも同じ問題が発生していました。私はさらに調査し、RAMを解放しようとしました。これは、RAMを解放するためにUbuntu14.04で使用したコマンドです。
sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
そして、それはすべてを修正しました。1時間ごとに実行するようにcronの下に設定しました。
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のアクセスがブロックされていました。
私はそれをチェックしました:
mysql> SHOW VARIABLES LIKE 'open%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| open_files_limit | 1185 |
+------------------+-------+
1 row in set (0.00 sec)
変数を大きな値に変更した後、サーバーは再び稼働していました:
[mysqld]
open_files_limit = 100000
64ビットWAMPSERVERを使用している場合、WAMPは[mysqldump]で設定された値ではなく、[wampmysqld64]で設定された値を使用するため、 max_allowed_packetの複数のオカレンスを検索してください。これをmax_allowed_packet=64Mのように設定します。
うまくいけば、これは他のWampserverユーザーに役立つでしょう。
これは通常、MySQLサーバーの接続の問題またはタイムアウトを示します。通常、my.cnfなどのwait_timeoutとmax_allowed_packetを変更することで解決できます。
私はこれらの値を提案します:
wait_timeout = 28800
max_allowed_packet = 8M
Mysqlサーバーがなくなった理由から、Mysqlサーバーのログを確認することをお勧めします。
それはあなたに教えてくれます。
MAMP 5.3では、my.cnfが見つからず、max_allowed_packetが変数に格納されているため、それらを追加しても機能しません。
1つの解決策は次のとおりです。
次のクエリを実行すると、max_allowed_packetが7gbに設定されます。
グローバルmax_allowed_packet=268435456を設定します。
一部の場合は、次の値も増やす必要があります。
set global wait_timeout = 600;
set innodb_log_file_size =268435456;
Vagrant Boxの場合、ボックスに十分なメモリを割り当てていることを確認してください
config.vm.provider "virtualbox" do |vb|
vb.memory = "4096"
end
ありそうもないシナリオは、クライアントとサーバーの間にファイアウォールがあり、TCPリセットを接続に強制することです。
その問題が発生し、企業のF5ファイアウォールが5分以上アイドル状態の非アクティブなセッションを終了するように構成されていることがわかりました。
繰り返しますが、これはありそうもないシナリオです。
これは、.sqlファイルサイズの問題である可能性があります。
xamppを使用している場合。xamppコントロールパネルに移動し、[MySqlconfig]をクリックして[my.ini]を開きます。
パケットサイズを増やします。
max_allowed_packet = 2M -> 10M
以下のligneのコメントを解除しますmy.ini/my.cnf
。これにより、大きなファイルが小さな部分に分割されます。
# binary logging format - mixed recommended
# binlog_format=mixed
に
# binary logging format - mixed recommended
binlog_format=mixed
このエラーの「#2006-MySQLサーバーがなくなりました」の解決策を見つけました。解決策は、2つのファイルをチェックするだけです。
Windowsでのこれらのファイルのパスは
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';
両方で確認してください:
そして最後のセット:
$cfg['Servers'][$i]['AllowNoPassword'] = true;
次に、Wampserverを再起動します。
phpmyadminのユーザー名とパスワードを変更するには
config.inc.phpファイルを使用してphpmyadminのユーザー名とパスワードを直接変更できます
これらの2行
$cfg['Servers'][$i]['user'] = 'root';
$cfg['Servers'][$i]['password'] = '';
ここで、新しいユーザー名とパスワードを指定できます。変更後、ファイルを保存してWAMPサーバーを再起動します。
UbuntuデスクトップのさまざまなMySQLクライアントソフトウェアでエラー2006メッセージが表示されました。JDBCドライバーのバージョンが古すぎることが判明しました。
以下の設定を追加するdockerでも同じ問題が発生しました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}
このエラーは基本的に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()
特に2番目の理由で、その背後にある理由が何であれ、エラーを軽減します。
RAMの不足が原因の場合は、コードまたはデータベース構成からデータベース接続の効率を上げるか、単にRAMを上げる必要があります。
私もこのエラーに遭遇しました。ただし、max_allowed_packet
の値が増加または増加してmy.cnf
も、エラーは解決しません。
私がしたことは、データベースのトラブルシューティングです。
SELECT primary_id FROM table
)私が考えた解決策は、データベースを再インポートすることです。良いことは、このデータベースのバックアップがあることです。しかし、問題のあるテーブルを削除してから、このテーブルのバックアップをインポートするだけです。それで私の問題は解決しました。
この問題の私の持ち帰り:
latin1_swedish_ci
ました。utf8_general_ci
XAMPPを使用しているユーザーの場合、C:\ xampp \ mysql \ bin\my.iniに2つのmax_allowed_packetパラメーターがあります。
これが誰かを助ける場合に備えて:
アプリケーションのいくつかの部分から呼び出される関数で接続を開いたり閉じたりすると、このエラーが発生しました。接続が多すぎるため、既存の接続を再利用するか、破棄して新しい接続を作成することをお勧めします。
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接続を強制終了することについて何かを学びました。
私にとっては、innodbテーブルの破損したインデックスツリーを修正するのに役立ちました。このコマンドでそのようなテーブルをローカライズしました
mysqlcheck -uroot --databases databaseName
結果
mysqlcheck: Got error: 2013: Lost connection to MySQL server during query when executing 'CHECK TABLE ...
続いて、どのテーブルが問題を引き起こしているかをmysqldログ/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コマンドはそれを修正しませんでしたが、それを明らかにするのに役立ちました。最終的には、mysqlcliからの通常のmysqlコマンドが続くように修正しました
OPTIMIZE table theCorruptedTableNameMentionedAboveInTheMysqld.log
しばらくオフラインになることがわかっている場合は、接続を閉じ、処理を実行し、再接続してレポートを作成できます。