Friday, April 30, 2010

เซ็ท Parameter ผิด คิดจนหัวบวม

ถ้าเราเซ็ทพารามิเตอร์บางตัวผิด (Oracle ไม่สามารถยอมรับค่านั้นได้) อาจจะทำให้เราไม่สามารถ Startup Database ได้ ดังเช่นตัวอย่างของการตั้งค่าพารามิเตอร์ SGA_MAX_SIZE ซึ่งจะต้อง Restart ระบบฯ หากค่าที่กำหนดเป็นค่าที่ไม่สามารถยอมรับได้ (Invalid) จะทำให้ระบบฯ Startup ไม่ขึ้น ดังเรื่องของสมสรวงที่จะกล่าวถึงต่อไปนี้

สมสรวง ต้องการเพิ่มหน่วยความจำให้กับระบบฐานข้อมูลออราเคิล โดยเขาต้องการให้ฐานข้อมูลใช้หน่วยความจำ 6GB โดยการเซ็ทพารามิเตอร์ SGA_TARGET ซึ่งสามารถทำได้โดยไม่ต้อง Restart ระบบฯ โดย Server มีหน่วยความจำทั้งหมดอยู่ 8GB บนเครื่อง โดยเขาต้องการเซ็ท SGA_MAX_SIZE ให้มากที่สุดเท่าที่จะทำได้ เขาจึงตัดสินใจเซ็ท SGA_MAX_SIZE ให้เท่ากับหน่วยความจำทั้งหมดที่มี

พารามิเตอร์ SGA_MAX_SIZE ใช้ในการกำหนดลิมิตสูงสุดของหน่วยความจำที่สามารถกำหนดให้ SGA_TARGET ได้ เป็นพารามิเตอร์ที่ต้อง Restart ระบบฐานข้อมูลจึงจะมีผล ในขณะที่พารามิเตอร์ SGA_TARGET สามารถกำหนดได้โดยไม่ต้อง Restart ระบบฯ

SQL> alter system set sga_max_size=8g scope=spfile;

System altered.

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORA-27102: out of memory
OSD-00022: additional error information
O/S-Error: (OS 8) Not enough storage is available to process this command.

เนื่อง จาก SGA_MAX_SIZE เป็นพารามิเตอร์ที่ต้องการการ Restart ระบบฐานข้อมูล แต่เมื่อเขา Startup ฐานข้อมูลปรากฎว่าเขาพบ Error ORA-27102: out of memory และไม่สามารถที่จะเปิดฐานข้อมูลได้เลย

สาเหตุที่เป็นเช่นนี้ เนื่องจาก เมื่อสมสรวงใช้คำสั่ง alter system set sga_max_size=8g scope=spfile นั้น ออราเคิลจะบันทึกค่าของพารามิเตอร์นี้ไว้ในไฟล์ %ORACLE_HOME%\dbs\SPFILEsid.ORA และเมื่อสมสรวงใช้คำสั่ง STARTUP เพื่อเปิดระบบฐานข้อมูล ออราเคิลจะไปอ่านพารามิเตอร์ในไฟล์นี้ในการเปิดระบบ เนื่องจากค่าที่ระบุ SGA_MAX_SIZE มีขนาดเกินกว่าที่หน่วยความจำที่มี (หน่วยความจำที่มีอยู่ 8G นั้นส่วนหนึ่งถูกใช้ไปโดย O/S) จึงไม่สามารถเปิดระบบฐานข้อมูลได้

ผมว่าออราเคิลน่าจะมีฟังก์ชันในการตรวจสอบพารามิเตอร์ใน SPFile ก่อนที่จะยอมปิดระบบฐานข้อมูล และแจ้งเตือนให้ผู้บริหารระบบทราบถึงผล (Error) อันอาจจะเกิดขึ้นหากมีการ Startup ด้วย SPFile ตัวปัจจุบัน

