背景
Raspberry Pi 4 (8GB) を購入し、MySQL のサーバにしたいと思いました*1。MicroSDの容量は限られているのと、データベースのようなアクセス頻度が高いものをMicroSDに置いた場合のカードの寿命を考え*2、外付けHDDにデータを置きたいと考えました。
結論
シンボリックリンクを使う。
具体的方法
外付けHDDをマウントした場所を /mnt/foobar
であるとします。
1. MySQL を止める
$ sudo service mysql stop
2. 既存のデータディレクトリの内容をマウントしたHDDに移す
パーミッションも一緒に移します。念のため、元データは残したままにしておきましょう。
$ sudo rsync -avuz /var/lib/mysql /mnt/foobar
3. 既存のデータディレクトリの名前を変更する
既存のデータディレクトリの名前を変更します。同じ名前を対象としてシンボリックリンクを作るため、名前の重複を避けるためです。
$ sudo mv /var/lib/mysql /var/lib/BACKUP_mysql
4. シンボリックリンクを張る
既存のデータディレクトリの場所にシンボリックリンクを張ります。リンク先は外付けHDDのMySQLのデータディレクトリです。
$ sudo ln -s /mnt/foobar/mysql /var/lib/mysql
5. MySQLのサーバの設定ファイルを一部編集する
この段階で MySQL サーバを開始するとエラーになります*3。エラーを回避するために設定ファイルを編集します。設定ファイルの場所は次のとおりです。
/etc/mysql/mysql.conf.d/mysqld.cnf
修正(コメントイン)する場所は次のとおりです。
tmpdir = /tmp log_bin = /var/log/mysql/mysql-bin.log
6. MySQL サーバを起動する
MySQL サーバを起動して、エラーが出なければ OK です。
$ sudo service mysql start
補足
こういう標準外のことを行う場合にはパーミッションでハマることが多い*4ので、設定ファイルをいじくり回すなどの派手なことはなるべくせずに解決したいものです。