SlideShare ist ein Scribd-Unternehmen logo
1 von 32
การตรวจเช็คฐานข้อมูล Oracle (v. 1) <br />หลายครั้งที่ผู้เริ่มต้นใช้งานฐานข้อมูล Oracle และต้องรับหน้าที่เป็นผู้ดูแลฐานข้อมูล อาจตั้งคำถามให้กับตัวเองว่าอะไรบ้างที่เราต้องรู้ในการตรวจเช็ค ตรวจสอบฐานข้อมูล เราสามารถอ่าน ค้นคว้าสิ่งต่างๆ เกี่ยวกับฐานข้อมูล Oracle ได้บน http://otn.oracle.com http://tahiti.oracle.com http://forums.oracle.com http://support.oracle.com หรือหาสิ่งที่อยากรู้ ได้บน google ด้วยตัวเอง <br />บทความนี้ได้ใช้ไอเดียจาก My Oracle Support พร้อมกันนี้ได้ดัดแปลง ทดสอบ เพื่อนำมาเสนอ และหวังว่าจะมีประโชยน์ต่อผู้อ่าน1. Parameter file - parameter ไฟล์ มี 2 แบบ คือ text ไฟล์ (pfile) และ binary ไฟล์ (spfile), pfile สามารถแก้ไขได้ด้วย Editor บน OS นั้นๆ ส่วน spfile ต้องจัดการผ่าน Instance ของมันเองตั้งแต่ Oracle 8i เราใช้ text ไฟล์ที่เรียกว่า pfile (parameter file) ในการเก็บ database initialization parameters ซึ่ง pfile นี้จะถูกอ่านเมื่อ Instance เริ่มต้น(startup) การเปลี่ยนค่าอะไรก็ตามใน pfile จะมีผลก็ต่อเมื่อฐานข้อมูล มีการเริ่มต้นใหม่(restart) แต่ parameter(dynamic)ก็ยังสามารถเปลี่ยนแปลงได้ด้วย ALTER SYSTEM หรือ ALTER SESSION ซึ่งจะมีผลทันทีจากนั้น Oracle 9i มีฟีเจอร์ที่เรียกว่า spfile (server parameter file) ซึ่งเป็น binary ไฟล์ และเก็บข้อมูล เหมือนกับ pfile การเปลี่ยนแปลงใน spfile ต้องทำผ่่าน Instance โดยการใช้ ALTER SYSTEMSPFILE อนุญาติให้มีการเปลี่ยนแปลงแบบ (dynamic) โดยไม่ต้องหยุด Instance และ spfile ยังใช้ในการแชร์บน RAC, ในการเริ่มต้น Instance นั้นถ้าเราไม่ระบุ pfile - Oracle จะใช้ spfile ในการเริ่มต้น Instance (startup)การเซตค่า Server Parameter File:ใช้ SID เพื่อกำหนดค่าเฉพาะแต่ละ Instance (เห็นได้ชัดบน RAC), ใช้ '*' สำหรับทุกๆ Instance ในฐานข้อมูลเช่น<br />db2.thread=2db1.thread=1*.undo_management='AUTO'*.undo_retention=3600db2.undo_tablespace='UNDOTBS2'db1.undo_tablespace='UNDOTBS1'<br />กับ Parameter ที่เป็น dynamic เราสามารถใช้ ALTER SESSION หรือ ALTER SYSTEM เปลี่ยนแปลงขณะที่ Instance ยังทำงานอยู่<br />ALTER SESSION SET parameter_name = valueALTER SYSTEM SET parameter_name = value [DEFERRED]<br />สำหรับ ALTER SYSTEM เราสามารถกำหนด SCOPE เพื่อระบุขอบเขตในการเปลี่ยนแปลงSCOPE = SPFILE - เหมาะกับ parameter ที่เป็น dynamic และ static เมื่อเปลี่ยนแปลงใน spfile ไฟล์ จะมีผลหลังจากเริ่มต้นใหม่ครั้งต่อไป (restart)SCOPE = MEMORY - เหมาะกับ parameter ที่เป็น dynamic การเปลี่ยนแปลงจะเปลี่ยนเพียงใน หน่วยความจำเท่านั้นSCOPE = BOTH - เหมาะกับ parameter ที่เป็น dynamic จะเปลี่ยนทั้งใน spfile ไฟล์ และ หน่วยความจำ<br />หากไม่ระบุ SCOPE = BOTH (default)<br />เช่น<br />SQL> show parameter open_cursorsNAME TYPE VALUE------------------------------------ ----------- ------------------------------open_cursors integer 300SQL> alter system set open_cursors=100 scope=MEMORY;System altered.SQL> show parameter open_cursors;NAME TYPE VALUE------------------------------------ ----------- ------------------------------open_cursors integer 100SQL> select sid, name, value from v$spparameter where name='open_cursors';SID NAME VALUE----- -------------------- ----------* open_cursors 300SQL> alter system set open_cursors=200 scope=BOTH;System altered.SQL> show parameter open_cursors;NAME TYPE VALUE------------------------------------ ----------- ------------------------------open_cursors integer 200SQL> select sid, name, value from v$spparameter where name='open_cursors';SID NAME VALUE----- -------------------- ----------* open_cursors 200SQL> alter system set open_cursors=300 scope=SPFILE;System altered.SQL> show parameter open_cursors;NAME TYPE VALUE------------------------------------ ----------- ------------------------------open_cursors integer 200SQL> select sid, name, value from v$spparameter where name='open_cursors';SID NAME VALUE----- -------------------- ----------* open_cursors 300SQL> alter system set open_cursors=300 sid='TEST' scope=SPFILE;System altered.SQL> select sid, name, value from v$spparameter where name='open_cursors';SID NAME VALUE----- -------------------- ----------* open_cursors 300TEST open_cursors 300SQL> alter system reset open_cursors sid='TEST' scope=SPFILE;System altered.SQL> select sid, name, value from v$spparameter where name='open_cursors';SID NAME VALUE----- -------------------- ----------* open_cursors 300<br />จากตัวอย่างข้างบนยังแสดงให้ เห็นว่าเรายังสามารถใช้ SID='...' เป็นอะไรก็ได้ และการใช้ ALTER SYSTEM RESET<br />การตรวจสอบว่าใช้ spfile หรือไม่ (อ้างอิง)<br />SQL> show parameter spfileNAME TYPE VALUE------------------------------------ ----------- ------------------------------spfile string /oracle/11gR1/dbs/spfileorcl.oraSQL> select isspecified, count(*) from v$spparameter group by isspecified;ISSPEC COUNT(*)------ ----------TRUE 23FALSE 267<br />หากต้อง การนำ SPFILE ออกมาเป็น text ไฟล์ - ทำได้โดยCREATE PFILE FROM SPFILEเช่น<br />SQL> create pfile='/tmp/pfile' from spfile;File created.<br />ในมุมกลับกัน หากต้องการเปลี่ยนจาก pfile เป็น spfileCREATE SPFILE FROM PFILE<br />เช่น<br />SQL> create spfile from pfile;<br />หรือ<br />SQL> create spfile from pfile='/tmp/pfile';<br />จาก นั้น stop/start ฐานข้อมูล<br />SQL> show parameter spfile;NAME TYPE VALUE------------------------------------ ----------- ------------------------------spfile stringSQL> create spfile from pfile;File created.SQL> shutdown immediate;SQL> startupSQL> show parameter spfile;NAME TYPE VALUE------------------------------------ ----------- ------------------------------spfile string /oracle/11gR1/dbs/spfileorcl.ora<br />หมายเหตุ เราจะรู้ได้อย่างไรว่า Initialization parameters ตัวไหนที่เราสามารถเปลี่ยนแปลง (ALTER SYSTEM SET) และมีผลในทันที<br />SQL> select name, value from v$parameter where ISSYS_MODIFIABLE='IMMEDIATE';<br />2. Control files - Control file เก็บข้อมูล - ชื่อฐานข้อมูล, เวลาที่ฐานข้อมูลถูกสร้าง, ชื่อและที่เก็บของ datafile/redo log ไฟล์ และอื่นๆ ที่จำเป็นในฐานข้อมูล, และแนะนำควรมีอย่างน้อย 2 ไฟล์ เก็บบน physical disk ที่ต่างกัน พร้อมกับ backup<br />SQL> select status, name from v$controlfile;STATUS NAME------- -----------------------------------------------------------------/oracle/oradata/ORCL/controlfile/o1_mf_5twzvtgn_.ctl/oracle/flash_recovery_area/ORCL/controlfile/o1_mf_5twzvtoh_.ctl<br />Initialization parameter ที่เกี่ยวข้องCONTROL_FILES - ชื่อของ controlfiles (ชื่อไฟล์)CONTROL_FILE_RECORD_KEEP_TIME- จำนวนวันที่เก็บข้อมูลใน controlfile ก่อนจะถูกเขียนทับ<br />Control file มีการเก็บข้อมูล 2 ประเภท- ข้อมูลที่จำเป็นสำหรับฐานข้อมูล และจะไม่ถูกเขียนทับ เช่น datafile, online redo log- ข้อมูลเกี่ยวกับ RMAN ที่ backup และใช้ในการ recovery ซึ่งจะถูกเขียนทับได้CONTROLFILE AUTOBACKUP<br />RMAN> show all;CONFIGURE CONTROLFILE AUTOBACKUP OFF; # defaultRMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;new RMAN configuration parameters:CONFIGURE CONTROLFILE AUTOBACKUP ON;new RMAN configuration parameters are successfully stored<br />ทุกๆ ครั้งหลัง backup หรือเปลี่ยนแปลงเกี่ยวกับ Tablespace, เพิ่ม redo log - oracle จะ backup control file โดยอัตโนมัติ (อ้าง อิง)เช่น<br />RMAN> backup datafile 1;Starting backup at 19-APR-10allocated channel: ORA_DISK_1channel ORA_DISK_1: SID=141 device type=DISKchannel ORA_DISK_1: starting full datafile backup setchannel ORA_DISK_1: specifying datafile(s) in backup setinput datafile file number=00001 name=/oracle/oradata/ORCL/datafile/o1_mf_system_5twzp126_.dbfchannel ORA_DISK_1: starting piece 1 at 19-APR-10channel ORA_DISK_1: finished piece 1 at 19-APR-10piece handle=/oracle/flash_recovery_area/ORCL/backupset/2010_04_19/o1_mf_nnndf_TAG20100419T231236_5ws07tyl_.bkp tag=TAG20100419T231236 comment=NONEchannel ORA_DISK_1: backup set complete, elapsed time: 00:02:38Finished backup at 19-APR-10Starting Control File and SPFILE Autobackup at 19-APR-10 piece handle=/oracle/flash_recovery_area/ORCL/autobackup/2010_04_19/o1_mf_s_716771721_5ws0f47f_.bkp comment=NONE Finished Control File and SPFILE Autobackup at 19-APR-10<br />การ backup Control file:- backup เป็น binary fileALTER DATABASE BACKUP CONTROLFILE TO '/oracle/backup/control.bkp';- สร้าง SQL statement เพื่อใช้ recreate control fileALTER DATABASE BACKUP CONTROLFILE TO TRACE;ALTER DATABASE BACKUP CONTROLFILE TO TRACE AS '/oracle/backup/control.sql';จะเห็นว่า Control file เป็นสิ่งที่สำคัญมาก จึงจำเป็นที่จะต้อง ตรวจสอบและ BACKUP(เสมอ)<br />ตัวอย่าง Multiplex controlfiles เมื่อใช้งาน ASM DiskGroup<br />SQL> show parameter control_files<br />NAME                                 TYPE        VALUE<br />------------------------------------ ----------- ------------------------------<br />control_files                        string      +DATA/orcl/controlfile/current.277.741286407<br />                                                 <br />SQL> shutdown immediate<br />Database closed.<br />Database dismounted.<br />ORACLE instance shut down.<br />RMAN> startup nomount;<br />Oracle instance started<br />Total System Global Area     626327552 bytes<br />Fixed Size                     2229080 bytes<br />Variable Size                390073512 bytes<br />Database Buffers             226492416 bytes<br />Redo Buffers                   7532544 bytes<br />RMAN> restore controlfile to '+DATA' from '+DATA/orcl/controlfile/current.277.741286407';<br />Starting restore at 25-APR-11<br />using target database control file instead of recovery catalog<br />allocated channel: ORA_DISK_1<br />channel ORA_DISK_1: SID=10 instance=orcl_2 device type=DISK<br />channel ORA_DISK_1: copied control file copy<br />Finished restore at 25-APR-11<br />ASMCMD> ls +DATA/orcl/CONTROLFILE/<br />Current.277.741286407<br />current.285.749426511<br />SQL> alter system set control_files='+DATA/orcl/controlfile/current.277.741286407','+DATA/orcl/controlfile/current.285.749426511' scope=spfile;<br />System altered.<br />SQL> startup force;<br />ORACLE instance started.<br />Total System Global Area  626327552 bytes<br />Fixed Size                  2229080 bytes<br />Variable Size             390073512 bytes<br />Database Buffers          226492416 bytes<br />Redo Buffers                7532544 bytes<br />Database mounted.<br />Database opened.<br />SQL> show parameter  control_files<br />NAME                                 TYPE        VALUE<br />------------------------------------ ----------- ------------------------------control_files                        string      +DATA/orcl/controlfile/current.277.741286407, +DATA/orcl/controlfile/current.285.749426511<br />                                                 <br />                                               <br />3. Redo log files - จะเก็บข้อมูลที่มีการเปลี่ยนแปลงในฐานข้อมูล และ Oracle ใช้ online redo log files เพื่อช่วยให้เกิดการสูญหายของข้อมูลน้อยที่สุด, redolog files จะถูกใช้ เช่นกรณี instance มีปัญหา และต้องการที่จะกู้ข้อมูลที่ commit ไปแล้ว ซึ่งยังไม่ได้ถูกเขียนลง data files - redo log ควรต้องทำ multiplex และอยู่บน physical disk ที่ต่างกัน เพื่อป้องกัน disk crash หรือ ผู้ใช้ลบ และ ต้องการ 2 redo log groups อย่างน้อย และ 3 redo log groups เมื่อใช้ ARCHIVE LOG modeการจัดการกับ Online Redo Log Groups และ Members (อ่านเพิ่มเติม Oracle support: 102995.1)ตัวอย่าง: ลบ/เพิ่ม Online Redo Log Groups<br />SQL> select group#, sequence#, bytes, members, status from v$log;GROUP# SEQUENCE# BYTES MEMBERS STATUS---------- ---------- ---------- ---------- ----------------1 22 52428800 2 CURRENT2 21 52428800 2 INACTIVE3 20 52428800 2 INACTIVE<br />SQL> select group#, status, type, member from v$logfile;GROUP# STATUS TYPE MEMBER---------- ------- ------- -----------------------------------------------------------------3 ONLINE /oracle/oradata/ORCL/onlinelog/o1_mf_3_5wb8p2vh_.log3 ONLINE /oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_3_5wb8p33t_.log2 ONLINE /oracle/oradata/ORCL/onlinelog/o1_mf_2_5wb6kn6p_.log2 ONLINE /oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_2_5wb6koh5_.log1 ONLINE /oracle/oradata/ORCL/onlinelog/o1_mf_1_5wb6khy8_.log1 ONLINE /oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_1_5wb6kkxd_.logSQL> ALTER DATABASE DROP LOGFILE GROUP 3;Database altered.SQL> select group#, sequence#, bytes, members, status from v$log;GROUP# SEQUENCE# BYTES MEMBERS STATUS---------- ---------- ---------- ---------- ----------------1 22 52428800 2 CURRENT2 21 52428800 2 INACTIVESQL> select group#, status, type, member from v$logfile;GROUP# STATUS TYPE MEMBER---------- ------- ------- -----------------------------------------------------------------2 ONLINE /oracle/oradata/ORCL/onlinelog/o1_mf_2_5wb6kn6p_.log2 ONLINE /oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_2_5wb6koh5_.log1 ONLINE /oracle/oradata/ORCL/onlinelog/o1_mf_1_5wb6khy8_.log1 ONLINE /oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_1_5wb6kkxd_.logSQL> ALTER DATABASE ADD LOGFILE GROUP 3;Database altered.<br />SQL> select group#, sequence#, bytes, members, status from v$log;GROUP# SEQUENCE# BYTES MEMBERS STATUS<br />---------- ---------- ---------- ---------- ----------------1 22 52428800 2 CURRENT2 21 52428800 2 INACTIVE3 0 104857600 2 UNUSED<br />ตัวอย่าง: ลบ/เพิ่ม Online Redo Log Members<br />SQL> select group#, status, type, member from v$logfile;GROUP# STATUS TYPE MEMBER---------- ------- ------- -----------------------------------------------------------------3 ONLINE /oracle/oradata/ORCL/onlinelog/o1_mf_3_5x5m8zfh_.log3 ONLINE /oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_3_5x5m8zrk_.log2 ONLINE /oracle/oradata/ORCL/onlinelog/o1_mf_2_5wb6kn6p_.log2 ONLINE /oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_2_5wb6koh5_.log1 ONLINE /oracle/oradata/ORCL/onlinelog/o1_mf_1_5wb6khy8_.log1 ONLINE /oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_1_5wb6kkxd_.logSQL> ALTER DATABASE DROP LOGFILE MEMBER '/oracle/oradata/ORCL/onlinelog/o1_mf_3_5x5m8zfh_.log';Database altered.SQL> select group#, status, type, member from v$logfile;GROUP# STATUS TYPE MEMBER---------- ------- ------- -----------------------------------------------------------------3 ONLINE /oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_3_5x5m8zrk_.log2 ONLINE /oracle/oradata/ORCL/onlinelog/o1_mf_2_5wb6kn6p_.log2 ONLINE /oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_2_5wb6koh5_.log1 ONLINE /oracle/oradata/ORCL/onlinelog/o1_mf_1_5wb6khy8_.log1 ONLINE /oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_1_5wb6kkxd_.logSQL> ALTER DATABASE ADD LOGFILE MEMBER '/oracle/oradata/ORCL/onlinelog/redo3b.log' to group 3;Database altered.SQL> select group#, status, type, member from v$logfile;GROUP# STATUS TYPE MEMBER---------- ------- ------- -----------------------------------------------------------------3 INVALID ONLINE /oracle/oradata/ORCL/onlinelog/redo3b.log3 ONLINE /oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_3_5x5m8zrk_.log 2 ONLINE /oracle/oradata/ORCL/onlinelog/o1_mf_2_5wb6kn6p_.log2 ONLINE /oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_2_5wb6koh5_.log1 ONLINE /oracle/oradata/ORCL/onlinelog/o1_mf_1_5wb6khy8_.log1 ONLINE /oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_1_5wb6kkxd_.log<br />ตัวอย่าง ที่เห็นจะเป็นแค่การจัดการกับ redolog file และหวังว่าจะเป็นประโยชน์ ช่วยในการตรวจเช็คฐานข้อมูล - อย่างไรก็ตาม เราต้องเรียนรู้การแก้ปัญหาในกรณีที่ redolog file มีปัญหาด้วย (และตรวจเช็ค backup เสมอ)<br />ตัวอย่าง กรณี member ของ redo group โดยลบ<br />SQL> select group#, status, type, member from v$logfile;GROUP# STATUS TYPE MEMBER---------- ------- ------- -----------------------------------------------------------------3 ONLINE /oracle/oradata/ORCL/onlinelog/redo3b.log3 ONLINE /oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_3_5x5m8zrk_.log2 ONLINE /oracle/oradata/ORCL/onlinelog/o1_mf_2_5wb6kn6p_.log2 ONLINE /oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_2_5wb6koh5_.log1 ONLINE /oracle/oradata/ORCL/onlinelog/o1_mf_1_5wb6khy8_.log1 ONLINE /oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_1_5wb6kkxd_.logSQL> !rm /oracle/oradata/ORCL/onlinelog/redo3b.log /oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_3_5x5m8zrk_.log<br />SQL> alter system switch logfile;<br />บน alert log file:<br />Sat Apr 24 18:31:47 2010Errors in file /oracle/diag/rdbms/orcl/orcl/trace/orcl_arc2_2497.trc:ORA-00313: open failed for members of log group 3 of thread 1ORA-00312: online log 3 thread 1: '/oracle/oradata/ORCL/onlinelog/redo3b.log'ORA-27037: unable to obtain file statusLinux Error: 2: No such file or directoryAdditional information: 3ORA-00312: online log 3 thread 1: '/oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_3_5x5m8zrk_.log'ORA-27037: unable to obtain file statusLinux Error: 2: No such file or directoryAdditional information: 3Errors in file /oracle/diag/rdbms/orcl/orcl/trace/orcl_arc2_2497.trc:ORA-00313: open failed for members of log group 3 of thread 1ORA-00312: online log 3 thread 1: '/oracle/oradata/ORCL/onlinelog/redo3b.log'ORA-27037: unable to obtain file statusLinux Error: 2: No such file or directoryAdditional information: 3ORA-00312: online log 3 thread 1: '/oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_3_5x5m8zrk_.log'ORA-27037: unable to obtain file statusLinux Error: 2: No such file or directoryAdditional information: 3Sat Apr 24 18:31:48 2010Errors in file /oracle/diag/rdbms/orcl/orcl/trace/orcl_m000_3908.trc:ORA-00313: open failed for members of log group 3 of thread 1ORA-00312: online log 3 thread 1: '/oracle/oradata/ORCL/onlinelog/redo3b.log'ORA-27037: unable to obtain file statusLinux Error: 2: No such file or directoryAdditional information: 3ORA-00312: online log 3 thread 1: '/oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_3_5x5m8zrk_.log'ORA-27037: unable to obtain file statusLinux Error: 2: No such file or directoryAdditional information: 3<br />ตรวจสอบ redolog group 3 และแก้ปัญหา<br />SQL> select group#, sequence#, bytes, members, status from v$log;GROUP# SEQUENCE# BYTES MEMBERS STATUS---------- ---------- ---------- ---------- ----------------1 28 52428800 2 CURRENT2 27 52428800 2 INACTIVE3 26 104857600 2 INACTIVESQL> alter database clear unarchived logfile group 3;Database altered.<br />บน alert log file:<br />Sat Apr 24 18:32:45 2010alter database clear unarchived logfile group 3WARNING! CLEARING REDO LOG WHICH HAS NOT BEEN ARCHIVED. BACKUPS TAKENBEFORE 04/24/2010 18:28:58 (CHANGE 1512349) CANNOT BE USED FOR RECOVERY.Clearing online log 3 of thread 1 sequence number 26Errors in file /oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_3904.trc:ORA-00313: open failed for members of log group 3 of thread 1ORA-00312: online log 3 thread 1: '/oracle/oradata/ORCL/onlinelog/redo3b.log'ORA-27037: unable to obtain file statusLinux Error: 2: No such file or directoryAdditional information: 3ORA-00312: online log 3 thread 1: '/oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_3_5x5m8zrk_.log'ORA-27037: unable to obtain file statusLinux Error: 2: No such file or directoryAdditional information: 3Deleted Oracle managed file /oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_3_5x5m8zrk_.logSat Apr 24 18:32:49 2010Archiver process freed from errors. No longer stoppedSat Apr 24 18:32:56 2010Completed: alter database clear unarchived logfile group 3<br />จะเห็นว่า logfile group 3 ใช้งานได้ปกติ - ส่วนการแก้ปัญหากับ redolog file ก็ขึ้นกับแต่ละกรณีไป<br />4. Archiving  - เป็นกลไกที่จำเป็นในการสำรองข้อมูลที่เปลี่ยนแปลงในฐานข้อมูลArchive files เก็บข้อมูลที่จำเป็นในการกู้ฐานข้อมูล ดังนั้นจึงมักแนะนำให้ใช้ฐานข้อมูลที่เป็น Archive Modeตัวอย่าง:เปลี่ยน No Archive Mode -> Archive Mode<br />SQL> archive log list;Database log mode No Archive ModeAutomatic archival DisabledArchive destination USE_DB_RECOVERY_FILE_DESTOldest online log sequence 31Current log sequence 33SQL> shutdown immediate;Database closed.Database dismounted.ORACLE instance shut down.SQL> startup mountORACLE instance started.Total System Global Area 836976640 bytesFixed Size 1303132 bytesVariable Size 536874404 bytesDatabase Buffers 293601280 bytesRedo Buffers 5197824 bytesDatabase mounted.SQL> alter database archivelog;Database altered.SQL> alter database open;Database altered.SQL> archive log list;Database log mode Archive ModeAutomatic archival EnabledArchive destination USE_DB_RECOVERY_FILE_DESTOldest online log sequence 31Next log sequence to archive 33Current log sequence 33SQL> select NAME, CREATED, LOG_MODE, CHECKPOINT_CHANGE#,ARCHIVE_CHANGE# from V$DATABASE;NAME CREATED LOG_MODE CHECKPOINT_CHANGE# ARCHIVE_CHANGE#--------- --------- ------------ ------------------ ---------------ORCL 28-MAR-10 ARCHIVELOG 1663822 1619901<br />*** กรณี ของ RAC เราต้อง shutdown database (instance all nodes) -> startup mount (only one node) -> alter database archivelog -> alter database open -> startup instance other nodes.ก่อน 10g หากฐานข้อมูลเป็น archive mode เราควรต้องเปิด automatic archiver process โดยการเซต log_archive_start=TRUE แต่จาก 10g quot;
log_archive_startquot;
 ไม่จำเป็นต่อไป และอาจพบ Error เมื่อ startup ฐานข้อมูลORA-32006: LOG_ARCHIVE_START initialization parameter has been deprecatedการพิจารณา พื้นที่ disk สำหรับ Archive Files [ID 122555.1] - ขอเสนอ script พร้อมตัวอย่าง<br />column ord noprintcolumn date_ heading 'Date' format A15column no heading '#Arch files' format 9999999column no_size heading 'Size Mb' format 9999999compute avg of no on reportcompute avg of no_size on reportbreak on reportselect MAX(first_time) ord, to_char(first_time,'DD-MON-YYYY') date_,count(recid) no, count(recid) * <REDO_SIZE_FILE_MB> no_sizefrom v$log_historygroup by to_char(first_time,'DD-MON-YYYY')order by ord/clear breaksclear computesclear columns<br />ตัวอย่าง:<br />SQL> select distinct (bytes)/1024/1024 from v$log;(BYTES)/1024/1024-----------------50SQL> column ord noprintSQL> column date_ heading 'Date' format A15SQL> column no heading '#Arch files' format 9999999SQL> column no_size heading 'Size Mb' format 9999999SQL> compute avg of no on reportSQL> compute avg of no_size on reportSQL> break on reportSQL> select MAX(first_time) ord, to_char(first_time,'DD-MON-YYYY') date_,count(recid) no, count(recid) * 50 no_sizefrom v$log_historygroup by to_char(first_time,'DD-MON-YYYY')order by ord/SQL> clear breaksSQL> clear computesSQL> clear columnsDate #Arch files Size Mb--------------- ----------- --------19-APR-2010 43 215020-APR-2010 96 480021-APR-2010 96 480022-APR-2010 97 485023-APR-2010 96 480024-APR-2010 96 480025-APR-2010 97 485026-APR-2010 96 480027-APR-2010 97 485028-APR-2010 96 480029-APR-2010 96 480030-APR-2010 96 480001-MAY-2010 66 3300----------- --------90 4492<br />จะพบว่า เฉลี่ยวันละ 4 - 5 Gb ถ้าต้องการเก็บ Archive Files 3 วัน จำเป็นต้องมีพื้นที่ ถึง 5 * 3 = 15 Gb<br />ตัวอย่าง อื่นๆ Archive Mode -> No Archive Mode<br />SQL> startup mountORACLE instance started.Total System Global Area 836976640 bytesFixed Size 1303132 bytesVariable Size 536874404 bytesDatabase Buffers 293601280 bytesRedo Buffers 5197824 bytesDatabase mounted.SQL> alter database noarchivelog;Database altered.SQL> archive log list;Database log mode No Archive ModeAutomatic archival DisabledArchive destination USE_DB_RECOVERY_FILE_DESTOldest online log sequence 31Current log sequence 33<br />Archiving จึงเป็นสิ่งจำเป็นในการสำรองข้อมูล หรือแม้แต่เพื่อการแก้ปัญหา บนฐานข้อมูล เช่น ปัญหา block corruptionOracle พารามิเตอร์ที่เกี่ยวกับ Archiving (เพิ่มเติมที่ Oracle Documents):- LOG_ARCHIVE_DEST_n- LOG_ARCHIVE_DEST_STATE_n- LOG_ARCHIVE_FORMAT<br />หมายเหตุ เมื่อเราใช้ Database Archive Mode และ Archive destination เป็นUSE_DB_RECOVERY_FILE_DESTแปลว่าเรากำลังเก็บ archive files ที่ Flashback Area (db_recovery_file_dest) ดังนั้นต้องแน่ใจว่าเรากำหนดค่าพารามิเตอร์ db_recovery_file_dest_size มากพอ และตรวจเช็ค V$FLASH_RECOVERY_AREA_USAGE เพราะถ้ามีการใช้พื้นที่มากเกินค่า db_recovery_file_dest_size อาจทำให้ฐานข้อมูลไม่สามารถเขียน archive file ได้ ส่งผลให้ฐานข้อมูลมีปัญหาได้<br />5. Data files - เป็น physical file บนดิสต์ ที่สร้างโดย Oracle และเก็บโครงสร้างข้อมูล อาทิเช่น tables และ indexes แต่ละ datafile สามารถอยู่บนฐานข้อมูลเดียวเท่านั้น*** อย่างไรก็ตาม read only tablespace สามารถ แชร์ datafiles ระหว่างฐานข้อมูลได้ (reference)<br />5.1 Autoextendautoextend เป็นทางเลือก ที่ช่วยเราสามารถปิดหรือเปิดการใช้งาน ในการขยาย datafile โดยอัตโนมัติ แต่ถ้าเราไม่สามารถจัดสรรพื้นที่ให้กับ datafile ได้ เรายังสามารถเพิ่ม datafile<br />SQL> select FILE_NAME, AUTOEXTENSIBLE, INCREMENT_BY from dba_data_files where tablespace_name='USERS';FILE_NAME AUT INCREMENT_BY------------------------------------------------------------ --- ------------/oracle/oradata/ORCL/datafile/o1_mf_users_5twzp1c3_new.dbf YES 160SQL> alter database datafile '/oracle/oradata/ORCL/datafile/o1_mf_users_5twzp1c3_new.dbf' autoextend off;Database altered.SQL> select FILE_NAME, AUTOEXTENSIBLE, INCREMENT_BY from dba_data_files where tablespace_name='USERS';FILE_NAME AUT INCREMENT_BY------------------------------------------------------------ --- ------------/oracle/oradata/ORCL/datafile/o1_mf_users_5twzp1c3_new.dbf NO 0SQL> alter database datafile '/oracle/oradata/ORCL/datafile/o1_mf_users_5twzp1c3_new.dbf' autoextend on next 10M;Database altered.<br />SQL> select FILE_NAME, AUTOEXTENSIBLE, INCREMENT_BY from dba_data_files where tablespace_name='USERS';FILE_NAME AUT INCREMENT_BY------------------------------------------------------------ --- ------------/oracle/oradata/ORCL/datafile/o1_mf_users_5twzp1c3_new.dbf YES 1280<br />มาตรฐาน Oracle datafile สามารถมีได้มากสุด 4194303 datablocks ดังนั้นDB_BLOCK_SIZE = 2048 จะมี datafile ขนาด 8191 MDB_BLOCK_SIZE = 4096 จะมี datafile ขนาด 16383 MDB_BLOCK_SIZE = 8192 จะมี datafile ขนาด 32767 MDB_BLOCK_SIZE = 16384 จะมี datafile ขนาด 65535 Mตั้งแต่ Oracle 10g มีฟังก์ชันการทำงานใหม่ที่เรียกว่า BIGFILE ที่ช่วยให้สามารถสร้าง datafile ที่มีขนาดใหญ่กว่าเดิม แต่ใน 1 tablespace มีได้แค่ 1 datafile เท่านั้น<br />SELECT TABLESPACE_NAME, BIGFILE from DBA_TABLESPACES;<br />อย่างไรก็ดี ขนาดของ datafile มากสุดยังขึ้นกับ Operation System อีกด้วยตัวอย่าง: พิจารณา datafile ที่เปิดใช้ Autoextend<br />SQL> select file_id, tablespace_name, bytes, maxbytes/1024/1024 quot;
