Nextcloudのデータベースをsqlite3からmysqlに変換する方法

mysql

約 7 分で読めます。



どうやら妻がnextcloudを使いたいらしい。

香港妻
香港妻

OneDriveのデータサイズが100GBを超えそうなの!

もう追加でお金払いたくない!

あんたが使っているストロベリーパイでなんとかしてよ!



ストロベリーパイじゃなくてRaspberry Piですが、まあそこは置いておいて。

nextcloudをsqlite3で運用していましたが、妻も使うということで、mysqlへ移行しました。

作業手順

occコマンドを実行して一発変換。
 こちらの記事を参考にさせていただきました。ありがとうございます。
自分はデータベース名/ユーザー名ともにnextcloudとしているので、これで。

sudo -u www-data php occ db:convert-type mysql nextcloud db nextcloud



さっそくコンテナの中に入って↑をやってみたら

could not find driver

とか出ましたので、mysqlのデータベースドライバーを追加。

docker-php-ext-install pdo_mysql
docker-php-ext-enable pdo_mysql



occコマンドを実行するとデータベースのユーザーに対応するパスワードを指定するのですが、
パスワードとして指定できる文字に制限があるようです。

自分は ? が入った文字を使ったらどんなにがんばっても入力できませんでした。
? を取り除いた文字列にしたらあっさり通過しました。

そしたら次はこんなエラーが出ました。
\x9F\x91\x8Dが日付フォーマットとして不適切とのこと。

sudo -u www-data php occ db:convert-type mysql nextcloud db nextcloud
The process control (PCNTL) extensions are required in case you want to interrupt long running commands - see https://www.php.net/manual/en/book.pcntl.php
The current PHP memory limit is below the recommended value of 512MB.
Nextcloud is in maintenance mode - no apps have been loaded

 105/154 [===================>--------]  68%
In ExceptionConverter.php line 114:

  An exception occurred while executing a query: SQLSTATE[22007]: Invalid datetime format: 1366 Incorrect string value: '\xF
  0\x9F\x91\x8D' for column `nextcloud`.`oc_comments`.`message` at row 1

db:convert-type [--port PORT] [--password PASSWORD] [--clear-schema] [--all-apps] [--chunk-size CHUNK-SIZE] [--] <type> <username> <hostname> <database>



\x9F\x91\x8Dは絵文字の 👍 のようで、emojiを正常に認識できていないようでした。

↓にある対策を実施したらエラーが解消しました。
 参考



実行したコマンドはこれです。
 パスワードは置き換えてあります。

# nextcloudコンテナ側
sudo -u www-data php occ config:system:set mysql.utf8mb4 --type boolean --value="true"

# mysqlコンテナ側
mysql -u root -p
(Enter password)
> ALTER DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
> exit;

sudo -u www-data php occ maintenance:repair
sudo -u www-data php occ db:convert-type mysql nextcloud db nextcloud --clear-schema --password='YOUR_PASSWORD'



ここで前記変換のocc db:convert-typeコマンドをやったら、
3時間以上かかりましたが、エラーなく変換完了。

config/config.phpも置き換わっています。

<?php
$CONFIG = array (
  (略)
  'dbtype' => 'mysql',
   'mysql.utf8mb4' => true,
  'dbname' => 'nextcloud',
  'dbhost' => 'db',
  'dbuser' => 'nextcloud',
  'dbpassword' => 'YOUR_PASSWORD',
);



↑の状態ですとTCP3306でmysqlにアクセスするので、Unix Domain Socketへは手で修正。
 ‘dbhost’ => ‘localhost:/var/run/mysqld/mysqld.sock’, などとする。

動作確認

トップページを見た時点で、
 データベースを設定しろ
みたいな指示が出ないので、問題なさそうです。



管理画面でもmysqlとなっています!

終わりに

いかがでしたか。

予想外に躓くところが多かったので記事にしました!

Comments

タイトルとURLをコピーしました