MySQL: ローカルホストには接続できるのに 127.0.0.1 には接続できない! ネットワーク設定やファイアウォールが原因? 解決方法を徹底解説!

2024-04-02

MySQL: ローカルホストには接続できるが 127.0.0.1 には接続できない

原因

この問題の主な原因は次の 2 つです。

MySQL 設定ファイル (my.cnf) に、bind-address という設定項目があります。この項目は、MySQL サーバがどの IP アドレスで接続を受け付けるかを指定します。デフォルトでは、bind-addresslocalhost に設定されています。つまり、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 に接続することができます。

手順:

  1. リモートサーバーに SSH で接続します。
  2. SSH トンネルを開きます。
ssh -L 3306:localhost:3306 user@remote_server
  1. ローカル MySQL クライアントを使って、localhost:3306 に接続します。
mysql -h localhost -P 3306 -u root -p

Unix ソケット

MySQL サーバは、Unix ソケットを使って接続することもできます。Unix ソケットは、ネットワーク経由ではなく、ローカルファイルシステムを使って接続する方式です。

  1. MySQL クライアントを起動します。
mysql -u root -p
  1. Unix ソケットを使って接続します。
use mysql;
SELECT * FROM user;

別のポートを使用する

MySQL サーバは、デフォルトで 3306 ポートを使用します。しかし、別のポートを使用するように設定することもできます。

  1. MySQL 設定ファイル (my.cnf) を編集します。
# /etc/my.cnf

[mysqld]
port = 3307
service mysql restart
mysql -h localhost -P 3307 -u root -p

注意:

上記の方法を試す前に、MySQL サーバの設定とネットワーク設定を理解しておく必要があります。また、これらの方法は、すべての環境で動作するとは限りません。


mysql mariadb


LOAD DATA INFILE vs INSERT INTO ... SELECT:大量データ挿入の比較

結論: 状況によって異なります。詳細:単一挿入 (Multiple Single INSERTs)INSERT文を1行ずつ実行する方式メリット: エラー発生時の影響範囲が小さい 処理の進捗状況を逐一確認できるエラー発生時の影響範囲が小さい...


【初心者向け】MySQLのROW_NUMBER()関数でグループ内最大値を取得する方法

MySQLのROW_NUMBER()関数は、ウィンドウ関数と呼ばれる特殊な関数の一つで、各行に連番を割り当てることができます。この機能を利用することで、グループ内における最大値などの複雑な処理を効率的に行うことができます。ROW_NUMBER()関数の使い方...


コメントツールを使ってMySQLのコメントを効率的に管理する

MySQL でコメントを追加するには、以下の2つの方法があります。クエリ内にコメントを追加するテーブルやカラムにコメントを追加する方法-- を使って、コメントしたい内容を記述します。/ ... / を使って、複数行にわたってコメントを記述することができます。...


MariaDB で pt-query-digest を使用してクエリログを分析する際のエラー "Redundant argument in sprintf" の解決方法

対象者:MariaDB を使用しているユーザーPercona Toolkit を使用しているユーザーpt-query-digest を使用しているユーザーパイプライン処理エラーの解決方法を知りたいユーザー前提知識:MariaDB の基礎知識...


MariaDBでVARCHAR列を作成できない?原因と解決方法を徹底解説

問題の症状MariaDBでVARCHAR列を作成しようとすると、以下のいずれかのエラーが発生する可能性があります。1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'VARCHAR(255)' at line 1...