maxbytes(M)quot;
, maxblocks, increment_by, file_name from dba_data_files where autoextensible = 'YES';FILE_ID TABLESPACE BYTES maxbytes(M) MAXBLOCKS INCREMENT_BY FILE_NAME---------- ---------- ---------- ----------- ---------- ------------ ------------------------------------------------------------4 USERS 298188800 32767.9844 4194302 1280 /oracle/oradata/ORCL/datafile/o1_mf_users_5twzp1c3_new.dbf3 UNDOTBS1 272629760 32767.9844 4194302 640 /oracle/oradata/ORCL/datafile/o1_mf_undotbs1_5twzp19d_.dbf2 SYSAUX 962854912 32767.9844 4194302 1280 /oracle/oradata/ORCL/datafile/o1_mf_sysaux_5twzp15k_.dbf1 SYSTEM 849346560 32767.9844 4194302 1280 /oracle/oradata/ORCL/datafile/o1_mf_system_5twzp126_.dbf5 TBS_DATA 136314880 32767.9844 4194302 1280 /oracle/oradata/ORCL/datafile/o1_mf_tbs_data_5v51k05o_.dbf<br />5.2 Locationเราควรต้องรู้ว่า ตำแหน่งของ datafile นั้นอยู่ที่ไหน เพื่อใช้ในการพิจารณา และการบำรุงรักษา<br />SQL> select * from v$dbfile;FILE# NAME---------- ------------------------------------------------------------4 /oracle/oradata/ORCL/datafile/o1_mf_users_5twzp1c3_new.dbf3 /oracle/oradata/ORCL/datafile/o1_mf_undotbs1_5twzp19d_.dbf2 /oracle/oradata/ORCL/datafile/o1_mf_sysaux_5twzp15k_.dbf1 /oracle/oradata/ORCL/datafile/o1_mf_system_5twzp126_.dbf5 /oracle/oradata/ORCL/datafile/o1_mf_tbs_data_5v51k05o_.dbf6 /oracle/oradata/ORCL/datafile/o1_mf_flow_1_5w23bgcm_.dbf<br />ตัวอย่าง: การย้าย datafile (แบบ alter database datafile ... )<br />SQL> select file#,name, status from v$datafile;FILE# NAME STATUS---------- ------------------------------------------------------------ -------1 /oracle/oradata/ORCL/datafile/o1_mf_system_5twzp126_.dbf SYSTEM2 /oracle/oradata/ORCL/datafile/o1_mf_sysaux_5twzp15k_.dbf ONLINE3 /oracle/oradata/ORCL/datafile/o1_mf_undotbs1_5twzp19d_.dbf ONLINE4 /oracle/oradata/ORCL/datafile/o1_mf_users_5twzp1c3_new.dbf ONLINE5 /oracle/oradata/ORCL/datafile/o1_mf_tbs_data_5v51k05o_.dbf ONLINE6 /oracle/oradata/ORCL/datafile/o1_mf_flow_1_5w23bgcm_.dbf ONLINE<br />SQL> alter database datafile 4 offline;Database altered.SQL> !mv /oracle/oradata/ORCL/datafile/o1_mf_users_5twzp1c3_new.dbf /oracle/oradata/ORCL/datafile_test/o1_mf_users_5twzp1c3_new.dbfSQL> select file#,name, status from v$datafile;FILE# NAME STATUS---------- ------------------------------------------------------------ -------4 /oracle/oradata/ORCL/datafile/o1_mf_users_5twzp1c3_new.dbf RECOVERSQL> alter database rename file '/oracle/oradata/ORCL/datafile/o1_mf_users_5twzp1c3_new.dbf' to '/oracle/oradata/ORCL/datafile_test/o1_mf_users_5twzp1c3_new.dbf';Database altered.SQL> select file#,name, status from v$datafile;FILE# NAME STATUS---------- ---------------------------------------------------------------- -------4 /oracle/oradata/ORCL/datafile_test/o1_mf_users_5twzp1c3_new.dbf RECOVERSQL> recover datafile 4;Media recovery complete.SQL> select file#,name, status from v$datafile;FILE# NAME STATUS---------- ---------------------------------------------------------------- -------4 /oracle/oradata/ORCL/datafile_test/o1_mf_users_5twzp1c3_new.dbf OFFLINESQL> alter database datafile 4 online ;Database altered.SQL> select file#,name, status from v$datafile;FILE# NAME STATUS---------- ---------------------------------------------------------------- -------4 /oracle/oradata/ORCL/datafile_test/o1_mf_users_5twzp1c3_new.dbf ONLINE<br />หรือ ใช้อีกวิธี (alter tablespace ...)<br />SQL> alter tablespace users read only;Tablespace altered.SQL> alter tablespace users offline ;Tablespace altered.SQL> select file#,name, status from v$datafile;FILE# NAME STATUS---------- ---------------------------------------------------------------- -------4 /oracle/oradata/ORCL/datafile_test/o1_mf_users_5twzp1c3_new.dbf OFFLINESQL> !mv /oracle/oradata/ORCL/datafile_test/o1_mf_users_5twzp1c3_new.dbf /oracle/oradata/ORCL/datafile/o1_mf_users_5twzp1c3_new.dbfSQL> alter database rename file '/oracle/oradata/ORCL/datafile_test/o1_mf_users_5twzp1c3_new.dbf' to '/oracle/oradata/ORCL/datafile/o1_mf_users_5twzp1c3_new.dbf';Database altered.SQL> select file#,name, status from v$datafile;FILE# NAME STATUS---------- ---------------------------------------------------------------- -------4 /oracle/oradata/ORCL/datafile/o1_mf_users_5twzp1c3_new.dbf OFFLINESQL> alter tablespace users online;Tablespace altered.SQL> alter tablespace users read write;Tablespace altered.<br />SQL> select file#,name, status from v$datafile;FILE# NAME STATUS---------- ---------------------------------------------------------------- -------4 /oracle/oradata/ORCL/datafile/o1_mf_users_5twzp1c3_new.dbf ONLINE<br />ข้างต้นได้แสดงตัวอย่างการย้าย datafile อย่างไรก็ดีเราควรรู้และเข้าใจ การตรวจเช็ค และจัดการกับ datafile (อ่าน เพิ่มเติม)<br />หมายเหตุ การย้าย database file จากข้างต้นเป็นการย้าย database file บน File System แต่ปัจจุบันหลายๆที่ อาจจะใช้ ASM และหากต้องการย้าย database file ใน ASM DiskGroup ควรทำอย่างไร ขอแนะนำตัวอย่างคร่าวๆ <br />http://surachartopun.com/2009/10/moving-datafile-system-from-one-asm.htmlhttp://surachartopun.com/2009/10/moving-datafile-in-asm-by-asmcmdcp.html<br />ตัวอย่างแรก เป็นการย้าย database file ของ system tablespace ดังนั้นจึงต้อง shutdown ฐานข้อมูล แต่ถ้าต้องการย้าย database file ของ tablespace ที่ไม่ใช่ system/sysaux เราแค่เพียง offline tablespace <br />ตัวอย่าง ย้าย database file กรณี ASM DiskGroup<br />SQL>   select file_id, file_name from dba_data_files where tablespace_name='TEST_DATA';<br />   FILE_ID FILE_NAME<br />---------- --------------------------------------------------<br />         9 +DATA/orcl/datafile/test_data.1335.721759717<br />SQL> alter tablespace TEST_DATA read only;<br />Tablespace altered.<br />SQL>  alter tablespace TEST_DATA offline;<br />Tablespace altered<br />RMAN> backup as copy datafile 9 format '+DATA2';<br />Starting backup at 26-APR-11<br />allocated channel: ORA_DISK_1<br />channel ORA_DISK_1: SID=38 device type=DISK<br />channel ORA_DISK_1: starting datafile copy<br />input datafile file number=00009 name=+DATA/orcl/datafile/test_data.1335.721759717<br />output file name=+DATA2/orcl/datafile/test_data.993.749500909 tag=TAG20110426T184147 RECID=38 STAMP=749500915<br />channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:15<br />Finished backup at 26-APR-11<br />RMAN> SWITCH DATAFILE 9 to copy;<br />datafile 9 switched to datafile copy quot;
+DATA2/orcl/datafile/test_data.993.749500909quot;
<br />SQL>  alter tablespace TEST_DATA online;<br />Tablespace altered.<br />SQL>  alter tablespace TEST_DATA read write;<br />Tablespace altered.<br />SQL>   select file_id, file_name from dba_data_files where tablespace_name='TEST_DATA';<br />   FILE_ID FILE_NAME<br />---------- --------------------------------------------------<br />         9 +DATA2/orcl/datafile/test_data.993.749500909<br />*** จากนั้นก็ลบ datafilecopy ด้วย rman *** RMAN> list datafilecopy all;RMAN> delete datafilecopy … [all];<br />6. Tablespaces6.1 SYSTEM TablespaceUser objects ไม่ควรสร้างใน System tablespace เพื่อช่วยไม่ให้เกิดปัญหาเรื่อง fragmentation และป้องกันการมีขนาดใหญ่ของ system tablespace โดยที่ไม่จำเป็น<br />SQL> select owner, segment_name, segment_type from dba_segments where tablespace_name = 'SYSTEM' and owner not in ('SYS','SYSTEM');<br />ตรวจสอบ segment ที่อยู่บน system tablspace และ เจ้าของไม่ใช้ SYS หรือ SYSTEM6.2 SYSAUX Tablespace (version >= 10g)SYSAUX ถูกติดตั้งอัตโนมัติ เป็นเหมือน tablespace (ช่วย)ให้กับ system tablespace ถ้า SYSAUX มีปัญหาอาจทำให้ ฐานข้อมูลฟีเจอร์(เช่น AWR)ที่ใช้ SYSAUX มีปัญหา<br />SQL> alter system checkpoint;System altered.SQL> exec DBMS_WORKLOAD_REPOSITORY.create_snapshot;BEGIN DBMS_WORKLOAD_REPOSITORY.create_snapshot; END;*ERROR at line 1:ORA-13509: error encountered during updates to a AWR tableORA-00376: file ORA-00376: file 2 cannot be read at this timeORA-01110: data file 2: '/oracle/oradata/ORCL/datafile/o1_mf_sysaux_5twzp15k_.dbf'cannot be read at this timeORA-06512: at quot;
SYS.DBMS_WORKLOAD_REPOSITORYquot;
, line 14ORA-06512: at quot;
SYS.DBMS_WORKLOAD_REPOSITORYquot;
, line 37ORA-06512: at line 1SQL> alter tablespace sysaux online;Tablespace altered.SQL> exec DBMS_WORKLOAD_REPOSITORY.create_snapshot;PL/SQL procedure successfully completed.<br />การตรวบสอบการใช้งานบน SYSAUX<br />SQL> select space_usage_kbytes, occupant_name, occupant_desc from v$sysaux_occupants order by 1 desc;<br />หรือ<br />SQL> @?/rdbms/admin/utlsyxsz.sql<br />utlsyxsz.sql - Utility script สำหรับ SYSAUX Size6.3 Locally vs Dictionary Managed TablespacesDictionary Managed Tablespaces ถูกจัดการด้วยการใช้ dictionary tablesLocally Managed Tablespaces เริ่มมีมาตั้งแต่ Oracle 8i. Tablespace จะถูกจัดการเฉพาะส่วน ด้วยการใช้ bitmap<br />SQL> select tablespace_name, extent_management from dba_tablespaces;TABLESPACE_NAME EXTENT_MAN------------------------------ ----------SYSTEM LOCALSYSAUX LOCAL<br />อย่างไรก็ตาม Locally Managed Tablespaces มีข้อดีกว่า Data Dictionary managed tablespaces เช่น ไม่ต้องมีการเก็บ free space ใน data dictionary จึงช่วยลด contention ของ table นั้นๆ และยังลดการเกิด fragmentation เป็นต้น<br />Extent_management_clause:[EXTENT MANAGEMENT{DICTIONARY | LOCAL{AUTOALLOCATE | UNIFORM [SIZE integer [K|M] }}]<br />AUTOALLOCATE - tablespace จะถูกจัดการขนาดของ EXTENT จากระบบUNIFORM - tablespace จะถูกจัดการกับขนาดของ EXTENT ให้มีขนาดที่เหมือนกัน (default = 1 megabyte)6.4 Temporary Tablespaceจะถูกใช้เพื่อการ sort และการเก็บ global temporary tables. เราควรต้องแน่ใจว่า tablespace สำหรับ temporary segments เป็นประเภท TEMPORARY<br />SQL> select tablespace_name, contents from dba_tablespaces;TABLESPACE_NAME CONTENTS------------------------------ ---------SYSTEM PERMANENTSYSAUX PERMANENTTEMP TEMPORARYUSERS PERMANENT<br />หรือ แน่ใจว่า USER ถูกหนดให้ใช้ temporary space เป็นประเภท TEMPORARY<br />SQL> select u.username, t.tablespace_name from dba_users u, dba_tablespaces t where u.temporary_tablespace = t.tablespace_name and t.contents <> 'TEMPORARY';<br />ตัวอย่างอื่นๆการเปลี่ยน temporary tablespace บน user<br />SQL> alter user SYSTEM temporary tablespace User;<br />การเปลี่ยน default temporary tablespace บนฐานข้อมูล<br />SQL> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp;<br />การลด ขนาด tempfileการหาขนาดของ temporary tablespace<br />SQL> select tablespace_name, sum(bytes)/1024/1024 mb from dba_temp_files group by tablespace_name;TABLESPACE_NAME MB------------------------------ ----------TEMP 28<br />การ หา quot;
high water markquot;
 ของ temporary tablespace (max used at one time)<br />SQL> select tablespace_name, sum(bytes_cached)/1024/1024 mb from v$temp_extent_pool group by tablespace_name;TABLESPACE_NAME MB------------------------------ ----------TEMP 27<br />การ หา current usage<br />SQL> select ss.tablespace_name, sum((ss.used_blocks*ts.blocksize))/1024/1024 mb from gv$sort_segment ss, sys.ts$ ts where ss.tablespace_name = ts.name group by ss.tablespace_name;TABLESPACE_NAME MB------------------------------- ----------TEMP 1<br />หรือ<br />SQL> SELECT A.tablespace_name tablespace, D.mb_total, SUM (A.used_blocks * D.block_size) / 1024 / 1024 mb_used,D.mb_total - SUM (A.used_blocks * D.block_size) / 1024 / 1024 mb_free FROM v$sort_segment A,(SELECT B.name, C.block_size, SUM (C.bytes) / 1024 / 1024 mb_total FROM v$tablespace B, v$tempfile C WHERE B.ts#= C.ts# GROUP BY B.name, C.block_size ) D WHERE A.tablespace_name = D.name GROUP by A.tablespace_name, D.mb_total;TABLESPACE MB_TOTAL MB_USED MB_FREE------------------------------- ---------- ---------- ----------TEMP 28 1 27<br />6.5 Tablespace FragmentationFragmentation คือ การที่ tablespace ถูกแบ่งออกเป็นส่วนๆ อาจจะมีพื้นที่ว่างมาก แต่เป็นชิ้นเล็ก ทำให้ไม่สามารถใช้งานมันได้Fragmented tablespaces มีผลต่อ performance โดยเฉพาะ Full Table Scans หรือ ทำให้เกิดปัญหา out-of-space. การแก้ไขปัญหา ทำได้ด้วยการ recreate object เราสามารถใช้ 'alter table .. move' หรือ การ export/importScript to Detect Tablespace Fragmentation [ID 1020182.6]<br />7. Objects 7.1 จำนวนของ ExtentsExtent เป็นหน่วย(logical) ของการจัดสรรพื้นที่ฐานข้อมูล หากเรียงลำดับ Data Block ->  Extent -> Segment<br />การ ขยาย ของ object อาจจะไม่ใช่สิ่งสำคัญต่อ Performance แต่ถ้าการขยายของ object รวมๆ กัน หลายๆ object ย่อมมีผลต่อ Performance แน่นอนเราสามารถหา object ที่มีการจัดสรร extent มากกว่าที่เรากำหนดได้:<br />select owner, segment_type, segment_name, tablespace_name, count(blocks), SUM(bytes/1024) quot;
BYTES Kquot;
, SUM(blocks) from dba_extents where owner NOT IN ('SYS','SYSTEM') group by owner, segment_type, segment_name, tablespace_name having count(*) > &number_extents order by segment_type, segment_name;<br />สิ่งนี้บอกอะไร แล้วอย่างไร?เมื่อ เราพบ object ที่มีการจัดสรร extent มาก(เช่น จำนวน extent 100 - 200) เราสามารถสร้าง object นี้ใหม่กับ extent ที่มีขนาดใหญ่กว่า<br />ตัวอย่าง: การย้าย table จาก extent 1M ไป 10M, สมมุติ สร้าง tablespace extent uniform 1M(TBS_EXT_1M) และ 10M(TBS_EXT_10M)<br />SQL> select blocks, bytes, tablespace_name from user_extents where segment_name='TB_TEST';BLOCKS BYTES TABLESPACE_NAME---------- ---------- ------------------------------128 1048576 TBS_EXT_1M128 1048576 TBS_EXT_1M128 1048576 TBS_EXT_1M128 1048576 TBS_EXT_1M128 1048576 TBS_EXT_1M128 1048576 TBS_EXT_1M128 1048576 TBS_EXT_1M128 1048576 TBS_EXT_1M128 1048576 TBS_EXT_1MSQL> alter table TB_TEST move tablespace TBS_EXT_10M;Table altered.SQL> select blocks, bytes, tablespace_name from user_extents where segment_name='TB_TEST';BLOCKS BYTES TABLESPACE_NAME---------- ---------- ------------------------------1280 10485760 TBS_EXT_10M<br />จะเห็นว่า จำนวนของ extent น้อยลง7.2 Next extentSegment สามารถที่จะเติบโตได้ จึงต้องมีการจัดสรร next extent เมื่อจำเป็น ถ้าพื้นที่ว่างนั้นไม่เพียงพอใน tablespace จะส่งผลให้ next extent ไม่สามารถจัดสรรพื้นที่ และ object จะไม่เติบโตต่อไปเราสามารถเช็ค segment ที่ไม่สามารถจัดสรร next extent<br />select s.owner, s.segment_name, s.segment_type, s.tablespace_name, s.next_extent from dba_segments s where s.next_extent > (select MAX(f.bytes) from dba_free_space f where f.tablespace_name = s.tablespace_name);<br />แต่ ถ้ามี fragmentation มากๆ ใน tablespace จะส่งผลให้ผลลัพท์ที่ได้ แสดงว่า object ว่ายังสามารถเติบโตได้ ดังนั้นเราอาจจะดัดแปลงโดยการหา fragmentation ใน tablespace ไปเปรียบเทียบกับ next extent ของแต่ละ object7.3 Indexesการ rebuild index เป็นสิ่งที่ดี แต่เรายังสามามารถเลือกวิธีการอื่น coalescing indexการ พิจารณา b-tree index ก่อน rebuild อาจใช้หลักเกณฑ์- deleted entries represent 20% or more of the current entries.- the index depth is more then 4 levels.อ่านเพิ่มเติม Richard Foote<br />ตัวอย่าง: เช็ค index_stats เมื่อมีการ update/index ข้อมูล และ rebuild index (tb_test = 50 rows)<br />SQL> create index ind_test on tb_test(object_id);Index created.SQL> analyze index IND_TEST validate structure;Index analyzed.SQL> select lf_rows, lf_rows_len, del_lf_rows, del_lf_rows_len, used_space FROM index_stats WHERE name = 'IND_TEST';LF_ROWS LF_ROWS_LEN DEL_LF_ROWS DEL_LF_ROWS_LEN USED_SPACE---------- ----------- ----------- --------------- ----------50 800 0 0 800SQL> update tb_test set object_id=1 where rownum <= 10; 10 rows updated. <br />SQL> commit;Commit complete.SQL> analyze index IND_TEST validate structure;Index analyzed.SQL> select lf_rows, lf_rows_len, del_lf_rows, del_lf_rows_len, used_space FROM index_stats WHERE name = 'IND_TEST';LF_ROWS LF_ROWS_LEN DEL_LF_ROWS DEL_LF_ROWS_LEN USED_SPACE---------- ----------- ----------- --------------- ----------60 940 10 160 940SQL> delete from tb_test where rownum <=10; 10 rows deleted. SQL> commit;Commit complete.SQL> analyze index IND_TEST validate structure;Index analyzed.SQL> select lf_rows, lf_rows_len, del_lf_rows, del_lf_rows_len, used_space FROM index_stats WHERE name = 'IND_TEST';LF_ROWS LF_ROWS_LEN DEL_LF_ROWS DEL_LF_ROWS_LEN USED_SPACE---------- ----------- ----------- --------------- ----------50 780 10 140 780SQL> alter index ind_test rebuild;Index altered.SQL> analyze index IND_TEST validate structure;Index analyzed.SQL> select lf_rows, lf_rows_len, del_lf_rows, del_lf_rows_len, used_space FROM index_stats WHERE name = 'IND_TEST';LF_ROWS LF_ROWS_LEN DEL_LF_ROWS DEL_LF_ROWS_LEN USED_SPACE---------- ----------- ----------- --------------- ----------40 640 0 0 640<br />นั่นเป็น แค่ตัวอย่างการ analyze index คร่าวๆการตรวจสอบ object เราควรจะตรวจเช็คอย่างสม่ำเสมอเพื่อป้องกันปัญหาในอนาคต ซึ่งอาจส่งผลต่อ application และอื่นๆ<br />8. AUTO vs MANUAL undo - ใน ฐาน ข้อมูล Oracle เวอร์ชั่นก่อนๆ เราจัดการกับ RollBack Segments ด้วย manual undo. ส่วน automatic undo(เริ่มใช้ Oracle 9i) จะถูกใช้เมื่อเซต UNDO_MANAGEMENT เป็น AUTO<br />SQL> show parameter UNDO_MANAGEMENTNAME TYPE VALUE------------------------------------ ----------- ------------------------------undo_management string AUTO<br />แต่ ถ้าหาไม่เซตค่า UNDO_MANAGEMENT หรือเซตเป็น MANUAL จะใช้กลไก 'old' rollback segment อย่างไรก็ตาม Oracle แนะนำให้ใช้ AUTO8.1 AUTO UNDOการกำหนดเวลาในการเก็บ undo นั้นจะถูกควบคุมด้วย UNDO_RETENTION (วินาที)undo_retention เป็นพารามิเตอร์ใหม่ที่พบบน Oracle 9i และยังเป็นพารามิเตอร์ที่สนับสนุน quot;
flashback queryquot;
 ฟีเจอร์<br />SQL> show parameter UNDO_RETENTION;NAME TYPE VALUE------------------------------------ ----------- ------------------------------undo_retention integer 900SQL> alter system set UNDO_RETENTION=3600;System altered.SQL> show parameter UNDO_RETENTION;NAME TYPE VALUE------------------------------------ ----------- ------------------------------undo_retention integer 3600<br />บน Oracle 10g คุณอาจเลือกใช้ GUARANTEE เพื่อให้แน่ใจว่า undo ข้อมูล ไม่ถูกขียนทับก่อน undo_retention ที่กำหนด<br />SQL> show parameter undo_tablespace;NAME TYPE VALUE------------------------------------ ----------- ------------------------------undo_tablespace string UNDOTBS1SQL> alter tablespace UNDOTBS1 retention GUARANTEE;Tablespace altered.<br />V$UNDOSTAT view สามารถใช้ในการตรวจสอบการใช้ประโยชน์พื้นที่ undoคำนวณจำนวน undo block ต่อวินาที:<br />SQL> SELECT (SUM(undoblks))/ SUM ((end_time - begin_time) * 86400) FROM v$undostat;(SUM(UNDOBLKS))/SUM((END_TIME-BEGIN_TIME)*86400)------------------------------------------------57.8207692<br />หรือ คำนวณจำนวน Byte ที่ต้องการ<br />SQL> SELECT (UR * (UPS * DBS)) + (DBS * 24) AS quot;
Bytesquot;
 FROM (SELECT value AS UR FROM v$parameter WHERE name = 'undo_retention'),(SELECT (SUM(undoblks)/SUM(((end_time - begin_time)*86400))) AS UPS FROM v$undostat),(select block_size as DBS from dba_tablespaces where tablespace_name=(select upper(value) from v$parameter where name = 'undo_tablespace'));Bytes----------751016.081<br />เรา ยังใช้ DBA_UNDO_EXTENTS เพื่อตรวจสอบรายละเอียด extents และพื้นที่ใช้ใน undo tablespace ปัจจุบัน<br />SQL> SELECT DISTINCT STATUS, SUM(BYTES), COUNT(*) FROM DBA_UNDO_EXTENTS GROUP BY STATUS;STATUS SUM(BYTES) COUNT(*)--------- ---------- ----------ACTIVE 1048576 1EXPIRED 172687360 250UNEXPIRED 49938432 57<br />ACTIVE - Undo Extent เป็น Active, ใช้โดย transaction.EXPIRED - Undo Extent ถูก expire (Exceeded the Undo Retention).UNEXPIRED - Undo Extent ที่ยังขึ้นอยู่กับค่า UNDO_RETENTION.8.2 MANUAL UNDO- rollback มีปัญหาอาจ ส่งผลต่อการเปิดฐานข้อมูลเช่น เซต rollback_segments เป็น RBS1 แต่ไม่พบ 'RBS1' rollback segment เมื่อเปิดฐานข้อมูล<br />ORA-01534: rollback segment 'RBS1' doesn't existError 1534 happened during db open, shutting down database<br />- rollback segment ขนาดเล็ก หรือไม่เพียงพอ จะมีผลกระทบต่อการทำงานของฐานข้อมูล ดังนั้นเราต้องตรวจสอบ<br />SQL> create rollback segment rbs1;Rollback segment created.SQL> show parameter UNDO_MANAGEMENTNAME TYPE VALUE------------------------------------ ----------- ------------------------------undo_management string MANUALSQL> show parameter rollback_segmentsNAME TYPE VALUE------------------------------------ ----------- ------------------------------rollback_segments string RBS1<br />SQL> select d.segment_name, d.tablespace_name, s.waits, s.shrinks, s.wraps, s.status from v$rollstat s, dba_rollback_segs d where s.usn = d.segment_id order by 1;SEGMENT_NAME TABLESPACE_NAME WAITS SHRINKS WRAPS STATUS------------------------------ ------------------------------ ---------- ---------- ---------- ---------------RBS1 SYSTEM 0 0 10 ONLINESYSTEM SYSTEM 0 0 0 ONLINE<br />ถ้าไม่กำหนด rollback_segments จะมี quot;
SYSTEMquot;
 rollback segment เดียว<br />SQL> show parameter UNDO_MANAGEMENTNAME TYPE VALUE------------------------------------ ----------- ------------------------------undo_management string MANUALSQL> show parameter rollback_segmentsNAME TYPE VALUE------------------------------------ ----------- ------------------------------rollback_segments stringSQL> select d.segment_name, d.tablespace_name, s.waits, s.shrinks, s.wraps, s.status from v$rollstat s, dba_rollback_segs d where s.usn = d.segment_id order by 1;SEGMENT_NAME TABLESPACE_NAME WAITS SHRINKS WRAPSSTATUS------------------------------ ------------------------------ ---------- ---------- ---------- ---------------SYSTEM SYSTEM 0 0 0 ONLINE<br />จากข้างต้น ขอขยายความ MANUAL UNDO เพียงคร่าวๆ (more)อย่าง ไรก็ตามขอแนะนำให้ใช้ AUTO UNDO (อย่างกรณีฟีเจอร์ Total Recall ก็ต้องการ AUTO UNDO)<br />9. การจัดการกับหน่วยความจำ (Memory Management)การ จัดการกับหน่วยความจำของฐานข้อมูล Oracle จะมีความแตกต่างกันไป ซึ่งขึ้นอยู่กับ oracle เวอร์ชัน เพราะ oracle เองได้มีการเพิ่มคุณสมบัติ ในการจัดการกับหน่วยความจำกับฐานข้อมูลเวอร์ชันใหม่ๆ เพื่อให้ง่ายและมีประสิทธิภาพ ดังนั้นเรามักจะถูกแนะนำให้ใช้คุณสมบัติในการจัดการกับหน่วยความจำ ด้วยวิธีอัตโนมัติ<br />9.1 ก่อน Oracle 9iองค์ ประกอบหน่วย ความจำที่แตกต่างกัน (SGA และ PGA) ต้องการที่จะถูกกำหนดในการเริ่มต้นของฐานข้อมูล(startup) ค่าเหล่านี้เป็นค่าคงที่ ดังนั้นหากหนึ่งในองค์ประกอบของหน่วยความจำที่ต่ำเกินไป และจำเป็นต้องเปลี่ยนแปลง ฐานข้อมูลจำเป็นต้อง restart เพื่อให้ฐานข้อมูลใช้ค่าใหม่ที่ได้เปลี่ยนแปลงตัวอย่าง พารามิเตอร์ที่อาจใช้ผิดบ่อยๆ เช่น sort_area_size<br />SQL> show parameter sort_area_sizeNAME TYPE VALUE------------------------------------ ----------- ------------------------------sort_area_size integer 1024000<br />พารามิเตอร์ sort_area_size กำหนด จำนวนหน่วยความจำที่สามารถใช้ในการเรียงลำดับ ค่านี้เป็นส่วนหนึ่งของ User Global Area (UGA) ดังนั้นจะถูกจัดสรรให้แต่ละผู้ใช้หากผู้ใช้เข้ามาใช้งานพร้อมกันเป็น จำนวนมาก ในการเรียงลำดับข้อมูลขนาดใหญ่ ระบบอาจจะใช้หน่วยความจำจำนวนมากเช่น sort_area_size ของ 1MB กับผู้ใช้ 200 คน เข้ามาพร้อมกันในฐานข้อมูล อย่างไรก็ตามหน่วยความจำนี้ถูกจัดสรรแบบไดนามิก มันสามารถจัดสรรหน่วยความจำถึง 200MB และอาจทำให้เกิดการใช้ SWAP บนระบบ9.2 Oracle 9iเริ่มต้นจาก Oracle 9i พวกเราจะพบพารามิเตอร์:workarea_size_policy = [AUTO | MANUAL]pga_aggregate_target = <value>ซึ่งยอมให้เรากำหนดพื้นที่หน่วยความจำสำหรับ PGA โดยที่จะถูกใช้ร่วมกันของ sessionsถ้าค่านี้น้อยเกินไป (pga_aggregate_target) บ่อยครั้งที่เราจะพบ ORA-4030<br />SQL> show parameter workarea_size_policyNAME TYPE VALUE------------------------------------ ----------- ------------------------------workarea_size_policy string AUTO<br />SQL> show parameter pga_aggregate_targetNAME TYPE VALUE------------------------------------ ----------- ------------------------------pga_aggregate_target big integer 500M<br />ถ้า workarea_size_policy เป็น AUTO หน่วยความจำสำหรับ work area (sort area) จะถูกจัดการอัตโนมัติ จากค่า pga_aggregate_targetตัวอย่าง work area:- Sort-based operators (ORDER BY, GROUP BY, ROLLUP, window functions)- Hash-join- Bitmap merge- Bitmap createอันได้แก่ พารามิเตอร์ *area_size<br />SQL> show parameter area_sizeNAME TYPE VALUE------------------------------------ ----------- ------------------------------bitmap_merge_area_size integer 1048576create_bitmap_area_size integer 8388608hash_area_size integer 131072sort_area_size integer 65536<br />ถ้า workarea_size_policy เป็น MANUAL หน่วยความจำสำหรับ work area (sort area) จะไม่ใช้ pga_aggregate_target เราต้องมีการจัดการกับพารามิเตอร์ *area_size แต่ละตัวเองการตรวจสอบ PGA เช่น ข้อมูลการใช้PGA<br />SELECT * FROM V$PGASTAT;<br />หรือ คำแนะนำเพื่อการปรับค่าของ PGA<br />SELECT round(PGA_TARGET_FOR_ESTIMATE/1024/1024) target_mb,ESTD_PGA_CACHE_HIT_PERCENTAGE cache_hit_perc,ESTD_OVERALLOC_COUNTFROM V$PGA_TARGET_ADVICE;<br />หรือ การตรวจสอบ PGA แต่ละ session<br />set pages500 lines110 trims onclear colcol name format a30col username format a20break on username nodup skip 1select vses.username||':'||vsst.sid||','||vses.serial# username, vstt.name, max(vsst.value) valuefrom v$sesstat vsst, v$statname vstt, v$session vseswhere vstt.statistic# = vsst.statistic# and vsst.sid = vses.sid and vstt.name in('session pga memory','session pga memory max','session uga memory','session uga memory max','session cursor cache count','session cursor cache hits','session stored procedure space','opened cursors current','opened cursors cumulative') and vses.username is not nullgroup by vses.username, vsst.sid, vses.serial#, vstt.name order by vses.username, vsst.sid, vses.serial#, vstt.name;<br />การประมาณค่า PGA_AGGREGATE_TARGET:- สำหรับระบบ OLTP<br />PGA_AGGREGATE_TARGET = (<Total Physical Memory > * 80%) * 20%<br />- สำหรับระบบ DSS<br />PGA_AGGREGATE_TARGET = (<Total Physical Memory > * 80%) * 50%<br />9.3 Oracle 10gAutomatic Shared Memory Management (ASMM) ถูกแนะนำใน Oracle เวอร์ชัน 10g คุณลักษณะการจัดการหน่วยความจำอัตโนมัติ ทำได้โดยการตั้งค่าพารามิเตอร์ SGA_TARGET ให้มากกว่าศุนย์คุณลักษณะ นี้มีประโยชน์ ช่วยให้เราสามารถแบ่งปันทรัพยากรหน่วยความจำในส่วนต่างๆ และการจัดสรรทรัพยากรณ์จะเป็นไปโดยอัตโนมัติ ด้วย OracleSGA_TARGET พารามิเตอร์มีผลต่อ องประกอบหน่วยความจำ:- Fixed SGA และ other internal ที่ต้องการโดย Oracle Database instance- Log buffer- Shared pool- Java pool- Buffer cache- keep และ recycle buffer caches (ถ้าระบุ)- Nonstandard block size buffer caches (ถ้าระบุ)- Streams poolเมื่อ เราเซตค่าสำหรับ SGA_TARGET, Oracle 10g จะกำหนดขนาดส่วนประกอบอันได้แก่- Shared pool (SQL และ PL/SQL execution)- Java pool (Java execution state)- Large pool (large allocations เช่น RMAN backup buffers)- Buffer cache- Streams pool<br />SQL> show parameter sga_targetNAME TYPE VALUE------------------------------------ ----------- ------------------------------sga_target big integer 512M<br />การตรวจสอบข้อมูลการใช้ SGA<br />select * from v$sgastat;select * from v$sgainfo;<br />หรือ คำแนะนำเพื่อการปรับค่าของ SGA<br />select * from v$sga_target_advice order by sga_size;<br />หรือตรวจสอบการเพิ่ม ค่าหรือลดค่า ของส่วนประกอบ SGA<br />select * from v$sga_dynamic_components;<br />และ<br />ALTER SESSION SET nls_date_format = 'DD/MM/YYYY:HH24:MI:SS';SET PAGESIZE 900SET LINESIZE 255COL COMPONENT FORMAT A25COL INITIAL_SIZE FORMAT A10COL TARGET_SIZE FORMAT A10COL FINAL_SIZE FORMAT A10COL OPER_TYPE FORMAT A10select START_TIME, component, oper_type, oper_mode,status, initial_size/1024/1024 quot;
INITIALquot;
, target_size/1024/1024 quot;
TARGETquot;
, FINAL_SIZE/1024/1024 quot;
FINALquot;
, END_TIMEfrom v$sga_resize_opsorder by start_time, component;<br />ส่วนการจัดการหน่วยความจำ PGA อัตโนมัติ ยังใช้งานได้ผ่าน workarea_size_policy และ pga_aggregate_target พารามิเตอร์9.4 Oracle 11gAutomatic Memory Management (AMM) ถูกแนะนำใน Oracle เวอร์ชัน 11g ช่วยให้ปรับค่า PGA และ SGA โดยอัตโนมัติ กับค่าพารามิเตอร์ MEMORY_MAX_TARGET และ MEMORY_TARGET <br />SQL> show parameter MEMORY_MAX_TARGETNAME TYPE VALUE------------------------------------ ----------- ------------------------------memory_max_target big integer 800MSQL> show parameter MEMORY_TARGETNAME TYPE VALUE------------------------------------ ----------- ------------------------------memory_target big integer 800M<br />การตรวจสอบองค์ประกอบของหน่วย ความจำที่ใช้ AMM<br />select * from V$MEMORY_DYNAMIC_COMPONENTS;<br />ตรวจสอบการเพิ่มและลดขององค์ ประกอบใน AMM ด้วย V$MEMORY_RESIZE_OPSหรือ คำแนะนำเพื่อการปรับค่าสำหรับ AMM<br />select * from v$memory_target_advice order by memory_size;<br />10. Logging & Tracing10.1 Alert Filealert log ไฟล์ของฐานข้อมูล จะเก็บสิ่งที่เปลี่ยนแปลงในฐานข้อมูล อันได้แก่- internal errors (ORA-600), block corruption errors (ORA-1578), และ deadlock errors (ORA-60)- SQL เช่น CREATE/ALTER/DROP DATABASE/TABLESPACE และจาก Oracle Enterprise Manager หรือ SQL*Plus ที่เกี่ยวกับ STARTUP, SHUTDOWN, ARCHIVE LOG, RECOVER- Errors เกี่ยวกับ shared server และ dispatcher processes- Errors ขณะที่ materialized view (refresh)การที่ เรามี alert log ไฟล์ ขนาดใหญ่ จะเป็นการใช้พื้นที่ของ Disk โดยที่ไม่จำเป็น และส่งผลต่อประสิทธิภาพในการเขียนลง Disk ของ OSก่อน 11g:<br />SQL> show parameter background_dump_destNAME TYPE VALUE------------------------------------ ----------- ------------------------------background_dump_dest string /oracle/admin/orcl/bdump<br />11g ->: จะใช้ diagnostic_dest พารามิเตอร์<br />SQL> show parameter background_dump_destNAME TYPE VALUE------------------------------------ ----------- ------------------------------background_dump_dest string /oracle/diag/rdbms/orcl/orcl/traceSQL> show parameter diagnostic_destNAME TYPE VALUE------------------------------------ ----------- ------------------------------diagnostic_dest string /oracle<br />10.2 Max_dump_file_size Oracle server process จะสร้าง trace ไฟล์ เพื่อเก็บความผิดพลาด เราสามารถใช้ trace ไฟล์ เพื่อวิเคราะห์ในแก้ปัญหาและปรับปรุง ส่วน max_dump_file_size จะจำกัดขนาดของ trace ไฟล์<br />SQL> show parameter max_dump_file_sizeNAME TYPE VALUE------------------------------------ ----------- ------------------------------max_dump_file_size string unlimitedSQL> alter system set max_dump_file_size=10240;System altered.SQL> show parameter max_dump_file_sizeNAME TYPE VALUE------------------------------------ ----------- ------------------------------max_dump_file_size string 10240<br />user_dump_dest พารามิเตอร์ จะเป็นพื้นที่ ที่ใช้เก็บข้อมูล trace ไฟล์ ที่เกิดจาก user processesส่วนบน Oracle 11g พื้นที่ดังกล่าว จะถูกควบคุมโดย 'diagnostic_dest' พารามิเตอร์*** audit ไฟล์ ***โดย ปกติการ เชื่อมต่อฐานข้อมูลด้วย SYS หรือ SYSDBA จะมีการเก็บเข้า OS ไฟล์ โดยพื้นที่ ที่ใช้เก็บจะถูกควบคุมด้วย พารามิเตอร์ 'audit_file_dest'ถ้า พารามิเตอร์นี้ ไม่ได้กำหนดจะเป็น $ORACLE_HOME/rdbms/audit<br />SQL> show parameter audit_file_destNAME TYPE VALUE------------------------------------ ----------- ------------------------------audit_file_dest string /oracle/admin/orcl/adump<br />ตัวอย่าง อื่นๆ (ตรวจสอบการ ใช้งาน sys กับการใช้ syslog)*** บน 11g เราจำเป็นที่จะต้องเรียนรู้กับ Automatic Diagnostic Repository (ADR) ***ADR เป็นที่เก็บข้อมูลเพื่อใช้ในการวินิจฉัย เช่น trace files, alert log, และ Health Monitor reports. ส่วนที่ตั้งของ ADR จะถูกควบคุมด้วย 'diagnostic_dest' พารามิเตอร์การตรวจเช็คบนฐานข้อมูล เป็นสิ่งที่จำเป็นสำหรับผู้ดูแลระบบ ผมหวังว่าบทความจะมีประโยชน์บ้างนะครับ<br />อ้างอิงhttp://support.oracle.comhttp://tahiti.oracle.com<br />เขียนโดย: @surachart (surachartopun.com) OUGTH<br />
การตรวจเช็คฐานข้อมูล Oracle v1 draft
การตรวจเช็คฐานข้อมูล Oracle v1 draft
การตรวจเช็คฐานข้อมูล Oracle v1 draft
การตรวจเช็คฐานข้อมูล Oracle v1 draft
การตรวจเช็คฐานข้อมูล Oracle v1 draft
การตรวจเช็คฐานข้อมูล Oracle v1 draft
การตรวจเช็คฐานข้อมูล Oracle v1 draft
การตรวจเช็คฐานข้อมูล Oracle v1 draft
การตรวจเช็คฐานข้อมูล Oracle v1 draft
การตรวจเช็คฐานข้อมูล Oracle v1 draft
การตรวจเช็คฐานข้อมูล Oracle v1 draft
การตรวจเช็คฐานข้อมูล Oracle v1 draft
การตรวจเช็คฐานข้อมูล Oracle v1 draft
การตรวจเช็คฐานข้อมูล Oracle v1 draft
การตรวจเช็คฐานข้อมูล Oracle v1 draft
การตรวจเช็คฐานข้อมูล Oracle v1 draft
การตรวจเช็คฐานข้อมูล Oracle v1 draft
การตรวจเช็คฐานข้อมูล Oracle v1 draft
การตรวจเช็คฐานข้อมูล Oracle v1 draft
การตรวจเช็คฐานข้อมูล Oracle v1 draft
การตรวจเช็คฐานข้อมูล Oracle v1 draft
การตรวจเช็คฐานข้อมูล Oracle v1 draft
การตรวจเช็คฐานข้อมูล Oracle v1 draft
การตรวจเช็คฐานข้อมูล Oracle v1 draft
การตรวจเช็คฐานข้อมูล Oracle v1 draft
การตรวจเช็คฐานข้อมูล Oracle v1 draft
การตรวจเช็คฐานข้อมูล Oracle v1 draft
การตรวจเช็คฐานข้อมูล Oracle v1 draft
การตรวจเช็คฐานข้อมูล Oracle v1 draft
การตรวจเช็คฐานข้อมูล Oracle v1 draft
การตรวจเช็คฐานข้อมูล Oracle v1 draft

Weitere ähnliche Inhalte

Was ist angesagt?

Triển khai wsus windows server update services
Triển khai wsus  windows server update servicesTriển khai wsus  windows server update services
Triển khai wsus windows server update serviceslaonap166
 
Microsoft SQL Server - Files and Filegroups
Microsoft SQL Server - Files and FilegroupsMicrosoft SQL Server - Files and Filegroups
Microsoft SQL Server - Files and FilegroupsNaji El Kotob
 
Customizing the look and-feel of DSpace
Customizing the look and-feel of DSpaceCustomizing the look and-feel of DSpace
Customizing the look and-feel of DSpaceBharat Chaudhari
 
Advanced RAC troubleshooting: Network
Advanced RAC troubleshooting: NetworkAdvanced RAC troubleshooting: Network
Advanced RAC troubleshooting: NetworkRiyaj Shamsudeen
 
Oracle SQL Developer Tips & Tricks
Oracle SQL Developer Tips & TricksOracle SQL Developer Tips & Tricks
Oracle SQL Developer Tips & TricksJeff Smith
 
Understanding the Basics of CA Workload Automation iDash
Understanding the Basics of CA Workload Automation iDashUnderstanding the Basics of CA Workload Automation iDash
Understanding the Basics of CA Workload Automation iDashCA Technologies
 
Lenguaje estructurado sql
Lenguaje estructurado sqlLenguaje estructurado sql
Lenguaje estructurado sqlDiego Sánchez
 
Oracle Database Performance Tuning Concept
Oracle Database Performance Tuning ConceptOracle Database Performance Tuning Concept
Oracle Database Performance Tuning ConceptChien Chung Shen
 

Was ist angesagt? (19)

Triển khai wsus windows server update services
Triển khai wsus  windows server update servicesTriển khai wsus  windows server update services
Triển khai wsus windows server update services
 
Microsoft SQL Server - Files and Filegroups
Microsoft SQL Server - Files and FilegroupsMicrosoft SQL Server - Files and Filegroups
Microsoft SQL Server - Files and Filegroups
 
01 oracle architecture
01 oracle architecture01 oracle architecture
01 oracle architecture
 
Customizing the look and-feel of DSpace
Customizing the look and-feel of DSpaceCustomizing the look and-feel of DSpace
Customizing the look and-feel of DSpace
 
Advanced RAC troubleshooting: Network
Advanced RAC troubleshooting: NetworkAdvanced RAC troubleshooting: Network
Advanced RAC troubleshooting: Network
 
Cookies & Session
Cookies & SessionCookies & Session
Cookies & Session
 
Database
DatabaseDatabase
Database
 
Sap bpc
Sap bpcSap bpc
Sap bpc
 
Oracle SQL Developer Tips & Tricks
Oracle SQL Developer Tips & TricksOracle SQL Developer Tips & Tricks
Oracle SQL Developer Tips & Tricks
 
Group policy objects
Group policy objectsGroup policy objects
Group policy objects
 
PHP - Introduction to PHP Cookies and Sessions
PHP - Introduction to PHP Cookies and SessionsPHP - Introduction to PHP Cookies and Sessions
PHP - Introduction to PHP Cookies and Sessions
 
Sql server basics
Sql server basicsSql server basics
Sql server basics
 
Understanding the Basics of CA Workload Automation iDash
Understanding the Basics of CA Workload Automation iDashUnderstanding the Basics of CA Workload Automation iDash
Understanding the Basics of CA Workload Automation iDash
 
Html list
Html listHtml list
Html list
 
Mysql ppt
Mysql pptMysql ppt
Mysql ppt
 
Lenguaje estructurado sql
Lenguaje estructurado sqlLenguaje estructurado sql
Lenguaje estructurado sql
 
Less07 storage
Less07 storageLess07 storage
Less07 storage
 
Oracle Database Performance Tuning Concept
Oracle Database Performance Tuning ConceptOracle Database Performance Tuning Concept
Oracle Database Performance Tuning Concept
 
HTML Tags
HTML TagsHTML Tags
HTML Tags
 

Andere mochten auch

การเพิ่มประสิทธิภาพ Instance memory - Oracle 11G
การเพิ่มประสิทธิภาพ Instance memory  - Oracle 11Gการเพิ่มประสิทธิภาพ Instance memory  - Oracle 11G
การเพิ่มประสิทธิภาพ Instance memory - Oracle 11GN/A
 
Apex thaibook 01_draft
Apex thaibook 01_draftApex thaibook 01_draft
Apex thaibook 01_draftN/A
 
Oracle Database 11g Product Family
Oracle Database 11g Product FamilyOracle Database 11g Product Family
Oracle Database 11g Product FamilyN/A
 
Basic - Oracle Edition Based Redefinition Presentation
Basic - Oracle Edition Based Redefinition PresentationBasic - Oracle Edition Based Redefinition Presentation
Basic - Oracle Edition Based Redefinition PresentationN/A
 
ออราเคิล (Oracle) Statspack (ติดตั้งและใช้งานเบื้องต้น)
ออราเคิล (Oracle) Statspack (ติดตั้งและใช้งานเบื้องต้น)ออราเคิล (Oracle) Statspack (ติดตั้งและใช้งานเบื้องต้น)
ออราเคิล (Oracle) Statspack (ติดตั้งและใช้งานเบื้องต้น)N/A
 
Test Dml With Nologging
Test Dml With NologgingTest Dml With Nologging
Test Dml With NologgingN/A
 
FIXING BLOCK CORRUPTION (RMAN) on 11G
FIXING BLOCK CORRUPTION (RMAN) on 11GFIXING BLOCK CORRUPTION (RMAN) on 11G
FIXING BLOCK CORRUPTION (RMAN) on 11GN/A
 
บทที่ 2 (1)
บทที่ 2 (1)บทที่ 2 (1)
บทที่ 2 (1)nopphanut
 
Spat Db 3 Intro Sql
Spat Db 3 Intro SqlSpat Db 3 Intro Sql
Spat Db 3 Intro Sqlphisan_chula
 
Connecting Hadoop and Oracle
Connecting Hadoop and OracleConnecting Hadoop and Oracle
Connecting Hadoop and OracleTanel Poder
 
Oracle XML Publisher / BI Publisher
Oracle XML Publisher / BI PublisherOracle XML Publisher / BI Publisher
Oracle XML Publisher / BI PublisherEdi Yanto
 

Andere mochten auch (18)

การเพิ่มประสิทธิภาพ Instance memory - Oracle 11G
การเพิ่มประสิทธิภาพ Instance memory  - Oracle 11Gการเพิ่มประสิทธิภาพ Instance memory  - Oracle 11G
การเพิ่มประสิทธิภาพ Instance memory - Oracle 11G
 
Apex thaibook 01_draft
Apex thaibook 01_draftApex thaibook 01_draft
Apex thaibook 01_draft
 
Oracle Database 11g Product Family
Oracle Database 11g Product FamilyOracle Database 11g Product Family
Oracle Database 11g Product Family
 
Basic - Oracle Edition Based Redefinition Presentation
Basic - Oracle Edition Based Redefinition PresentationBasic - Oracle Edition Based Redefinition Presentation
Basic - Oracle Edition Based Redefinition Presentation
 
ออราเคิล (Oracle) Statspack (ติดตั้งและใช้งานเบื้องต้น)
ออราเคิล (Oracle) Statspack (ติดตั้งและใช้งานเบื้องต้น)ออราเคิล (Oracle) Statspack (ติดตั้งและใช้งานเบื้องต้น)
ออราเคิล (Oracle) Statspack (ติดตั้งและใช้งานเบื้องต้น)
 
Test Dml With Nologging
Test Dml With NologgingTest Dml With Nologging
Test Dml With Nologging
 
FIXING BLOCK CORRUPTION (RMAN) on 11G
FIXING BLOCK CORRUPTION (RMAN) on 11GFIXING BLOCK CORRUPTION (RMAN) on 11G
FIXING BLOCK CORRUPTION (RMAN) on 11G
 
Web 2.0 สู่ Library 2.0
Web 2.0 สู่ Library 2.0Web 2.0 สู่ Library 2.0
Web 2.0 สู่ Library 2.0
 
บทที่ 2 (1)
บทที่ 2 (1)บทที่ 2 (1)
บทที่ 2 (1)
 
Sql ta2
Sql ta2Sql ta2
Sql ta2
 
บทที่ 4
บทที่ 4 บทที่ 4
บทที่ 4
 
Database Tuning for e-Learning
Database Tuning for e-LearningDatabase Tuning for e-Learning
Database Tuning for e-Learning
 
ภาษา Sql
ภาษา Sqlภาษา Sql
ภาษา Sql
 
Spat Db 3 Intro Sql
Spat Db 3 Intro SqlSpat Db 3 Intro Sql
Spat Db 3 Intro Sql
 
07 sql
07 sql07 sql
07 sql
 
Connecting Hadoop and Oracle
Connecting Hadoop and OracleConnecting Hadoop and Oracle
Connecting Hadoop and Oracle
 
Oracle XML Publisher / BI Publisher
Oracle XML Publisher / BI PublisherOracle XML Publisher / BI Publisher
Oracle XML Publisher / BI Publisher
 
คำสั่งSql
คำสั่งSqlคำสั่งSql
คำสั่งSql
 

Ähnlich wie การตรวจเช็คฐานข้อมูล Oracle v1 draft

Ähnlich wie การตรวจเช็คฐานข้อมูล Oracle v1 draft (17)

Assignment 2 of Database (Database Security)
Assignment 2 of Database (Database Security)Assignment 2 of Database (Database Security)
Assignment 2 of Database (Database Security)
 
Oracle Database Monitoring with AAS
Oracle Database Monitoring with AASOracle Database Monitoring with AAS
Oracle Database Monitoring with AAS
 
Sql theory
Sql theorySql theory
Sql theory
 
Ch07 bind9-part2
Ch07 bind9-part2Ch07 bind9-part2
Ch07 bind9-part2
 
Server2Go เว็บพกพาตัวจริง
Server2Go เว็บพกพาตัวจริงServer2Go เว็บพกพาตัวจริง
Server2Go เว็บพกพาตัวจริง
 
lesson4 JSP
lesson4 JSPlesson4 JSP
lesson4 JSP
 
Hotspotubuntu8
Hotspotubuntu8Hotspotubuntu8
Hotspotubuntu8
 
Cent os
Cent osCent os
Cent os
 
Ch12 web-app-part2
Ch12 web-app-part2Ch12 web-app-part2
Ch12 web-app-part2
 
Coovaubuntu904
Coovaubuntu904Coovaubuntu904
Coovaubuntu904
 
การเพ มข_อม_ลลงฐานข_อม_ลด_วยภาษา jsp&sql
การเพ  มข_อม_ลลงฐานข_อม_ลด_วยภาษา jsp&sqlการเพ  มข_อม_ลลงฐานข_อม_ลด_วยภาษา jsp&sql
การเพ มข_อม_ลลงฐานข_อม_ลด_วยภาษา jsp&sql
 
Proxy fc4 web
Proxy fc4 webProxy fc4 web
Proxy fc4 web
 
คู่มือการติดตั้ง Cent os
คู่มือการติดตั้ง  Cent osคู่มือการติดตั้ง  Cent os
คู่มือการติดตั้ง Cent os
 
Ch06 bind9
Ch06 bind9Ch06 bind9
Ch06 bind9
 
Portable Moodle : Moodle & Server2Go
Portable Moodle  : Moodle & Server2GoPortable Moodle  : Moodle & Server2Go
Portable Moodle : Moodle & Server2Go
 
Doc1
Doc1Doc1
Doc1
 
Javacentrix com chap11-2
Javacentrix com chap11-2Javacentrix com chap11-2
Javacentrix com chap11-2
 

การตรวจเช็คฐานข้อมูล Oracle v1 draft

  • 1. การตรวจเช็คฐานข้อมูล Oracle (v. 1) <br />หลายครั้งที่ผู้เริ่มต้นใช้งานฐานข้อมูล Oracle และต้องรับหน้าที่เป็นผู้ดูแลฐานข้อมูล อาจตั้งคำถามให้กับตัวเองว่าอะไรบ้างที่เราต้องรู้ในการตรวจเช็ค ตรวจสอบฐานข้อมูล เราสามารถอ่าน ค้นคว้าสิ่งต่างๆ เกี่ยวกับฐานข้อมูล Oracle ได้บน http://otn.oracle.com http://tahiti.oracle.com http://forums.oracle.com http://support.oracle.com หรือหาสิ่งที่อยากรู้ ได้บน google ด้วยตัวเอง <br />บทความนี้ได้ใช้ไอเดียจาก My Oracle Support พร้อมกันนี้ได้ดัดแปลง ทดสอบ เพื่อนำมาเสนอ และหวังว่าจะมีประโชยน์ต่อผู้อ่าน1. Parameter file - parameter ไฟล์ มี 2 แบบ คือ text ไฟล์ (pfile) และ binary ไฟล์ (spfile), pfile สามารถแก้ไขได้ด้วย Editor บน OS นั้นๆ ส่วน spfile ต้องจัดการผ่าน Instance ของมันเองตั้งแต่ Oracle 8i เราใช้ text ไฟล์ที่เรียกว่า pfile (parameter file) ในการเก็บ database initialization parameters ซึ่ง pfile นี้จะถูกอ่านเมื่อ Instance เริ่มต้น(startup) การเปลี่ยนค่าอะไรก็ตามใน pfile จะมีผลก็ต่อเมื่อฐานข้อมูล มีการเริ่มต้นใหม่(restart) แต่ parameter(dynamic)ก็ยังสามารถเปลี่ยนแปลงได้ด้วย ALTER SYSTEM หรือ ALTER SESSION ซึ่งจะมีผลทันทีจากนั้น Oracle 9i มีฟีเจอร์ที่เรียกว่า spfile (server parameter file) ซึ่งเป็น binary ไฟล์ และเก็บข้อมูล เหมือนกับ pfile การเปลี่ยนแปลงใน spfile ต้องทำผ่่าน Instance โดยการใช้ ALTER SYSTEMSPFILE อนุญาติให้มีการเปลี่ยนแปลงแบบ (dynamic) โดยไม่ต้องหยุด Instance และ spfile ยังใช้ในการแชร์บน RAC, ในการเริ่มต้น Instance นั้นถ้าเราไม่ระบุ pfile - Oracle จะใช้ spfile ในการเริ่มต้น Instance (startup)การเซตค่า Server Parameter File:ใช้ SID เพื่อกำหนดค่าเฉพาะแต่ละ Instance (เห็นได้ชัดบน RAC), ใช้ '*' สำหรับทุกๆ Instance ในฐานข้อมูลเช่น<br />db2.thread=2db1.thread=1*.undo_management='AUTO'*.undo_retention=3600db2.undo_tablespace='UNDOTBS2'db1.undo_tablespace='UNDOTBS1'<br />กับ Parameter ที่เป็น dynamic เราสามารถใช้ ALTER SESSION หรือ ALTER SYSTEM เปลี่ยนแปลงขณะที่ Instance ยังทำงานอยู่<br />ALTER SESSION SET parameter_name = valueALTER SYSTEM SET parameter_name = value [DEFERRED]<br />สำหรับ ALTER SYSTEM เราสามารถกำหนด SCOPE เพื่อระบุขอบเขตในการเปลี่ยนแปลงSCOPE = SPFILE - เหมาะกับ parameter ที่เป็น dynamic และ static เมื่อเปลี่ยนแปลงใน spfile ไฟล์ จะมีผลหลังจากเริ่มต้นใหม่ครั้งต่อไป (restart)SCOPE = MEMORY - เหมาะกับ parameter ที่เป็น dynamic การเปลี่ยนแปลงจะเปลี่ยนเพียงใน หน่วยความจำเท่านั้นSCOPE = BOTH - เหมาะกับ parameter ที่เป็น dynamic จะเปลี่ยนทั้งใน spfile ไฟล์ และ หน่วยความจำ<br />หากไม่ระบุ SCOPE = BOTH (default)<br />เช่น<br />SQL> show parameter open_cursorsNAME TYPE VALUE------------------------------------ ----------- ------------------------------open_cursors integer 300SQL> alter system set open_cursors=100 scope=MEMORY;System altered.SQL> show parameter open_cursors;NAME TYPE VALUE------------------------------------ ----------- ------------------------------open_cursors integer 100SQL> select sid, name, value from v$spparameter where name='open_cursors';SID NAME VALUE----- -------------------- ----------* open_cursors 300SQL> alter system set open_cursors=200 scope=BOTH;System altered.SQL> show parameter open_cursors;NAME TYPE VALUE------------------------------------ ----------- ------------------------------open_cursors integer 200SQL> select sid, name, value from v$spparameter where name='open_cursors';SID NAME VALUE----- -------------------- ----------* open_cursors 200SQL> alter system set open_cursors=300 scope=SPFILE;System altered.SQL> show parameter open_cursors;NAME TYPE VALUE------------------------------------ ----------- ------------------------------open_cursors integer 200SQL> select sid, name, value from v$spparameter where name='open_cursors';SID NAME VALUE----- -------------------- ----------* open_cursors 300SQL> alter system set open_cursors=300 sid='TEST' scope=SPFILE;System altered.SQL> select sid, name, value from v$spparameter where name='open_cursors';SID NAME VALUE----- -------------------- ----------* open_cursors 300TEST open_cursors 300SQL> alter system reset open_cursors sid='TEST' scope=SPFILE;System altered.SQL> select sid, name, value from v$spparameter where name='open_cursors';SID NAME VALUE----- -------------------- ----------* open_cursors 300<br />จากตัวอย่างข้างบนยังแสดงให้ เห็นว่าเรายังสามารถใช้ SID='...' เป็นอะไรก็ได้ และการใช้ ALTER SYSTEM RESET<br />การตรวจสอบว่าใช้ spfile หรือไม่ (อ้างอิง)<br />SQL> show parameter spfileNAME TYPE VALUE------------------------------------ ----------- ------------------------------spfile string /oracle/11gR1/dbs/spfileorcl.oraSQL> select isspecified, count(*) from v$spparameter group by isspecified;ISSPEC COUNT(*)------ ----------TRUE 23FALSE 267<br />หากต้อง การนำ SPFILE ออกมาเป็น text ไฟล์ - ทำได้โดยCREATE PFILE FROM SPFILEเช่น<br />SQL> create pfile='/tmp/pfile' from spfile;File created.<br />ในมุมกลับกัน หากต้องการเปลี่ยนจาก pfile เป็น spfileCREATE SPFILE FROM PFILE<br />เช่น<br />SQL> create spfile from pfile;<br />หรือ<br />SQL> create spfile from pfile='/tmp/pfile';<br />จาก นั้น stop/start ฐานข้อมูล<br />SQL> show parameter spfile;NAME TYPE VALUE------------------------------------ ----------- ------------------------------spfile stringSQL> create spfile from pfile;File created.SQL> shutdown immediate;SQL> startupSQL> show parameter spfile;NAME TYPE VALUE------------------------------------ ----------- ------------------------------spfile string /oracle/11gR1/dbs/spfileorcl.ora<br />หมายเหตุ เราจะรู้ได้อย่างไรว่า Initialization parameters ตัวไหนที่เราสามารถเปลี่ยนแปลง (ALTER SYSTEM SET) และมีผลในทันที<br />SQL> select name, value from v$parameter where ISSYS_MODIFIABLE='IMMEDIATE';<br />2. Control files - Control file เก็บข้อมูล - ชื่อฐานข้อมูล, เวลาที่ฐานข้อมูลถูกสร้าง, ชื่อและที่เก็บของ datafile/redo log ไฟล์ และอื่นๆ ที่จำเป็นในฐานข้อมูล, และแนะนำควรมีอย่างน้อย 2 ไฟล์ เก็บบน physical disk ที่ต่างกัน พร้อมกับ backup<br />SQL> select status, name from v$controlfile;STATUS NAME------- -----------------------------------------------------------------/oracle/oradata/ORCL/controlfile/o1_mf_5twzvtgn_.ctl/oracle/flash_recovery_area/ORCL/controlfile/o1_mf_5twzvtoh_.ctl<br />Initialization parameter ที่เกี่ยวข้องCONTROL_FILES - ชื่อของ controlfiles (ชื่อไฟล์)CONTROL_FILE_RECORD_KEEP_TIME- จำนวนวันที่เก็บข้อมูลใน controlfile ก่อนจะถูกเขียนทับ<br />Control file มีการเก็บข้อมูล 2 ประเภท- ข้อมูลที่จำเป็นสำหรับฐานข้อมูล และจะไม่ถูกเขียนทับ เช่น datafile, online redo log- ข้อมูลเกี่ยวกับ RMAN ที่ backup และใช้ในการ recovery ซึ่งจะถูกเขียนทับได้CONTROLFILE AUTOBACKUP<br />RMAN> show all;CONFIGURE CONTROLFILE AUTOBACKUP OFF; # defaultRMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;new RMAN configuration parameters:CONFIGURE CONTROLFILE AUTOBACKUP ON;new RMAN configuration parameters are successfully stored<br />ทุกๆ ครั้งหลัง backup หรือเปลี่ยนแปลงเกี่ยวกับ Tablespace, เพิ่ม redo log - oracle จะ backup control file โดยอัตโนมัติ (อ้าง อิง)เช่น<br />RMAN> backup datafile 1;Starting backup at 19-APR-10allocated channel: ORA_DISK_1channel ORA_DISK_1: SID=141 device type=DISKchannel ORA_DISK_1: starting full datafile backup setchannel ORA_DISK_1: specifying datafile(s) in backup setinput datafile file number=00001 name=/oracle/oradata/ORCL/datafile/o1_mf_system_5twzp126_.dbfchannel ORA_DISK_1: starting piece 1 at 19-APR-10channel ORA_DISK_1: finished piece 1 at 19-APR-10piece handle=/oracle/flash_recovery_area/ORCL/backupset/2010_04_19/o1_mf_nnndf_TAG20100419T231236_5ws07tyl_.bkp tag=TAG20100419T231236 comment=NONEchannel ORA_DISK_1: backup set complete, elapsed time: 00:02:38Finished backup at 19-APR-10Starting Control File and SPFILE Autobackup at 19-APR-10 piece handle=/oracle/flash_recovery_area/ORCL/autobackup/2010_04_19/o1_mf_s_716771721_5ws0f47f_.bkp comment=NONE Finished Control File and SPFILE Autobackup at 19-APR-10<br />การ backup Control file:- backup เป็น binary fileALTER DATABASE BACKUP CONTROLFILE TO '/oracle/backup/control.bkp';- สร้าง SQL statement เพื่อใช้ recreate control fileALTER DATABASE BACKUP CONTROLFILE TO TRACE;ALTER DATABASE BACKUP CONTROLFILE TO TRACE AS '/oracle/backup/control.sql';จะเห็นว่า Control file เป็นสิ่งที่สำคัญมาก จึงจำเป็นที่จะต้อง ตรวจสอบและ BACKUP(เสมอ)<br />ตัวอย่าง Multiplex controlfiles เมื่อใช้งาน ASM DiskGroup<br />SQL> show parameter control_files<br />NAME TYPE VALUE<br />------------------------------------ ----------- ------------------------------<br />control_files string +DATA/orcl/controlfile/current.277.741286407<br /> <br />SQL> shutdown immediate<br />Database closed.<br />Database dismounted.<br />ORACLE instance shut down.<br />RMAN> startup nomount;<br />Oracle instance started<br />Total System Global Area 626327552 bytes<br />Fixed Size 2229080 bytes<br />Variable Size 390073512 bytes<br />Database Buffers 226492416 bytes<br />Redo Buffers 7532544 bytes<br />RMAN> restore controlfile to '+DATA' from '+DATA/orcl/controlfile/current.277.741286407';<br />Starting restore at 25-APR-11<br />using target database control file instead of recovery catalog<br />allocated channel: ORA_DISK_1<br />channel ORA_DISK_1: SID=10 instance=orcl_2 device type=DISK<br />channel ORA_DISK_1: copied control file copy<br />Finished restore at 25-APR-11<br />ASMCMD> ls +DATA/orcl/CONTROLFILE/<br />Current.277.741286407<br />current.285.749426511<br />SQL> alter system set control_files='+DATA/orcl/controlfile/current.277.741286407','+DATA/orcl/controlfile/current.285.749426511' scope=spfile;<br />System altered.<br />SQL> startup force;<br />ORACLE instance started.<br />Total System Global Area 626327552 bytes<br />Fixed Size 2229080 bytes<br />Variable Size 390073512 bytes<br />Database Buffers 226492416 bytes<br />Redo Buffers 7532544 bytes<br />Database mounted.<br />Database opened.<br />SQL> show parameter control_files<br />NAME TYPE VALUE<br />------------------------------------ ----------- ------------------------------control_files string +DATA/orcl/controlfile/current.277.741286407, +DATA/orcl/controlfile/current.285.749426511<br /> <br /> <br />3. Redo log files - จะเก็บข้อมูลที่มีการเปลี่ยนแปลงในฐานข้อมูล และ Oracle ใช้ online redo log files เพื่อช่วยให้เกิดการสูญหายของข้อมูลน้อยที่สุด, redolog files จะถูกใช้ เช่นกรณี instance มีปัญหา และต้องการที่จะกู้ข้อมูลที่ commit ไปแล้ว ซึ่งยังไม่ได้ถูกเขียนลง data files - redo log ควรต้องทำ multiplex และอยู่บน physical disk ที่ต่างกัน เพื่อป้องกัน disk crash หรือ ผู้ใช้ลบ และ ต้องการ 2 redo log groups อย่างน้อย และ 3 redo log groups เมื่อใช้ ARCHIVE LOG modeการจัดการกับ Online Redo Log Groups และ Members (อ่านเพิ่มเติม Oracle support: 102995.1)ตัวอย่าง: ลบ/เพิ่ม Online Redo Log Groups<br />SQL> select group#, sequence#, bytes, members, status from v$log;GROUP# SEQUENCE# BYTES MEMBERS STATUS---------- ---------- ---------- ---------- ----------------1 22 52428800 2 CURRENT2 21 52428800 2 INACTIVE3 20 52428800 2 INACTIVE<br />SQL> select group#, status, type, member from v$logfile;GROUP# STATUS TYPE MEMBER---------- ------- ------- -----------------------------------------------------------------3 ONLINE /oracle/oradata/ORCL/onlinelog/o1_mf_3_5wb8p2vh_.log3 ONLINE /oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_3_5wb8p33t_.log2 ONLINE /oracle/oradata/ORCL/onlinelog/o1_mf_2_5wb6kn6p_.log2 ONLINE /oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_2_5wb6koh5_.log1 ONLINE /oracle/oradata/ORCL/onlinelog/o1_mf_1_5wb6khy8_.log1 ONLINE /oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_1_5wb6kkxd_.logSQL> ALTER DATABASE DROP LOGFILE GROUP 3;Database altered.SQL> select group#, sequence#, bytes, members, status from v$log;GROUP# SEQUENCE# BYTES MEMBERS STATUS---------- ---------- ---------- ---------- ----------------1 22 52428800 2 CURRENT2 21 52428800 2 INACTIVESQL> select group#, status, type, member from v$logfile;GROUP# STATUS TYPE MEMBER---------- ------- ------- -----------------------------------------------------------------2 ONLINE /oracle/oradata/ORCL/onlinelog/o1_mf_2_5wb6kn6p_.log2 ONLINE /oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_2_5wb6koh5_.log1 ONLINE /oracle/oradata/ORCL/onlinelog/o1_mf_1_5wb6khy8_.log1 ONLINE /oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_1_5wb6kkxd_.logSQL> ALTER DATABASE ADD LOGFILE GROUP 3;Database altered.<br />SQL> select group#, sequence#, bytes, members, status from v$log;GROUP# SEQUENCE# BYTES MEMBERS STATUS<br />---------- ---------- ---------- ---------- ----------------1 22 52428800 2 CURRENT2 21 52428800 2 INACTIVE3 0 104857600 2 UNUSED<br />ตัวอย่าง: ลบ/เพิ่ม Online Redo Log Members<br />SQL> select group#, status, type, member from v$logfile;GROUP# STATUS TYPE MEMBER---------- ------- ------- -----------------------------------------------------------------3 ONLINE /oracle/oradata/ORCL/onlinelog/o1_mf_3_5x5m8zfh_.log3 ONLINE /oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_3_5x5m8zrk_.log2 ONLINE /oracle/oradata/ORCL/onlinelog/o1_mf_2_5wb6kn6p_.log2 ONLINE /oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_2_5wb6koh5_.log1 ONLINE /oracle/oradata/ORCL/onlinelog/o1_mf_1_5wb6khy8_.log1 ONLINE /oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_1_5wb6kkxd_.logSQL> ALTER DATABASE DROP LOGFILE MEMBER '/oracle/oradata/ORCL/onlinelog/o1_mf_3_5x5m8zfh_.log';Database altered.SQL> select group#, status, type, member from v$logfile;GROUP# STATUS TYPE MEMBER---------- ------- ------- -----------------------------------------------------------------3 ONLINE /oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_3_5x5m8zrk_.log2 ONLINE /oracle/oradata/ORCL/onlinelog/o1_mf_2_5wb6kn6p_.log2 ONLINE /oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_2_5wb6koh5_.log1 ONLINE /oracle/oradata/ORCL/onlinelog/o1_mf_1_5wb6khy8_.log1 ONLINE /oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_1_5wb6kkxd_.logSQL> ALTER DATABASE ADD LOGFILE MEMBER '/oracle/oradata/ORCL/onlinelog/redo3b.log' to group 3;Database altered.SQL> select group#, status, type, member from v$logfile;GROUP# STATUS TYPE MEMBER---------- ------- ------- -----------------------------------------------------------------3 INVALID ONLINE /oracle/oradata/ORCL/onlinelog/redo3b.log3 ONLINE /oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_3_5x5m8zrk_.log 2 ONLINE /oracle/oradata/ORCL/onlinelog/o1_mf_2_5wb6kn6p_.log2 ONLINE /oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_2_5wb6koh5_.log1 ONLINE /oracle/oradata/ORCL/onlinelog/o1_mf_1_5wb6khy8_.log1 ONLINE /oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_1_5wb6kkxd_.log<br />ตัวอย่าง ที่เห็นจะเป็นแค่การจัดการกับ redolog file และหวังว่าจะเป็นประโยชน์ ช่วยในการตรวจเช็คฐานข้อมูล - อย่างไรก็ตาม เราต้องเรียนรู้การแก้ปัญหาในกรณีที่ redolog file มีปัญหาด้วย (และตรวจเช็ค backup เสมอ)<br />ตัวอย่าง กรณี member ของ redo group โดยลบ<br />SQL> select group#, status, type, member from v$logfile;GROUP# STATUS TYPE MEMBER---------- ------- ------- -----------------------------------------------------------------3 ONLINE /oracle/oradata/ORCL/onlinelog/redo3b.log3 ONLINE /oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_3_5x5m8zrk_.log2 ONLINE /oracle/oradata/ORCL/onlinelog/o1_mf_2_5wb6kn6p_.log2 ONLINE /oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_2_5wb6koh5_.log1 ONLINE /oracle/oradata/ORCL/onlinelog/o1_mf_1_5wb6khy8_.log1 ONLINE /oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_1_5wb6kkxd_.logSQL> !rm /oracle/oradata/ORCL/onlinelog/redo3b.log /oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_3_5x5m8zrk_.log<br />SQL> alter system switch logfile;<br />บน alert log file:<br />Sat Apr 24 18:31:47 2010Errors in file /oracle/diag/rdbms/orcl/orcl/trace/orcl_arc2_2497.trc:ORA-00313: open failed for members of log group 3 of thread 1ORA-00312: online log 3 thread 1: '/oracle/oradata/ORCL/onlinelog/redo3b.log'ORA-27037: unable to obtain file statusLinux Error: 2: No such file or directoryAdditional information: 3ORA-00312: online log 3 thread 1: '/oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_3_5x5m8zrk_.log'ORA-27037: unable to obtain file statusLinux Error: 2: No such file or directoryAdditional information: 3Errors in file /oracle/diag/rdbms/orcl/orcl/trace/orcl_arc2_2497.trc:ORA-00313: open failed for members of log group 3 of thread 1ORA-00312: online log 3 thread 1: '/oracle/oradata/ORCL/onlinelog/redo3b.log'ORA-27037: unable to obtain file statusLinux Error: 2: No such file or directoryAdditional information: 3ORA-00312: online log 3 thread 1: '/oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_3_5x5m8zrk_.log'ORA-27037: unable to obtain file statusLinux Error: 2: No such file or directoryAdditional information: 3Sat Apr 24 18:31:48 2010Errors in file /oracle/diag/rdbms/orcl/orcl/trace/orcl_m000_3908.trc:ORA-00313: open failed for members of log group 3 of thread 1ORA-00312: online log 3 thread 1: '/oracle/oradata/ORCL/onlinelog/redo3b.log'ORA-27037: unable to obtain file statusLinux Error: 2: No such file or directoryAdditional information: 3ORA-00312: online log 3 thread 1: '/oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_3_5x5m8zrk_.log'ORA-27037: unable to obtain file statusLinux Error: 2: No such file or directoryAdditional information: 3<br />ตรวจสอบ redolog group 3 และแก้ปัญหา<br />SQL> select group#, sequence#, bytes, members, status from v$log;GROUP# SEQUENCE# BYTES MEMBERS STATUS---------- ---------- ---------- ---------- ----------------1 28 52428800 2 CURRENT2 27 52428800 2 INACTIVE3 26 104857600 2 INACTIVESQL> alter database clear unarchived logfile group 3;Database altered.<br />บน alert log file:<br />Sat Apr 24 18:32:45 2010alter database clear unarchived logfile group 3WARNING! CLEARING REDO LOG WHICH HAS NOT BEEN ARCHIVED. BACKUPS TAKENBEFORE 04/24/2010 18:28:58 (CHANGE 1512349) CANNOT BE USED FOR RECOVERY.Clearing online log 3 of thread 1 sequence number 26Errors in file /oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_3904.trc:ORA-00313: open failed for members of log group 3 of thread 1ORA-00312: online log 3 thread 1: '/oracle/oradata/ORCL/onlinelog/redo3b.log'ORA-27037: unable to obtain file statusLinux Error: 2: No such file or directoryAdditional information: 3ORA-00312: online log 3 thread 1: '/oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_3_5x5m8zrk_.log'ORA-27037: unable to obtain file statusLinux Error: 2: No such file or directoryAdditional information: 3Deleted Oracle managed file /oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_3_5x5m8zrk_.logSat Apr 24 18:32:49 2010Archiver process freed from errors. No longer stoppedSat Apr 24 18:32:56 2010Completed: alter database clear unarchived logfile group 3<br />จะเห็นว่า logfile group 3 ใช้งานได้ปกติ - ส่วนการแก้ปัญหากับ redolog file ก็ขึ้นกับแต่ละกรณีไป<br />4. Archiving - เป็นกลไกที่จำเป็นในการสำรองข้อมูลที่เปลี่ยนแปลงในฐานข้อมูลArchive files เก็บข้อมูลที่จำเป็นในการกู้ฐานข้อมูล ดังนั้นจึงมักแนะนำให้ใช้ฐานข้อมูลที่เป็น Archive Modeตัวอย่าง:เปลี่ยน No Archive Mode -> Archive Mode<br />SQL> archive log list;Database log mode No Archive ModeAutomatic archival DisabledArchive destination USE_DB_RECOVERY_FILE_DESTOldest online log sequence 31Current log sequence 33SQL> shutdown immediate;Database closed.Database dismounted.ORACLE instance shut down.SQL> startup mountORACLE instance started.Total System Global Area 836976640 bytesFixed Size 1303132 bytesVariable Size 536874404 bytesDatabase Buffers 293601280 bytesRedo Buffers 5197824 bytesDatabase mounted.SQL> alter database archivelog;Database altered.SQL> alter database open;Database altered.SQL> archive log list;Database log mode Archive ModeAutomatic archival EnabledArchive destination USE_DB_RECOVERY_FILE_DESTOldest online log sequence 31Next log sequence to archive 33Current log sequence 33SQL> select NAME, CREATED, LOG_MODE, CHECKPOINT_CHANGE#,ARCHIVE_CHANGE# from V$DATABASE;NAME CREATED LOG_MODE CHECKPOINT_CHANGE# ARCHIVE_CHANGE#--------- --------- ------------ ------------------ ---------------ORCL 28-MAR-10 ARCHIVELOG 1663822 1619901<br />*** กรณี ของ RAC เราต้อง shutdown database (instance all nodes) -> startup mount (only one node) -> alter database archivelog -> alter database open -> startup instance other nodes.ก่อน 10g หากฐานข้อมูลเป็น archive mode เราควรต้องเปิด automatic archiver process โดยการเซต log_archive_start=TRUE แต่จาก 10g quot; log_archive_startquot; ไม่จำเป็นต่อไป และอาจพบ Error เมื่อ startup ฐานข้อมูลORA-32006: LOG_ARCHIVE_START initialization parameter has been deprecatedการพิจารณา พื้นที่ disk สำหรับ Archive Files [ID 122555.1] - ขอเสนอ script พร้อมตัวอย่าง<br />column ord noprintcolumn date_ heading 'Date' format A15column no heading '#Arch files' format 9999999column no_size heading 'Size Mb' format 9999999compute avg of no on reportcompute avg of no_size on reportbreak on reportselect MAX(first_time) ord, to_char(first_time,'DD-MON-YYYY') date_,count(recid) no, count(recid) * <REDO_SIZE_FILE_MB> no_sizefrom v$log_historygroup by to_char(first_time,'DD-MON-YYYY')order by ord/clear breaksclear computesclear columns<br />ตัวอย่าง:<br />SQL> select distinct (bytes)/1024/1024 from v$log;(BYTES)/1024/1024-----------------50SQL> column ord noprintSQL> column date_ heading 'Date' format A15SQL> column no heading '#Arch files' format 9999999SQL> column no_size heading 'Size Mb' format 9999999SQL> compute avg of no on reportSQL> compute avg of no_size on reportSQL> break on reportSQL> select MAX(first_time) ord, to_char(first_time,'DD-MON-YYYY') date_,count(recid) no, count(recid) * 50 no_sizefrom v$log_historygroup by to_char(first_time,'DD-MON-YYYY')order by ord/SQL> clear breaksSQL> clear computesSQL> clear columnsDate #Arch files Size Mb--------------- ----------- --------19-APR-2010 43 215020-APR-2010 96 480021-APR-2010 96 480022-APR-2010 97 485023-APR-2010 96 480024-APR-2010 96 480025-APR-2010 97 485026-APR-2010 96 480027-APR-2010 97 485028-APR-2010 96 480029-APR-2010 96 480030-APR-2010 96 480001-MAY-2010 66 3300----------- --------90 4492<br />จะพบว่า เฉลี่ยวันละ 4 - 5 Gb ถ้าต้องการเก็บ Archive Files 3 วัน จำเป็นต้องมีพื้นที่ ถึง 5 * 3 = 15 Gb<br />ตัวอย่าง อื่นๆ Archive Mode -> No Archive Mode<br />SQL> startup mountORACLE instance started.Total System Global Area 836976640 bytesFixed Size 1303132 bytesVariable Size 536874404 bytesDatabase Buffers 293601280 bytesRedo Buffers 5197824 bytesDatabase mounted.SQL> alter database noarchivelog;Database altered.SQL> archive log list;Database log mode No Archive ModeAutomatic archival DisabledArchive destination USE_DB_RECOVERY_FILE_DESTOldest online log sequence 31Current log sequence 33<br />Archiving จึงเป็นสิ่งจำเป็นในการสำรองข้อมูล หรือแม้แต่เพื่อการแก้ปัญหา บนฐานข้อมูล เช่น ปัญหา block corruptionOracle พารามิเตอร์ที่เกี่ยวกับ Archiving (เพิ่มเติมที่ Oracle Documents):- LOG_ARCHIVE_DEST_n- LOG_ARCHIVE_DEST_STATE_n- LOG_ARCHIVE_FORMAT<br />หมายเหตุ เมื่อเราใช้ Database Archive Mode และ Archive destination เป็นUSE_DB_RECOVERY_FILE_DESTแปลว่าเรากำลังเก็บ archive files ที่ Flashback Area (db_recovery_file_dest) ดังนั้นต้องแน่ใจว่าเรากำหนดค่าพารามิเตอร์ db_recovery_file_dest_size มากพอ และตรวจเช็ค V$FLASH_RECOVERY_AREA_USAGE เพราะถ้ามีการใช้พื้นที่มากเกินค่า db_recovery_file_dest_size อาจทำให้ฐานข้อมูลไม่สามารถเขียน archive file ได้ ส่งผลให้ฐานข้อมูลมีปัญหาได้<br />5. Data files - เป็น physical file บนดิสต์ ที่สร้างโดย Oracle และเก็บโครงสร้างข้อมูล อาทิเช่น tables และ indexes แต่ละ datafile สามารถอยู่บนฐานข้อมูลเดียวเท่านั้น*** อย่างไรก็ตาม read only tablespace สามารถ แชร์ datafiles ระหว่างฐานข้อมูลได้ (reference)<br />5.1 Autoextendautoextend เป็นทางเลือก ที่ช่วยเราสามารถปิดหรือเปิดการใช้งาน ในการขยาย datafile โดยอัตโนมัติ แต่ถ้าเราไม่สามารถจัดสรรพื้นที่ให้กับ datafile ได้ เรายังสามารถเพิ่ม datafile<br />SQL> select FILE_NAME, AUTOEXTENSIBLE, INCREMENT_BY from dba_data_files where tablespace_name='USERS';FILE_NAME AUT INCREMENT_BY------------------------------------------------------------ --- ------------/oracle/oradata/ORCL/datafile/o1_mf_users_5twzp1c3_new.dbf YES 160SQL> alter database datafile '/oracle/oradata/ORCL/datafile/o1_mf_users_5twzp1c3_new.dbf' autoextend off;Database altered.SQL> select FILE_NAME, AUTOEXTENSIBLE, INCREMENT_BY from dba_data_files where tablespace_name='USERS';FILE_NAME AUT INCREMENT_BY------------------------------------------------------------ --- ------------/oracle/oradata/ORCL/datafile/o1_mf_users_5twzp1c3_new.dbf NO 0SQL> alter database datafile '/oracle/oradata/ORCL/datafile/o1_mf_users_5twzp1c3_new.dbf' autoextend on next 10M;Database altered.<br />SQL> select FILE_NAME, AUTOEXTENSIBLE, INCREMENT_BY from dba_data_files where tablespace_name='USERS';FILE_NAME AUT INCREMENT_BY------------------------------------------------------------ --- ------------/oracle/oradata/ORCL/datafile/o1_mf_users_5twzp1c3_new.dbf YES 1280<br />มาตรฐาน Oracle datafile สามารถมีได้มากสุด 4194303 datablocks ดังนั้นDB_BLOCK_SIZE = 2048 จะมี datafile ขนาด 8191 MDB_BLOCK_SIZE = 4096 จะมี datafile ขนาด 16383 MDB_BLOCK_SIZE = 8192 จะมี datafile ขนาด 32767 MDB_BLOCK_SIZE = 16384 จะมี datafile ขนาด 65535 Mตั้งแต่ Oracle 10g มีฟังก์ชันการทำงานใหม่ที่เรียกว่า BIGFILE ที่ช่วยให้สามารถสร้าง datafile ที่มีขนาดใหญ่กว่าเดิม แต่ใน 1 tablespace มีได้แค่ 1 datafile เท่านั้น<br />SELECT TABLESPACE_NAME, BIGFILE from DBA_TABLESPACES;<br />อย่างไรก็ดี ขนาดของ datafile มากสุดยังขึ้นกับ Operation System อีกด้วยตัวอย่าง: พิจารณา datafile ที่เปิดใช้ Autoextend<br />SQL> select file_id, tablespace_name, bytes, maxbytes/1024/1024 quot; maxbytes(M)quot; , maxblocks, increment_by, file_name from dba_data_files where autoextensible = 'YES';FILE_ID TABLESPACE BYTES maxbytes(M) MAXBLOCKS INCREMENT_BY FILE_NAME---------- ---------- ---------- ----------- ---------- ------------ ------------------------------------------------------------4 USERS 298188800 32767.9844 4194302 1280 /oracle/oradata/ORCL/datafile/o1_mf_users_5twzp1c3_new.dbf3 UNDOTBS1 272629760 32767.9844 4194302 640 /oracle/oradata/ORCL/datafile/o1_mf_undotbs1_5twzp19d_.dbf2 SYSAUX 962854912 32767.9844 4194302 1280 /oracle/oradata/ORCL/datafile/o1_mf_sysaux_5twzp15k_.dbf1 SYSTEM 849346560 32767.9844 4194302 1280 /oracle/oradata/ORCL/datafile/o1_mf_system_5twzp126_.dbf5 TBS_DATA 136314880 32767.9844 4194302 1280 /oracle/oradata/ORCL/datafile/o1_mf_tbs_data_5v51k05o_.dbf<br />5.2 Locationเราควรต้องรู้ว่า ตำแหน่งของ datafile นั้นอยู่ที่ไหน เพื่อใช้ในการพิจารณา และการบำรุงรักษา<br />SQL> select * from v$dbfile;FILE# NAME---------- ------------------------------------------------------------4 /oracle/oradata/ORCL/datafile/o1_mf_users_5twzp1c3_new.dbf3 /oracle/oradata/ORCL/datafile/o1_mf_undotbs1_5twzp19d_.dbf2 /oracle/oradata/ORCL/datafile/o1_mf_sysaux_5twzp15k_.dbf1 /oracle/oradata/ORCL/datafile/o1_mf_system_5twzp126_.dbf5 /oracle/oradata/ORCL/datafile/o1_mf_tbs_data_5v51k05o_.dbf6 /oracle/oradata/ORCL/datafile/o1_mf_flow_1_5w23bgcm_.dbf<br />ตัวอย่าง: การย้าย datafile (แบบ alter database datafile ... )<br />SQL> select file#,name, status from v$datafile;FILE# NAME STATUS---------- ------------------------------------------------------------ -------1 /oracle/oradata/ORCL/datafile/o1_mf_system_5twzp126_.dbf SYSTEM2 /oracle/oradata/ORCL/datafile/o1_mf_sysaux_5twzp15k_.dbf ONLINE3 /oracle/oradata/ORCL/datafile/o1_mf_undotbs1_5twzp19d_.dbf ONLINE4 /oracle/oradata/ORCL/datafile/o1_mf_users_5twzp1c3_new.dbf ONLINE5 /oracle/oradata/ORCL/datafile/o1_mf_tbs_data_5v51k05o_.dbf ONLINE6 /oracle/oradata/ORCL/datafile/o1_mf_flow_1_5w23bgcm_.dbf ONLINE<br />SQL> alter database datafile 4 offline;Database altered.SQL> !mv /oracle/oradata/ORCL/datafile/o1_mf_users_5twzp1c3_new.dbf /oracle/oradata/ORCL/datafile_test/o1_mf_users_5twzp1c3_new.dbfSQL> select file#,name, status from v$datafile;FILE# NAME STATUS---------- ------------------------------------------------------------ -------4 /oracle/oradata/ORCL/datafile/o1_mf_users_5twzp1c3_new.dbf RECOVERSQL> alter database rename file '/oracle/oradata/ORCL/datafile/o1_mf_users_5twzp1c3_new.dbf' to '/oracle/oradata/ORCL/datafile_test/o1_mf_users_5twzp1c3_new.dbf';Database altered.SQL> select file#,name, status from v$datafile;FILE# NAME STATUS---------- ---------------------------------------------------------------- -------4 /oracle/oradata/ORCL/datafile_test/o1_mf_users_5twzp1c3_new.dbf RECOVERSQL> recover datafile 4;Media recovery complete.SQL> select file#,name, status from v$datafile;FILE# NAME STATUS---------- ---------------------------------------------------------------- -------4 /oracle/oradata/ORCL/datafile_test/o1_mf_users_5twzp1c3_new.dbf OFFLINESQL> alter database datafile 4 online ;Database altered.SQL> select file#,name, status from v$datafile;FILE# NAME STATUS---------- ---------------------------------------------------------------- -------4 /oracle/oradata/ORCL/datafile_test/o1_mf_users_5twzp1c3_new.dbf ONLINE<br />หรือ ใช้อีกวิธี (alter tablespace ...)<br />SQL> alter tablespace users read only;Tablespace altered.SQL> alter tablespace users offline ;Tablespace altered.SQL> select file#,name, status from v$datafile;FILE# NAME STATUS---------- ---------------------------------------------------------------- -------4 /oracle/oradata/ORCL/datafile_test/o1_mf_users_5twzp1c3_new.dbf OFFLINESQL> !mv /oracle/oradata/ORCL/datafile_test/o1_mf_users_5twzp1c3_new.dbf /oracle/oradata/ORCL/datafile/o1_mf_users_5twzp1c3_new.dbfSQL> alter database rename file '/oracle/oradata/ORCL/datafile_test/o1_mf_users_5twzp1c3_new.dbf' to '/oracle/oradata/ORCL/datafile/o1_mf_users_5twzp1c3_new.dbf';Database altered.SQL> select file#,name, status from v$datafile;FILE# NAME STATUS---------- ---------------------------------------------------------------- -------4 /oracle/oradata/ORCL/datafile/o1_mf_users_5twzp1c3_new.dbf OFFLINESQL> alter tablespace users online;Tablespace altered.SQL> alter tablespace users read write;Tablespace altered.<br />SQL> select file#,name, status from v$datafile;FILE# NAME STATUS---------- ---------------------------------------------------------------- -------4 /oracle/oradata/ORCL/datafile/o1_mf_users_5twzp1c3_new.dbf ONLINE<br />ข้างต้นได้แสดงตัวอย่างการย้าย datafile อย่างไรก็ดีเราควรรู้และเข้าใจ การตรวจเช็ค และจัดการกับ datafile (อ่าน เพิ่มเติม)<br />หมายเหตุ การย้าย database file จากข้างต้นเป็นการย้าย database file บน File System แต่ปัจจุบันหลายๆที่ อาจจะใช้ ASM และหากต้องการย้าย database file ใน ASM DiskGroup ควรทำอย่างไร ขอแนะนำตัวอย่างคร่าวๆ <br />http://surachartopun.com/2009/10/moving-datafile-system-from-one-asm.htmlhttp://surachartopun.com/2009/10/moving-datafile-in-asm-by-asmcmdcp.html<br />ตัวอย่างแรก เป็นการย้าย database file ของ system tablespace ดังนั้นจึงต้อง shutdown ฐานข้อมูล แต่ถ้าต้องการย้าย database file ของ tablespace ที่ไม่ใช่ system/sysaux เราแค่เพียง offline tablespace <br />ตัวอย่าง ย้าย database file กรณี ASM DiskGroup<br />SQL> select file_id, file_name from dba_data_files where tablespace_name='TEST_DATA';<br /> FILE_ID FILE_NAME<br />---------- --------------------------------------------------<br /> 9 +DATA/orcl/datafile/test_data.1335.721759717<br />SQL> alter tablespace TEST_DATA read only;<br />Tablespace altered.<br />SQL> alter tablespace TEST_DATA offline;<br />Tablespace altered<br />RMAN> backup as copy datafile 9 format '+DATA2';<br />Starting backup at 26-APR-11<br />allocated channel: ORA_DISK_1<br />channel ORA_DISK_1: SID=38 device type=DISK<br />channel ORA_DISK_1: starting datafile copy<br />input datafile file number=00009 name=+DATA/orcl/datafile/test_data.1335.721759717<br />output file name=+DATA2/orcl/datafile/test_data.993.749500909 tag=TAG20110426T184147 RECID=38 STAMP=749500915<br />channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:15<br />Finished backup at 26-APR-11<br />RMAN> SWITCH DATAFILE 9 to copy;<br />datafile 9 switched to datafile copy quot; +DATA2/orcl/datafile/test_data.993.749500909quot; <br />SQL> alter tablespace TEST_DATA online;<br />Tablespace altered.<br />SQL> alter tablespace TEST_DATA read write;<br />Tablespace altered.<br />SQL> select file_id, file_name from dba_data_files where tablespace_name='TEST_DATA';<br /> FILE_ID FILE_NAME<br />---------- --------------------------------------------------<br /> 9 +DATA2/orcl/datafile/test_data.993.749500909<br />*** จากนั้นก็ลบ datafilecopy ด้วย rman *** RMAN> list datafilecopy all;RMAN> delete datafilecopy … [all];<br />6. Tablespaces6.1 SYSTEM TablespaceUser objects ไม่ควรสร้างใน System tablespace เพื่อช่วยไม่ให้เกิดปัญหาเรื่อง fragmentation และป้องกันการมีขนาดใหญ่ของ system tablespace โดยที่ไม่จำเป็น<br />SQL> select owner, segment_name, segment_type from dba_segments where tablespace_name = 'SYSTEM' and owner not in ('SYS','SYSTEM');<br />ตรวจสอบ segment ที่อยู่บน system tablspace และ เจ้าของไม่ใช้ SYS หรือ SYSTEM6.2 SYSAUX Tablespace (version >= 10g)SYSAUX ถูกติดตั้งอัตโนมัติ เป็นเหมือน tablespace (ช่วย)ให้กับ system tablespace ถ้า SYSAUX มีปัญหาอาจทำให้ ฐานข้อมูลฟีเจอร์(เช่น AWR)ที่ใช้ SYSAUX มีปัญหา<br />SQL> alter system checkpoint;System altered.SQL> exec DBMS_WORKLOAD_REPOSITORY.create_snapshot;BEGIN DBMS_WORKLOAD_REPOSITORY.create_snapshot; END;*ERROR at line 1:ORA-13509: error encountered during updates to a AWR tableORA-00376: file ORA-00376: file 2 cannot be read at this timeORA-01110: data file 2: '/oracle/oradata/ORCL/datafile/o1_mf_sysaux_5twzp15k_.dbf'cannot be read at this timeORA-06512: at quot; SYS.DBMS_WORKLOAD_REPOSITORYquot; , line 14ORA-06512: at quot; SYS.DBMS_WORKLOAD_REPOSITORYquot; , line 37ORA-06512: at line 1SQL> alter tablespace sysaux online;Tablespace altered.SQL> exec DBMS_WORKLOAD_REPOSITORY.create_snapshot;PL/SQL procedure successfully completed.<br />การตรวบสอบการใช้งานบน SYSAUX<br />SQL> select space_usage_kbytes, occupant_name, occupant_desc from v$sysaux_occupants order by 1 desc;<br />หรือ<br />SQL> @?/rdbms/admin/utlsyxsz.sql<br />utlsyxsz.sql - Utility script สำหรับ SYSAUX Size6.3 Locally vs Dictionary Managed TablespacesDictionary Managed Tablespaces ถูกจัดการด้วยการใช้ dictionary tablesLocally Managed Tablespaces เริ่มมีมาตั้งแต่ Oracle 8i. Tablespace จะถูกจัดการเฉพาะส่วน ด้วยการใช้ bitmap<br />SQL> select tablespace_name, extent_management from dba_tablespaces;TABLESPACE_NAME EXTENT_MAN------------------------------ ----------SYSTEM LOCALSYSAUX LOCAL<br />อย่างไรก็ตาม Locally Managed Tablespaces มีข้อดีกว่า Data Dictionary managed tablespaces เช่น ไม่ต้องมีการเก็บ free space ใน data dictionary จึงช่วยลด contention ของ table นั้นๆ และยังลดการเกิด fragmentation เป็นต้น<br />Extent_management_clause:[EXTENT MANAGEMENT{DICTIONARY | LOCAL{AUTOALLOCATE | UNIFORM [SIZE integer [K|M] }}]<br />AUTOALLOCATE - tablespace จะถูกจัดการขนาดของ EXTENT จากระบบUNIFORM - tablespace จะถูกจัดการกับขนาดของ EXTENT ให้มีขนาดที่เหมือนกัน (default = 1 megabyte)6.4 Temporary Tablespaceจะถูกใช้เพื่อการ sort และการเก็บ global temporary tables. เราควรต้องแน่ใจว่า tablespace สำหรับ temporary segments เป็นประเภท TEMPORARY<br />SQL> select tablespace_name, contents from dba_tablespaces;TABLESPACE_NAME CONTENTS------------------------------ ---------SYSTEM PERMANENTSYSAUX PERMANENTTEMP TEMPORARYUSERS PERMANENT<br />หรือ แน่ใจว่า USER ถูกหนดให้ใช้ temporary space เป็นประเภท TEMPORARY<br />SQL> select u.username, t.tablespace_name from dba_users u, dba_tablespaces t where u.temporary_tablespace = t.tablespace_name and t.contents <> 'TEMPORARY';<br />ตัวอย่างอื่นๆการเปลี่ยน temporary tablespace บน user<br />SQL> alter user SYSTEM temporary tablespace User;<br />การเปลี่ยน default temporary tablespace บนฐานข้อมูล<br />SQL> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp;<br />การลด ขนาด tempfileการหาขนาดของ temporary tablespace<br />SQL> select tablespace_name, sum(bytes)/1024/1024 mb from dba_temp_files group by tablespace_name;TABLESPACE_NAME MB------------------------------ ----------TEMP 28<br />การ หา quot; high water markquot; ของ temporary tablespace (max used at one time)<br />SQL> select tablespace_name, sum(bytes_cached)/1024/1024 mb from v$temp_extent_pool group by tablespace_name;TABLESPACE_NAME MB------------------------------ ----------TEMP 27<br />การ หา current usage<br />SQL> select ss.tablespace_name, sum((ss.used_blocks*ts.blocksize))/1024/1024 mb from gv$sort_segment ss, sys.ts$ ts where ss.tablespace_name = ts.name group by ss.tablespace_name;TABLESPACE_NAME MB------------------------------- ----------TEMP 1<br />หรือ<br />SQL> SELECT A.tablespace_name tablespace, D.mb_total, SUM (A.used_blocks * D.block_size) / 1024 / 1024 mb_used,D.mb_total - SUM (A.used_blocks * D.block_size) / 1024 / 1024 mb_free FROM v$sort_segment A,(SELECT B.name, C.block_size, SUM (C.bytes) / 1024 / 1024 mb_total FROM v$tablespace B, v$tempfile C WHERE B.ts#= C.ts# GROUP BY B.name, C.block_size ) D WHERE A.tablespace_name = D.name GROUP by A.tablespace_name, D.mb_total;TABLESPACE MB_TOTAL MB_USED MB_FREE------------------------------- ---------- ---------- ----------TEMP 28 1 27<br />6.5 Tablespace FragmentationFragmentation คือ การที่ tablespace ถูกแบ่งออกเป็นส่วนๆ อาจจะมีพื้นที่ว่างมาก แต่เป็นชิ้นเล็ก ทำให้ไม่สามารถใช้งานมันได้Fragmented tablespaces มีผลต่อ performance โดยเฉพาะ Full Table Scans หรือ ทำให้เกิดปัญหา out-of-space. การแก้ไขปัญหา ทำได้ด้วยการ recreate object เราสามารถใช้ 'alter table .. move' หรือ การ export/importScript to Detect Tablespace Fragmentation [ID 1020182.6]<br />7. Objects 7.1 จำนวนของ ExtentsExtent เป็นหน่วย(logical) ของการจัดสรรพื้นที่ฐานข้อมูล หากเรียงลำดับ Data Block -> Extent -> Segment<br />การ ขยาย ของ object อาจจะไม่ใช่สิ่งสำคัญต่อ Performance แต่ถ้าการขยายของ object รวมๆ กัน หลายๆ object ย่อมมีผลต่อ Performance แน่นอนเราสามารถหา object ที่มีการจัดสรร extent มากกว่าที่เรากำหนดได้:<br />select owner, segment_type, segment_name, tablespace_name, count(blocks), SUM(bytes/1024) quot; BYTES Kquot; , SUM(blocks) from dba_extents where owner NOT IN ('SYS','SYSTEM') group by owner, segment_type, segment_name, tablespace_name having count(*) > &number_extents order by segment_type, segment_name;<br />สิ่งนี้บอกอะไร แล้วอย่างไร?เมื่อ เราพบ object ที่มีการจัดสรร extent มาก(เช่น จำนวน extent 100 - 200) เราสามารถสร้าง object นี้ใหม่กับ extent ที่มีขนาดใหญ่กว่า<br />ตัวอย่าง: การย้าย table จาก extent 1M ไป 10M, สมมุติ สร้าง tablespace extent uniform 1M(TBS_EXT_1M) และ 10M(TBS_EXT_10M)<br />SQL> select blocks, bytes, tablespace_name from user_extents where segment_name='TB_TEST';BLOCKS BYTES TABLESPACE_NAME---------- ---------- ------------------------------128 1048576 TBS_EXT_1M128 1048576 TBS_EXT_1M128 1048576 TBS_EXT_1M128 1048576 TBS_EXT_1M128 1048576 TBS_EXT_1M128 1048576 TBS_EXT_1M128 1048576 TBS_EXT_1M128 1048576 TBS_EXT_1M128 1048576 TBS_EXT_1MSQL> alter table TB_TEST move tablespace TBS_EXT_10M;Table altered.SQL> select blocks, bytes, tablespace_name from user_extents where segment_name='TB_TEST';BLOCKS BYTES TABLESPACE_NAME---------- ---------- ------------------------------1280 10485760 TBS_EXT_10M<br />จะเห็นว่า จำนวนของ extent น้อยลง7.2 Next extentSegment สามารถที่จะเติบโตได้ จึงต้องมีการจัดสรร next extent เมื่อจำเป็น ถ้าพื้นที่ว่างนั้นไม่เพียงพอใน tablespace จะส่งผลให้ next extent ไม่สามารถจัดสรรพื้นที่ และ object จะไม่เติบโตต่อไปเราสามารถเช็ค segment ที่ไม่สามารถจัดสรร next extent<br />select s.owner, s.segment_name, s.segment_type, s.tablespace_name, s.next_extent from dba_segments s where s.next_extent > (select MAX(f.bytes) from dba_free_space f where f.tablespace_name = s.tablespace_name);<br />แต่ ถ้ามี fragmentation มากๆ ใน tablespace จะส่งผลให้ผลลัพท์ที่ได้ แสดงว่า object ว่ายังสามารถเติบโตได้ ดังนั้นเราอาจจะดัดแปลงโดยการหา fragmentation ใน tablespace ไปเปรียบเทียบกับ next extent ของแต่ละ object7.3 Indexesการ rebuild index เป็นสิ่งที่ดี แต่เรายังสามามารถเลือกวิธีการอื่น coalescing indexการ พิจารณา b-tree index ก่อน rebuild อาจใช้หลักเกณฑ์- deleted entries represent 20% or more of the current entries.- the index depth is more then 4 levels.อ่านเพิ่มเติม Richard Foote<br />ตัวอย่าง: เช็ค index_stats เมื่อมีการ update/index ข้อมูล และ rebuild index (tb_test = 50 rows)<br />SQL> create index ind_test on tb_test(object_id);Index created.SQL> analyze index IND_TEST validate structure;Index analyzed.SQL> select lf_rows, lf_rows_len, del_lf_rows, del_lf_rows_len, used_space FROM index_stats WHERE name = 'IND_TEST';LF_ROWS LF_ROWS_LEN DEL_LF_ROWS DEL_LF_ROWS_LEN USED_SPACE---------- ----------- ----------- --------------- ----------50 800 0 0 800SQL> update tb_test set object_id=1 where rownum <= 10; 10 rows updated. <br />SQL> commit;Commit complete.SQL> analyze index IND_TEST validate structure;Index analyzed.SQL> select lf_rows, lf_rows_len, del_lf_rows, del_lf_rows_len, used_space FROM index_stats WHERE name = 'IND_TEST';LF_ROWS LF_ROWS_LEN DEL_LF_ROWS DEL_LF_ROWS_LEN USED_SPACE---------- ----------- ----------- --------------- ----------60 940 10 160 940SQL> delete from tb_test where rownum <=10; 10 rows deleted. SQL> commit;Commit complete.SQL> analyze index IND_TEST validate structure;Index analyzed.SQL> select lf_rows, lf_rows_len, del_lf_rows, del_lf_rows_len, used_space FROM index_stats WHERE name = 'IND_TEST';LF_ROWS LF_ROWS_LEN DEL_LF_ROWS DEL_LF_ROWS_LEN USED_SPACE---------- ----------- ----------- --------------- ----------50 780 10 140 780SQL> alter index ind_test rebuild;Index altered.SQL> analyze index IND_TEST validate structure;Index analyzed.SQL> select lf_rows, lf_rows_len, del_lf_rows, del_lf_rows_len, used_space FROM index_stats WHERE name = 'IND_TEST';LF_ROWS LF_ROWS_LEN DEL_LF_ROWS DEL_LF_ROWS_LEN USED_SPACE---------- ----------- ----------- --------------- ----------40 640 0 0 640<br />นั่นเป็น แค่ตัวอย่างการ analyze index คร่าวๆการตรวจสอบ object เราควรจะตรวจเช็คอย่างสม่ำเสมอเพื่อป้องกันปัญหาในอนาคต ซึ่งอาจส่งผลต่อ application และอื่นๆ<br />8. AUTO vs MANUAL undo - ใน ฐาน ข้อมูล Oracle เวอร์ชั่นก่อนๆ เราจัดการกับ RollBack Segments ด้วย manual undo. ส่วน automatic undo(เริ่มใช้ Oracle 9i) จะถูกใช้เมื่อเซต UNDO_MANAGEMENT เป็น AUTO<br />SQL> show parameter UNDO_MANAGEMENTNAME TYPE VALUE------------------------------------ ----------- ------------------------------undo_management string AUTO<br />แต่ ถ้าหาไม่เซตค่า UNDO_MANAGEMENT หรือเซตเป็น MANUAL จะใช้กลไก 'old' rollback segment อย่างไรก็ตาม Oracle แนะนำให้ใช้ AUTO8.1 AUTO UNDOการกำหนดเวลาในการเก็บ undo นั้นจะถูกควบคุมด้วย UNDO_RETENTION (วินาที)undo_retention เป็นพารามิเตอร์ใหม่ที่พบบน Oracle 9i และยังเป็นพารามิเตอร์ที่สนับสนุน quot; flashback queryquot; ฟีเจอร์<br />SQL> show parameter UNDO_RETENTION;NAME TYPE VALUE------------------------------------ ----------- ------------------------------undo_retention integer 900SQL> alter system set UNDO_RETENTION=3600;System altered.SQL> show parameter UNDO_RETENTION;NAME TYPE VALUE------------------------------------ ----------- ------------------------------undo_retention integer 3600<br />บน Oracle 10g คุณอาจเลือกใช้ GUARANTEE เพื่อให้แน่ใจว่า undo ข้อมูล ไม่ถูกขียนทับก่อน undo_retention ที่กำหนด<br />SQL> show parameter undo_tablespace;NAME TYPE VALUE------------------------------------ ----------- ------------------------------undo_tablespace string UNDOTBS1SQL> alter tablespace UNDOTBS1 retention GUARANTEE;Tablespace altered.<br />V$UNDOSTAT view สามารถใช้ในการตรวจสอบการใช้ประโยชน์พื้นที่ undoคำนวณจำนวน undo block ต่อวินาที:<br />SQL> SELECT (SUM(undoblks))/ SUM ((end_time - begin_time) * 86400) FROM v$undostat;(SUM(UNDOBLKS))/SUM((END_TIME-BEGIN_TIME)*86400)------------------------------------------------57.8207692<br />หรือ คำนวณจำนวน Byte ที่ต้องการ<br />SQL> SELECT (UR * (UPS * DBS)) + (DBS * 24) AS quot; Bytesquot; FROM (SELECT value AS UR FROM v$parameter WHERE name = 'undo_retention'),(SELECT (SUM(undoblks)/SUM(((end_time - begin_time)*86400))) AS UPS FROM v$undostat),(select block_size as DBS from dba_tablespaces where tablespace_name=(select upper(value) from v$parameter where name = 'undo_tablespace'));Bytes----------751016.081<br />เรา ยังใช้ DBA_UNDO_EXTENTS เพื่อตรวจสอบรายละเอียด extents และพื้นที่ใช้ใน undo tablespace ปัจจุบัน<br />SQL> SELECT DISTINCT STATUS, SUM(BYTES), COUNT(*) FROM DBA_UNDO_EXTENTS GROUP BY STATUS;STATUS SUM(BYTES) COUNT(*)--------- ---------- ----------ACTIVE 1048576 1EXPIRED 172687360 250UNEXPIRED 49938432 57<br />ACTIVE - Undo Extent เป็น Active, ใช้โดย transaction.EXPIRED - Undo Extent ถูก expire (Exceeded the Undo Retention).UNEXPIRED - Undo Extent ที่ยังขึ้นอยู่กับค่า UNDO_RETENTION.8.2 MANUAL UNDO- rollback มีปัญหาอาจ ส่งผลต่อการเปิดฐานข้อมูลเช่น เซต rollback_segments เป็น RBS1 แต่ไม่พบ 'RBS1' rollback segment เมื่อเปิดฐานข้อมูล<br />ORA-01534: rollback segment 'RBS1' doesn't existError 1534 happened during db open, shutting down database<br />- rollback segment ขนาดเล็ก หรือไม่เพียงพอ จะมีผลกระทบต่อการทำงานของฐานข้อมูล ดังนั้นเราต้องตรวจสอบ<br />SQL> create rollback segment rbs1;Rollback segment created.SQL> show parameter UNDO_MANAGEMENTNAME TYPE VALUE------------------------------------ ----------- ------------------------------undo_management string MANUALSQL> show parameter rollback_segmentsNAME TYPE VALUE------------------------------------ ----------- ------------------------------rollback_segments string RBS1<br />SQL> select d.segment_name, d.tablespace_name, s.waits, s.shrinks, s.wraps, s.status from v$rollstat s, dba_rollback_segs d where s.usn = d.segment_id order by 1;SEGMENT_NAME TABLESPACE_NAME WAITS SHRINKS WRAPS STATUS------------------------------ ------------------------------ ---------- ---------- ---------- ---------------RBS1 SYSTEM 0 0 10 ONLINESYSTEM SYSTEM 0 0 0 ONLINE<br />ถ้าไม่กำหนด rollback_segments จะมี quot; SYSTEMquot; rollback segment เดียว<br />SQL> show parameter UNDO_MANAGEMENTNAME TYPE VALUE------------------------------------ ----------- ------------------------------undo_management string MANUALSQL> show parameter rollback_segmentsNAME TYPE VALUE------------------------------------ ----------- ------------------------------rollback_segments stringSQL> select d.segment_name, d.tablespace_name, s.waits, s.shrinks, s.wraps, s.status from v$rollstat s, dba_rollback_segs d where s.usn = d.segment_id order by 1;SEGMENT_NAME TABLESPACE_NAME WAITS SHRINKS WRAPSSTATUS------------------------------ ------------------------------ ---------- ---------- ---------- ---------------SYSTEM SYSTEM 0 0 0 ONLINE<br />จากข้างต้น ขอขยายความ MANUAL UNDO เพียงคร่าวๆ (more)อย่าง ไรก็ตามขอแนะนำให้ใช้ AUTO UNDO (อย่างกรณีฟีเจอร์ Total Recall ก็ต้องการ AUTO UNDO)<br />9. การจัดการกับหน่วยความจำ (Memory Management)การ จัดการกับหน่วยความจำของฐานข้อมูล Oracle จะมีความแตกต่างกันไป ซึ่งขึ้นอยู่กับ oracle เวอร์ชัน เพราะ oracle เองได้มีการเพิ่มคุณสมบัติ ในการจัดการกับหน่วยความจำกับฐานข้อมูลเวอร์ชันใหม่ๆ เพื่อให้ง่ายและมีประสิทธิภาพ ดังนั้นเรามักจะถูกแนะนำให้ใช้คุณสมบัติในการจัดการกับหน่วยความจำ ด้วยวิธีอัตโนมัติ<br />9.1 ก่อน Oracle 9iองค์ ประกอบหน่วย ความจำที่แตกต่างกัน (SGA และ PGA) ต้องการที่จะถูกกำหนดในการเริ่มต้นของฐานข้อมูล(startup) ค่าเหล่านี้เป็นค่าคงที่ ดังนั้นหากหนึ่งในองค์ประกอบของหน่วยความจำที่ต่ำเกินไป และจำเป็นต้องเปลี่ยนแปลง ฐานข้อมูลจำเป็นต้อง restart เพื่อให้ฐานข้อมูลใช้ค่าใหม่ที่ได้เปลี่ยนแปลงตัวอย่าง พารามิเตอร์ที่อาจใช้ผิดบ่อยๆ เช่น sort_area_size<br />SQL> show parameter sort_area_sizeNAME TYPE VALUE------------------------------------ ----------- ------------------------------sort_area_size integer 1024000<br />พารามิเตอร์ sort_area_size กำหนด จำนวนหน่วยความจำที่สามารถใช้ในการเรียงลำดับ ค่านี้เป็นส่วนหนึ่งของ User Global Area (UGA) ดังนั้นจะถูกจัดสรรให้แต่ละผู้ใช้หากผู้ใช้เข้ามาใช้งานพร้อมกันเป็น จำนวนมาก ในการเรียงลำดับข้อมูลขนาดใหญ่ ระบบอาจจะใช้หน่วยความจำจำนวนมากเช่น sort_area_size ของ 1MB กับผู้ใช้ 200 คน เข้ามาพร้อมกันในฐานข้อมูล อย่างไรก็ตามหน่วยความจำนี้ถูกจัดสรรแบบไดนามิก มันสามารถจัดสรรหน่วยความจำถึง 200MB และอาจทำให้เกิดการใช้ SWAP บนระบบ9.2 Oracle 9iเริ่มต้นจาก Oracle 9i พวกเราจะพบพารามิเตอร์:workarea_size_policy = [AUTO | MANUAL]pga_aggregate_target = <value>ซึ่งยอมให้เรากำหนดพื้นที่หน่วยความจำสำหรับ PGA โดยที่จะถูกใช้ร่วมกันของ sessionsถ้าค่านี้น้อยเกินไป (pga_aggregate_target) บ่อยครั้งที่เราจะพบ ORA-4030<br />SQL> show parameter workarea_size_policyNAME TYPE VALUE------------------------------------ ----------- ------------------------------workarea_size_policy string AUTO<br />SQL> show parameter pga_aggregate_targetNAME TYPE VALUE------------------------------------ ----------- ------------------------------pga_aggregate_target big integer 500M<br />ถ้า workarea_size_policy เป็น AUTO หน่วยความจำสำหรับ work area (sort area) จะถูกจัดการอัตโนมัติ จากค่า pga_aggregate_targetตัวอย่าง work area:- Sort-based operators (ORDER BY, GROUP BY, ROLLUP, window functions)- Hash-join- Bitmap merge- Bitmap createอันได้แก่ พารามิเตอร์ *area_size<br />SQL> show parameter area_sizeNAME TYPE VALUE------------------------------------ ----------- ------------------------------bitmap_merge_area_size integer 1048576create_bitmap_area_size integer 8388608hash_area_size integer 131072sort_area_size integer 65536<br />ถ้า workarea_size_policy เป็น MANUAL หน่วยความจำสำหรับ work area (sort area) จะไม่ใช้ pga_aggregate_target เราต้องมีการจัดการกับพารามิเตอร์ *area_size แต่ละตัวเองการตรวจสอบ PGA เช่น ข้อมูลการใช้PGA<br />SELECT * FROM V$PGASTAT;<br />หรือ คำแนะนำเพื่อการปรับค่าของ PGA<br />SELECT round(PGA_TARGET_FOR_ESTIMATE/1024/1024) target_mb,ESTD_PGA_CACHE_HIT_PERCENTAGE cache_hit_perc,ESTD_OVERALLOC_COUNTFROM V$PGA_TARGET_ADVICE;<br />หรือ การตรวจสอบ PGA แต่ละ session<br />set pages500 lines110 trims onclear colcol name format a30col username format a20break on username nodup skip 1select vses.username||':'||vsst.sid||','||vses.serial# username, vstt.name, max(vsst.value) valuefrom v$sesstat vsst, v$statname vstt, v$session vseswhere vstt.statistic# = vsst.statistic# and vsst.sid = vses.sid and vstt.name in('session pga memory','session pga memory max','session uga memory','session uga memory max','session cursor cache count','session cursor cache hits','session stored procedure space','opened cursors current','opened cursors cumulative') and vses.username is not nullgroup by vses.username, vsst.sid, vses.serial#, vstt.name order by vses.username, vsst.sid, vses.serial#, vstt.name;<br />การประมาณค่า PGA_AGGREGATE_TARGET:- สำหรับระบบ OLTP<br />PGA_AGGREGATE_TARGET = (<Total Physical Memory > * 80%) * 20%<br />- สำหรับระบบ DSS<br />PGA_AGGREGATE_TARGET = (<Total Physical Memory > * 80%) * 50%<br />9.3 Oracle 10gAutomatic Shared Memory Management (ASMM) ถูกแนะนำใน Oracle เวอร์ชัน 10g คุณลักษณะการจัดการหน่วยความจำอัตโนมัติ ทำได้โดยการตั้งค่าพารามิเตอร์ SGA_TARGET ให้มากกว่าศุนย์คุณลักษณะ นี้มีประโยชน์ ช่วยให้เราสามารถแบ่งปันทรัพยากรหน่วยความจำในส่วนต่างๆ และการจัดสรรทรัพยากรณ์จะเป็นไปโดยอัตโนมัติ ด้วย OracleSGA_TARGET พารามิเตอร์มีผลต่อ องประกอบหน่วยความจำ:- Fixed SGA และ other internal ที่ต้องการโดย Oracle Database instance- Log buffer- Shared pool- Java pool- Buffer cache- keep และ recycle buffer caches (ถ้าระบุ)- Nonstandard block size buffer caches (ถ้าระบุ)- Streams poolเมื่อ เราเซตค่าสำหรับ SGA_TARGET, Oracle 10g จะกำหนดขนาดส่วนประกอบอันได้แก่- Shared pool (SQL และ PL/SQL execution)- Java pool (Java execution state)- Large pool (large allocations เช่น RMAN backup buffers)- Buffer cache- Streams pool<br />SQL> show parameter sga_targetNAME TYPE VALUE------------------------------------ ----------- ------------------------------sga_target big integer 512M<br />การตรวจสอบข้อมูลการใช้ SGA<br />select * from v$sgastat;select * from v$sgainfo;<br />หรือ คำแนะนำเพื่อการปรับค่าของ SGA<br />select * from v$sga_target_advice order by sga_size;<br />หรือตรวจสอบการเพิ่ม ค่าหรือลดค่า ของส่วนประกอบ SGA<br />select * from v$sga_dynamic_components;<br />และ<br />ALTER SESSION SET nls_date_format = 'DD/MM/YYYY:HH24:MI:SS';SET PAGESIZE 900SET LINESIZE 255COL COMPONENT FORMAT A25COL INITIAL_SIZE FORMAT A10COL TARGET_SIZE FORMAT A10COL FINAL_SIZE FORMAT A10COL OPER_TYPE FORMAT A10select START_TIME, component, oper_type, oper_mode,status, initial_size/1024/1024 quot; INITIALquot; , target_size/1024/1024 quot; TARGETquot; , FINAL_SIZE/1024/1024 quot; FINALquot; , END_TIMEfrom v$sga_resize_opsorder by start_time, component;<br />ส่วนการจัดการหน่วยความจำ PGA อัตโนมัติ ยังใช้งานได้ผ่าน workarea_size_policy และ pga_aggregate_target พารามิเตอร์9.4 Oracle 11gAutomatic Memory Management (AMM) ถูกแนะนำใน Oracle เวอร์ชัน 11g ช่วยให้ปรับค่า PGA และ SGA โดยอัตโนมัติ กับค่าพารามิเตอร์ MEMORY_MAX_TARGET และ MEMORY_TARGET <br />SQL> show parameter MEMORY_MAX_TARGETNAME TYPE VALUE------------------------------------ ----------- ------------------------------memory_max_target big integer 800MSQL> show parameter MEMORY_TARGETNAME TYPE VALUE------------------------------------ ----------- ------------------------------memory_target big integer 800M<br />การตรวจสอบองค์ประกอบของหน่วย ความจำที่ใช้ AMM<br />select * from V$MEMORY_DYNAMIC_COMPONENTS;<br />ตรวจสอบการเพิ่มและลดขององค์ ประกอบใน AMM ด้วย V$MEMORY_RESIZE_OPSหรือ คำแนะนำเพื่อการปรับค่าสำหรับ AMM<br />select * from v$memory_target_advice order by memory_size;<br />10. Logging & Tracing10.1 Alert Filealert log ไฟล์ของฐานข้อมูล จะเก็บสิ่งที่เปลี่ยนแปลงในฐานข้อมูล อันได้แก่- internal errors (ORA-600), block corruption errors (ORA-1578), และ deadlock errors (ORA-60)- SQL เช่น CREATE/ALTER/DROP DATABASE/TABLESPACE และจาก Oracle Enterprise Manager หรือ SQL*Plus ที่เกี่ยวกับ STARTUP, SHUTDOWN, ARCHIVE LOG, RECOVER- Errors เกี่ยวกับ shared server และ dispatcher processes- Errors ขณะที่ materialized view (refresh)การที่ เรามี alert log ไฟล์ ขนาดใหญ่ จะเป็นการใช้พื้นที่ของ Disk โดยที่ไม่จำเป็น และส่งผลต่อประสิทธิภาพในการเขียนลง Disk ของ OSก่อน 11g:<br />SQL> show parameter background_dump_destNAME TYPE VALUE------------------------------------ ----------- ------------------------------background_dump_dest string /oracle/admin/orcl/bdump<br />11g ->: จะใช้ diagnostic_dest พารามิเตอร์<br />SQL> show parameter background_dump_destNAME TYPE VALUE------------------------------------ ----------- ------------------------------background_dump_dest string /oracle/diag/rdbms/orcl/orcl/traceSQL> show parameter diagnostic_destNAME TYPE VALUE------------------------------------ ----------- ------------------------------diagnostic_dest string /oracle<br />10.2 Max_dump_file_size Oracle server process จะสร้าง trace ไฟล์ เพื่อเก็บความผิดพลาด เราสามารถใช้ trace ไฟล์ เพื่อวิเคราะห์ในแก้ปัญหาและปรับปรุง ส่วน max_dump_file_size จะจำกัดขนาดของ trace ไฟล์<br />SQL> show parameter max_dump_file_sizeNAME TYPE VALUE------------------------------------ ----------- ------------------------------max_dump_file_size string unlimitedSQL> alter system set max_dump_file_size=10240;System altered.SQL> show parameter max_dump_file_sizeNAME TYPE VALUE------------------------------------ ----------- ------------------------------max_dump_file_size string 10240<br />user_dump_dest พารามิเตอร์ จะเป็นพื้นที่ ที่ใช้เก็บข้อมูล trace ไฟล์ ที่เกิดจาก user processesส่วนบน Oracle 11g พื้นที่ดังกล่าว จะถูกควบคุมโดย 'diagnostic_dest' พารามิเตอร์*** audit ไฟล์ ***โดย ปกติการ เชื่อมต่อฐานข้อมูลด้วย SYS หรือ SYSDBA จะมีการเก็บเข้า OS ไฟล์ โดยพื้นที่ ที่ใช้เก็บจะถูกควบคุมด้วย พารามิเตอร์ 'audit_file_dest'ถ้า พารามิเตอร์นี้ ไม่ได้กำหนดจะเป็น $ORACLE_HOME/rdbms/audit<br />SQL> show parameter audit_file_destNAME TYPE VALUE------------------------------------ ----------- ------------------------------audit_file_dest string /oracle/admin/orcl/adump<br />ตัวอย่าง อื่นๆ (ตรวจสอบการ ใช้งาน sys กับการใช้ syslog)*** บน 11g เราจำเป็นที่จะต้องเรียนรู้กับ Automatic Diagnostic Repository (ADR) ***ADR เป็นที่เก็บข้อมูลเพื่อใช้ในการวินิจฉัย เช่น trace files, alert log, และ Health Monitor reports. ส่วนที่ตั้งของ ADR จะถูกควบคุมด้วย 'diagnostic_dest' พารามิเตอร์การตรวจเช็คบนฐานข้อมูล เป็นสิ่งที่จำเป็นสำหรับผู้ดูแลระบบ ผมหวังว่าบทความจะมีประโยชน์บ้างนะครับ<br />อ้างอิงhttp://support.oracle.comhttp://tahiti.oracle.com<br />เขียนโดย: @surachart (surachartopun.com) OUGTH<br />