WindowsからLinux上のMySQLサーバーにアクセスする

最近はWindows上でnodejs開発しています。
そうしていると困っちゃうことが稀によくあって大変です。
さて、今回困ったことはこちら↓↓

## 困ったこと
Windows上でnodejs+mysqlを使ってRaspberryPi上のMySQLサーバーにアクセスしようとしたらアクセスできなかった！

### 環境
Windows10 Home
node：version 8.11.1
mysql(node_module)：version 2.15.0

RaspberryPi(raspbian-jessie)
MySQLサーバー：Ver 14.14 Distrib 5.5.59, for debian-linux-gnu (armv7l) using readline 6.3



## 詳細
RaspberryPi上にMySQLのサーバーがすでにあったらやっぱりそれを使いたくなりますよね。
そこで外部からアクセスするためにMySQLサーバーにログインして以下のコマンドで設定をします[^1]。

```console
> grant all privileges on `db_name`.* to 'user_name'@'%' identified by 'password';
```

この設定をして以下のプログラムでWindowsから接続してみました。


```test_mysql.js
var mysql = require('mysql');
var mysqlOptions = {
  host: 'mysqlサーバーのIPアドレス',
  user: 'user_name',
  password: 'password',
  database: 'db_name'
};
var db = mysql.createConnection(mysqlOptions);
new Promise((resolve, reject) => {
  db.connect((err) => {
    if (err) {
      console.log('connection failed');
      return reject(err);
    }
    return resolve();
  });
}).then(() => {
  return new Promise((resolve, reject) => {
    db.query("select * from db_name;", (err, res, fields) => {
      if (err) {
        return reject(err);
      }
      console.log(res[0]);
      return resolve();
    });
  });
}).then(() => {
  db.end();
}).catch((err) => {
  console.log(err);
});
```

LinuxOSからの接続を試していないのでこれだけで行けるのかはわからないのですが、Windowsではgrantコマンドによる設定だけではダメでした。
具体的には以下のエラーが返ってきます。

```console
PS C:\hoge\fuga> node .\test_mysql.js
connection failed
{ Error: connect ECONNREFUSED データベースのIPアドレス:3306
    at Object._errnoException (util.js:1022:11)
    at _exceptionWithHostPort (util.js:1044:20)
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1198:14)
    --------------------
    at Protocol._enqueue (C:\path\to\program\node_modules\mysql\lib\protocol\Protocol.js:145:48)
    at Protocol.handshake (C:\path\to\program\node_modules\mysql\lib\protocol\Protocol.js:52:23)
    at Connection.connect (C:\path\to\program\node_modules\mysql\lib\Connection.js:130:18)
    at Promise (C:\path\to\program\test_mysql.js:5:6)
    at new Promise (<anonymous>)
    at Object.<anonymous> (C:\path\to\program\test_mysql.js:9:1)
    at Module._compile (module.js:652:30)
    at Object.Module._extensions..js (module.js:663:10)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
  code: 'ECONNREFUSED',
  errno: 'ECONNREFUSED',
  syscall: 'connect',
  address: 'データベースのIPアドレス',
  port: 3306,
  fatal: true }
```

んーーーなんなんだーこれはー！！！
TCP的なエラーだしポートがうんぬんという話を見つけてファイヤウォールのポートを開放してみましたが、同じエラーが返ってきてました[^2]。

キレそう

## 解決策
MySQLサーバーのlisten設定を変える必要がありました[^3]。

```/etc/mysql/my.cnf
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address           = 127.0.0.1
bind-address            = 0.0.0.0 ←これに変更
```

そしてMySQLサーバーを再起動

```console
 $ sudo /etc/init.d/mysql restart 
```

これで無事WindowsからRaspberryPi上のMySQLサーバーに接続できました！

## 参考
[^1]: [mysql serverで外部から接続できるユーザを作成する。](https://qiita.com/yoshiokaCB/items/df4ae185be7cbc4f03ac)
[^2]: [MySQLのポートを開放する(WindowsファイアーウォールでのMSQLのポート開放)(MySQL操作方法Tips)](https://www.ipentec.com/document/windows-mysql-firewall-open-configure)
[^3]: [Connec to MySQL Server on Linux From Windows](http://www.xpertdeveloper.com/2012/06/connect-to-mysql-server-on-linux-from-windows/)