NextcloudバージョンアップでDBメンテ

Nextcloud のバージョンアップ(20.0.5 => 20.0.8)時に、テーブル定義の変更を求められました。

その対応の記録です。

目次

概要

我が家では、NextCloudPi で構築した Nextcloud 環境が常時稼働中です。

NextCloudPi は予想以上に便利 – あららぼ

NextCloudPi を使う前は素の Nextcloud を使っていたので、Nextcloud 自体は通算で 2年ほど稼働しています。
加えて、直近 1年間は24時間稼働しており、生活に浸透してきています。

今回バージョンアップしようと管理画面を開いてみると「セキュリティ&セットアップ警告」画面に セットアップに関して警告がいくつかあります。 と表示されていました。

どうもバージョンアップに伴う変更点のようですが、実行時のパフォーマンスなどへの影響を懸念して、手動実行に委ねられている模様。

環境

我が家の Nextcloud 環境です。

  • Raspberry Pi 3 Model B
    Raspberry Pi OS
$ cat /etc/issue
Raspbian GNU/Linux 10 \n \l

$ cat /proc/version 
Linux version 5.10.11-v7+ (dom@buildbot) (arm-linux-gnueabihf-gcc-8 (Ubuntu/Linaro 8.4.0-3ubuntu1) 8.4.0, GNU ld (GNU Binutils for Ubuntu) 2.34) #1399 SMP Thu Jan 28 12:06:05 GMT 2021

警告内容

下記 3種類の対応が必要になりました。

  • インデックスなし
  • 主キーなし
  • カラムのデータ型変更

インデックスなし

データベースにいくつかのインデックスがありません。 大きなテーブルにインデックスを追加すると、自動的に追加されないまでに時間がかかる可能性があるためです。 "occ db:add-missing-indices"を実行することによって、インスタンスが実行し続けている間にそれらの欠けているインデックスを手動で追加することができます。 インデックスが追加されると、それらのテーブルへのクエリは通常はるかに速くなります。

  • テーブル "oc_cards"のインデックス "cards_abiduri"が見つかりません。
  • 原因
    Nextcloud をバージョンアップした際に、パフォーマンス維持に必要となるインデックスが足りない。
  • 対応
    管理用 CLI(コマンドラインインターフェース)occ を使い、コマンド occ db:add-missing-indices を実行して、インデックスを追加する。

主キーなし

The database is missing some primary keys. Due to the fact that adding primary keys on big tables could take some time they were not added automatically. By running "occ db:add-missing-primary-keys" those missing primary keys could be added manually while the instance keeps running.

  • Missing primary key on table "oc_federated_reshares".
  • Missing primary key on table "oc_systemtag_object_mapping".
  • Missing primary key on table "oc_comments_read_markers".
  • Missing primary key on table "oc_collres_resources".
  • Missing primary key on table "oc_collres_accesscache".
  • Missing primary key on table "oc_filecache_extended".
  • 原因
    Nextcloud をバージョンアップした際に、パフォーマンス維持に必要となる主キーが無い。
  • 対応
    管理用 CLI(コマンドラインインターフェース)occ を使い、コマンド occ db:add-missing-primary-keys を実行して、主キーを追加する。

カラムのデータ型変更

データベース内のいくつかの列で、big intへの変換が行われていません。 大きなテーブルでカラムタイプを変更すると時間がかかることがあるため、自動的には変更されませんでした。 'occ db:convert-filecache-bigint'を実行することによって、それらの保留中の変更は手動で適用できます。 この操作は、インスタンスがオフラインの間に行う必要があります。 詳細についてはこれに関するドキュメントページを読んでください。

  • federated_reshares.share_id
  • share_external.id
  • share_external.parent
  • 原因
    数値データ型のカラムで INT だと足りないケースが出てきたようです。
  • 対応
    管理用 CLI(コマンドラインインターフェース)occ を使い、コマンド occ db:convert-filecache-bigint を実行して、必要なカラムについて BITINT へ変換する。

対応内容

パス確認

まず、管理用 CLI(コマンドラインインターフェース)occ を使うために、パスの確認を行います。

occ は Nextcloud インストールディレクトリの直下にあるので、DocumentRoot を探します。

$ whereis apache2
apache2: /usr/sbin/apache2 /usr/lib/apache2 /etc/apache2 /usr/share/apache2 /usr/share/man/man8/apache2.8.gz

$ cat /etc/apache2/sites-enabled/000-default.conf | grep DocumentRoot
  DocumentRoot /var/www/nextcloud

$ sudo ls -lh /var/www/nextcloud/occ
-rw-r--r-- 1 www-data www-data 283  1月 17 11:16 /var/www/nextcloud/occ

