NextcloudのインストールでDBを作成す際に
CREATE DATABASE IF NOT EXISTS nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
としていました。
運用中、より正確な比較やソートが必要という判断をしたのでDBの照合順序をci(Case Insentive)ではなく、bin(Binary)に変更します。
DBを操作するため、作業前後にメンテナンスモードに入るとともに、ユーザーへの周知は徹底して行ってください。
メンテナンスモードを実行
- Nextcloudのルートディレクトリ移動
cd /var/www/html/nextcloud && pwd
自分の環境に合わせます。(筆者環境/home/www-data/nextcloud
)
- メンテナンスモード有効化
sudo -u www-data php occ maintenance:mode --on
- メンテナンスモード確認
運用中のNextcloudのURLにアクセスし、メンテナンスモードであることを確認します。
mysqldumpでバックアップを取得する
- 作業ディレクトリに移動
cd /hoge && pwd
任意のディレクトリを指定します。
- DBバックアップ作成
mysqldump -h localhost -u nextcloud -p --no-tablespaces --single-transaction nextcloud > nextcloud_backup.$(date +%Y%m%d).sql
DB名やユーザーは自分の環境に合わせます。
- DBバックアップ作成確認
ls -la nextcloud_backup.$(date +%Y%m%d).sql
ファイルがあることを確認します。
DB設定変更
- 管理者権限でMySQLにログインする
mysql -u root -p
- 対象のDBを確認する
SHOW DATABASES;
nextcloudが動いているDBであることを再確認してください。
- データベース全体の照合順序を変更する
ALTER DATABASE nextcloud COLLATE utf8mb4_bin;
- 既存のデーテーブルの照合順序を変更する
USE nextcloud;
SET @DATABASE_NAME = 'nextcloud';
DB名は自分の環境に合わせます。
SET @COLLATE = 'utf8mb4_bin';
SELECT CONCAT('ALTER TABLE ', TABLE_NAME, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE ', @COLLATE, ';')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = @DATABASE_NAME
AND TABLE_TYPE = 'BASE TABLE';
- MySQLから抜ける
EXIT
メンテナンスモードの解除を実行
- Nextcloudのルートディレクトリ移動
cd /var/www/html/nextcloud && pwd
自分の環境に合わせます。(筆者環境/home/www-data/nextcloud
)
- メンテナンスモード無効化
sudo -u www-data php occ maintenance:mode --off
- メンテナンスモード確認
運用中のNextcloudのURLにアクセスし、普通にアクセスできることを確認します。
切り戻し
何か不具合があった場合の切り戻し手順です。上記、メンテナンスモードを有効化してから行ってください。
- バックアップしたDBがあることを再確認する
ls -l /hoge/nextcloud_backup.$(date +%Y%m%d).sql
バックアップを行ったディレクトリを指定します。
head -100 /hoge/nextcloud_backup.$(date +%Y%m%d).sql
ファイルがあること、平文で読めることを確認します。
- 管理者権限でMySQLにログインする
mysql -u root -p
- 対象のDBを確認する
SHOW DATABASES;
nextcloudが動いているDBであることを再確認してください。
- 不具合が発生したDBを削除する
二回ほど深呼吸して、落ち着いて作業しましょう。
DROP DATABASE nextcloud;
- DBを再作成する
CREATE DATABASE IF NOT EXISTS nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
- MySQLから抜ける
EXIT
- DB復元
mysql -h localhost -u nextcloud -p nextcloud < /hoge/nextcloud_backup.$(date +%Y%m%d).sql
この後、メンテナンスモードを解除して、以前と同じ状態か確認します。
作業後:バックアップDBの削除
平文でSQLがサーバ上にあるのは危険な状態なので、以下の措置を執ります。
- 作業ディレクトリに移動
cd /hoge && pwd
バックアップを行ったディレクトリを指定します。
- DBバックアップ確認
ls -la nextcloud_backup.$(date +%Y%m%d).sql
ファイルがあることを確認します。
- バックアップしたDBの削除
rm nextcloud_backup.$(date +%Y%m%d).sql
- DBバックアップ削除確認
ls -la nextcloud_backup.$(date +%Y%m%d).sql
ファイルが無いことを確認します。