はじめに
短縮URLサービスの Shlink を Ubuntu VM に直インストールして使い始めたとき、
とりあえず簡単に動かすために ローカルの MariaDB に接続させていました。
ところが、運用していくと気になる点が増えてきます。
- バックアップや監視を自分でやらないといけない
- サーバーを落としたときに DB ごと巻き込まれる
- 他サービスと DB をまとめたい
「だったらマネージドDBに移せば解決じゃん」と思い、試してみたら…
Oracle Cloud の Always Free で MySQL(HeatWave)インスタンスが使えることに気づきました。
つまり 追加コストゼロでマネージド化できる。これなら使わない手はない!ということで、
Shlink の DB をローカル MariaDB から Always Free のマネージド MySQL に移行しました。
移行の流れ
マネージド側で準備
まずは Oracle Cloud(Always Free の MySQL HeatWave インスタンス)で 空のDBとユーザーを作成。
文字コードは UTF8MB4、権限は Shlink が必要とするSELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER, INDEX
を付与。
ローカル MariaDB からデータをダンプ
既存データは mysqldump --single-transaction
でエクスポート。
InnoDB 前提ならこれで停止せずに抜けるのが便利。
mysqldump --single-transaction -u shlink -p shlink \
| gzip > /tmp/shlink_$(date +%F).sql.gz
マネージド MySQL へリストア
gzip パイプでマネージド側に流し込み。
gunzip -c /tmp/shlink_2025-08-24.sql.gz \
| mysql -h <managed-host> -P 3306 -u shlink -p shlink
DEFINER
が原因でエラーになる場合は sed
で削除して再実行。
Shlink の接続先を切り替え
今回は config/params/generated_config.php
を編集して、新しいDBホストを指定。
その後 php vendor/bin/shlink-installer init
を実行。
出力例:
Initializing database if needed... Success!
Updating database... Success!
Generating proxies... Success!
→ テーブル作成&マイグレーション完了。
APIキーを再発行
DBを新規にしたので旧キーは存在せず。api-key:generate
で新しいキーを作り、Web Client の servers.json
に登録。
動作確認
curl -H "X-Api-Key: <KEY>" https://ドメイン/rest/v3/health
を叩くと{"status":"pass"}
が返ってくる。
Web UI からも短縮URLの作成・統計ができることを確認。
ローカル MariaDB の完全削除
不要になったのでサービスを停止し、自動起動を無効化して削除。
sudo systemctl stop mariadb
sudo systemctl disable mariadb
sudo apt purge mariadb-server mariadb-client mariadb-common
sudo apt autoremove --purge
sudo rm -rf /etc/mysql /var/lib/mysql
dpkg -l | grep mariadb
で何も出なければ完全に消えた状態。
サーバーのリソースも軽くなった。
移行してみての感想
「とりあえず動かす」ならローカルDBで十分ですが、
- バックアップ
- 冗長化
- モニタリング
を考えると、本番運用はやはりマネージドDBが安心。
しかも Oracle Cloud の Always Free を使えば 追加コストなしでクラウド側に任せられる。
結果として、ゼロ円で“管理いらず”の本番運用DBを手に入れられました。
まとめ
- Shlink の DB をローカル MariaDB から Always Free のマネージドMySQL へ移行
- dump → restore →
generated_config.php
更新 →shlink-installer init
の流れで簡単に切替可能 - APIキーは新規発行が必要
- ローカル MariaDB は stop/disable/purge で完全削除
- 運用コストも金銭的コストもゼロに近い状態で、より安心して使えるようになった
コメント