Scribble at 2020-12-10 01:50:07 Last modified: unmodified
Adminer (formerly phpMinAdmin) is a full-featured database management tool written in PHP. Conversely to phpMyAdmin, it consist of a single file ready to deploy to the target server. Adminer is available for MySQL, MariaDB, PostgreSQL, SQLite, MS SQL, Oracle, Firebird, SimpleDB, Elasticsearch and MongoDB.
データベースを手軽に管理・運用できるツールとして Adminer が知られている。これは、adminer.php という1個の PHP ファイルだけで動くため、サーバに入れて扱うのも簡単だし、見栄えをカスタマイズするなら同じ階層に adminer.css を置くだけでいい。幾つかバリエーションはあるが、最もよく使われている MySQL 専用で英語表示だけのプログラムだと、わずか 200 kB である。MySQL の管理ツールとして知られている phpMyAdmin なら、多言語版という条件ではあるものの、40 MB を超える分量になる。しかも、挙動が安定しているとは限らないし、有名なだけあって頻繁に攻撃の対象となって、実際に脆弱性を突かれた事故が起きることもある。
そういうわけで、僕は10年以上前から好んで Adminer を使っている。そもそも、この手のツールはサーバに常備するようなものではない。必要な時だけアクセスできるようにしておけばいいのであって、脆弱性を突かれるかどうかに関わらず、サーバに置いたままにしておくようなツールではないのだ。したがって、ファイル1個をアップロードすればいいだけの Adminer は、安全性という意味でも運用が楽でいい。何かデータ・ベースに対してアクセスするたびに phpMyAdmin をインストールするような手間だと、往々にしてサーバへ放置してしまうことになるからだ(しかも、放置されている phpMyAdmin に限って古いままだったりする)。
ただ、Adminer にも問題はあって、以前も書いたがエクスポートの挙動がおかしいときがある。"save" を選んでもダウンロードされずにブラウザ上でデータが表示されてしまうことがあるし、昔から困っているのはユーザの権限を変更しようとすると必ずエラーになって拒否されることだ。これはローカル・マシンで試しに root でやってすらエラーになるので、何か根本的にユーザ管理の挙動に問題があるのだと思う。ただ、こういう現象があると昔から知っているので、僕は Adminer でユーザの作成や権限の設定・変更はしない。使わないと決めて特定の機能を無視すれば、あとは普通に使える。
しかし、さきほど更におかしな挙動を見つけた。テーブルについて SELECT した結果が、クリックするたびに変わってしまうのである。上記のとおり、3回の表示ですべて違うレコード数が表示される。ただし、ダンプしたデータとエクスポートしたデータの総数は一致しているため、実際に格納されているデータが増えたり減ったりするわけではない(MySQL 側でそんなことが起きていたら大問題だし、Adminer でデータを勝手に足したり減らしたりしていたら、これも大問題だ)。よって、あくまでもフロント・エンド上での表示が変わるということなのだが、調べてみると Adminer の問題というわけではなく、InnoDB というエンジンではテーブルのデータ数を常にトラッキングしているわけではないという。しかし、いくらデータを数えるのに負荷がかかるからといって、データの総数を割り出す結果が変わるなどというおかしな挙動を平気で放置するプログラマがいるのだろうか。もちろん、これにはトランザクションごとに利用できるリソースの範囲で扱っているカラム数を返すという、それなりの理由があるようだ(https://dev.mysql.com/doc/refman/8.0/en/innodb-restrictions-limitations.html)。