サイトDBデータ移行

2023/12 の作業


旧サーバのDBデータを新サーバへ移行する。


(旧サーバ)旧サーバのデータ吸い上げ

$ sudo -i -u posgres
$ pg_dump --verbose -Fc -f olddb.dump olddb


サイト作成

$ sudo -i -u workusr
$ source workusr_venv/bin/activate
$ coderedcms start worksite --sitename "WorkSite"
Creating a Wagtail CRX project called worksite for WorkSite
Success! worksite has been created

Next steps:
    1. cd worksite/
    2. python manage.py migrate
    3. python manage.py createsuperuser
    4. python manage.py runserver
    5. Go to http://localhost:8000/admin/ and start editing!


新DBにリストア

旧サーバから吸い上げたデータを、Postgresql15 インストールとDB作成 で作成したDBにリストア。

$ sudo -i -u postgres
$ pg_restore --verbose -d workdb -Fc old.dump


無理やりパッチ

・ migration しようとしたら、website の依存関係が変わっていてうまくいかなかった。ので、website の migration はやり直す。

・ 今回は、website_xxx テーブルのうち、website_webpage のデータだけが残っていたので、migration 後そのデータだけ戻す。

・ website_webpage.coderedpage_ptr_id と coderedcms_coderedpage.page_ptr_id がリンクしていたけど、migration 後 oderedcms_coderedpage の page_ptr_id が変わるので、確認しておく。


まず消す

# 確認
workdb=> select coderedpage_ptr_id from website_webpage ;
 coderedpage_ptr_id
--------------------
                  3
                 39
                 40
(3 rows)

workdb=> select page_ptr_id from coderedcms_coderedpage;
 page_ptr_id
-------------
           3
          39
          40
(3 rows)

# website のマイグレーションを消す
workdb=> delete from django_migrations where app = 'website';

# website のテーブルを消す
workdb=> drop table website_articleindexpage ;
workdb=> drop table website_articlepage ;
workdb=> drop table website_formconfirmemail ;
workdb=> drop table website_formpagefield ;
workdb=> drop table website_formpage ;
workdb=> drop table website_webpage ;


settings.prod.py とか settings のDB接続情報を環境に合わせて書き換え


マイグレーション

$ sudo -i -u workusr
$ source workusr_venv/bin/activate
$ cd worksite/
$ python manage.py migrate --settings worksite.settings.prod


マイグレーション後のデータ確認

workdb=> select * from website_webpage ;
 coderedpage_ptr_id | body
--------------------+------
                 56 | []

workdb=> select page_ptr_id from coderedcms_coderedpage;
 page_ptr_id
-------------
          39
          40
          56
(3 rows)


website_webpage データ戻し

coderedcms_coderedpage.page_ptr_id の 3 が 56 になっているので、website_webpage.coderedpage_ptr_id を 56に編集して入れる。

# website_webpage のデータを消す
workdb=> truncate table website_webpage ;

# website_webpage の SQL を抽出
$ sudo -i -u postgres
$ pg_restore -f website_webpage_patch.sql -t website_webpage old.dump

# website_webpage_patch.sql を編集

# データを入れる
$ psql workdb < website_webpage_patch.sql


DBデータの移行はこれで終わり。

今の状態で動かすと、データの不整合があるっぽくて、ログに大量のエラーが出力される。

それを消す為に次は画面でいじって直す。