私の環境(NextCloud Pi)だと /var/www/nextcloud/occ にありました。

なお、occ は PHP で書かれたスクリプトファイルです。

$ sudo cat /var/www/nextcloud/occ
#!/usr/bin/env php
<?php
/**
 * Copyright (c) 2013 Thomas Müller <thomas.mueller@tmit.eu>
 * This file is licensed under the Affero General Public License version 3 or
 * later.
 * See the COPYING-README file.
 */

//$argv = $_SERVER['argv'];
require_once __DIR__ . '/console.php';

コマンド実行

上述のように、管理用 CLI(コマンドラインインターフェース)occ は PHP スクリプトなので、PHP のパスが通っていることを確認しておきます。
※パスが通ってない場合は、コマンド実行時にパス込みで入力してください。

NextCloud Pi は標準で PHP のパスが通っています。

$ php -v
PHP 7.3.19-1~deb10u1 (cli) (built: Jul  5 2020 06:46:45) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.19, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.3.19-1~deb10u1, Copyright (c) 1999-2018, by Zend Technologies

メンテナンスモード ON

更新作業中の更新防止のため、メンテナンスモードへ移行します。

メンテナンスモードで移行する際は、権限を持つユーザ(下記例だと -u www-data)を指定して実行します。
以降のコマンドは全て -u 付きで実行しています。

$ sudo -u www-data php /var/www/nextcloud/occ maintenance:mode --on
Maintenance mode enabled

ちなみに、権限指定しないと以下のようなエラーになります...。

$ sudo php /var/www/nextcloud/occ maintenance:mode --on
Console has to be executed with the user that owns the file config/config.php
Current user id: 0
Owner id of config.php: 33
Try adding 'sudo -u #33' to the beginning of the command (without the single quotes)
If running with 'docker exec' try adding the option '-u 33' to the docker command (without the single quotes)

対応)インデックスなし

コマンド occ db:add-missing-indices を実行します。

$ sudo -u www-data php /var/www/nextcloud/occ db:add-missing-indices
Nextcloud is in maintenance mode - no apps have been loaded

Check indices of the share table.
Check indices of the filecache table.
Check indices of the twofactor_providers table.
Check indices of the login_flow_v2 table.
Check indices of the whats_new table.
Check indices of the cards table.
Adding cards_abiduri index to the cards table, this can take some time...
cards table updated successfully.
Check indices of the cards_properties table.
Check indices of the calendarobjects_props table.
Check indices of the schedulingobjects table.
Check indices of the oc_properties table.

対応)主キーなし

コマンド occ db:add-missing-primary-keys を実行します。

$ sudo -u www-data php /var/www/nextcloud/occ db:add-missing-primary-keys
Nextcloud is in maintenance mode - no apps have been loaded

Check primary keys.
Adding primary key to the federated_reshares table, this can take some time...
federated_reshares table updated successfully.
Adding primary key to the systemtag_object_mapping table, this can take some time...
systemtag_object_mapping table updated successfully.
Adding primary key to the comments_read_markers table, this can take some time...
comments_read_markers table updated successfully.
Adding primary key to the collres_resources table, this can take some time...
collres_resources table updated successfully.
Adding primary key to the collres_accesscache table, this can take some time...
collres_accesscache table updated successfully.
Adding primary key to the filecache_extended table, this can take some time...
filecache_extended table updated successfully.

対応)カラムのデータ型変更

コマンド occ db:convert-filecache-bigint を実行します。

最後の Continue with the conversion(y/n)?(変換を続行しますか?)には、y を入力します。

$ sudo -u www-data php /var/www/nextcloud/occ db:convert-filecache-bigint
Nextcloud is in maintenance mode - no apps have been loaded

Following columns will be updated:

* federated_reshares.share_id
* files_trash.auto_id
* share_external.id
* share_external.parent

This can take up to hours, depending on the number of files in your instance!
Continue with the conversion (y/n)? [n] y

メンテナンスモード OFF

作業完了後は、メンテナンスモードを解除します。

$ sudo -u www-data php /var/www/nextcloud/occ maintenance:mode --off
Maintenance mode disabled

確認

画面を更新すると、すべてのチェックに合格しました。 と表示され、全てのチェックが通ったことが確認できます。

最後に

チェックが通ったら、通常の手順でバージョンアップ OK です。

具体的なバージョンアップ手順でつまづいたら、ぜひ過去記事をご参照ください。

NextCloudPiのバージョンアップ – あららぼ
Nextcloudのアップデートは段階を踏んでくれる – あららぼ