ChatGPTと一緒にConoHa WINGの古いNextcloudを安全にアップデート【第2回】

MySQL 5.7からMySQL 8.4へ ― データベース移行を慎重に実施

はじめに

前回は、ConoHa WING上で約3年間運用してきたNextcloudをアップデートするにあたり、まず現状確認とバックアップを行ったことを紹介しました。

今回の第2回では、Nextcloud本体のメジャーバージョンアップに進む前に行った、MySQLデータベースの移行について記録します。

作業開始時の環境では、Nextcloudは26系、データベースはMySQL 5.7系でした。

Nextcloudのアップデートを進めようとしたところ、古いMySQLがサポート対象外であることが分かりました。

そこで、

NextcloudのアップデートとMySQLの移行を同時に行わない

ことにしました。

まずデータベースだけをMySQL 8系へ移行し、

Nextcloud 26が新しいMySQLで正常に動作することを確認してから、Nextcloud 27へのアップデートへ進む

という方針です。

今回も第1回と同じく、

ChatGPTに相談 → 私自身が実行 → 結果をChatGPTに伝える → 一緒に確認 → 次へ進む

という方法で、一つずつ作業しました。


移行前の環境を確認

作業時点では、おおむね次の環境でした。

  • Nextcloud:26.0.13
  • PHP CLI:8.2.31
  • データベース:MySQL 5.7.44-log
  • 旧DBサーバー:ConoHa WING上のMySQL 5.7環境
  • 移行先:MySQL 8.4系

まず、いきなりデータベース移行を始めるのではなく、現在の状態を確認しました。

PHPの確認:

php -v

Nextcloudの状態確認:

php occ status

Nextcloudが現在接続しているDBサーバーも確認しました。

php occ config:system:get dbhost

さらにMySQLへ直接接続し、実際のバージョンを確認しました。

mysql -h [旧DBサーバー] -u [DBユーザー] -p -e "SELECT VERSION();"

ここでMySQL 5.7.44-logが動作していることを確認しました。


まずデータベースをバックアップ

移行前に最も重要なのは、やはりバックアップです。

mysqldumpを利用して、Nextcloudデータベース全体を保存しました。

実際のDBサーバー名、データベース名、ユーザー名などは公開用に伏せています。

mysqldump \ -h [旧DBサーバー] \ -u [DBユーザー] \ -p \ --single-transaction \ --quick \ --skip-lock-tables \ --no-tablespaces \ [NextcloudのDB名] \ | gzip > ~/nextcloud-db-before-migration.sql.gz

ここで使用した、

--no-tablespaces

には理由があります。

ConoHa WINGのような共有サーバー環境では、MySQLの権限が専用サーバーとは異なります。

当初、mysqldump実行時にPROCESS権限に関係するエラーが発生しました。

ChatGPTにエラー内容を伝えて確認した結果、今回のバックアップでは--no-tablespacesを付けることで対応できました。

これは今回のような共有サーバー環境ならではのポイントだったと思います。


バックアップが本当に正常か確認

バックアップファイルを作っただけでは、まだ次へ進みません。

まずgzipファイルが正常か確認しました。

gzip -t ~/nextcloud-db-before-migration.sql.gz

問題なく終了することを確認します。

今回作成した圧縮後のデータベースバックアップは約6.9MBでした。

さらにdumpファイルの最後まで正常に作成されていることも確認しました。

そしてデータベースだけでなく、

  • config.php
  • Nextcloud関連データ
  • データベースdump

について、別の保存先にもバックアップを確保しました。

「バックアップがある」だけではなく、「必要になったら戻せる状態になっている」

ことを確認してから次へ進みました。


Nextcloudをメンテナンスモードへ

バックアップが確認できたところで、Nextcloudをメンテナンスモードにしました。

php occ maintenance:mode --on

データベース移行中に、ブラウザやアプリからNextcloudへ書き込みが発生するのを避けるためです。

ここから先は、Nextcloudを通常利用しない状態で作業を進めました。


ConoHa WINGでMySQL 8.4へ移行

次にConoHa WINGの管理画面からデータベース移行を実施しました。

移行前:

MySQL 5.7.44-log

移行後:

MySQL 8.4.4

となりました。

今回の環境では、データベース名、DBユーザー名、パスワードはそのままで、DBサーバーのホスト名が変更されました。

そのため、Nextcloud側のconfig.phpに設定されているDB接続先を新しいMySQLサーバーへ変更する必要があります。


NextcloudのDB接続先を変更

Nextcloudのoccを使って、DBホストを新しいMySQL 8.4側へ変更しました。

公開記事のため実際のホスト名は伏せています。

php occ config:system:set dbhost --value="[新DBサーバー]"

変更後、本当に新しい値になったか確認します。

php occ config:system:get dbhost

さらに、新しいDBサーバーへMySQLコマンドで直接接続しました。

mysql -h [新DBサーバー] -u [DBユーザー] -p -e "SELECT VERSION();"

ここで、

8.4.4

と表示され、新しいMySQLへ接続できていることを確認しました。


ここで問題発生 ― UPDATE権限エラー

データベースの移行自体はできました。

しかし、その後の確認中に、気になるエラーが出ました。

Nextcloudのoc_authtokenテーブルに対するUPDATE permission deniedです。

ここで、

「Nextcloudは一応開くから大丈夫だろう」

とは判断しませんでした。

今回決めていたルールどおり、そこで止まりました。

エラー内容をChatGPTに伝え、まずMySQLユーザーにどの権限が付与されているか確認することにしました。

