MacPortで入れたMySQLサーバーに接続できない理由と対応
MacPortでインストールしたMySQLで最初に戸惑うポイントに、
いつものTCP/IP(IPアドレスとポート指定)で接続ができないという点があります。
接続できない理由はデフォルト設定にあります。
接続できるようにする設定変更は非常に簡単です。
概要
MacPortでインストールしたMySQLに接続できない
MacPortでインストールしたMySQLサーバーに接続しようとして、
接続できないパターンとして、
よく利用するTCP/IP接続による、
localhost:3306や、127.0.0.1:3306による接続をしている場合ではないでしょうか。
しかしMacPortのデフォルト設定では、
セキュリティー設定の為、TCP/IPによる接続ができない設定になっています。
MacPort初期状態のMySQLサーバーは全くLISTENしません
MySQLを起動して3306ポート(標準)のLISTENをしているかを確認すると分かります。
MySQLを起動しただけでは3306ポートのLISTENをしていないばかりか、
全くどこのポートに対してもLISTENしていません。
LISTENしないのは多くの場合、TCP/IP接続の必要性がないという判断から
自宅サーバーなどの構築を行って、
Webサーバーとデータベースサーバーを別々の端末(ホスト)で構築し、
運用、管理をしていくような環境が必要でしょうか。
確かに本格的にサーバーを運用するような場合には、
WebサーバーのみをDMZ(非武装エリア)で公開し、
データベースなどのサーバーはファイヤーウォールの内部で管理することと思います。
が、そうした環境を構築している方は、
おそらくこのような記事を読んでいることはないと思います。
自己解決できているスキルがあるはずです。
多くの場合は同一ホスト上にA.M.P(Apache,MySQL,PHP)環境を構築し、
普段使うパソコンとサーバーを分けて構築する程度のはずです。
即ち、MySQLを参照するApacheは同一ホストに存在している訳です。
同一ホスト内からのデータベース接続はソケット接続(UNIX Socket)で十分
同一ホスト(端末)内からのMySQLの接続に限って利用できる接続方法に、
ソケット接続(UNIX Socket)があります。
別の端末からは一切接続することができませんが、
これはセキュリティー上は大きな効果があることはすぐにわかる事と思います。
端末の外からデータベースの参照ができない訳ですから。
※PHPなどで構築したプログラム上のバグを介してのアクセスは可能です。
基本はソケット接続を利用を想定している
どうしても別のホスト(端末)からアクセスする必要性があるわけでもない限りは、
基本はソケット接続で接続をするように環境構築を検討してみる方がいいと思います。
何となく慣れているTCP/IP接続で、
127.0.0.1やlocalhost、192.168.1.xxxを利用して接続したい気持ちも分かります。
しかし、自ホスト以外からデータベースの参照をしないのであれば、
ソケット接続のみを利用するのも一つの選択肢です。
同一ホスト内にインストールしたMySQLWordkbenchから、
ソケット接続でMacPortインストールMySQLの管理を行うための設定は、
以下でご紹介しています。
こうしたソケット接続に限定しているセキュリティー設定は、
「macports-default.cnf」に対して、
「skip_networking
」が記載されていることに起因しています。
「skip_networking
」の記述によって、
以下のようにTCP/IP接続の制限が行われています。
Make sure that the server has not been configured to ignore network connections or (if you are attempting to connect remotely) that it has not been configured to listen only locally on its network interfaces. If the server was started with
--skip-networking
, it will not accept TCP/IP connections at all. If the server was started with--bind-address=127.0.0.1
, it will listen for TCP/IP connections only locally on the loopback interface and will not accept remote connections.(意訳)サーバーがネットワーク接続を無視するように構成されていないこと、または(リモートで接続しようとしている場合)サーバーがネットワークインターフェイス上でローカルでのみ受信するように構成されていないことを確認します。 サーバが–skip-networkingで起動された場合、TCP / IP接続はまったく受け付けません。 –bind-address = 127.0.0.1でサーバーを起動した場合、ループバックインターフェイス上でローカルにのみTCP / IP接続をリッスンし、リモート接続を受け付けません。
(引用)MySQL :: MySQL 5.7 Reference Manual :: 7.2.7 Troubleshooting Problems Connecting to MySQL
(結論)それでもデータ投入などは別ホストからやりたい
そうなんですよね。
基本的にはサーバー上で完結する作業がほとんどですが、
MySQLWorkbenchなどで別のホストから接続して、
データベースに関する操作をしたい。
そうなったらやはりTCP/IPによる接続が必要になると感じるかもしれません。
そんな時には、
「skip_networking
」の記述をコメントアウト・・・
するのではなく、
「macports-default.cnf」の読み込み指定を解除します。
詳細は以下でご紹介しています。
「macports-default.cnf」に対しての設定はアップデートで失われます(のはずです)
変更前: !include /opt/local/etc/mysql55/macports-default.cnf
変更後: #!include /opt/local/etc/mysql55/macports-default.cnf
このことによって、TCP/IPの制限が解除され、
「*:3306」に対してLISTENをするようになります。
後は、アクセス元のIPアドレスでログインができるように、
「mysql@192.168.0.*」などのユーザー権限を設定するだけです。
以下関連の情報です。
参考
MySQL :: MySQL 5.7 Reference Manual :: 6.1.5 Server System Variables
当サイト内のコンテンツおよび画像を含むすべてにおいて、管理人アルゴリズンが著作権を保持しております。
当サイトでご紹介しております写真等につきましては著作権の放棄はしませんが、
ライセンスフリーでご利用いただいて構いません。
コンテンツを有益であると感じていただけましたら非常に光栄です。
ありがとうございます。
サイト内コンテンツを引用される際には、出典元として当サイト(個別記事)へのリンクをお願いいたします。
申し訳ございませんが、無断転載、複製をお断りさせて頂いております。
公開日:
最終更新日:2017/02/17