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