ユーザ用ツール

サイト用ツール


サイドバー

db:mysql:障害対応:mysqlに繋がらない_error_2002_hy000:can_t_connect_to_local_mysql_server_through_socket_var_lib_mysql_mysql.ock_111

MySQLに繋がらない

WordPress を使っているサイトで「データベース接続確立エラー」が発生。結論から言うと、MySQL を再起動させることで解決しました。
その上で再発防止のため、Swap領域の作成と innodb_buffer_pool_size を増やしました。

# MySQL に接続しようとすると、以下のエラーがでる
$ mysql -u root -p
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.ock' (111)

# 再起動で解決
$ sudo service mysqld restart

以下、解決までの調査の流れ

「service mysqld status」で MySQL の状態を確認すると、「Active: failed」で停止している

$ service mysqld status
Redirecting to /bin/systemctl status mysqld.service
● mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since 木 2019-03-07 10:57:29 JST; 42min ago
   Status: "SERVER_BOOTING"
    Error: 2 (そのようなファイルやディレクトリはありません)

一応、実行中のプロセス一覧も確認するが「/usr/sbin/mysqld」がない

$ ps ax | grep mysql

my.cnf で「mysql.sock」とログフィアルの場所を確認

$ sudoedit /etc/my.cnf
 socket=/var/lib/mysql/mysql.sock
 log-error=/var/log/mysql/mysqld.log

# mysql.sock を確認
$ sudo ls -l /var/lib/mysql/ | grep mysql.sock
srwxrwxrwx  1 mysql mysql        0  3月  7 16:41 mysql.sock

# ログの確認
$ less /var/log/mysql/mysqld.log
  [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.12) starting as process 18440
  [System] [MY-010229] [Server] Starting crash recovery...
  [System] [MY-010232] [Server] Crash recovery finished.
  [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
  [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.12'  socket: '/var/lib/mysql/mysql.sock'  port: 3306  MySQL Community Server - GPL.
  [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.12) starting as process 18537
  [ERROR] [MY-012681] [InnoDB] InnoDB: mmap(137428992 bytes) failed; errno 12
  [ERROR] [MY-012956] [InnoDB] InnoDB: Cannot allocate memory for the buffer pool
  [ERROR] [MY-012930] [InnoDB] InnoDB: Plugin initialization aborted with error Generic error.
  [ERROR] [MY-010334] [Server] Failed to initialize DD Storage Engine
  [ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
  [ERROR] [MY-010119] [Server] Aborting
  [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.12)  MySQL Community Server - GPL.

どうやら DB がクラッシュしたため、リカバリーを行った模様。しかし、バッファープールのメモリが足りずデータディクショナリの初期化に失敗し、停止してしまったようです。
まずは、MySQL を再起動してサイトに繋がるように。

# 再起動
$ sudo service mysqld restart

# ステータスを確認。「Active: active」になってます
$ service mysqld status
Redirecting to /bin/systemctl status mysqld.service
● mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: active (running) since 木 2019-03-07 11:51:11 JST; 21min ago

# MySQL に接続できるか確認
$ mysql -u root -p

特に問題は無さそうだったので、再発しないように対策を行います。

Swapを確認

$ free -m
        total   used   free   shared  buff/cache   available
Mem:     1837    531    677       64         628        1031
Swap:       0      0      0

AWSのEC2で、インスタンスタイプ「t2.small」を使ってますが、Swap領域は無しとのこと。 AWSであれば、Swap領域はインスタンスストア上に作成することが推奨されているようですが、残念ながら「t2.small」には用意されていない模様。
インスタンスタイプ毎のインスタンスストアボリューム

Swap領域の作成

# 空ファイル作成
sudo dd if=/dev/zero of=/swapfile bs=1M count=1024

# 作成した空ファイルをswap領域に設定
sudo mkswap /swapfile

# 権限を変更
sudo chmod 600 /swapfile

# スワップ領域を有効化
sudo swapon /swapfile

# swap領域確認
free -m
        total   used   free   shared  buff/cache   available
Mem:     1837    545    207       88        1084        1014
Swap:    1023      0   1023

# MySQL 再起動
sudo service mysqld restart

# 再起動時にマウントされるように fstab を編集
sudoedit /etc/fstab
/swapfile    swap       swap    defaults        0   0

# エラーが出ないか確認
sudo mount -a

# 再起動
shutdown -r now

innodb_buffer_pool_size を増やす

まずは、現在のバッファプールサイズを確認。

$ mysql -u root -p

> show variables like 'innodb_buffer_pool_size';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| innodb_buffer_pool_size | 134217728 |
+-------------------------+-----------+
1 row in set (0.00 sec)

サイズを増やす。

# my.cnfに追記
$ sudoedit /etc/my.cnf
[mysqld]
innodb_buffer_pool_size = 256M

# MySQL の再起動
$ sudo service mysqld restart

サイズが反映されているか確認。

> show variables like 'innodb_buffer_pool_size';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| innodb_buffer_pool_size | 268435456 |
+-------------------------+-----------+
1 row in set (0.00 sec)

コメント

コメントを入力. Wiki文法が有効です:
 
db/mysql/障害対応/mysqlに繋がらない_error_2002_hy000/can_t_connect_to_local_mysql_server_through_socket_var_lib_mysql_mysql.ock_111.txt · 最終更新: 2019/05/07 10:39 by yusuke_komori