Category: Oracle

  • กำหนด Lexer สำหรับ Full Text Search บน ฐานข้อมูล Oracle เพื่อค้นหาภาษาไทยให้ถูกต้อง

    เนื่องจากระบบสืบค้นที่ดูแลอยู่เจอปัญหาค้นหาเลขไทย “๑ ๒ ๓ …” ไม่เจอ หลังจากตรวจสอบจนแน่ใจแล้วว่าก่อนจะส่งคำสั่ง Query ไปยังฐานข้อมูลไม่ได้เผลอตัดเลขไทยออกที่ขั้นตอนไหน จึงทำการตรวจสอบคำสั่งที่ใช้ในการค้นหา พบว่าใช้ฟังก์ชัน

    SELECT * FROM THAI_LIBRARY WHERE CONTAINS(BOOK_NAME, '๑๐๐ ปีชาติไทย', 1) > 0;

    จากคำสั่ง (ที่สมมุติขึ้น) ด้านบนจะเห็นได้ว่าใช้ CONTAINS ซึ่งเป็นฟังก์ชันที่อยู่ในกลุ่ม Oracle Text ซึ่งฟังก์ชันนี้จะค้นหาคำใกล้เคียงจาก Index แล้วคืนค่า Score มาให้เราเพื่อใช้เป็นเงื่อนไขพิจารณาว่าจะใช้ข้อมูลรายการนั้นหรือไม่

    ที่มาภาพ

    ภาพด้านบนแสดงขั้นตอนการสร้าง Oracle Text Index เนื่องจากระบบจัดเก็บข้อมูลเป็น Text อยู่แล้วจึงไม่มีการกำหนด Fillter, Sectioner ทำให้จุดที่ต้องตรวจสอบว่า เลขไทยเราหายไปจาก Index ได้ยังไงเหลืออยู่คือ Lexer ที่จะเป็นตัวกำหนด Wordlist, Stoplist ในการทำ Index ต่อไป ไปดูว่ามี Lexer อะไรบ้าง

    จากตารางด้านบน เนื่องจากฐานข้อมูลของระบบที่ดูแลอยู่ประกอบไปด้วย ภาษาไทย ภาษาอังกฤษ เป็นหลัก และอาจจะมีภาษาอื่นๆปนอยู่ด้วย Lexer ที่น่าจะใช้ได้คือ AUTO_LEXER, MULTI_LEXER, WORLD_LEXER หลังจากได้ทดสอบกำหนดค่า Lexer ให้กับฐานข้อมูล และทดสอบค้นหาด้วย เลขไทย พบว่าจะต้องใช้ WORLD_LEXER จึงจะสามารถรองรับกรณีนี้ได้ โดยใช้คำสั่งดังนี้

    EXEC CTX_DDL.CREATE_PREFERENCE('WorldLex', 'world_lexer');

    DROP INDEX USER01.IDXFT_THAI_LIBRARY_BOOKNAME;
    CREATE INDEX USER01.IDXFT_THAI_LIBRARY_BOOKNAME ON USER01.THAI_LIBRARY(BOOK_NAME)
    INDEXTYPE IS CTXSYS.CONTEXT
    PARAMETERS('LEXER WorldLex STOPLIST CTXSYS.EMPTY_STOPLIST SYNC(ON COMMIT)')
    NOPARALLEL;

    USER01 คือ User ของฐานข้อมูล Oracle

    THAI_LIBRARY คือ ชื่อตาราง

    BOOK_NAME คือ ชื่อคอลัมภ์ ที่ต้องการทำ Index

    IDXFT_THAI_LIBRARY_BOOKNAME ชื่อ ตาราง index

    ผลพลอยได้ จากการปรับในครั้งนี้พบว่าเดิมต้องทำการตัดคำให้เรียบร้อย (เนื่องจากค่า Default คือ Basic Lexer ที่แบ่งคำด้วยช่องว่างเท่านั้น) เพื่อค้นหา แต่เมื่อปรับ Lexer ให้ถูกต้องสามารถส่งคำค้นเป็นประโยคยาวๆ ไปค้นหาได้เลย หวังว่าบทความนี้จะเป็นประโยชน์กับท่านที่ใช้งาน Full Text Search ของ Oracle และประสบปัญหาคล้ายๆกันนี้ครับ

  • Migrate จากฐานข้อมูล MySql มายัง Oracle ด้วย Sql Developer

    เนื่องจากงานที่รับผิดชอบ จะต้องมีการโอนย้ายข้อมูลจากฐานข้อมูลอื่นๆมายัง Oracle เป็นประจำ พบว่าการย้าย MySql มายัง Oracle นั้นสามารถทำได้ง่ายมาก (อาจเพราะเจ้าของเดียวกัน) โดยมีวิธีดังนี้

    1. ดาวส์โหลดและติดตั้ง Oracle SQL Developer

    2. ทำการเชื่อมต่อไปยังฐานข้อมูล Oracle ด้วย User system

    3. สร้าง Oracle User สำหรับเก็บข้อมูลจาก MySql และกำหนดสิทธิให้เรียบร้อย

    4. ดาวส์โหลดไฟล์ Third Party JDBC Driver สำหรับ My Sql

    5. เปิดการใช้งาน Third Party JDBC Driver โดยไปที่ Tools > Preferences > Database > Third Party JDBC Drivers

    6. ทำการ Restart โปรแกรม Sql Developer เมื่อทำการ New Connection จะมีตัวเลือกเพื่อเชื่อมต่อไปยัง My Sql

    7. ทำการเชื่อมต่อไปยัง My Sql  หากต้องการเพียง Data, Schema สามารถคลิกขวาตารางที่ต้องการเลือก Copy To Oracle ได้เลย

    เพียงเท่านี้ ข้อมูล Table, Field ก็จะถูกโอนย้ายและ Map Data Type ให้อัตโนมัติสามารถ Query จาก Oracle ได้เลย

    แต่สำหรับงานที่ต้องการ Constraint, Trigger, ฯลฯ ด้วย จะมีขั้นตอนเพิ่มเติมดังนี้

    1. ไปที่  Tools > Migration > Migrate กำหนด User ที่จะใช้เป็น Migrate Repository (เก็บข้อมูลต่างๆขณะดำเนินการ Migrate)

    2. กำหนดโฟลเดอร์จัดเก็บ Script, Log file

    3. เลือก Connection My Sql ที่ต้องการ Migrate

    4. เลือก My Sql User ที่ต้องการ Migrate

    5. การ Map Data Type สามารถใช้ค่า Default ได้

    6. เลือก Sql Object ที่ต้องการ

    7. เลือก Connection ของ DB User ที่ใช้เก็บโครงสร้าง และคำสั่งต่างๆ ที่ระบบใช้ในการ Migrate

    8. กำหนด User เป้าหมายที่จะนำข้อมูลเข้า จากนั้นเลือก Finish

    เพียงเท่านี้ก็เรียบร้อยครับ ข้อควรระวังคือการเลือก Repository User ควรสร้างขึ้นมาใหม่ เนื่องจากจะมีการสร้าง Table ขึ้นมาระหว่างการ Migrate และการกำหนดสิทธิให้กับ User ต่างๆให้ครบถ้วน แบบที่สองดูเหมือนหลายขั้นตอน แต่ก็เป็นแบบ Wizard ที่ใช้งานได้ไม่ยาก หวังว่าบทความนี้จะเป็นประโยชน์ครับ

  • Grid Infrastructure 18c ตอน 5 (ตอนจบภาคติดตั้ง)

    • ตอนนี้จะมาติดตั้ง oracle database 18c
    • เข้าระบบด้วยผู้ใช้ oracle เปิด terminal พิมพ์คำสั่ง (จากครั้งที่แล้วยังเหลือ disk อีก 2 ลูก)
    grid_env
    sqlplus / as sysasm
    • ต่อด้วยคำสั่ง SQL ต่อไปนี้
    CREATE DISKGROUP data EXTERNAL REDUNDANCY DISK '/dev/oracleasm/disks/DISK5'
           ATTRIBUTE 'compatible.asm'='18.0','compatible.rdbms'='18.0';
    CREATE DISKGROUP reco EXTERNAL REDUNDANCY DISK '/dev/oracleasm/disks/DISK6'
           ATTRIBUTE 'compatible.asm'='18.0','compatible.rdbms'='18.0';
    exit;
    • ได้ดังรูป
    • เริ่มติดตั้ง database
    db_env
    cd $ORACLE_HOME
    ./runInstaller
    • ได้ดังรูป
    Select Configuration Option
    • Set Up Software Only
    • กด Next ได้ดังรูป
    • เลือก Oracle Real Application Clusters database installation ได้ดังรูป
    • กด Next ได้ดังรูป
    • เลือก Standard Edition 2 กด Next
    • กด Next
    • กด Next
    • รอแป๊บ
    • กด Install
    • รอจนมีหน้าต่างใหม่ว่า
    • เปิด Terminal แล้วพิมพ์คำสั่งต่อไปนี้ ที่ rac1 และ rac2
    sudo /u01/app/oracle/product/18.0.0.0/db_1/root.sh
    • กลับไปที่หน้าต่าง Execute Configuration Scripts กด OK
    • กด Close
    • ต่อไปสร้าง database ด้วยคำสั่ง
    dbca
    • จะได้
    • เลือก Create a database กด Next
    • กด Next
    • เลือกดังรูปกด Next
    • กด Next
    • ตั้ง Global database name และ SID Prefix เอาเครื่องหมายถูกหน้า Create Container database ออก กด Next
    • คลิก Browse…
    • เลือก DATA กด OK
    • กด Next
    • คลิกเลือก Specify Fast Recovery Area Browse ไฟล์เลือก +MGMT ช่อง Fast Recovery Area size: เป็นขนาด HDD–10%
    • กด Next
    • ปรับแต่ง memory ตามความเหมาะสม คลิกช่อง Sizing ปรับจำนวนโปรเซส
    • กดช่อง Character sets
    • เลือกตามรูป กด Next
    • กด Next
    • ตั้ง Password กด Next
    • กด Next
    • รอแป๊บ
    • กด Finish
    • รอระหว่างนี้ไปพักได้
    • กด Close
    • เสร็จ

    สิ่งที่ต้องหาข้อมูลเพิ่มเติม

    • disk group ต่างๆ ไว้ทำอะไร และอาจปรับลดให้เหลือเฉพาะ disk group เดียว จะได้มีเนื้อที่มากขึ้นกว่าตอนนี้ ที่มีแค่ 1TB
    • automatic start/stop server
      • ตอนนี้ทำเสร็จไม่สามารถ restart ได้เพราะทำไม่เป็น
    • ทำแค่ how to ติดตั้งเพียงอย่างเดียวจึงได้เพียงเท่านี้
    • จบขอให้สนุก
  • Grid Infrastructure 18c ตอน 4

    • โหมดแทบ จะ next technology
    • เข้าระบบด้วยผู้ใช้ oracle เปิด terminal พิมพ์คำสั่งต่อไปนี้
    grid_env
    cd $ORACLE_HOME
    ./gridSetup.sh
    • จะได้ดังรูป
    Select Configuration Option
    • เลือก Configure Oracle Grid Infrastructure for New Cluster กด Next
    • จะได้ดังรูป
    Select Cluster Configuration
    • เลือก Configure an Oracle Standalone Cluster กด Next
    • จะได้ดังรูป
    Grid Plug and Play Information
    • เลือก Create Local SCAN
    • แก้ชื่อให้ตรงกับที่ขอจดกับ DNS (rac-scan) ดังรูป
    Grid Plug and Play Information
    • กด Next จะได้ดังรูป
    Cluster Node Information
    • ให้กด Add… เพื่อเพิ่ม rac2 ดังรูป
    Cluster Nod Information
    • กด Next จะได้ดังรูป
    Specify Network Interface Usage
    • ให้เปลี่ยนเป็นตามรูป (ซึ่งตัวอย่างนี้ใช้ iSCSI)
    Specify Network Interface Usage
    • กด Next จะได้ดังรูป
    Storage Option Information
    • เลือก Configure ASM using block devices กด Next
    • จะได้
    Grid Infrastructure Management Repository Option
    • เลือก Yes กด Next
    • ได้ดังรูป
    Create ASM Disk Group
    • เปลี่ยน Disk Discovery Path เป็น /dev/oracleasm/disks/* โดยการคลิก Change Discovery Path…
    Change Disk Discovery
    • คลิก Specify Failure Groups… กรอกและเลือกดังรูป กด OK
    Failure Groups
    • ในส่วนของ Redundancy เลือก Normal
    • ในช่อง Select Disks เลือก Disk 3 ลูก ระบุ Failure Group ต่างกัน Group ตามที่สร้างไว้
    Create ASM Disk Group
    • กด Next จะได้ดังรูป
    GIMR Data Disk Group
    • เลือก External และ disk 1 ลูก
    GIMR Data Disk Group
    • กด Next จะได้
    Specify ASM Password
    • เลือก Use same passwords for these accounts แล้ว ตั้ง password
    Specify ASM Password
    • กด Next ได้ดังรูป
    Failure Isolation Support
    • เลือก Do not use Intelligent Platform Management Interface (IPMI) กด Next ได้ดังรูป
    Specify Management Options
    • กด Next แล้วเลือกดังรูป dba, oper, asmoper
    Privileged Operating System Groups
    • จะได้ดังรูป
    Specify Installation Location
    • กด Next ได้ดังรูป
    Oracle Grid Infrastructure 18c Installer
    • เลือก Yes ได้ดังรูป
    • กด Next ได้ดังรูป
    Root script execution configuration
    • กด next ได้ดังรูป
    Perform Prerequisite Checks
    Summary
    • กด Install ได้ดังรูป
    • รอจนกระทั่ง
    Execute Configuration Scripts
    • ให้รันคำสั่งต่อไปนี้ ใน terminal เริ่มจาก rac1 แล้วต่อด้วย rac2
    sudo /u01/app/oraInventory/orainstRoot.sh
    orainstRoot.sh
    sudo /u01/app/18.0.0.0/grid/root.sh
    • กด enter 1 ครั้งแล้วรอ ให้สคริปต์ทำงานไปจนกว่าจะเสร็จ โดยสังเกตด้วยต้องไม่มีคำว่า Fail เลย
    • เมื่อครบทั้ง 2 คำสั่งที่ rac1 แล้ว ให้ทำซ้ำที่ rac2 อาจสั่งไปจาก rac1 ก็ได้
    ssh rac2
    • เมื่อสั่งคำสั่งครบทั้ง 2 เครื่องแล้วให้กลับมา rac1 แล้วกด OK ได้รูป
    Oracle Grid Infrastructure 18c Installer – Step 18 of 19
    • พักดื่มน้ำปัสสาวะได้ เนื่องจากค่อนข้างนาน
    • กลับมากด Close ได้เลย
    Finish
    • ต่อไปติดตั้ง database ตอน 5 ใกล้ละๆ
    https://sysadmin.psu.ac.th/2021/01/27/grid-infrastructure-18c-5/
  • Grid Infrastructure 18c ตอน 3

    downloaded 
    • ไฟล์ที่ download จาก https://edelivery.oracle.com จะมี 2 ไฟล์คือ
      • V978967-01.zip คือ ไฟล์ติดตั้ง database
      • V978971-01.zip คือ ไฟล์ติดตั้ง grid infrastructure
      • download ไฟล์มาเก็บไว้ที่ /home/oracle/Downloads ของ rac1 เครื่องเดียว
    • เข้าระบบด้วย ผู้ใช้ oracle เปิด terminal
    • unzip
    db_env
    cd $ORACLE_HOME
    unzip /home/oracle/Downloads/V978967-01.zip
    grid_env
    cd $ORACLE_HOME
    unzip /home/oracle/Downloads/V978971-01.zip
    • สร้าง User Equivalence (Key-Based Authentication) ระหว่าง rac1 และ rac2
    ssh-keygen -t rsa #enter ผ่านไปเรื่อยๆ จนได้ prompt $
    • จากนั้นตามด้วยคำสั่ง
    ssh-copy-id rac2
    • พิมพ์ yes แล้วใส่รหัสผ่านของ rac2
    • ทดสอบ
    ssh rac2 date
    • ต้องได้ผลลัพธ์ประมาณว่า
    ssh rac2 date
    • ทำซ้ำที่ rac2
    ssh rac1 date
    • ติดตั้ง cvuqdisk.rpm ด้วยคำสั่ง
    sudo rpm -iUvh /u01/app/18.0.0.0/grid/cv/rpm/cvuqdisk-1.0.10-1.rpm
    • ส่งไฟล์ cvuqdisk-1.0.10-1.rpm ไปให้ rac2
    scp /u01/app/18.0.0.0/grid/cv/rpm/cvuqdisk-1.0.10-1.rpm rac2:/home/oracle
    • ติดตั้ง cvuqdisk ที่ rac2 ด้วยคำสั่ง
    sudo rpm -iUvh cvuqdisk-1.0.10-1.rpm
    • สั่งคำสั่งต่อไปนี้ ที่ rac1 และ rac2
    sudo systemctl stop avahi-daemon.socket
    sudo systemctl disable avahi-daemon
    • สั่งคำสั่งต่อไปนี้ที่ rac1
    grid_env
    cd /u01/app/18.0.0.0/grid/
    ./runcluvfy.sh stage -pre crsinst -n rac1,rac2 -fixup -verbose
    • ต้องได้ผลเป็น PASSED ทั้งหมด
    • จบเตรียมเครื่อง
    https://sysadmin.psu.ac.th/2021/01/21/grid-infrastructure-%e0%b8%95%e0%b8%ad%e0%b8%99-4/
  • Grid Infrastructure 18c ตอน 2

    • ตอนสองจัดการ Shared disk
      • ล็อคอินด้วยผู้ใช้ oracle เปิด terminal พิมพ์คำสั่ง ต่อไปนี้ เพื่อเป็น root เมื่อถามรหัสผ่าน ให้ใส่รหัสผ่านของ oracle
    sudo -i
    • ตรวจสอบว่ามีแฟ้ม /etc/multipath.conf หรือไม่ หากไม่มีให้สั่งคำสั่งต่อไปนี้
    mpathconf --enable
    systemctl start multipathd
    systemctl enable multipathd
    • ตรวจสอบ shared disk ด้วยคำสั่ง
    ls -l /dev/mapper/mpath?
    shared disk
    • จะเห็นว่ามี mpatha ถึง mpathf
    • สร้าง partition บน mpatha ถึง mpathf ด้วยคำสั่ง
    fdisk  /dev/mapper/mpatha
    • สร้าง partition ใหม่ตามขั้นตอนเดิม n แล้ว enter 4 ครั้ง แล้วกด w แล้ว enter ทำจนครบ ถึง mpathf
    • เนื่องจากเป็น shared disk แบ่ง partition ที่เดียวก็จะได้ทั้งสองเครื่อง ที่ rac2 เข้าระบบด้วย oracle แล้วเป็น root ด้วยคำสั่ง
    sudo -i
    • แล้วพิมพ์คำสั่งต่อไปนี้เพื่อ update ตาราง partition
    partprobe
    • กลับมาที่ rac1 ติดตั้ง oracleasm-support และ kmod-oracleasm ด้วยคำสั่ง
    yum install -y kmod-oracleasm oracleasm-support
    • ตั้งค่า oracleasm ด้วยคำสั่ง
     oracleasm configure -i
    • แล้วกรอกตามภาพ
    oracleasm configure
    • โหลด kernel module ด้วยคำสั่ง
    oracleasm init

    ได้ผลดังภาพ

    oracleasm
    • ทำซ้ำอีกครั้งที่ rac2
    • กลับมา rac1 พิมพ์คำสั่งต่อไปนี้เพื่อสร้าง oracleasm disk โดย DISK* คือขื่อ disk
    oracleasm createdisk DISK1 /dev/mapper/mpatha1
    oracleasm createdisk DISK2 /dev/mapper/mpathb1
    oracleasm createdisk DISK3 /dev/mapper/mpathc1
    oracleasm createdisk DISK4 /dev/mapper/mpathd1
    oracleasm createdisk DISK5 /dev/mapper/mpathe1
    oracleasm createdisk DISK6 /dev/mapper/mpathf1
    • ที่ rac2 พิมพ์คำสั่ง
    oracleasm scandisks
    oracleasm scandisks
    • ที่ rac1 terminal พิมพ์ exit
      • พิมพ์ oracleasm listdisks
    • ที่ rac2 terminal พิมพ์ exit
      • พิมพ์ oracleasm listdisks
    oracleasm listdisks
    • ต้องได้ผลเหมือนกันทั้งสองเครื่อง
    • จบจัดการ shared disk
    https://sysadmin.psu.ac.th/2021/01/19/grid-infrastructure-3/
  • Grid infrastructure 18c ตอน 1

    รอบนี้จะมาติดตั้ง Oracle grid infrastructure 18c กัน

    สิ่งที่ต้องเตรียม

    • Vmware 2 เครื่อง โดยแต่ละเครื่องมีคุณสมบัติดังนี้ (ปรับลดตามความเหมาะสมได้)
      • 2 CPU 64 core
      • 128 GB Memory
      • HDD 2 ลูก
        • 300GB
        • 1TB
      • Shared Storage ครั้งนี้เลือกใช้ iSCSI 6 ลูกลูกละ 1TB
      • Network Card 3 ใบ
      • IP address โดย 4 IP วงเดียวกัน 3 IP สำหรับชื่อเรียกใน DNS วงเดียวกันกับ 4 IP แรก 2 IP คนละวง
        • rac1 1 IP สำหรับการ์ดใบแรก เป็น IP ประจำเครื่อง หรือเรียก Public IP (ens192)
        • rac2 1 IP สำหรับการ์ดใบแรก เป็น IP ประจำเครื่อง หรือเรียก Public IP (ens192)
        • rac1-vip 1 IP เป็น virtual IP ไม่ต้องใส่ในการ์ดแลน วงเดียวกันกับ IP ประจำเครื่อง เรียก Virtual IP
        • rac2-vip 1 IP เป็น virtual IP ไม่ต้องใส่ในการ์ดแลน วงเดียวกันกับ IP ประจำเครื่อง เรียก Virtual IP
        • rac-scan 3 IP ต้องจดชื่อนี้ใน DNS ด้วยโดยจดเป็น round robin วงเดียวกันกับ IP ประจำเครื่อง เรียก Scan name
        • rac1-priv 1 IP สำหรับการ์ดใบที่สอง เป็น IP สำหรับคุยกันเองใน cluster คนละวงกับ IP ประจำเครื่อง เรียก Private IP (ens224) วงเดียวกับ rac2-priv
        • rac2-priv 1 IP สำหรับการ์ดใบที่สอง เป็น IP สำหรับคุยกันเองใน cluster คนละวงกับ IP ประจำเครื่อง เรียก Private IP (ens224) วงเดียวกับ rac1-priv
        • rac1-storage 1 IP สำหรับเชื่อมต่อ iSCSI ติดต่อผู้ดูแล iSCSI (ens256)***
        • rac2-storage 1 IP สำหรับเชื่อมต่อ iSCSI ติดต่อผู้ดูแล iSCSI (ens256)***
    • Download Software
    • Oracle Enterprise Linux 7.9
      • เลือกติดตั้งดังรูปได้แก่
        • Date & Time เลือก Timezone ที่ถูกต้อง Asia/Bangkok
        • Keyboard English (US), Thai
        • Software Selection เลิอกเป็น Server with GUI
        • KDUMP เลือก Disabled
        • Security Policy เลือก ปิด เป็น No profile selectd
        • ตั้งค่า network ตามที่เขียนข้างบน
    • ขั้นตอนแบ่งดิสก์
    • เริ่มการจัดการ iSCSI ในขั้นตอนนี้
    Device Selection
    • กด Add a disk
    Add iSCSI
    • กด Add iSCSI Target…
    • ใส่ IP Address ของ iSCSI และ iSCSI Initiator Name ที่ได้จาก iSCSI Admin
    ADD iSCSI STORAGE TARGET
    • กด Start Discovery
    • ทำเครื่องหมายถูกหน้าดิสก์ที่ขึ้นมาทั้งหมด
    ADD iSCSI STORAGE TARGET
    • กด Log In จะได้
    Installation Destination
    • กดเลือกทั้งหมดแล้วกด Done จะได้
    INSTALLATION DESTINATION
    • เลือกเฉพาะ disk ขนาด 300GB และเลือก I will configure partitioning กด Done
    INSTALLATION DESTINATION
    • ตอนแบ่ง Partition เลือกเป็น LVM
      • /boot 1GB file
      • /boot/efi 200MB (default) เนื่องจากเลือก boot แบบ efi
      • / 282.8 GB file system ext4
      • swap 16GB
    Manual Portioning
    • กด Done ได้ดังรูป
    • กด Accept Changes
    • กด Begin Installation
    • ขั้นตอนสร้าง User สร้างตามรูป
    Configuration 
    • คลิก Advanced…
    • คลิกถูกในช่องสี่เหลี่ยมทั้งสองช่อง พิมพ์ 54321 ทั้งสองช่อง
    • ในช่อง Add user to the following groups: เปลี่ยนเป็นดังนี้
    wheel,oinstall(54321),oper(54322),dba(54323),backupdba(54324),dgdba(54325)
    ,kmdba(54326),asmdba(54327), asmoper(54328),asmadmin(54329),racdba(54330)
    • รอจนติดตั้งเสร็จ reboot ทำแบบเดียวกันที่ rac2
    • เริ่มการตั้งค่าที่ rac1
    • ล็อคอินด้วยผู้ใช้ oracle เปิด terminal แล้วพิมพ์คำสั่งต่อไปนี้ จะขึ้นให้ใส่ password ให้ใส่ password ของ oracle
    sudo -i
    • แก้ไขไฟล์ host ด้วยคำสั่ง
    vi /etc/hosts
    • แก้ไขให้อยู่ดังรูป
    <IP-address>  <fully-qualified-machine-name>  <machine-name>
    • ปิด selinux แก้ไขแฟ้ม /etc/selinux/config
    vi /etc/selinux/config
    • เปลี่ยน SELINUX=enforcing เป็น SELINUX=permissive
    • บันทึกแล้วออกมารันคำสั่ง
     setenforce Permissive
    • ปิด firewall ด้วยคำสั่ง
    systemctl stop firewalld
    systemctl disable firewalld
    • เปิดการทำงานของ NTP
    systemctl enable chronyd
    systemctl restart chronyd
    chronyc -a 'burst 4/4'
    chronyc -a makestep
    • ติดตั้งซอฟท์แวร์ที่จำเป็นสำหรับ Oracle 18c
    yum install oracle-database-preinstall-18c -y
    yum install binutils -y
    yum install compat-libstdc++-33 -y
    yum install compat-libstdc++-33.i686 -y
    yum install gcc -y
    yum install gcc-c++ -y
    yum install glibc -y
    yum install glibc.i686 -y
    yum install glibc-devel -y
    yum install glibc-devel.i686 -y
    yum install ksh -y
    yum install libgcc -y
    yum install libgcc.i686 -y
    yum install libstdc++ -y
    yum install libstdc++.i686 -y
    yum install libstdc++-devel -y
    yum install libstdc++-devel.i686 -y
    yum install libaio -y
    yum install libaio.i686 -y
    yum install libaio-devel -y
    yum install libaio-devel.i686 -y
    yum install libXext -y
    yum install libXext.i686 -y
    yum install libXtst -y
    yum install libXtst.i686 -y
    yum install libX11 -y
    yum install libX11.i686 -y
    yum install libXau -y
    yum install libXau.i686 -y
    yum install libxcb -y
    yum install libxcb.i686 -y
    yum install libXi -y
    yum install libXi.i686 -y
    yum install make -y
    yum install sysstat -y
    yum install unixODBC -y
    yum install unixODBC-devel -y
    yum install zlib-devel -y
    yum install zlib-devel.i686 -y
    • ปรับปรุงรุ่นของ software
    yum update -y
    • ยกเลิก virbr0 interface
    systemctl stop libvirtd.service
    systemctl disable libvirtd.service
    • จัดการกับ disk ลูก 1TB
    fdisk /dev/sdb
    • กด n แล้ว enter แล้วกด enter 4 ครั้ง
    • กด t แล้ว enter แล้วเลือก 31 กด enter
    • กด w enter
    • สร้าง sdb1 ให้เป็น LVM Physical volume
    pvcreate /dev/sdb1
    • สร้าง LVM volume group ชื่อ vg_u01
    vgcreate vg_u01 /dev/sdb1
    • สร้าง LVM logical volume group ชื่อ lv_u01 ใน volume group ที่ชื่อ vg_u01 โดยให้มีขนาดทั้งหมดที่มีอยู่ใน vg_u01
    lvcreate -n lv_u01 -l 100%FREE vg_u01
    • format LVM logical volume group lv_u01 เป็นแบบ ext4 มี Label ว่า u01
    mkfs.ext4 -L u01 /dev/vg_u01/lv_u01
    • สร้าง /u01
    mkdir /u01
    • แก้ไขแฟ้ม /etc/fstab เพิ่มบรรทัดต่อไปนี้ต่อท้าย
    LABEL=u01               /u01                    ext4    defaults        1 1
    • สั่งให้ mount /u01 ด้วยคำสั่ง
    mount -a
    • ตรวจสอบว่า mount ได้หรือไม่
    df -h
    • ได้ผลประมาณว่า
    • จบการจัดการ disk 1TB
    • ต่อมาสร้างโฟลเดอร์ ที่จำเป็นสำหรับ grid infrastructure และ oracle database
    mkdir -p /u01/app/18.0.0.0/grid
    mkdir -p /u01/app/oracle/product/18.0.0.0/db_1
    chown -R oracle:oinstall /u01/app
    chmod -R 775 /u01/app
    • พิมพ์ logout เพื่อออกจาก user root แล้วกลับเป็น user oracle
    • สร้างโฟลเดอร์ /home/oracle/scripts
    mkdir -p /home/oracle/scripts
    • สร้างแฟ้ม /home/oracle/scripts/setEnv.sh มีข้อความว่า โดย rac1.x.x.x คือชื่อเต็มของ rac1 หรือ rac2 ตามเครื่องที่ทำ ORACLE_SID ก็ต้องเป็น regist1 สำหรับ rac1 และ regist2 สำหรับ rac2
    cat > /home/oracle/scripts/setEnv.sh <<EOF
    # Oracle Settings
    export TMP=/tmp
    export TMPDIR=\$TMP
    export ORACLE_HOSTNAME=rac1.x.x.x  #เปลี่ยน   
    export ORACLE_UNQNAME=regist   #เปลี่ยน
    export ORACLE_BASE=/u01/app/oracle
    export GRID_HOME=/u01/app/18.0.0.0/grid
    export DB_HOME=\$ORACLE_BASE/product/18.0.0.0/db_1
    export ORACLE_HOME=\$DB_HOME
    export ORACLE_SID=regist1 #เปลี่ยน
    export ORACLE_TERM=xterm
    export BASE_PATH=/usr/sbin:\$PATH
    export PATH=\$ORACLE_HOME/bin:\$BASE_PATH
    export LD_LIBRARY_PATH=\$ORACLE_HOME/lib:/lib:/usr/lib
    export CLASSPATH=\$ORACLE_HOME/JRE:\$ORACLE_HOME/jlib:\$ORACLE_HOME/rdbms/jlib
    alias grid_env='. /home/oracle/scripts/grid_env'
    alias db_env='. /home/oracle/scripts/db_env'
    EOF
    • เพิ่ม script /home/oracle/scripts/setEnv.sh ให้ทำงานทุกครั้งที่ Login
    cat >> /home/oracle/.bashrc <<EOF
    . /home/oracle/scripts/setEnv.sh
    EOF
    • สร้างแฟ้ม /home/oracle/scripts/grid_env และแฟ้ม /home/oracle/scripts/db_env ด้วยคำสั่ง
    cat > /home/oracle/scripts/grid_env <<EOF
    export ORACLE_SID=+ASM1
    export ORACLE_HOME=\$GRID_HOME
    export PATH=\$ORACLE_HOME/bin:\$BASE_PATH
    export LD_LIBRARY_PATH=\$ORACLE_HOME/lib:/lib:/usr/lib
    export CLASSPATH=\$ORACLE_HOME/JRE:\$ORACLE_HOME/jlib:\$ORACLE_HOME/rdbms/jlib
    EOF
    
    cat > /home/oracle/scripts/db_env <<EOF
    export ORACLE_SID=regist1
    export ORACLE_HOME=\$DB_HOME
    export PATH=\$ORACLE_HOME/bin:\$BASE_PATH
    export LD_LIBRARY_PATH=\$ORACLE_HOME/lib:/lib:/usr/lib
    export CLASSPATH=\$ORACLE_HOME/JRE:\$ORACLE_HOME/jlib:\$ORACLE_HOME/rdbms/jlib
    EOF
    • reboot ด้วยคำสั่งต่อไปนี้ หากขึ้นให้ใส่ password ให้กรอก password ของ oracle
    sudo reboot
    • ทำซ้ำที่ rac2 อีกเครื่อง
    https://sysadmin.psu.ac.th/2021/01/18/grid-infrastructure-18c-2/

  • ORA-31623: a job is not attached to this session via the specified handle

    • ปัญหา
      • พยายามใช้ expdp แล้วเกิด error

    UDE-31623: operation generated ORACLE error 31623
    ORA-31623: a job is not attached to this session via the specified handle
    ORA-06512: at “SYS.DBMS_DATAPUMP”, line 3905
    ORA-06512: at “SYS.DBMS_DATAPUMP”, line 5203
    ORA-06512: at line 1

    งานมา…
    • เมื่อค้นข้อมูลไปเรื่อย ๆ จะพบว่าอาจเกี่ยวของกับการปรับแต่งค่าต่างๆ เกี่ยวกับ memory ซึ่งก็ได้ทำไปจริงนั่นคือการปรับ shared_pool_size ให้มีขนาดมากขึ้นทำให้หน่วยความจำสำหรับทำเรื่อง expdp ไม่พอ
    • แก้ไขได้ด้วยการลดค่า shared_pool_size ลง ด้วยคำสั่ง
    SQL> alter system set shared_pool_size=5G scope=both;
    • เพื่อปรับขนาด shared_pool_size ให้เป็น 5GB
    • และอาจต้องเพิ่ม streams_pool_size เพราะไม่ได้ลด shared_pool_size ให้เท่าเดิม เนื่องจากมีการเพิ่มหน่วยความจำของระบบให้มากขึ้นแล้ว ด้วยคำสั่ง
    SQL> alter system set streams_pool_size=128M scope=both;
    • เพื่อปรับ streams_pool_size ให้เป็น 128MB
    • และยังมี parameter บางตัวที่อาจเกี่ยวข้อง เช่น db_cache_size เป็นต้น
    • แต่ในครั้งนี้ปรับแค่สองอย่าง คือ shared_pool_size และ streams_pool_size ก็สามารถแก้ปัญหานี้ได้
    • จบ
    • ขอให้สนุก

    อ้างอิง

    ORA-31623: a job is not attached to this session via the specified handle
    UDI-31623: operation generated ORACLE error 31623 / ORA-31623

  • Oracle User expire โดยไม่ทราบสาเหตุ

    นักพัฒนาบางท่านที่เพิ่งเริ่มพัฒนาระบบบนฐานข้อมูล Oracle อาจจะเคยเจอปัญหาเมื่อใช้ Oracle ตั้งแต่เวอร์ชัน 11 เป็นต้นไป นั่นคือ เมื่อสร้าง user บน Oracle และใช้งานไปได้ซักระยะอยู่ ๆ user นี้ก็เกิดก็ expire โดยที่ไม่ได้มีใครเข้าแก้ไขการตั้งค่าของ user นี้ ซึ่งเหตุการณ์นี้อาจจะมีสาเหตุแบบเดียวกับที่จะนำเสนอในบทควาามนี้ก็เป็นได้

    หมายเหตุ ในบทความนี้จะใช้ Oracle SQL Developer ซึ่งเป็นเครื่องมือในการเข้าถึงและจัดการฐานข้อมูล Oracle มาช่วยในการอธิบายเพื่อให้เห็นภาพได้ง่ายขึ้น

    ขั้นตอนการตรวจสอบที่มาของปัญหาและการแก้ไข

    1. login ด้วย sys
    2. ตรวจสอบการตั้งค่า Default Profile โดยเลือกเมนู View –> DBA

    3. ในหน้าต่าง DBA เลือกเพิ่มการเชื่อมต่อโดย SYS

    4. ไปที่การตั้งค่า Default Profile

    5. คลิกขวาที่ Default แล้วเลือก Edit

    6. จะปรากฏหน้าต่าง Default Profile

    ซึ่งใน Oracle 11 เป็นต้นไป หลังจากติดตั้งและสร้าง Database แล้ว ใน Default Profile จะมีการตั้งค่าเริ่มต้นไว้ดังรูป โดย Default Profile จะมีผลกับ user ที่ถูกสร้างใหม่ และค่าที่ทำให้ user หมดอายุโดยอัตโนมัติก็คือ “Expire in (days)” นั่นเอง จึงเป็นที่มาของการที่ user expire เองโดยที่ไม่ได้มีการเข้าไปแก้ไขข้อมูลใด ๆ ของ user นี้

    7. การแก้ไขไม่ให้ user ที่สร้างใหม่ expire อัตโนมัติ ทำได้โดยการแก้ค่า “Expire in (days)” ให้เป็น UNLIMITED

    เมื่อแก้ไขแล้ว user ใหม่ที่ถูกสร้างหลังจากนี้ก็จะใช้งานได้ตลอดไม่มีวัน expire แต่ส่วนของ user ที่เคยสร้างไปก่อนหน้านี้ ผู้พัฒนาจะต้องเข้าไปปรับแก้วันที่ expire เป็นราย user ไป