QNAP TS-453BeのMariaDB/MySQLと設定ファイルの場所

# はじめに
QNAP TS-453BeはNASだけど「SQLサーバ」が使える。実態はMariaDBである。この機能は「コントロールパネル→アプリケーション→SQLサーバ」で有効にできる。このMariaDBの設定を変更するためmy.cnfに相当するファイルを探そうとして色々調べた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15158/cef69172-f49e-c8c4-5c21-4ff7ac45a759.png)

# 3つのインスタンス
QNAPのNAS上ではMariaDB/MySQLのインスタンスが複数動いている。必要に応じて他にもプロセスがforkされるのかもしれないが、少なくともコントロールパネルで「SQLサーバ」を有効にしただけだと3つのインスタンスが動いている。以下の表は[psコマンドで確認できるコマンドラインオプション](https://docs.google.com/spreadsheets/d/e/2PACX-1vRMNvJVlZfApMbPrNSIepYPhtOyEIWjJpi11ShGi0rSRK1-c1Q0eS-x_oPHN3I3Jk3J6yFLOBbPdcxY/pubhtml?gid=1539798672&single=true)の一部である。


|  binary | --port | --defaults-file | --datadir |
| --- | --- | --- | --- |
|  /usr/local/mysql/bin/mysqld_safe |  | /etc/config/my.cnf | /usr/local/mysql/var |
|  /usr/local/mysql/bin/mysqld | 3306 | /etc/config/my.cnf | /usr/local/mysql/var |
|  /usr/local/mariadb/bin/mysqld_safe |  | /etc/qbox-mariadb.cnf | /share/CACHEDEV1_DATA/.qbox/mysql/data |
|  /usr/local/mariadb/bin/mysqld | 23310 | /etc/qbox-mariadb.cnf | /share/CACHEDEV1_DATA/.qbox/mysql/data |
|  /usr/local/mariadb/bin/mysqld_safe |  | /usr/local/mariadb/my-mariadb.cnf | /share/CACHEDEV1_DATA/.system/data |
|  /usr/local/mariadb/bin/mysqld | 3310 | /usr/local/mariadb/my-mariadb.cnf | /share/CACHEDEV1_DATA/.system/data |

ポート3306を使っているプロセスがコントロールパネルから設定できるSQLサーバだろう。3つのインスタンスではあるがそれぞれ*_safeというラッパースクリプトから起動されているので6つのプロセスが見える。ラッパースクリプトは多重起動など危険な状態での起動を避けるためにあるらしい[^1]。

[^1]: mysqld_multi 概要 https://changineer.info/server/mysql/mysqld_multi.html


# ユーザーがNAS外から使えるMariaDB
ポートを見る限りはこれがアプリケーション用のMariaDBらしい。

|  binary | /usr/local/mysql/bin/mysqld |
| --- | --- |
|  --port | 3306 |
|  --defaults-file | /etc/config/my.cnf |
|  --datadir | /usr/local/mysql/var |
|  --log-error | /usr/local/mysql/var/`ホスト名`.err |
|  --basedir | /usr/local/mysql |
|  --user | admin |
|  --pid-file | /var/lock/qmysql.pid |
|  --tmpdir | /usr/local/mysql/tmp |
|  --socket | /tmp/mysql.sock |

## データの置き場所
`--datadir`が`/usr/local/mysql/var`なので、ここってシステム用の小さなパーティションなのにな、がっつりデータが保存されるはずなのにこれで良いのかと疑問に思ったが、シンボリックリンクが張られていた。

- `/usr/local/mysql` → `/mnt/ext/opt/mariadb/`
*  `/mnt/ext/opt/mariadb/var` → `/share/CACHEDEV1_DATA/.@qmariadb/data/`

## 設定ファイル `my.cnf` の場所
設定ファイルは`/etc/config/my.cnf`とのこと。これは`/etc/my.cnf`からのシンボリックリンク先でもある。ほかに`/usr/local/mariadb/my.cnf`や`/usr/local/mariadb/my-mariadb.conf`というファイルもあって混乱する。

### 既定の `my.cnf`

自分でいじりすぎてわけがわからなくなった時のために、エディタで変更を加える前の`my.cnf`を保全しておく。scpでコピーしたままのものをgistにも置いておく。https://gist.github.com/TakashiSasaki/4fb4039c242ce9ad0f3634dbe6e8463c

|  [client] |  |
| --- | --- |
|  port | 3306 |
|  socket | /tmp/mysql.sock |

|  [mysqld] |  |
| --- | --- |
|  port | 3306 |
|  socket | /tmp/mysql.sock |
|  skip-external-locking |  |
|  key_buffer_size | 16M |
|  max_allowed_packet | 1M |
|  table_open_cache | 64 |
|  sort_buffer_size | 512K |
|  net_buffer_length | 8K |
|  read_buffer_size | 256K |
|  read_rnd_buffer_size | 512K |
|  myisam_sort_buffer_size | 8M |
|  default-storage-engine | MyISAM |
|  log-bin | mysql-bin |
|  binlog_format | mixed |
|  server-id | 1 |

|  [mysqldump] |  |
| --- | --- |
|  quick |  |
|  max_allowed_packet | 16M |

|  [mysql] |  |
| --- | --- |
|  no-auto-rehash |  |

|  [myisamchk] |  |
| --- | --- |
|  key_buffer_size | 20M |
|  sort_buffer_size | 20M |
|  read_buffer | 2M |
|  write_buffer | 2M |

|  [mysqlhotcopy] |  |
| --- | --- |
|  interactive-timeout |  |


### コントロールパネルの設定との関係
コントロールパネルの「TCP/IPネットワークを有効にする」チェックボックスに従って`[mysqld]`セクションに`skip-networking`が追加されたり削除されたりするとともに、ファイル末尾にもう一つ`[mysqld]`セクションが作られ`port = 3306`が加除される。

# DNSによる逆引きの抑止
MySQL/MariaDBのユーザーアカウントはホスト部に名前を書くことができる。ということは何らかの方法でIPアドレスから名前への名前解決が起きているはずである。`hosts`ファイルに書かれているようなアドレスであればすぐに名前解決できるが、DNSへの逆引きが発生する場合にはこれが性能低下を引き起こすことがある。そこでセキュリティ上はあまり好ましくないのかもしれないが、`[mysqld]`に`skip-name-resolve`を書くことでDNSへの逆引きを抑制することができる。逆引きを抑制するとホスト名として名前が指定されているMySQL/MariaDBのアカウントは無効となる。`hosts`ファイルで名前の分かるホストについても無効になるので注意。

```/usr/local/mysql/var/ホスト名.err
200825 13:26:16 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/var
200825 13:26:16 [Note] /usr/local/mysql/bin/mysqld (mysqld 5.5.57-MariaDB) starting as process 15761 ...
200825 13:26:16 InnoDB: The InnoDB memory heap is disabled
200825 13:26:16 InnoDB: Mutexes and rw_locks use GCC atomic builtins
200825 13:26:16 InnoDB: Compressed tables use zlib 1.2.3
200825 13:26:16 InnoDB: Initializing buffer pool, size = 128.0M
200825 13:26:16 InnoDB: Completed initialization of buffer pool
200825 13:26:16 InnoDB: highest supported file format is Barracuda.
200825 13:26:16  InnoDB: Waiting for the background threads to start
200825 13:26:17 Percona XtraDB (http://www.percona.com) 5.5.55-MariaDB-38.8 started; log sequence number 214412668
200825 13:26:17 [Note] Plugin 'FEEDBACK' is disabled.
200825 13:26:18 [Warning] 'user' entry 'root@myhost' ignored in --skip name-resolve mode.
200825 13:26:18 [Warning] 'user' entry '@myhost' ignored in --skip-name-resolve mode.
200825 13:26:18 [Warning] 'proxies_priv' entry '@ root@myhost' ignored in --skip-name-resolve mode.
200825 13:26:18 [Note] Event Scheduler: Loaded 0 events
200825 13:26:18 [Note] /usr/local/mysql/bin/mysqld: ready for connections.
Version: '5.5.57-MariaDB'  socket: '/tmp/mysql.sock'  port: 0  MariaDB Server
```