# 3.10. ການໂອນຍ້າຍຖານຂໍ້ມູນ (database migrations)

ເຖິງແມ່ນວ່າພວກເຮົາຈະພະຍາຍາມໃຫ້ດີທີ່ສຸດເພື່ອໂອນຍ້າຍເຄືອຂ່າຍຂອງທ່ານໂດຍອັດຕະໂນມັດໃນຂະນະທີ່ມີການຍົກລະດັບຂອງລະບົບຂຶ້ນ, ແຕ່ກໍມີບາງຄັ້ງທີ່ມັນເປັນໄປບໍ່ໄດ້. ໃນສ່ວນນີ້ພວກເຮົາຈະພະຍາຍາມກວມເອົາບາງການໂອນຍ້າຍທີ່ພົບເລື້ອຍທີ່ສຸດທີ່ທ່ານອາດຈະພົບໃນເວລາທີ່ແລ່ນຊອບແວຣ໌ຂອງພວກເຮົາດ້ວຍຕົນເອງຜ່ານ Docker container.

{% hint style="warning" %}
ຢ່າພະຍາຍາມຍົກລະດັບຂອງລະບົບ GeoPrism Registry ຈາກເວີຊັ້ນຫຼັກເກີນກວ່າສອງລະດັບຕໍ່ຄັ້ງ.
{% endhint %}

ຂັ້ນຕອນທົ່ວໄປໃນການປະຕິບັດການໂອນຍ້າຍປະເພດໃດໜຶ່ງສາມາດແບ່ງອອກເປັນດັ່ງນີ້:

1. ສ້າງສະພາບແວດລ້ອມທີ່ຮຽນແບບເຄືອຂ່າຍການຜະລິດຂອງທ່ານ ເພື່ອທີ່ພວກເຮົາຈະທົດສອບຂັ້ນຕອນເຫຼົ່ານີ້
2. ປະຕິບັດທຸກຂັ້ນຕອນທີ່ຕ້ອງການຕາມທີ່ໄດ້ລະບຸໄວ້ໃນ "Orient DB Migration" ແລະ/ຫຼື "PostgreSQL Migration" ຂ້າງລຸ່ມນີ້ໃນສະພາບແວດລ້ອມທີ່ຮຽນແບບໄວ້, ຕິດຕາມຄໍາສັ່ງທີ່ແນ່ນອນທີ່ກ່ຽວຂ້ອງກັບສະພາບແວດລ້ອມຂອງທ່ານ ແລະ ຈົດບັນທຶກບັນຫາ ຫຼື ຄຳເຕືອນ.
3. ຕັ້ງເອກະສານ docker-compose.yml ຂອງທ່ານ (ໃນສະພາບແວດລ້ອມການທົດສອບ) ໃຫ້ກັບລຸ້ນ GeoPrism Registry / Postgres / OrientDB ໃໝ່ ແລະ ເປີດໃຊ້ `docker compose down` ຈາກນັ້ນ `docker compose pull`. ຈາກນັ້ນ `docker compose up`. ເມື່ອ GeoPrism Registry boots, ມັນຈະດໍາເນີນການແກ້ໄຂເພີ່ມເຕີມ ຫຼື ໂອນຍ້າຍຕົ້ນສະບັບໂດຍອັດຕະໂນມັດຕາມຄວາມຈໍາເປັນ. ກະລຸນາອົດທົນເນື່ອງຈາກວ່າຂັ້ນຕອນນີ້ຈະຕ້ອງໃຊ້ເວລາ.
4. ກວດເບິ່ງບັນທຶກເພື່ອຊອກຫາຄວາມຜິດພາດ ແລະ ເພື່ອໃຫ້ແນ່ໃຈວ່າການທົດສອບເຄືອຂ່າຍແມ່ນນຳໃຊ້ໄດ້ ແລະ ມີການຕອບສະໜອງ.
5. ຈັດສັນ "ຊ່ວງເວລາຢຸດເຮັດວຽກ (downtime window)" ສໍາລັບເຄືອຂ່າຍຂອງທ່ານເພື່ອຫຼຸດຜ່ອນການລົບກວນຜູ້ໃຊ້ອື່ນໃຫ້ໜ້ອຍທີ່ສຸດເທົ່າທີ່ເປັນໄປໄດ້
6. ດຳເນີນການຖ່າຍພາບ/ສໍາຮອງຂໍ້ມູນຂອງເຄືອຂ່າຍການຜະລິດຂອງທ່ານ
7. ຢຸດ webserver ດ້ວຍ `docker stop georegistry`
8. ດຳເນີນຂັ້ນຕອນຕ່າງໆໃຫ້ຄືກັນກັບທີ່ປະຕິບັດຢູ່ສະພາບແວດລ້ອມການທົດສອບ, ຍົກເວັ້ນວ່າຮອບນີ້ແມ່ນໃນສະພາບແວດລ້ອມການຜະລິດຈິງ

