有馬総一郎のブログ

(彼氏の事情)

2022年12月04日 14:26:57 JST - 4 minute read - Linux

NextcloudサーバーのDBをMySQLからPostgreSQLに移行する

これまで NextcloudサーバーのDBは MySQLにしていたのだけど、 Joplin Serverでは、 PostgresSQLと連携するようにしたので、こちらもPostgreSQL1に乗り換えることにした。バージョンはOSは Ubuntu 20.04.5 LTS。Nextcloudは 24.0.6.1

参考サイト

参考にしたサイトは以下の二つである。

PDOをインストール

とりあえず、既にPostgreSQLはインストール済みなのでsudo apt install postgresql postgresql-contribは不要。

次に、 Installation on Linux — Nextcloud latest Administration Manual latest documentationを見てのとおり、 PHP: PostgreSQL (PDO) - Manualが必要となるので、それをインストールする。

php -vでphpのバージョンを確認する。

$ php -v
PHP 8.0.26 (cli) (built: Dec  3 2022 19:20:51) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.26, Copyright (c) Zend Technologies
    with Zend OPcache v8.0.26, Copyright (c), by Zend Technologies

sudo apt search 'php.*pgsql'で検索するも…

php7.0-pgsql/now 7.0.33-29+ubuntu16.04.1+deb.sury.org+1 amd64 [設定が残存]
  (none)

php7.3-pgsql/now 7.3.18-1+ubuntu16.04.1+deb.sury.org+1 amd64 [設定が残存]
  (none)

php7.4-pgsql/focal-updates,focal-security 7.4.3-4ubuntu2.15 amd64 [設定が残存]
  PostgreSQL module for PHP

とphp8.0のPDOがリポジトリに見当たらない。ともあれ、不要なPDOと設定が残存してたので、sudo apt --purge remove php7.*-pgsqlで削除した。

