STARTUP กับ SHUTDOWN ของ Oracle เกิดอะไรขึ้นบ้างในแต่ละขั้น
STARTUP เดินสามขั้นคือ NOMOUNT สร้าง instance ขึ้นมา MOUNT อ่าน control file ให้รู้ว่าไฟล์อยู่ไหน แล้ว OPEN เปิด datafile ให้ผู้ใช้เข้าทำงาน ที่ต้องแยกขั้นเพราะงานซ่อมบำรุงหลายอย่างทำได้เฉพาะตอน NOMOUNT หรือ MOUNT ส่วน SHUTDOWN ให้ใช้ IMMEDIATE เป็นปกติ และ ABORT ไม่ทำข้อมูลที่ commit แล้วหายเพราะ redo log จดก่อน commit เสมอ แต่แลกด้วยเวลา instance recovery ตอนเปิดใหม่
มีคำถามคู่หนึ่งที่ตามมาแทบทุกครั้งเวลาสอนเรื่องการดูแลฐานข้อมูล
"อาจารย์ครับ SHUTDOWN ABORT แล้วข้อมูลหายไหม" กับอีกคำถามคือ "ทำไม STARTUP ต้องมีหลายขั้น กดเปิดทีเดียวไม่ได้เหรอ"
สองคำถามนี้ตอบไม่ยากครับ แต่คนที่ทำงานจริงจำนวนไม่น้อยใช้คำสั่งพวกนี้แบบท่องสูตรมา พอถึงวันที่ระบบมีปัญหาแล้วต้องเปิดทีละขั้น เลยไปต่อไม่ถูก วันนี้มาไล่ดูกันว่าข้างในมันทำอะไรบ้าง
ก่อนอื่น instance กับ database ไม่ใช่อย่างเดียวกัน
ตรงนี้เป็นจุดที่นักศึกษาสับสนบ่อยที่สุด เลยขอปูก่อน
database คือไฟล์ที่นอนอยู่บนดิสก์ ทั้ง datafile ที่เก็บข้อมูลจริง redo log ที่จดบันทึกการเปลี่ยนแปลง และ control file ที่เก็บแผนผังว่าไฟล์อะไรอยู่ตรงไหน ปิดเครื่องไปมันก็ยังอยู่
instance คือหน่วยความจำกับกลุ่มโปรเซสที่ทำงานอยู่ในเครื่อง เป็นตัวกลางที่คอยหยิบข้อมูลจากไฟล์มาให้เรา ปิดเครื่องเมื่อไหร่มันหายไปทันที
ลองนึกภาพห้องสมุด ตัวหนังสือบนชั้นคือ database ส่วนบรรณารักษ์กับโต๊ะทำงานคือ instance หนังสือมีอยู่แล้วแม้ไม่มีใครอยู่ แต่ถ้าไม่มีบรรณารักษ์ก็ไม่มีใครหยิบให้เรา
เข้าใจตรงนี้แล้ว เรื่อง STARTUP จะง่ายขึ้นเยอะ
STARTUP เดินทีละสามขั้น
STARTUP NOMOUNT; -- ขั้น 1
STARTUP MOUNT; -- ขั้น 2
STARTUP; -- ขั้น 3 คือ OPEN เป็นค่าปกติ
NOMOUNT Oracle อ่านไฟล์คอนฟิกแล้วสร้าง instance ขึ้นมา จองหน่วยความจำ ปลุกโปรเซสเบื้องหลังให้มาทำงาน ขั้นนี้ยังไม่รู้จัก database เลยด้วยซ้ำ รู้แค่ว่าตัวเองควรมีหน้าตาแบบไหน
MOUNT ตอนนี้ Oracle เปิดอ่าน control file จึงรู้แล้วว่าไฟล์ของ database อยู่ที่ไหนบ้าง แต่ยังไม่เปิดไฟล์ให้ใครใช้ เหมือนบรรณารักษ์รู้ว่าหนังสืออยู่ชั้นไหน แต่ยังไม่เปิดประตูให้คนเข้า
OPEN เปิด datafile กับ redo log จริง ตรวจว่าทุกอย่างสอดคล้องกันดี แล้วเปิดให้ผู้ใช้เข้ามาทำงาน
ปกติเราสั่ง STARTUP เฉย ๆ Oracle ก็วิ่งครบสามขั้นให้เอง แล้วจะแยกขั้นไปทำไม เพราะงานซ่อมบำรุงหลายอย่างต้องหยุดกลางทาง เช่นการเปิดโหมดเก็บ archive log ต้องทำตอนอยู่ MOUNT เท่านั้น
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
การกู้ control file ต้องทำตอน NOMOUNT ส่วนการย้าย datafile ต้องทำตอน MOUNT ถ้าไม่รู้ว่าแต่ละขั้นทำอะไร พอเจอสถานการณ์จริงจะงงว่าทำไมสั่งไปแล้วมันไม่ยอม
ดูใน lab ให้เห็นกับตา
ถ้ามีเครื่องทดสอบ ลองรันตามนี้แล้วสังเกตค่า STATUS ที่เปลี่ยนไปทีละขั้น
SHUTDOWN IMMEDIATE;
STARTUP NOMOUNT;
SELECT status FROM v$instance; -- STARTED
ALTER DATABASE MOUNT;
SELECT status FROM v$instance; -- MOUNTED
ALTER DATABASE OPEN;
SELECT status FROM v$instance; -- OPEN
สังเกตว่าเราเดินหน้าทีละขั้นด้วย ALTER DATABASE ได้ ไม่ต้องปิดเปิดใหม่ แต่ถอยหลังไม่ได้นะครับ จาก OPEN จะกลับไป MOUNT เฉย ๆ ไม่ได้ ต้องปิดแล้วเปิดใหม่ให้ถึงขั้นที่ต้องการ นี่คือเหตุผลที่งานอย่างการเปิดโหมด archive ต้องวางแผนช่วงหยุดระบบไว้ก่อน
SHUTDOWN มีสี่แบบ ต่างกันที่ความใจเย็น
SHUTDOWN NORMAL;
SHUTDOWN TRANSACTIONAL;
SHUTDOWN IMMEDIATE;
SHUTDOWN ABORT;
NORMAL รอให้ทุกคนออกจากระบบเอง ฟังดูสุภาพดี แต่ในทางปฏิบัติแทบไม่มีใครใช้ เพราะถ้ามีใครสักคนเปิดหน้าจอค้างไว้แล้วไปกินข้าว เราก็รอไปเรื่อย ๆ
TRANSACTIONAL ใจดีน้อยลงหน่อย รอเฉพาะให้งานที่ทำค้างอยู่จบก่อน แล้วค่อยไล่ออก
IMMEDIATE ตัดการเชื่อมต่อทั้งหมด ย้อนงานที่ยังไม่ยืนยันกลับคืน แล้วปิดอย่างเรียบร้อย อันนี้คือตัวที่ควรใช้เป็นปกติ เปิดครั้งหน้าไม่ต้องซ่อมอะไร
ABORT ดับทันที เหมือนถอดปลั๊ก ไม่ย้อนงาน ไม่บันทึกอะไรเพิ่ม
กลับมาที่คำถามยอดฮิต ABORT ทำข้อมูลหายไหม
ข้อมูลที่ commit แล้วไม่หายครับ
เหตุผลอยู่ที่ redo log ทุกครั้งที่เรา commit Oracle จะจดบันทึกลง redo log ให้เรียบร้อยก่อนถึงจะตอบกลับมาว่าสำเร็จ เพราะฉะนั้นต่อให้ไฟดับกลางคัน ข้อมูลนั้นก็ถูกจดไว้แล้ว พอเปิดเครื่องใหม่ Oracle จะเอา redo มาไล่ทำซ้ำให้ครบเอง ส่วนงานที่ยังไม่ commit ก็ถูกย้อนกลับทิ้งตามหลักการของ transaction ที่เราเรียนกันมา
สิ่งที่เสียจริงคือเวลา การซ่อมตอนเปิดเครื่องใหม่อาจกินเวลานานถ้ามีงานค้างเยอะ และถ้าใช้ ABORT จนติดเป็นนิสัย วันหนึ่งไปเจอจังหวะที่ระบบกำลังทำงานสำคัญอยู่พอดี จะยุ่งกว่าที่คิด
หลักที่ผมสอนเสมอคือ ใช้ IMMEDIATE เป็นปกติ เก็บ ABORT ไว้เป็นทางเลือกสุดท้ายตอนที่ IMMEDIATE ค้างจริง ๆ
คำถามที่มักตามมาอีกสองข้อ
"IMMEDIATE ค้างนานมาก ทำยังไงดี" ส่วนใหญ่เกิดจากมีงานใหญ่กำลังถูกย้อนกลับอยู่ หรือมีการเชื่อมต่อค้างในสถานะแปลก ๆ เปิดอีกหน้าจอไปดู alert log ก่อนว่าเกิดอะไรขึ้น ถ้าจำเป็นจริงค่อยใช้ ABORT แล้วยอมรับว่าตอนเปิดจะช้าหน่อย ดีกว่านั่งรอโดยไม่รู้สาเหตุ
"STARTUP FORCE คืออะไร" มันคือ ABORT บวก STARTUP ในคำสั่งเดียว ใช้ตอน instance ค้างจนสั่งอะไรไม่ได้ สะดวกดี แต่ความหมายเท่ากับถอดปลั๊กแล้วเสียบใหม่ ใช้ด้วยความระวังแบบเดียวกับ ABORT
สรุป
STARTUP เดินสามขั้นคือ NOMOUNT สร้าง instance ขึ้นมา MOUNT อ่านผังจาก control file แล้ว OPEN เปิดให้ใช้จริง ที่ต้องรู้ว่ามีสามขั้นเพราะงานซ่อมบำรุงหลายอย่างต้องหยุดกลางทาง ส่วน SHUTDOWN ให้ใช้ IMMEDIATE เป็นปกติไว้ก่อน ABORT ไม่ได้ทำข้อมูลที่ commit แล้วหาย แต่แลกด้วยเวลาซ่อมตอนเปิดใหม่ อยากรู้ว่าตอนนี้อยู่ขั้นไหนก็ถามมันตรง ๆ ด้วย SELECT status FROM v$instance
ผมเขียนเรื่อง Oracle และ SQL แบบนี้ทุกสัปดาห์ ทั้งทิปสั้นและเคสที่เจอกันบ่อยในวงการ ติดตามได้ที่เพจ Facebook อาจารย์ตี๋ที่สอน Oracle ครับ