## 3.10.1. ການໂອນຍ້າຍ OrientDB (OrientDB migration)

ຖ້າ GeoPrism Registry ລຸ້ນໃໝ່ຕ້ອງການການຍົກລະດັບຊອບແວ OrientDB ຫຼັກຂອງທ່ານ, ການໂອນຂໍ້ມູນຕ້ອງປະຕິບັດດ້ວຍຕົນເອງ.

ເອກະສານການໂອນຍ້າຍ OrientDB ຢ່າງເປັນທາງການສາມາດພົບໄດ້ທີ່ນີ້: <http://www.orientdb.com/docs/last/release/Upgrade.html>

ເນື່ອງຈາກເອກະສານການໂອນຍ້າຍ OrientDB ຢ່າງເປັນທາງການອາດຈະມີການເຮັດໃຫ້ເກີດຄວາມສັບສົນ, ຂາດລາຍລະອຽດ, ຫຼື ບໍ່ເປັນໄປຕາມເປົ້າໝາຍໂດຍກົງ ໃນວິທີທີ່ພວກເຮົານຳໃຊ້ຊອບແວຣ໌ຂອງພວກເຂົາ, ພວກເຮົາຈະນໍາທ່ານຜ່ານຂັ້ນຕອນລະອຽດຢູ່ນີ້.

1. ຢຸດ webserver ດ້ວຍ `docker stop georegistry`
2. ສ້າງຈຸດໂອນຍ້າຍຂໍ້ມູນຂອງເຄືອຂ່າຍ Orient DB. ຄໍາສັ່ງນີ້ປະກອບມີຕົວແປ (ເລີ່ມຕົ້ນດ້ວຍ $) ເຊິ່ງຕ້ອງຖືກປ່ຽນແທນກ່ອນທີ່ຈະດໍາເນີນການ. `docker exec georegistry-orientdb bash -c 'bin/console.sh "connect remote:localhost/georegistry $ORIENTDB_ROOT_USER $ORIENTDB_ROOT_PASS; export database /orientdb/backup/$ORIENTDB_MAJOR_VERSION.json"'`
   1. &#x20;ຊື່ຜູ້ໃຊ້ orientdb root ເລີ່ມຕົ້ນແມ່ນ 'root'
   2. &#x20;ລະຫັດຜ່ານ orientdb root ເລີ່ມຕົ້ນແມ່ນ 'root'
   3. ລຸ້ນຫຼັກຂອງ OrientDB ບໍ່ຄວນລວມເອົາລຸ້ນສະບັບແກ້ໄຂ. ຕົວຢ່າງ, '3.2'.
3. ກຳຈັດເຄືອຂ່າຍ OrientDB `docker rm -f georegistry-orientdb`
4. ລຶບຂໍ້ມູນທັງໝົດໃນປະລິມານທີ່ຕິດຕັ້ງ (mounted volume) `rm -rf data/orientdb/databases/*`
5. ດຳເນີນການເປີດໃຊ້ OrientDB ລຸ້ນໃໝ່. ຄໍາສັ່ງນີ້ປະກອບມີຕົວແປ (ເລີ່ມຕົ້ນດ້ວຍ $) ເຊິ່ງຕ້ອງຖືກປ່ຽນແທນກ່ອນທີ່ຈະດໍາເນີນການ. `docker run --name georegistry-orientdb2 -e ORIENTDB_ROOT_PASSWORD="$ORIENTDB_ROOT_PASS" -e ORIENTDB_OPTS_MEMORY="-Xms512M -Xmx2G" -d -v /data/orientdb/databases:/orientdb/databases -v /data/orientdb/backup:/orientdb/backup orientdb:$ORIENTDB_MAJOR_VERSION`
6. ນຳເຂົ້າຂໍ້ມູນສຳຮອງໃສ່ Orient DB ລຸ້ນໃໝ່. ຄໍາສັ່ງນີ້ປະກອບມີຕົວແປ (ເລີ່ມຕົ້ນດ້ວຍ $) ເຊິ່ງຕ້ອງຖືກປ່ຽນແທນກ່ອນທີ່ຈະດໍາເນີນການ. `docker exec georegistry-orientdb2 bash -c 'bin/console.sh "CREATE DATABASE remote:localhost/georegistry $ORIENTDB_ROOT_USER $ORIENTDB_ROOT_PASS; connect remote:localhost/georegistry $ORIENTDB_ROOT_USER $ORIENTDB_ROOT_PASS; import database /orientdb/backup/$ORIENTDB_MAJOR_VERSION.json.gz"'`
7. ກຳຈັດເຄືອຂ່າຍ OrientDB ຊົ່ວຄາວ `docker rm -f georegistry-orientdb2`

## 3.1.0.2. ການໂອນຍ້າຍ PostgreSQL (PostgreSQL migration)

ການຍົກລະດັບ PostgreSQL ແມ່ນຂ້ອນຂ້າງກົງໄປກົງມາ ແລະ ເຊື່ອຖືໄດ້.

ເອກະສານການເຄື່ອນຍ້າຍ PostgreSQL ຢ່າງເປັນທາງການສາມາດພົບໄດ້ທີ່ນີ້: <https://www.postgresql.org/docs/current/upgrading.html#UPGRADING-VIA-PGDUMPALL>

ຂັ້ນຕອນພື້ນຖານສໍາລັບການປະຕິບັດການຍົກລະດັບໃນສະພາບແວດລ້ອມການຂຽນ docker ແມ່ນມີດັ່ງຕໍ່ໄປນີ້:

1. ຢຸດ webserver ດ້ວຍ `docker stop georegistry`
2. ດໍາເນີນການເປີດໃຊ້ Postgres ລຸ້ນໃໝ່ຄືນໃໝ່. ຄໍາສັ່ງນີ້ປະກອບມີຕົວແປ (ເລີ່ມຕົ້ນດ້ວຍ $) ເຊິ່ງຕ້ອງຖືກປ່ຽນແທນກ່ອນທີ່ຈະດໍາເນີນການ. `docker run --name georegistry-postgres2 -d -p 5482:5432 --network $CGR_DOCKER_NETWORK --link georegistry-postgres -v /data/postgres-migrate:/var/lib/postgresql/data -e POSTGRES_PASSWORD=$POSTGRES_ROOT_PASSWORD postgis/postgis:$NEW_POSTGRES_VERSION`
   1. ຊື່ຜູ້ໃຊ້ postgres root ເລີ່ມຕົ້ນແມ່ນ `postgres`.
   2. ລະຫັດຜ່ານ postgres root ເລີ່ມຕົ້ນແມ່ນ `georegistry`.
   3. ຕົວແປ NEW\_POSTGRES\_VERSION ແມ່ນແທັກຮູບພາບ Docker ແລະ ຄວນມີລຸ້ນ PostGIS ນຳ. ຕົວຢ່າງ '14-3.2'.
   4. ຄ່າຂອງຕົວແປ CGR\_DOCKER\_NETWORK ສາມາດພົບໄດ້ໂດຍການເປີດໃຊ້ `docker inspect georegistry-postgres`. ຊື່ georegistry network ໄດ້ຖືກສ້າງຂື້ນໂດຍອັດຕະໂນມັດ ແລະ ຈະຖືກສະແດງຢູ່ໃນສ່ວນ "Networks" ຂອງຜົນໄດ້ຮັບການກວດສອບ.
3. ຕິດຕັ້ງ Postgres ລຸ້ນເກົ່າເຂົ້າໄປໃນ Postgres ໃໝ່. ຄໍາສັ່ງນີ້ປະກອບມີຕົວແປ (ເລີ່ມຕົ້ນດ້ວຍ $) ເຊິ່ງຕ້ອງຖືກປ່ຽນແທນກ່ອນທີ່ຈະດໍາເນີນການ `docker exec -t georegistry-postgres2 bash -c "(PGPASSWORD=$POSTGRES_ROOT_PASSWORD pg_dumpall --host georegistry-postgres --port 5432 --username postgres --no-password && echo -e \"\n\nALTER ROLE postgres PASSWORD '$POSTGRES_ROOT_PASSWORD';\" && echo -e \"\n\nALTER ROLE georegistry PASSWORD '$POSTGRES_APP_PASSWORD';\") | psql -d postgres --host 127.0.0.1 --port 5432 --username postgres --no-password"`
   1. ລະຫັດຜ່ານ Postgres app ເລີ່ມຕົ້ນແມ່ນ `georegistry`.
4. ລົບ Postgres containers ຊົ່ວຄາວ `docker rm -f georegistry-postgres && docker rm -f georegistry-postgres2`
5. ລົບ Postgres data directory ລຸ້ນເກົ່າ `rm -rf /data/postgres`
6. ຄັດຂໍ້ມູນ postgres ຈາກລຸ້ນໃໝ່ໄປໃສ່ໄດເລກະທໍລີມາດຕະຖານ `mv /data/postgres-migrate /data/postgres`
