これまで NextcloudサーバーのDBは MySQLにしていたのだけど、 Joplin Serverでは、 PostgresSQLと連携するようにしたので、こちらもPostgreSQL1に乗り換えることにした。バージョンはOSは Ubuntu 20.04.5 LTS。Nextcloudは 24.0.6.1。
参考サイト
参考にしたサイトは以下の二つである。
- We migrated our Nextcloud server to PostgreSQL! – Tech and Me
- How to migrate Nextcloud 17 Database Backend from MySQL to postgreSQL – Markus’ Blog
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/
- php-gearman を使っている場合は ppa:ondrej/pkg-gearman を追加する必要があります。
- apache2 を使用している場合、ppa:ondrej/apache2 を追加することをお勧めします。
- 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 psql
でpostgres
に接続。
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',
問題なく移行できて、動作に問題なければ、mysql
にmysql -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
思ったより簡単だった。