sudo add-apt-repository ppa:ondrej/phpでphpパッケージリポジトリを追加しようとすると。

 Co-installable PHP versions: PHP 5.6, PHP 7.x and most requested extensions are included. Only Supported Versions of PHP (http://php.net/supported-versions.php) for Supported Ubuntu Releases (https://wiki.ubuntu.com/Releases) are provided. Don't ask for end-of-life PHP versions or Ubuntu release, they won't be provided.

Debian oldstable and stable packages are provided as well: https://deb.sury.org/#debian-dpa

You can get more information about the packages at https://deb.sury.org

IMPORTANT: The <foo>-backports is now required on older Ubuntu releases.

BUGS&FEATURES: This PPA now has a issue tracker:
https://deb.sury.org/#bug-reporting

CAVEATS:
1. If you are using php-gearman, you need to add ppa:ondrej/pkg-gearman
2. If you are using apache2, you are advised to add ppa:ondrej/apache2
3. If you are using nginx, you are advised to add ppa:ondrej/nginx-mainline
???or ppa:ondrej/nginx

PLEASE READ: If you like my work and want to give me a little motivation, please consider donating regularly: https://donate.sury.org/
  1. php-gearman を使っている場合は ppa:ondrej/pkg-gearman を追加する必要があります。
    1. apache2 を使用している場合、ppa:ondrej/apache2 を追加することをお勧めします。
  2. nginx を使用している場合は、ppa:ondrej/nginx-mainline を追加することをお勧めします。 または ppa:ondrej/nginx を追加してください。

と表示されたのでppa:ondrej/nginx-mainlineだけ追加しても、php8.0-pgsqlが追加されなかったので結局ppa:ondrej/phpを追加した。

php8.0-pgsql/focal 1:8.0.26-1+ubuntu20.04.1+deb.sury.org+1 amd64
  PostgreSQL module for PHP

php8.1-pgsql/focal 8.1.13-1+ubuntu20.04.1+deb.sury.org+1 amd64
  PostgreSQL module for PHP

php8.2-pgsql/focal 8.2.0~rc7-1+ubuntu20.04.1+deb.sury.org+1 amd64
  PostgreSQL module for PHP

追加後、無事にphp8.0以上のPDOがリポジトリに追加されたのでsudo apt install php8.0-pgsqlでインストール。

データベース、ユーザ作成

sudo -u postgres psqlpostgresに接続。

CREATE USER nextcloud WITH PASSWORD 'xxxxxxxxxxxxxxxxxxxx';
CREATE DATABASE nextclouddb TEMPLATE template0 ENCODING 'UNICODE';
ALTER DATABASE nextclouddb OWNER TO nextcloud;
GRANT ALL PRIVILEGES ON DATABASE nextclouddb TO nextcloud;

データベース一覧表示は\l。ユーザ一覧表示は\du。終了は\q

ちなみに公式ドキュメントの方は↓のように書いてある。ただ、自分は↑のように参考サイトの手順で行った。

CREATE USER username CREATEDB;
CREATE DATABASE nextcloud OWNER username TEMPLATE template0 ENCODING 'UTF8';
GRANT CREATE ON SCHEMA public TO username;

移行実行

移行専用のツール2が用意されているので、それを使う。sudo -u www-data php /var/www/nextcloud/occ db:convert-type --all-apps --password "xxxxxxxxxxxxxxxxxxxx" pgsql nextcloud 127.0.0.1 nextclouddb。途中でContinue with the conversion (y/n)?と変換を続行するか聞いてくるが、私はyイエスと答えた。

$ sudo -u www-data php /var/www/nextcloud/occ db:convert-type --all-apps --password "xxxxxxxxxxxxxxxxxxxx" pgsql nextcloud 127.0.0.1 nextclouddb
[sudo] arimasou16 のパスワード:
Creating schema in new database
 - cloud_federation_api
 - nextcloud_announcements
 - files_sharing
 - quota_warning
 - viewer
 - oauth2
 - photos
 - keeweb
 ・・・中略・・・
 - files_videoplayer
 - files_rightclick
 - federation
The following tables will not be converted:
oc_calendar_appt_bookings
oc_calendar_appt_configs
oc_health_ces_contexts
 ・・・中略・・・
oc_mail_coll_addresses
oc_mail_mailboxes
oc_mail_messages
oc_mail_recipients
oc_tsp_polls
oc_tsp_votes
Continue with the conversion (y/n)? [n] y
 - oc_migrations
Skipping migrations table because it was already filled by running the migrations
 - oc_reactions
    0 [>---------------------------] < 1 sec
 - oc_appconfig
 247/247 [============================] 100% < 1 sec/< 1 sec
 ・・・中略・・・
 - oc_text_steps
    0 [>---------------------------] < 1 sec
 - oc_twofactor_backupcodes
 10/10 [============================] 100% < 1 sec/< 1 sec
 - oc_trusted_servers
    0 [>---------------------------] < 1 sec
$

あまり意味が分かってないが、参考にしたサイトでは実行していたので、修復コマンド3を打つ。sudo -u www-data php /var/www/nextcloud/occ maintenance:repair

$ sudo -u www-data php /var/www/nextcloud/occ maintenance:repair
[sudo] arimasou16 のパスワード:
 - Repair MySQL collation
     - Not a mysql database -> nothing to do
 - Repair mime types
 ・・・中略・・・
 - Populating added da

殆ど0と出てたので、意味があったの不明。

確認やらMySQL停止

設定ファイルは手動で編集しなおすのかな?と思ったら、修正されていた。

/var/www/nextcloud/config/config.php

  'dbtype' => 'pgsql',
  'version' => '24.0.6.1',
  'overwrite.cli.url' => 'https://example.com/nextcloud',
  'dbname' => 'nextclouddb',
  'dbhost' => '127.0.0.1',
  'dbport' => '',
  'dbtableprefix' => 'oc_',
  'mysql.utf8mb4' => true,
  'dbuser' => 'nextcloud',
  'dbpassword' => 'xxxxxxxxxxxxxxxxxxx',

問題なく移行できて、動作に問題なければ、mysqlmysql -u root -pで、接続してnextcloud用のデータベースを削除しておく。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| nextcloud          |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.02 sec)

mysql> DROP DATABASE nextcloud;
Query OK, 127 rows affected (3.87 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.01 sec)

mysql>

そして、MySQLパケージ削除しても良いのだけど、一応止めて数日様子を見る。

$ sudo systemctl stop mysql.service
$ sudo systemctl disable mysql.service

思ったより簡単だった。