วิธีคอมไพล์โมดูล PostgreSQL ใน ServBay
เมื่อคุณพัฒนา PostgreSQL บน ServBay สภาพแวดล้อมเว็บท้องถิ่น อาจจำเป็นต้องคอมไพล์และติดตั้งโมดูล PostgreSQL เพิ่มเติม (หรือตามที่เรียกว่าส่วนขยาย) เพื่อเสริมความสามารถหรือขยายฟีเจอร์ของฐานข้อมูล โมดูลเหล่านี้อาจเพิ่มชนิดข้อมูลใหม่ ฟังก์ชัน อ็อปเปอเรเตอร์ หรือแม้แต่เมธอดดัชนี
บทความนี้จะแนะนำวิธีการทีละขั้นตอนสำหรับการคอมไพล์และติดตั้งโมดูล PostgreSQL ใน ServBay พร้อมตัวอย่างการคอมไพล์ postgis
(รองรับ GIS) และ pg_jieba
(ตัดคำภาษาจีน)
ภาพรวม
ServBay มอบแพลตฟอร์มที่ยืดหยุ่นและครบเครื่องให้นักพัฒนาสามารถต่อยอดและคอมไพล์แพ็คเกจเพิ่มเติมได้ การคอมไพล์โมดูล PostgreSQL โดยทั่วไปจะเกี่ยวข้องกับการดาวน์โหลดซอร์สโค้ดของโมดูล กำหนดค่าตัวเลือกคอมไพล์ ใช้เครื่องมือ build เฉพาะ (เช่น make
หรือ cmake
) ในการคอมไพล์และติดตั้ง และสุดท้ายคือเปิดใช้โมดูลบนฐานข้อมูล PostgreSQL
หัวใจสำคัญคือการตั้งค่าสภาพแวดล้อมคอมไพล์ให้ถูกต้อง เพื่อให้พบ header, ไฟล์ไลบรารี และ dependencies ต่าง ๆ ของ PostgreSQL เวอร์ชันที่ต้องการใน ServBay
ข้อกำหนดเบื้องต้น
ก่อนเริ่มคอมไพล์โมดูล PostgreSQL ใด ๆ จำเป็นต้อง เตรียมสภาพแวดล้อมคอมไพล์ของ ServBay ให้พร้อมตามขั้นตอนที่กำหนดไว้ การเตรียมสภาพแวดล้อมนี้จะตั้งค่าเครื่องมือ toolchain ที่จำเป็น (compiler, linker ฯลฯ) , ตัวแปรสภาพแวดล้อม (เช่น $PATH
, $CFLAGS
, $LDFLAGS
) พร้อมทั้งเส้นทางการ build เฉพาะของ ServBay
โปรดศึกษารายละเอียดที่เอกสาร คอมไพล์แพ็คเกจกับ ServBay ของทางการ และต้องแน่ใจว่าคุณได้รันสคริปต์เตรียมสภาพแวดล้อมในเทอร์มินัลของ ServBay ตามที่เอกสารแนะนำก่อนเริ่มใช้งาน
ความสำคัญของการระบุเวอร์ชัน PostgreSQL
ServBay รองรับการติดตั้งและรัน PostgreSQL หลายเวอร์ชันได้ โมดูล PostgreSQL แต่ละตัวต้องคอมไพล์และทำงานกับเวอร์ชันฐานข้อมูลที่ตรงกัน (เนื่องจากพึ่งพา header, ไลบรารี และ API ภายในที่จำเพาะเจาะจง)
ดังนั้นขณะคอมไพล์ คุณต้องระบุให้ชัดเจนว่ากำลังคอมไพล์โมดูลสำหรับ PostgreSQL เวอร์ชันใด และกำหนดเส้นทาง config อย่างถูกต้อง
หากระบุเส้นทางไม่ถูก โมดูลที่คอมไพล์อาจใช้งานไม่ได้ หรือเกิดปัญหาเวลาติดตั้งและรัน ฯลฯ
ตัวอย่างนี้จะใช้ PostgreSQL 15
(เช่น 15.7
) ที่ติดตั้งบน ServBay หากคุณใช้เวอร์ชันอื่น ให้ปรับเส้นทางให้ถูกต้อง
ServBay ให้ตัวแปรสภาพแวดล้อมและเครื่องมือ pg_config
เพื่อช่วยระบุเส้นทางสำหรับแต่ละเวอร์ชัน เช่น ${SERVBAY_PACKAGE_FULL_PATH}/postgresql/15/15.7/bin/pg_config
ซึ่ง pg_config
จะรายงาน path การติดตั้ง ข้อมูล build และไลบรารีของ PostgreSQL เวอร์ชันที่ต้องการ ถือเป็นเครื่องมือสำคัญสำหรับคอมไพล์โมดูล
การคอมไพล์โมดูล postgis
postgis
คือหนึ่งในส่วนขยาย PostgreSQL ที่ทรงพลังและเป็นที่นิยมมากที่สุด เพิ่มความสามารถรองรับข้อมูลเชิงพื้นที่และ GIS ให้กับ PostgreSQL ต่อไปนี้เป็นขั้นตอนคอมไพล์ postgis-3.4.2
:
ขั้นตอนที่ 1: ดาวน์โหลดซอร์สโค้ด
โหลดแพ็คเกจซอร์สโค้ด postgis-3.4.2
จากเว็บไซต์ทางการ (ควรเลือกแบบ .tar.gz
หรือ .zip
)
bash
wget https://download.osgeo.org/postgis/source/postgis-3.4.2.tar.gz
1
wget
เป็น utility สำหรับดาวน์โหลดไฟล์ผ่าน URL
ขั้นตอนที่ 2: แตกไฟล์ซอร์ส
แตกไฟล์ที่ดาวน์โหลดและเปลี่ยนโฟลเดอร์เข้าสู่ root directory ของซอร์ส
bash
tar zxvf postgis-3.4.2.tar.gz
cd postgis-3.4.2
1
2
2
tar zxvf
คือคำสั่งแตกไฟล์ .tar.gz
และ cd
คือเปลี่ยน directory
ขั้นตอนที่ 3: กำหนดค่าตัวเลือกคอมไพล์
PostGIS ใช้ระบบ build แบบ GNU Autotools ขั้นตอนนี้จะเช็ค dependency และสร้างไฟล์ Makefile
จำเป็นต้องระบุ path ของ PostgreSQL เวอร์ชันที่ถูกต้องใน ServBay และ library ที่เกี่ยวข้อง
bash
./configure \
--prefix=${SERVBAY_PACKAGE_FULL_PATH}/postgresql/15/15.7 \
--bindir=${SERVBAY_PACKAGE_FULL_PATH}/postgresql/15/15.7/bin \
--datarootdir=${SERVBAY_PACKAGE_FULL_PATH}/postgresql/15/15.7/share \
--with-protobufdir=${SERVBAY_BIN_PATH} \
--disable-nls \
--without-raster \
--without-topology \
--with-pgconfig=${SERVBAY_PACKAGE_FULL_PATH}/postgresql/15/15.7/bin/pg_config \
CFLAGS="${CFLAGS} -I${SERVBAY_COMMON_INCLUDE_PATH}/libxml2 -I${SERVBAY_COMMON_INCLUDE_PATH}" \
CXXFLAGS="${CXXFLAGS} -std=c++17 -I${SERVBAY_COMMON_INCLUDE_PATH}/libxml2 -I${SERVBAY_COMMON_INCLUDE_PATH}" \
LDFLAGS="${LDFLAGS} -L${SERVBAY_COMMON_LIB_PATH} -lxml2 -lz -lpthread -liconv -licui18n -licuuc -licudata -lm"
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
./configure
: สั่งเริ่มคอนฟิก--prefix
,--bindir
,--datarootdir
: ระบุ root directory ให้ตรงกับ PostgreSQL เวอร์ชันที่ต้องการใน ServBay เพื่อให้ PostgreSQL หาไฟล์โมดูลเจอ--with-protobufdir
: ชี้ไปที่ path ของ Protobuf library ซึ่ง PostGIS ต้องใช้--disable-nls
: ปิดการรองรับภาษาท้องถิ่น (NLS)--without-raster
,--without-topology
: ปิดฟีเจอร์ Raster และ Topology (เพื่อความง่าย แต่เปิดได้หากมี dependency พร้อม)--with-pgconfig
: สำคัญที่สุด กำหนด path ของpg_config
สำหรับเวอร์ชัน PostgreSQL ที่จะคอมไพล์ งานนี้ให้ขึ้นกับรหัสของ ServBayCFLAGS
,CXXFLAGS
,LDFLAGS
: ส่ง option เพิ่มให้ compiler และ linker เช่น path ของ include/lib ของ libxml2 ฯลฯ และกำหนด C++17
ขั้นตอนที่ 4: คอมไพล์และติดตั้ง
เมื่อคอนฟิกสำเร็จ ใช้ make
เพื่อคอมไพล์ และ make install
เพื่อคัดลอกไฟล์โมดูลไปยังตำแหน่งที่ต้องการให้ PostgreSQL เจอ
bash
make -j ${CPU_NUMBER}
make install
1
2
2
make -j ${CPU_NUMBER}
: คอมไพล์พร้อมกันหลายคอร์ สำหรับความเร็วmake install
: คัดลอก library และสคริปต์ SQL ไปยังlib/postgresql
และshare/postgresql/extension
ของ PostgreSQL
ขั้นตอนที่ 5: ทดสอบการโหลดโมดูล
หลังจากติดตั้งแล้ว ต้องเปิดใช้งานส่วนขยาย postgis
ในฐานข้อมูล สามารถใช้ psql ของ ServBay ทดสอบในเทอร์มินัล
bash
# สร้าง EXTENSION PostGIS
${SERVBAY_PACKAGE_FULL_PATH}/postgresql/15/15.7/bin/psql -c "CREATE EXTENSION postgis;"
1
2
2
หากสำเร็จ จะสามารถตรวจสอบเวอร์ชัน PostGIS ในฐานข้อมูลได้:
bash
# ตรวจสอบเวอร์ชัน PostGIS
${SERVBAY_PACKAGE_FULL_PATH}/postgresql/15/15.7/bin/psql -c "SELECT PostGIS_Version();"
1
2
2
หากโปรแกรมตอบกลับเป็นเลขเวอร์ชัน แสดงว่าคอมไพล์ ติดตั้ง และโหลดโมดูล PostGIS สำเร็จแล้ว
การคอมไพล์โมดูล pg_jieba
pg_jieba
เป็นส่วนขยายที่ต่อยอดจากไลบรารี cppjieba
เพื่อใช้ตัดคำภาษาจีนภายใน PostgreSQL ส่วนใหญ่ใช้สำหรับ full-text search ในภาษาไทย ใช้ CMake เป็นระบบ build ต่อไปนี้คือขั้นตอนครบถ้วน:
ขั้นตอนที่ 1: ดาวน์โหลดซอร์สโค้ด
ใช้ git clone
เพื่อโหลดซอร์ส pg_jieba
และสั่งอัปเดต submodule ให้รวมซอร์ส cppjieba
ด้วย
bash
git clone https://github.com/jaiminpan/pg_jieba.git
cd pg_jieba
git submodule update --init --recursive
1
2
3
2
3
git clone ...
: โคลน repository ของpg_jieba
git submodule update --init --recursive
: โหลดซอร์สของ submodule ทั้งหมดที่อยู่ใน repo รวมถึงcppjieba
ขั้นตอนที่ 2: กำหนดค่าคอมไพล์ (CMake)
pg_jieba
ใช้ CMake คุณจำเป็นต้องระบุ path PostgreSQL และรายละเอียดระบบ ServBay ที่จะ build
bash
cmake -S . -B builddir \
-DCMAKE_PREFIX_PATH=${SERVBAY_PACKAGE_FULL_PATH}/postgresql/15/15.7 \
-DCMAKE_OSX_DEPLOYMENT_TARGET=${BUILD_OS_MIN_VERSION} \
-DCMAKE_OSX_ARCHITECTURES=${BUILD_CPU_ARCH_CMAKE}
1
2
3
4
2
3
4
cmake -S . -B builddir
: อ่านซอร์สโค้ดจากปัจจุบัน สร้าง build directory ชื่อbuilddir
-DCMAKE_PREFIX_PATH
: สำคัญมาก ให้ CMake หา PostgreSQL ใน path ที่กำหนดของ ServBay-DCMAKE_OSX_DEPLOYMENT_TARGET
: ระบุ version ขั้นต่ำของ macOS ที่รองรับ-DCMAKE_OSX_ARCHITECTURES
: ระบุสถาปัตยกรรม CPU (x86_64 หรือ arm64)
ขั้นตอนที่ 3: คอมไพล์และติดตั้ง (CMake)
รันคำสั่งด้านล่างเพื่อคอมไพล์และติดตั้งไฟล์โมดูลที่สร้างขึ้น
bash
cmake --build builddir -j ${CPU_NUMBER}
cmake --install builddir
1
2
2
cmake --build builddir
: เริ่มกระบวนการคอมไพล์ในไดเรกทอรี build-j ${CPU_NUMBER}
: คอมไพล์แบบขนานcmake --install builddir
: ติดตั้งไฟล์โมดูลสำเร็จรูปไปยัง path ที่สัมพันธ์กับ${SERVBAY_PACKAGE_FULL_PATH}/postgresql/15/15.7
ขั้นตอนที่ 4: ทดสอบการโหลดโมดูล
เปิดใช้งาน pg_jieba
ในฐานข้อมูล PostgreSQL ของคุณ (แนะนำให้ทำบนเทอร์มินัลที่เตรียมสภาพแวดล้อม ServBay แล้ว)
bash
# สร้าง EXTENSION pg_jieba
${SERVBAY_PACKAGE_FULL_PATH}/postgresql/15/15.7/bin/psql -c "CREATE EXTENSION pg_jieba;"
1
2
2
หากผ่าน ให้ตรวจสอบในตาราง extension:
bash
# ตรวจสอบรายการ Extension
${SERVBAY_PACKAGE_FULL_PATH}/postgresql/15/15.7/bin/psql -c "SELECT * FROM pg_available_extensions WHERE name = 'pg_jieba';"
1
2
2
หากปรากฏในตาราง แสดงว่าโมดูลถูกติดตั้งและเปิดใช้งานอย่างถูกต้อง
คำถามที่พบบ่อย (FAQ)
- คอมไพล์ล้มเหลว พบว่าไม่พบไฟล์ header หรือไลบรารี?
- ตรวจสอบว่าคุณได้รันสคริปต์เตรียมสภาพแวดล้อมของ ServBay แล้ว และตัวแปรสภาพแวดล้อมทั้งหมดชี้ไปยัง path ใน ServBay ที่ถูกต้อง (
$CFLAGS
,$LDFLAGS
,${SERVBAY_COMMON_INCLUDE_PATH}
,${SERVBAY_COMMON_LIB_PATH}
ฯลฯ) - ตรวจสอบว่าคุณระบุ path
--with-pgconfig
(Autotools) หรือ-DCMAKE_PREFIX_PATH
(CMake) ไปยัง PostgreSQL เวอร์ชันที่ต้องการจริง ๆ และไฟล์pg_config
อยู่ตรงนั้นและรันได้ - โมดูลบางตัวอาจต้องการ dependency เพิ่มนอกจากที่ ServBay มี เช่น PostGIS ที่เปิด Raster/Topology ต้องมี GEOS, GDAL เป็นต้น หากขาด dependency ลองติดตั้งหรือสั่ง configure โดยปิดฟีเจอร์นั้น
- ตรวจสอบว่าคุณได้รันสคริปต์เตรียมสภาพแวดล้อมของ ServBay แล้ว และตัวแปรสภาพแวดล้อมทั้งหมดชี้ไปยัง path ใน ServBay ที่ถูกต้อง (
- รัน
CREATE EXTENSION
แล้ว PostgreSQL หาโมดูลไม่เจอ?- ตรวจสอบว่าคำสั่ง
make install
(Autotools) หรือcmake --install
(CMake) สำเร็จหรือไม่ และไฟล์ถูกคัดลอกไปยังปลายทางของ PostgreSQL ที่ถูกต้อง - ตรวจสอบ path ที่ระบุใน
--prefix
หรือ-DCMAKE_PREFIX_PATH
ว่าตรงกับ PostgreSQL เวอร์ชันที่คุณอยากติดตั้งหรือไม่ ไฟล์โมดูลควรไปอยู่ในlib/postgresql
ของ path ดังกล่าว - บางครั้ง PostgreSQL อาจต้องรีสตาร์ทเพื่อมองเห็นโมดูลใหม่ ใช้ interface ของ ServBay รีสตาร์ทบริการ PostgreSQL ได้เลย
- ตรวจสอบ config
shared_preload_libraries
ของ PostgreSQL ด้วย ส่วนใหญ่ extension ทั่วไปจะไม่ต้องเพิ่มชื่อโมดูลในนี้ ยกเว้นบาง extension ประเภท hook
- ตรวจสอบว่าคำสั่ง
- อยากคอมไพล์โมดูลสำหรับ PostgreSQL หลายเวอร์ชันในเครื่องเดียว?
- ทำซ้ำขั้นตอนข้างต้น โดยเปลี่ยน path
--with-pgconfig
(Autotools) หรือ-DCMAKE_PREFIX_PATH
(CMake) ให้ชี้ไปยังไดเรกทอรีหรือpg_config
ของ PostgreSQL เวอร์ชันเป้าหมาย (เช่น${SERVBAY_PACKAGE_FULL_PATH}/postgresql/14/14.x/bin/pg_config
สำหรับเวอร์ชัน 14)
- ทำซ้ำขั้นตอนข้างต้น โดยเปลี่ยน path
สรุป
เพียงปฏิบัติตามคู่มือนี้ พร้อมใช้ความสะดวกจากเครื่องมือและสภาพแวดล้อมที่ ServBay เตรียมมาให้ คุณก็สามารถคอมไพล์และติดตั้งโมดูล PostgreSQL ที่คุณต้องการเพื่อเสริมศักยภาพให้ฐานข้อมูลของคุณได้ง่ายดาย หัวใจสำคัญคือเตรียมสภาพแวดล้อม ServBay ให้ถูกต้อง ระบุเวอร์ชัน PostgreSQL ที่เจาะจง และพิจารณาจุดติดตั้งโมดูลให้เหมาะสม
เราหวังว่าคู่มือนี้จะช่วยให้คุณปรับแต่งและขยายศักยภาพ PostgreSQL ใน ServBay ได้สมบูรณ์ หากพบปัญหาเพิ่มเติม สามารถอ้างอิงเอกสาร ServBay ฉบับอื่นหรือขอคำแนะนำจากชุมชนได้