TraccarのデータをH2からMySQLに移行
この記事はZennにも投稿しています#概要
Traccarを5.9にアプデしたら起動しなくなった。どうやら今までの内部データベース形式はサポートされなくなったみたいです。
これを機にMySQLに移行しようという記事です。
#MySQLの導入
traccarのサーバーはdocker-compose.ymlで管理しているのでそこにmysqlを追加します。データ移行のために一時的にportsを設定します。
db:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: mysql
MYSQL_DATABASE: db
MYSQL_USER: user
MYSQL_PASSWORD: password
ports:
- "3306:3306"
volumes:
- ./db/data:/var/lib/mysql
- ./db/logs:/var/log/mysql次にtraccar.xmlのデータベース設定を書き換えます。
参考:
<entry key='database.driver'>com.mysql.cj.jdbc.Driver</entry>
<entry key='database.url'>jdbc:mysql://db/db?zeroDateTimeBehavior=round&serverTimezone=UTC&allowPublicKeyRetrieval=true&useSSL=false&allowMultiQueries=true&autoReconnect=true&useUnicode=yes&characterEncoding=UTF-8&sessionVariables=sql_mode=''</entry>
<entry key='database.user'>user</entry>
<entry key='database.password'>password</entry>
ここで一度Traccarを起動し、MySQLにテーブルが作成されていることを確認するようにしてください。 確認後はデータの移行を行うため、Traccarのコンテナは停止しておきます。
#データの移行
次に実際にデータを移行します。このメモを書く際に色々試してみましたが、DBeaverを使うと一番簡単だったのでこれを使うことにしました。他のソフトウエアでも一応できるみたいではあるようです。 参考:
#手順
#1. H2データベースとMySQLに接続
DBeaverを開き、データベースに接続します。H2データベースはdockerであればボリューム内のどこかにdatabase.mv.dbというファイルがあるはず。多分バックアップしておいたほうがいいです。接続する際のユーザーネームは今までのtraccar.xmlに書いてあるはずです。
同様に新しいMySQLデータベースにも接続します。
#2. データのエクスポート
DBeaverでは他データベースにエクスポートするという機能があり、今回はこれを使うことで簡単にデータを移行できました。
まず、H2データベースのテーブルからDATABASECHANGELOGとDATABASECHANGELOGLOCKを除いた全てのテーブルを選択して右クリックしてデータのエクスポートを選択。
その後出てくるウィザードに従い進めます。
Export targetでは「データベース」を選択し次へ
次の画面でChoose...よりMySQLのデータベースを選択する。すると自動で既存のデータベースにinsertするように設定してくれます。
そのまま次へと進み、正しくマッピングされているか確認をしてから「続行」でデータベースが移行されます。
#3. 確認
Traccarが正常に起動し、データが失われていないことを確認したら完了。
#あとがき
一応自分はこの方法でデータを移行できましたがこれから使っていくうちに何かエラーなどが出始める可能性もあるしもっと大きいデータベースからの移行だと失敗するかもしれないです。
H2データベースは今回のように急に壊れる可能性があるのでH2データベースでtraccarを運用している人はデータが小さいうちに移行しておいたほうがいいかも。