ต้นเดือนที่ผ่านมา พยายามจะ copy table ของ Oracle Enterprise View จาก Oracle Server (ซึ่งหน่วยงานอื่น provide ให้ read-only) มาเก็บสำรองไว้ที่ Oracle Express Edition (Oracle XE) ที่ดูแลเอง เอาไว้ใช้ในยามฉุกเฉิน เมื่อระบบหลักมีอันเป็นไปไม่ว่าด้วยเหตุใด ทำให้ใช้งานไม่ได้ ยามวิกฤตนั้นจะได้ไม่มืดมนหนทาง
ออกตัวก่อนว่า ผมเป็นคนประเภทรู้อะไรก็รู้อย่างเป็ด แม้จะทำได้หลายอย่าง แต่ก็ไม่ค่อยได้เด่นซักเรื่อง ขอแก้ไขปัญหาให้ระบบนำมาใช้งานได้เป็นลำดับแรก (เจอปัญหาอื่นๆ ก็ค่อยๆ ไล่แก้ โดยอาศัยประสบการณ์ที่แชร์กันบนเน็ตเป็นที่พึ่ง) เพราะฉะนั้นแน่ใจได้เลยว่า จะไม่ได้คำอธิบายที่ลงลึกในรายละเอียดจากบล็อกนี้
Oracle XE
- Limitation ข้อจำกัดของการนำ Oracle XE มาใช้งานมีบอกไว้ในเว็บไซต์ของ Oracle ดังนี้
Oracle Database XE can be installed on any size host machine with any number of CPUs (one database per machine), but XE will store up to 4GB of user data, use up to 1GB of memory, and use one CPU on the host machine.
- Installation ผมต้องทำการแก้ไขปัญหา swap memory ของเครื่องต่ำกว่า 1GB ก่อนจะติดตั้ง ตามนี้
# dd if=/dev/zero of=/swapfile bs=1M count=400
ดำเนินการติดตั้งต่อไป
# mkswap /swapfile
# swapon /swapfile#vi /etc/apt/sources.list
โดยเพิ่มบรรทัดนี้เข้าไปdeb http://oss.oracle.com/debian/ unstable main non-free
เสร็จแล้ว#wget http://oss.oracle.com/el4/RPM-GPG-KEY-oracle -O- | apt-key add -
จากนั้น#apt-get update
สุดท้ายแล้ว
#apt-get install oracle-xe#/etc/init.d/oracle-xe configure
- Configuration เป็นขั้นตอนที่ผมติดอยู่นาน โดยเฉพาะเรื่องการตั้งค่า encoding ของ database ให้เป็นภาษาไทย (TH8TISASCII) เมื่อเข้าไปใน SQL command line prompt แล้ว (sqlplus) ให้ลองดูตัวแปรของ database ตามนี้
SQL> select * from nls_database_parameters;
มีตัวแปรที่เกี่ยวข้องกับ 2 ตัว คือ NLS_CHARACTERSET กับ NLS_NCHAR_CHARACTERSET ซึ่งผมไม่ขออธิบายเกี่ยวกับตัวแปรทั้งสองตัว ณ ตรงนี้ แต่ไปดูวิธีแก้ค่าให้เป็น TH8TISASCII เลยละกัน เริ่มจาก NLS_CHARACTERSET ทำตามนี้เลยครับ
PARAMETER VALUE
------------------------------ ----------------------------------------
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_CHARACTERSET TH8TISASCII
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE AMERICAN
NLS_SORT BINARY
NLS_TIME_FORMAT HH.MI.SSXFF AM
PARAMETER VALUE
------------------------------ ----------------------------------------
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY $
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
NLS_NCHAR_CHARACTERSET TH8TISASCII
NLS_RDBMS_VERSION 10.2.0.1.0
20 rows selected.SQL> conn sys@INSTANCE as sysdba
ส่วน NLS_NCHAR_CHARACTERSET ก็ทำแบบนี้ครับ
Enter password:
Connected.
SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL> ALTER DATABASE OPEN;
SQL> ALTER DATABASE CHARACTER SET INTERNAL_USE TH8TISASCII;SQL> conn sys@INSTANCE as sysdba
Enter password:
Connected.
SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL> ALTER DATABASE OPEN ;
SQL> UPDATE props$ SET value$='TH8TISASCII' WHERE name IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');
SQL> commit; - Operation ในที่นี้หมายถึงการ Copy table from one to another instance เพื่อป้องกันปัญหาการอ่าน column ที่เป็นภาษาไทยไม่ออก ก่อน run คำสั่ง sqlplus เพื่อเข้าไปใน SQL command line prompt ที่ bash shell จำเป็นต้อง setup ตัวแปร NLS_LANG ตามนี้ซะก่อน
export NLS_LANG=AMERICAN_AMERICA.TH8TISASCII
จากนั้นค่อยทำการ copy ตาม sytax ข้างล่างนี้ต่อไปcopy from user/pass@SRC_INSTANCE to user/pass@DST_INSTANCE replace dst_table using select * from src_table;
ผมใช้วิธีง่ายๆ เพราะตัว Instance ของ Oracle XE ฝั่งปลายทางนั้น อย่างที่บอกคือ ไว้ใช้ในยามฉุกเฉินกรณีที่ตัวหลักที่ฝั่งต้นทางล่มไปนานๆ เท่านั้น โดยให้ cron ตั้งเวลาให้เหมาะสมเพื่อ run script ที่เขียนไว้สำหรับ copy หลายๆ tables ข้างล่างนี้เป็นตัวอย่าง shell script ที่ผมใช้ (ไฟล์ copy.sql เป็น sql command ที่ใช้สำหรับ copy table ตามรูปแบบ syntax ข้างบน)#!/bin/bash
export NLS_LANG=AMERICAN_AMERICA.TH8TISASCII
export ORACLE_HOME=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server
export PATH=$ORACLE_HOME/bin:$PATH
$ORACLE_HOME/bin/sqlplus user/pass@DST_INSTANCE @copy.sql
Links