SHOW GRANTS FOR CURRENT_USER();

権限を確認した後、実際にUPDATE操作が可能なのか、データを変更しないテストを行いました。

START TRANSACTION; UPDATE oc_authtoken SET id=id WHERE 1=0; ROLLBACK;

WHERE 1=0としているため、実際の行は更新されません。

つまり、

UPDATE権限が機能するかだけを安全に確認するテスト

です。

最終的に必要な権限が確認でき、この0行UPDATEテストも正常に通ることを確認できました。


ブラウザからも実際の操作を確認

コマンドが正常だからといって、すぐに移行完了とはしませんでした。

今度は実際のNextcloudの操作を確認しました。

ブラウザから、

  • ファイルのアップロード
  • ファイル名の変更
  • ファイルの削除

などを試しました。

これらが正常に動作し、データベース関連の新しいSQLSTATEエラーや権限エラーが発生しないことを確認しました。

ここまで確認して、ようやく、

「MySQL 8.4への移行は正常に完了した」

と判断しました。


移行後にも、もう一度バックアップ

ここも今回重要だと感じたポイントです。

移行前にバックアップしたから終わりではありません。

MySQL 8.4で正常に動作している状態ができたので、今度はこの正常な状態を新しい復旧ポイントとして保存しました。

新しいMySQL 8.4側から再びデータベースをdumpし、更新されたconfig.phpもバックアップしました。

さらにNextcloud本体やデータについても、別のストレージへバックアップしました。

これで、

MySQL 5.7時代のバックアップ

と、

MySQL 8.4への移行が正常に完了した後のバックアップ

の両方を確保できました。


なぜNextcloudのアップデートと同時にやらなかったのか

今回、ChatGPTと相談しながら特に意識したのが、

一度に複数の大きな変更をしない

ということでした。

仮に、

MySQL 5.7 → 8.4

と同時に、

Nextcloud 26 → 27

まで実施して、その後エラーが出たとします。

すると、

「MySQLが原因なのか?」

「Nextcloud 27が原因なのか?」

「アプリの互換性なのか?」

「PHPなのか?」

と、原因の切り分けが難しくなります。

そこで、

① MySQLだけ変更する

② Nextcloud 26のまま正常動作を確認する

③ 新しい正常状態をバックアップする

④ その後Nextcloud 27へ進む

という順番にしました。

時間はかかりますが、問題が発生したときの原因を特定しやすくなります。


ChatGPTと作業して便利だったこと

今回のMySQL移行では、第1回以上にChatGPTとのやり取りが役に立ちました。

特に、

  • mysqldumpの権限エラー
  • 共有サーバー環境でのオプション
  • MySQL移行後の権限確認
  • UPDATE操作の安全なテスト方法
  • どの段階で「移行成功」と判断するか

などは、自分だけで作業していたら、かなり調べる時間が必要だったと思います。

一方で、ChatGPTからコマンドを教えてもらっても、私はできるだけ一つずつ実行しました。

そして結果をChatGPTへ返し、

「この結果なら次へ進んで大丈夫ですか?」

と確認しました。

今回改めて感じたのは、AIを使うメリットは、単に答えを早く得られることだけではないということです。

作業中に発生した状況を伝え、その時点から次の判断を一緒に考えられる。

これは、今回のようなサーバーメンテナンスでは非常に便利でした。


第2回のまとめ

今回のMySQL移行では、

MySQL 5.7.44-log

から、

MySQL 8.4.4

へ移行することができました。

しかし、今回一番重要だったのは「8.4になった」という結果そのものではなかったと思います。

移行前に確認する。

バックアップする。

バックアップ自体を検証する。

メンテナンスモードにする。

データベースだけを移行する。

新DBへ接続できていることを確認する。

権限を確認する。

実際のNextcloud操作を試す。

正常な状態を、もう一度バックアップする。

そして、

分からない結果が出たら、そこで止まってChatGPTに相談する。

この積み重ねによって、次のNextcloud本体のアップデートへ進める状態になりました。


次回予告

【第3回】いよいよNextcloud 26から27へ

MySQL 8.4への移行が完了し、Nextcloud 26が新しいデータベース上で正常に動作することを確認できました。

次はいよいよNextcloud本体のメジャーバージョンアップです。

Nextcloud 26系の最終バージョンからNextcloud 27へ。

ここでも一気に進めるのではなく、

バックアップ → アップデート → occによる確認 → データベースの確認 → Web画面での動作確認

という手順を繰り返しました。

次回は、実際にNextcloud 27.1.11へアップデートした手順と、その際に行った確認について紹介します。


免責事項

この記事は、Namiki Associatesで実際に使用しているConoHa WINGおよびNextcloud環境で行った作業をもとにした記録です。

Nextcloud、PHP、MySQL、ConoHa WINGなどの仕様や対応バージョンは変更される可能性があります。また、サーバー環境によって必要な手順や使用できるコマンド、権限などは異なります。

同様の作業を行う場合は、Nextcloud、MySQL、ConoHa WINGなどの最新の公式情報を確認し、データベース、設定ファイル、データディレクトリなどのバックアップを取得したうえで、ご自身の環境に合わせて慎重に作業してください。

また、ChatGPTを含むAIの回答が常に正しいことを保証するものではありません。重要なサーバー操作では、AIの回答をそのまま無条件に実行するのではなく、バックアップを取得し、一つずつ実行結果を確認しながら作業することをおすすめします。

\ 最新情報をチェック /

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA