drupal5: บันทึกการย้ายจาก Mysql เป็น PostgreSQL
ต้องการใช้ฐานข้อมูล postgresql เพราะงานส่วนใหญ่ลงใน postgresql
ตอนศึกษา Drupal เลือก mysql เพราะหลายมอดูลใช้กับ postgresql ไม่ได้ เลยใช้ mysql มาเรื่อย
ตอนนี้ต้องการเปลี่ยนกลับแล้ว เลยศึกษาวิธีโอนข้อมูลเตรียมไว้
เที่ยวนี้ต้องทำด้วยมือเป็นส่วนใหญ่ เพราะลองค้นจากกูเกิลแล้ว สคริปต์ต่าง ๆ ที่ค้นได้ ส่วนใหญ่จะเขียนด้วย perl และล้าสมัยหมดแล้ว รันแล้วเกิดข้อผิดพลาดทุกอัน
บันทึกการย้ายฐานข้อมูล Drupal รุ่น 5.6 จาก MySQL-5.0.32 มาเป็น PostgreSQL-8.1.11 บนเดเบียน Etch
- คัดลอกไดเรกทอรี่เก่ามายังอันใหม่ทั้งหมด
$ cd /var/www/
$ cp -xa drupal newdrupal - ปรับตั้ง drupal ของไดเรกทอรี่ใหม่ ให้เป็นฐานข้อมูลใหม่
$ cd newdrupal
$ vi sites/default/setting.php... //$db_url = 'mysql://myuser:mypassword@localhost/drupal-mysql'; $db_url = 'pgsql://pguser:pgpassword@localhost/newdrupal-pgsql'; ...
- ดิดตั้งโดยเข้าไปที่ URL:
http://www.example.com/install.php
ติดตั้งพร้อมเพิ่มผู้ใช้คือ admin ให้เรียบร้อย - ดูใน drupal เก่า ว่าเปิดใช้มอดูลอะไรบ้าง ก็ให้เปิดใช้ให้เหมือนเดิม ทั้งนี้เพื่อให้ Drupal สร้างตารางขึ้นมารองรับการโอน โดยใช้ URL:
admin/build/modules
เลือกกาทุกมอดูล - ล้างข้อมูลในตารางทั้งหมด แต่ไม่ต้องลบตาราง (งานนี้ลบด้วยมือ โดยใช้ phppgadmin ประมาณสัก 10 ตารางเห็นจะได้
- นำข้อมูลจากฐานข้อมูลเก่ามา โดยใช้ mysqldump
$ mysqldump -c -t --skip-opt -u myuser -p drupal-mysql > mydrupal.sql
-c
คือ complete insert เพื่อให้เหมาะกับการนำเข้าไปยัง postgresql
-t
คือ --no-create-info ไม่ต้องเขียนการสร้างตารางใหม่
--skip-opt
คือไม่ต้องเขียนการล๊อกตาราง - ปรับแต่งข้อมูลให้เหมาะกับ postgresql โดยการลบ backquote (
`
) ทิ้ง
$ vi mydrupal.sql
:1,$ s/`//g :wq
- ถึงตรงนี้อาจนำเข้าข้อมูลได้แล้ว แต่จะมีข้อผิดพลาดจากโค๊ดของ Drupal ตรงตาราง node_revision หน่อยนึง ตรงสดมถ์ log ที่ mysql ยอมให้เป็น NULL แต่ postgresql ไม่ยอม
ต้องไปแก้ตารางnode_revision
สดมถ์log
ให้เป็นNULL
ได้
งานนี้ทำผ่าน phppgadmin - นำเข้าฐานข้อมูลใหม่ โดยใช้ psql
$ psql -f mydrupal.sql -U pguser newdrupal-pgsql
- เข้าไซต์ใหม่ แล้วอัปเดตครั้งนึง ถ้ายังมีรายงานข้อผิดพลาด อาจต้องไปลบ Constraints ของตาราง locales_source ออก (ตรงนี้ลืมจดชื่อ Constraints) โดยใช้ phppgadmin
เสร็จแล้ว
แต่หากยังมีข้อผิดพลาดแบบเล็กน้อย เราอาจเริ่มสร้างตารางใหม่ทั้งหมดผ่าน pg_dump ได้ คือ
- ดัมป์ข้อมูลแบบสั่งให้สร้างตารางใหม่ทั้งหมด
$ pg_dump -c -U pguser newdrupal-pgsql > newpg.sql
-c
ให้สร้างคำสั่งสร้างตารางด้วย - นำเข้าข้อมูลอีกครั้ง
$ psql -f newpg.sql -U pguser newdrupal-pgsql
เสร็จแล้ว
update 51-01-22
ยังไม่เสร็จจริง พอตรวจจริงแล้วเกิดข้อผิดพลาดคือ postgresql ไม่ยอมปรับค่า sequence ให้ตามจริง ไม่รู้ว่าเป็นเพราะอะไร ต้องมานั่งปรับประโยคใน newpg.sql ให้เลข sequence เป็นตัวเลขล่าสุด ต้องทำสักประมาณ 20 ตาราง
ขั้นตอนตั้งแต่เริ่ม (นับตั้งแต่ผ่านขั้นตอนก่อนหน้านี้มาแล้ว) คือ
- สั่งดัมป์จาก postgresql โดยให้มีคำสั่งสร้างตารางด้วย
$ pg_dump -c -U pguser newdrupal-pgsql > newpg.sql
- แก้ไขข้อมูล sql โดยเอาแต่ส่วนหัว ตัดส่วน
INSERT
ทิ้งไป คือดูตั้งแต่คำสั่งCOPY ...
เป็นต้นไป
$ vi newpg.sql
/COPY dG :wq
- ไล่ดูว่าตารางไหนมีฟีลด์ที่เป็น SERIAL ให้ดูค่าที่มากที่สุดของฟีลด์นั้น แล้วนำไปปรับแก้ในข้อมูล sql
เช่นสมมุติว่า ตารางaccesslog
มีฟีลด์ที่เป็น SERIAL คือaid
โดยมีค่าที่มากที่สุดเป็น 12345 (ดูจาก phppgadmin) ก็ให้ไปปรับแก้ประโยค sql ตรงส่วนปรับ sequence ให้เป็นตัวเลขนี้ด้วย เช่น
$ vi pgnew.sql
... SELECT pg_catalog.setval(pg_catalog.pg_get_serial_sequence('accesslog', 'aid'), 12345, true); ...
ทำให้ครบทุกตารางที่มีฟิลด์เป็น SERIAL
- นำเข้าข้อมูลจาก sql ของ postgresql ที่เพิ่งปรับแก้เมื่อสักครู่ เพื่อนำไปสร้างตาราง
$ psql -f newpg.sql -U pguser newdrupal-pgsql
- นำเข้าข้อมูลจาก sql ของ mysql ที่ได้จากคราวก่อน เพื่อนำไปเป็นข้อมูล
$ psql -f mydrupal.sql -U pguser newdrupal-pgsql
เสร็จจริง ๆ แล้ว
ยุ่งเป็นลิงถุง สงสัยเที่ยวหน้าทำเป็นสคริปต์ดูจากข้อมูลดัมป์ของ mysql แล้วโยนไปสร้างสดที่ postgresql เลยดีกว่า
- Printer-friendly version
- Log in or register to post comments
- 4301 reads
Recent comments