การแก้ไข
ใน %ORACLE_BASE%\admin\orcl10g\pfile\ มีไฟล์พารามิเตอร์ชื่อ init.ora.xxxxxxxxxxxx อยู่ ซึ่งเป็นเท็กซ์ไฟล์ธรรมดา (ต่างจาก SPFile ซึ่งเป็น Binary) เราสามารถเลือกที่จะ Startup ระบบฯ ด้วยไฟล์พารามิเตอร์ตัวนี้แทน SPFile ได้ เราเรียกไฟล์นี้ว่า Pfile (Parameter File) เป็นไฟล์ลูกพี่ลูกน้องกับ Server Parameter File (SPFile) ซึ่งค่าของพารามิเตอร์ที่กำหนดไว้ภายในอาจจะเหมือนหรือต่างกันก็ได้

และ เนื่องจากการที่เราพยายาม Startup ด้วย SPFile ครั้งล่าสุดทำให้ระบบจำค่าพารามิเตอร์ที่ผิดเอาไว้ เราจึงจะต้องเคลียร์ค่าเหล่านี้โดยปิด Service => ลบหรือเปลี่ยนชื่อของ SPFile (ตัวเก่า) => แล้วเปิด Service ใหม่ => แล้วจึง Startup ระบบฯ ด้วย PFile

SQL> host
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\Documents and Settings\tanakorn>oradim -shutdown -shuttype srvc -sid orcl10g

C:\Documents and Settings\tanakorn>ren C:\oracle\product\10.2.0\db_1\dbs\spfileorcl10g.ora spfileorcl10g_ori.ora

C:\Documents and Settings\tanakorn>oradim -startup -sid orcl10g

C:\Documents and Settings\tanakorn>exit

SQL> conn / as sysdba
Connected to an idle instance.
SQL> startup pfile='C:\oracle\product\10.2.0\admin\orcl10g\pfile\init.ora.312255320268'
ORACLE instance started.

Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 167775108 bytes
Database Buffers 436207616 bytes
Redo Buffers 7135232 bytes
Database mounted.
Database opened.

หลังจากที่เราเปิดระบบฯ ได้แล้ว เราควรจะสร้าง SPFile จาก Pfile ที่เราใช้ในการเปิดระบบฯ เอาไว้ เนื่องจาก SPFile ตัวเก่าใช้ไม่ได้แล้ว เมื่อสร้างเสร็จแล้วให้ Restart ระบบฯ อีกทีเพื่อให้ระบบฯ กลับมาใช้ SPFile อย่างเดิม

การเปิดฐานข้อมูลด้วย SPFile มีประโยชน์ที่เห็นได้ชัดคือทำให้เราสามารถที่จะเปลี่ยนค่าในพารามิเตอร์ได้ โดยสะดวก โดยไม่ต้องไปแก้ไขในเท็กซ์ไฟล์อย่าง PFile

SQL> create spfile from pfile='C:\oracle\product\10.2.0\admin\orcl10g\pfile\init.ora.312255320268';

File created.

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 167775108 bytes
Database Buffers 436207616 bytes
Redo Buffers 7135232 bytes
Database mounted.
Database opened.
SQL>

เป็นการเตรียมการที่ดีที่จะสร้าง PFile จาก SPFile ตัวปัจจุบันทุกครั้้ง ก่อนที่จะแก้ไขพารามิเตอร์ที่จะต้องทำการ Restart ระบบฯ เพื่อที่หากเกิดปัญหาจะสามารถนำเอา PFile ตัวนั้นมาใช้ Start ระบบฯได้เลย จากตัวอย่างเราใช้ไฟล์เก่า ซึ่งพารามิเตอร์บางตัวอาจจะไม่เหมือนกับที่ปรากฏใน SPFile ซึ่งอัพเดทกว่าเสมอ

SQL> conn / as sysdba
Connected.
SQL> create pfile from spfile;

File created.

Pfile ที่สร้างขึ้นโดยดีฟอลต์จะไปอยู่ที่ %ORACLE_HOME%\database\ (หรือในกรณีนี้คือ C:\oracle\product\10.2.0\db_1\database\)

No comments:

Post a Comment