MacPortで入れたMySQLサーバーがLISTEN:3306しない訳
MacPortでインストールしたMySQLサーバーに対して、
初期設定、my.cnfの設定などを行った上に苦労の末に起動し、
さぁクライアントから接続しようと思っても接続できなかった経験はありませんか?
MacPortからインストールしたMySQLにはちょっとした落とし穴が仕込まれています。
概要
MacPortでインストールしたMySQLがLISTEN:3306しない訳
MacPortでインストールしたMySQLサーバーを起動してみたが接続できない。
なんで接続ができないのかと、LISTENしているポートの確認をしてみるも、
標準のポート3306ばかりか、mysqld実行ファイルが全くLISTENしていない。
そうなんですよね、デフォルト状態ではLISTENしないんです。
ここでお話しする内容は以下の手順を済ませている前提でお話しします。
では、MacPortでインストールしたMySQLの起動を行います。
通常は以下のコマンドでMySQLサーバーを起動します。
起動: sudo port load mysql55-server
毎回ターミナル操作も面倒なので、
私はWordkbenchを利用して起動終了をするようにしています。
次に、起動したプロセスを確認します。
起動しているプロセスを確認する手順は以下でご紹介しています。
今回、起動中の「mysqld」実行ファイルのパスが正しい事を確認して、
プロセスIDが「30930」であることが上記で確認できます。
では、次にこの「mysqld」がどこのポートに対してLISTENしているのかを確認します。
LISTEN中のポートを確認するには以下の手順で確認ができます。
しかし、以下の通り「mysqld」は、
一切 LISTENしているリストに表示されてきません。
通常、MySQLサーバーをインストールして起動すると、
「*:3306」という風に、すべてのIPアドレスの3306ポートに対して、
LISTENし待ち受け状態になりますが、
MacPortでインストールしたMySQLサーバーでは初期状態ではLISTENしていません。
諸悪の根源は「macport-default.cnf」
諸悪の根源と言うか、セキュリティー設定の為に導入されている一文が、
「macport-default.cnf」というファイルに記載されています。
MacPortでインストールしたMySQLサーバーの
「my.cnf」参照先ディレクトリにあります。
MySQLサーバーが参照している「my.cnf」ディレクトリの
調べ方は以下でご紹介しています。
その調べたディレクトリに存在している「macport-default.cnf」は、
同じディレクトリに配置された「my.cnf」ファイル内で、
読み込まれる設定になっています。
では読み込まれる側の「macport-default.cnf」の中身を確認します。
実体は「[mysqld]」のサーバー用セレクタ文字列と、
「skip-networking」だけです。
[mysqld]
skip-networking
「skip-networking」はTCP/IP接続を無効化
この「skip-networking」の設定が本丸です。
要はこの設定を導入することで
「ソケット接続」によってのみ接続が可能な状態になります。
一般的にTCP/IPを利用する接続方法
- localhost:3306
- 127.0.0.1:3306
- 192.168.1.xxx:3306
等はすべて利用することができません。
--skip-networking
TCP/IP 接続を listen しません。mysqld とのすべての対話は、名前付きパイプまたは共有メモリー (Windows の場合) または UNIX ソケットファイル (UNIX の場合) を使用して行う必要があります。このオプションは、ローカルクライアントのみが許可されているシステムで強く推奨します。セクション8.11.5.2「DNS ルックアップの最適化とホストキャッシュ」を参照してください。
では、その読み込み設定をコメントアウトして停止します。
これで「skip-networking」がOFFになります。
再び、LISTENしているかどうかの確認を行います。
設定を無効にしたことによって、LISTENが行われるようになりました。
こうすることでMacPortでインストールしたMySQLサーバーでも、
TCP/IPによって接続ができるようになります。
が、それって必要ですか?
MacPortではこの設定で利用することを勧めて初期設定に
よく見かけるこの回避方法として、
「skip-networking」をコメントアウトする。
という方法が見受けられます。
「macport-default.cnf」の編集はアップデートで失われる
この場合「macport-default.cnf」を開き、編集しコメントアウトすることになります。
しかし、元々2行しか記述されていない「macport-default.cnf」の読み込みを、
止めることで回避は十分です。
また「macport-default.cnf」を編集することについては注意が必要です。
どこで書いてあったのかソースが提供できないのですが、
「macport-default.cnf」は、
MacPortでMySQLサーバーのアップデートを行うと、
上書きされて変更が失われてしまうという事なのです。
自動的にアップデートされることはないとしても、
MacPortからなんとなくMySQLのアップデートを行って変更が失われてしまっては、
忘れたことにTCP/IP接続ができなくなってしまうことになりかねません。
そういう意味では変更を「my.cnf」のみに行って、
「macport-default.cnf」は編集しない方が無難と言えます。
ソケット接続(UNIXソケット)接続を利用すればいい場合が大半
さらに言えば、
MySQLサーバーにTCP/IPで接続する必要性がどれくらいあるのか?
という点です。
同一ホスト上にM.A.M.P(Mac上にApache,MySQL,PHP)環境を構築した場合、
接続方法はローカル接続に限定されている
「ソケット接続(UNIXソケット)」を利用すれば事足りるのです。
Webサーバーとデータベースサーバーを別のホスト上で動作させて、
他の端末からデータベースへアクセスする必要がある場合には、
初めてこの「skip-networking」の設定が問題になるだけばのです。
同一ホストで「localhost」や「127.0.0.1」でアクセスする設定を利用するなら、
最初から「ソケット接続(UNIXソケット)」を利用しても同じです。
安易に「skip-networking」の設定を解除する前に、
解除する必要性があるのかどうかを十分に検討する必要があると私は思います。
当然、MySQLのGUI管理ツールMySQLWordkbenchでも、
「ソケット接続(UNIXソケット)」を利用しての接続が行えます。
参考
そのままではありますが、
セキュリティーを考慮したデフォルト設定「–skip-networking」が困惑する原因です。
--skip-networking
TCP/IP 接続を listen しません。mysqld とのすべての対話は、名前付きパイプまたは共有メモリー (Windows の場合) または UNIX ソケットファイル (UNIX の場合) を使用して行う必要があります。このオプションは、ローカルクライアントのみが許可されているシステムで強く推奨します。セクション8.11.5.2「DNS ルックアップの最適化とホストキャッシュ」を参照してください。
当サイト内のコンテンツおよび画像を含むすべてにおいて、管理人アルゴリズンが著作権を保持しております。
当サイトでご紹介しております写真等につきましては著作権の放棄はしませんが、
ライセンスフリーでご利用いただいて構いません。
コンテンツを有益であると感じていただけましたら非常に光栄です。
ありがとうございます。
サイト内コンテンツを引用される際には、出典元として当サイト(個別記事)へのリンクをお願いいたします。
申し訳ございませんが、無断転載、複製をお断りさせて頂いております。
公開日: