drupal5: ปรับปรุงวิธีย้ายจาก Mysql เป็น PostgreSQL
ปรับปรุงจากครั้งก่อน แต่เพื่อให้สมบูรณ์ในตัวและอ้างอิงภายหลังได้ เลยเขียนใหม่ทั้งหมด
บันทึกการย้ายฐานข้อมูล Drupal รุ่น 5.6 จาก MySQL-5.0.32 มาเป็น PostgreSQL-8.1.11 บนเดเบียน Etch
- สร้างฐานข้อมูลใหม่
$ createdb --encoding=UNICODE -U PG_USER NEW_DRUPAL_PG_DB
- คัดลอกไดเรกทอรี่เก่ามายังอันใหม่ทั้งหมด เพราะต้องการเอาไดเรกทอรี่ของมอดูลเก่ามาด้วย เพื่อนำมาเป็นข้อมูลทั้งหมดในการสร้างฐานข้อมูลใหม่
$ cd /var/www/
$ cp -xa OLD_DRUPAL_DIR NEW_DRUPAL_DIR - ปรับตั้ง drupal ของไดเรกทอรี่ใหม่ ให้เป็นฐานข้อมูลใหม่
$ cd NEW_DRUPAL_DIR
$ vi sites/default/setting.php... //$db_url = 'mysql://MY_USER:MY_PASSWORD@localhost/OLD_DRUPAL_MY_DB'; $db_url = 'pgsql://PG_USER:PG_PASSWORD@localhost/NEW_DRUPAL_PG_DB'; ...
- ดิดตั้งโดยเข้าไปที่ URL:
http://WWW.EXAMPLE.COM/install.php
ติดตั้งพร้อมเพิ่มผู้ใช้คือ admin ให้เรียบร้อย (create new user) - ดูใน drupal เก่า ว่าเปิดใช้มอดูลอะไรบ้าง ก็ให้เปิดใช้ให้เหมือนเดิม ทั้งนี้เพื่อให้ Drupal สร้างตารางขึ้นมารองรับการโอน โดยใช้ URL:
admin/build/modules
เลือกกาทุกมอดูล (enable all modules) - ล้างข้อมูลในตารางทั้งหมด รวมทั้งเป็นการสำเนาส่วนหัวของตารางใหม่ไปในตัว โดยใช้ pg_dump
$ pg_dump -cs -U PG_USER NEW_DRUPAL_PG_DB > NEW_PG.SQL
- สร้างตารางใหม่จาก sql เมื่อกี้นี้ ด้วย psql
$ psql -f NEW_PG.SQL -U PG_USER NEW_DRUPAL_PG_DB > temp.log
ตรงนี้ไม่ควรมีข้อผิดพลาดขึ้น - นำข้อมูลจากฐานข้อมูลเก่ามา โดยใช้ mysqldump
$ mysqldump -c -t --skip-opt -u MY_USER -p OLD_DRUPAL_MY_DB > OLD_MY.SQL
-c
คือ complete insert เพื่อให้เหมาะกับการนำเข้าไปยัง postgresql
-t
คือ --no-create-info ไม่ต้องเขียนการสร้างตารางใหม่
--skip-opt
คือไม่ต้องเขียนการล๊อกตาราง - ปรับแต่งข้อมูลให้เหมาะกับ postgresql โดยการลบ backquote (
`
) ทิ้ง
$ vi OLD_MY.SQL
:1,$ s/`//g :wq
- ถึงตรงนี้อาจนำเข้าข้อมูลได้แล้ว แต่จะมีข้อผิดพลาดจากโค๊ดของ Drupal ตรงตาราง node_revisions หน่อยนึง ตรงสดมถ์ log ที่ mysql ยอมให้เป็น NULL แต่ postgresql ไม่ยอม
ต้องไปแก้ตารางnode_revisions
สดมถ์log
ให้เป็นNULL
ได้
งานนี้ทำผ่าน phppgadmin (enable NULL in node_revisions.log) - นำเข้าฐานข้อมูลใหม่ โดยใช้ psql
$ psql -f OLD_MY.SQL -U PG_USER NEW_DRUPAL_PG_DB > temp.log
ขั้นตอนนี้อาจมีข้อผิดพลาดรายงาน ไม่ต้องสนใจ - แก้เรื่อง sequence ไม่ตรง โดยนำข้อมูลจาก phppgadmin ดูจากหน้า
public/Sequences
เอาทั้งหมดมาสร้างเป็น sql สมมุติตั้งชื่อว่า fixseq.sql
$ vi fixseq.sql
SELECT pg_catalog.setval(pg_catalog.pg_get_serial_sequence('access', 'aid'), (SELECT MAX(aid) FROM access), false); SELECT pg_catalog.setval(pg_catalog.pg_get_serial_sequence('accesslog', 'aid'), (SELECT MAX(aid) FROM accesslog), true); SELECT pg_catalog.setval(pg_catalog.pg_get_serial_sequence('aggregator_category', 'cid'), (SELECT MAX(cid) FROM aggregator_category), false); SELECT pg_catalog.setval(pg_catalog.pg_get_serial_sequence('aggregator_feed', 'fid'), (SELECT MAX(fid) FROM aggregator_feed), false); SELECT pg_catalog.setval(pg_catalog.pg_get_serial_sequence('aggregator_item', 'iid'), (SELECT MAX(iid) FROM aggregator_item), false); SELECT pg_catalog.setval(pg_catalog.pg_get_serial_sequence('authmap', 'aid'), (SELECT MAX(aid) FROM authmap), false); SELECT pg_catalog.setval(pg_catalog.pg_get_serial_sequence('boxes', 'bid'), (SELECT MAX(bid) FROM boxes), false); SELECT pg_catalog.setval(pg_catalog.pg_get_serial_sequence('client', 'cid'), (SELECT MAX(cid) FROM client), false); SELECT pg_catalog.setval(pg_catalog.pg_get_serial_sequence('comments', 'cid'), (SELECT MAX(cid) FROM comments), false); SELECT pg_catalog.setval(pg_catalog.pg_get_serial_sequence('contact', 'cid'), (SELECT MAX(cid) FROM contact), false); SELECT pg_catalog.setval(pg_catalog.pg_get_serial_sequence('files', 'fid'), (SELECT MAX(fid) FROM files), false); SELECT pg_catalog.setval(pg_catalog.pg_get_serial_sequence('filter_formats', 'format'), (SELECT MAX(format) FROM filter_formats), true); SELECT pg_catalog.setval(pg_catalog.pg_get_serial_sequence('locales_source', 'lid'), (SELECT MAX(lid) FROM locales_source), false); SELECT pg_catalog.setval(pg_catalog.pg_get_serial_sequence('menu', 'mid'), (SELECT MAX(mid) FROM menu), true); SELECT pg_catalog.setval(pg_catalog.pg_get_serial_sequence('node_comment_statistics', 'nid'), (SELECT MAX(nid) FROM node_comment_statistics), false); SELECT pg_catalog.setval(pg_catalog.pg_get_serial_sequence('node', 'nid'), (SELECT MAX(nid) FROM node), false); SELECT pg_catalog.setval(pg_catalog.pg_get_serial_sequence('node_revisions', 'vid'), (SELECT MAX(vid) FROM node_revisions), false); SELECT pg_catalog.setval(pg_catalog.pg_get_serial_sequence('poll_choices', 'chid'), (SELECT MAX(chid) FROM poll_choices), false); SELECT pg_catalog.setval(pg_catalog.pg_get_serial_sequence('profile_fields', 'fid'), (SELECT MAX(fid) FROM profile_fields), false); SELECT pg_catalog.setval(pg_catalog.pg_get_serial_sequence('"role"', 'rid'), (SELECT MAX(rid) FROM role), true); SELECT pg_catalog.setval(pg_catalog.pg_get_serial_sequence('term_data', 'tid'), (SELECT MAX(tid) FROM term_data), false); SELECT pg_catalog.setval(pg_catalog.pg_get_serial_sequence('url_alias', 'pid'), (SELECT MAX(pid) FROM url_alias), false); SELECT pg_catalog.setval(pg_catalog.pg_get_serial_sequence('users', 'uid'), (SELECT MAX(uid) FROM users), true); SELECT pg_catalog.setval(pg_catalog.pg_get_serial_sequence('vocabulary', 'vid'), (SELECT MAX(vid) FROM vocabulary), true); SELECT pg_catalog.setval(pg_catalog.pg_get_serial_sequence('watchdog', 'wid'), (SELECT MAX(wid) FROM watchdog), true);
สั่งรันด้วย psql ให้มาซ่อมเรื่อง sequence
$ psql -f fixseq.sql -U PG_USER NEW_DRUPAL_PG_DB > temp.log
ขั้นตอนนี้ไม่ควรมีข้อผิดพลาด
- อันนี้สำหรับถ้าติดตั้ง Drupal ไว้ในไดเรกทอรี่รองจากโดเมนหลัก (OPTIONAL: IF INSTALL DRUPAL IN SUBDIR) เช่น
http://www.example.com/drupal
และเปลี่ยนชื่อไดเรกทอรี่ด้วย
ต้องปรับแก้ข้อมูลในตารางlocales_source
ให้ข้อมูลเป็นอันใหม่
เช่นอันเก่าชื่อwww.example.com/OLDDRUPAL
อันใหม่ชื่อwww.example.com/NEWDRUPAL
ต้องเขียน sql ดังนี้
$ vi fixlocale.sql
UPDATE locales_source SET location = '/NEWDRUPAL/' || substr(location,12) WHERE location LIKE '/OLDDRUPAL/%'
ตัวเลข 12 ของฟังก์ชั่น
substr(location, NUM)
เป็นความยาวของอักขระไดเรกทอรี่เก่า คือOLDDRUPAL
บวก 3 คือเครื่องหมาย '/' หน้าหลังและบวกกับตำแหน่งถัดไป
สั่งรันได้เลย
$ psql -f fixlocale.sql -U PG_USER NEW_DRUPAL_PG_DB > temp.log
ต้องไม่มีข้อผิดพลาด
-c
คือ --clean ล้างตารางเก่า ก่อนสร้างตารางใหม่
-s
คือ --schema-only เอาแต่ส่วนหัวของการสร้างตาราง ไม่เอาข้อมูล เพราะเราต้องการล้างอยู่แล้ว
เสร็จจริง ๆ แล้ว
จะมีรายงานข้อผิดพลาด ที่หน้า Administer หนึ่งครั้ง
และตอนสร้างเนื้อหาใหม่อีกหนึ่งครั้ง ก็สามารถใช้งานได้แล้ว
- Printer-friendly version
- Log in or register to post comments
- 3437 reads
Recent comments