MySQL: ローカルホストには接続できるのに 127.0.0.1 には接続できない! ネットワーク設定やファイアウォールが原因? 解決方法を徹底解説!
MySQL: ローカルホストには接続できるが 127.0.0.1 には接続できない
原因
この問題の主な原因は次の 2 つです。
MySQL 設定ファイル (my.cnf
) に、bind-address
という設定項目があります。この項目は、MySQL サーバがどの IP アドレスで接続を受け付けるかを指定します。デフォルトでは、bind-address
は localhost
に設定されています。つまり、MySQL サーバは localhost
経由での接続のみを受け付けます。
ネットワーク設定の問題
127.0.0.1 は、ループバックアドレスと呼ばれる特別な IP アドレスです。ループバックアドレスは、自分のコンピュータ自身を指します。そのため、127.0.0.1 を使って接続しようとする場合、ネットワークの設定に問題があると接続できない場合があります。
解決方法
MySQL 設定ファイルの編集
my.cnf
ファイルを開き、bind-address
設定項目を 127.0.0.1
に変更します。
# /etc/my.cnf
[mysqld]
bind-address = 127.0.0.1
127.0.0.1 に接続できない場合は、ネットワーク設定に問題がないことを確認する必要があります。以下のコマンドを実行して、ネットワーク設定を確認できます。
ipconfig
このコマンドを実行して、127.0.0.1 が正しく設定されていることを確認してください。
ファイアウォールを使用している場合は、MySQL サーバのポート (デフォルトは 3306) が開放されていることを確認する必要があります。
上記の解決方法を試しても問題が解決しない場合は、以下の方法も試してみてください。
- MySQL サーバを再起動する
- コンピュータを再起動する
補足
- この問題は、MySQL だけでなく MariaDB でも発生します。
- この問題を解決するには、MySQL サーバの設定とネットワーク設定を理解する必要があります。
しかし、この問題を再現するためのサンプルコードは以下のように作成できます。
import mysql.connector
# ローカルホストに接続
try:
connection = mysql.connector.connect(
host="localhost",
user="root",
password="password",
database="database",
)
print("接続成功")
except Exception as e:
print(f"接続失敗: {e}")
# 127.0.0.1 に接続
try:
connection = mysql.connector.connect(
host="127.0.0.1",
user="root",
password="password",
database="database",
)
print("接続成功")
except Exception as e:
print(f"接続失敗: {e}")
このコードを実行すると、localhost
には接続できるが 127.0.0.1
には接続できないことが確認できます。
他の方法
MySQL クライアントによっては、接続先ホストを指定するオプションがあります。このオプションを使って、localhost
ではなく 127.0.0.1
を指定することで、127.0.0.1 に接続することができます。
例:
mysql -h 127.0.0.1 -u root -p
SSH トンネルを使うことで、間接的に 127.0.0.1 に接続することができます。
手順:
- リモートサーバーに SSH で接続します。
- SSH トンネルを開きます。
ssh -L 3306:localhost:3306 user@remote_server
- ローカル MySQL クライアントを使って、
localhost:3306
に接続します。
mysql -h localhost -P 3306 -u root -p
Unix ソケット
MySQL サーバは、Unix ソケットを使って接続することもできます。Unix ソケットは、ネットワーク経由ではなく、ローカルファイルシステムを使って接続する方式です。
- MySQL クライアントを起動します。
mysql -u root -p
- Unix ソケットを使って接続します。
use mysql;
SELECT * FROM user;
別のポートを使用する
MySQL サーバは、デフォルトで 3306 ポートを使用します。しかし、別のポートを使用するように設定することもできます。
- MySQL 設定ファイル (
my.cnf
) を編集します。
# /etc/my.cnf
[mysqld]
port = 3307
service mysql restart
mysql -h localhost -P 3307 -u root -p
注意:
上記の方法を試す前に、MySQL サーバの設定とネットワーク設定を理解しておく必要があります。また、これらの方法は、すべての環境で動作するとは限りません。
mysql mariadb