go to http://oracle.in.th
Showing posts with label database. Show all posts
Showing posts with label database. Show all posts

Wednesday, December 1, 2010

National Character Set แบบ AL16UTF16 กับ UTF8 ต่างกันอย่างไร?

ห่างหายไปนานกับการเขียนบทความลงบล็อค oracle ของเรา ขอต้อนรับต้นเดือนสุดท้ายของปี 2010 นี้ด้วยทริก เล็กๆน้อยๆ นะครับ

วันนี้มีเกร็ดเล็กๆ น้อยๆ ที่เป็นประโยชน์ซึ่งเกี่ยวกับการสร้าง Database โดยใช้ DBCA หรือ Database Configuration Assistant มาให้ทุกท่านได้อ่านกันนะครับ

...ผมเชื่อว่า หลายๆท่านที่กำลังอ่านอยู่ตอนนี้ ต้องเคยได้ลองติดตั้ง Oracle Database หรือ เคยสร้าง Database มากันบ้างแล้วล่ะ ซึ่งขั้นตอนในการสร้าง Database นั้นมันก็ไม่ได้ยากมากมาย เพียงแค่ตั้งค่าให้ถูกต้องเท่านั้นเอง ซึ่งผมนั้นก็ได้ลองติดตั้งด้วยตัวผมเองแล้วเหมือนกัน แต่มีขั้นตอนนึงที่ทำให้ผมชะงักขึ้นมาว่า ...เอ๊ะ จะเลือกอันไหนดีล่ะ ? นั่นคือ ตอนที่ให้ตั้งค่า Database Character set โดยมี National Character Set แบบ AL16UTF16 กับ UTF8 ให้เลือก (ดูตามรูปได้เลยนะครับ)


เอาเป็นว่า แทนที่จะมานั่งเดาเอา ผมก็ search หาเอาซะเลย แล้วดูว่า National Character Set แบบ AL16UTF16 กับ UTF8 มันมีข้อแตกต่างกันอย่างไร?

AL16UTF16
  1. ถ้าข้อมูลเป็นภาษาเอเชีย จะประหยัดพื้นที่กว่า UTF8 ซึ่งจะดีในแง่ของพื้นที่ในฮาร์ดดิสก์ และ I/O แต่ถ้าข้อมูลส่วนใหญ่เป็นภาษาทางยุโรปใช้ UTF8 ดีกว่าเพราะประหยัดพื้นที่กว่า
  2. Oracle มอง AL16UTF16 เป็น fixed-width characters ดังนั้นจะ process เร็วกว่า
  3. ความกว้างสูงสุดของ NCHAR และ NVARCHAR คือ 1000 และ 2000 ตัวอักษร ซึ่งการันตี เพราะเป็น fixed-width
...มาดูฝั่ง UTF8 กันบ้าง

UTF8
  1. ถ้าข้อมูลเป็นภาษาทางยุโรป โดยปกติจะประหยัดพื้นที่กว่า AL16UTF16 (เนื่องจากภาษาทางยุโรปอยู่ในลำดับต้นๆของ Unicode ซึ่งสามารถแทนได้ด้วยข้อมูลเพียง Byte เดียว) และให้ประสิทธิภาพดีกว่าในการ Process
  2. ความยาวสูงสุดของ NCHAR และ NVARCHAR คือ 2000 และ 4000 ซึ่งดูเหมือนจะมากกว่า AL16UTF16 แต่ไม่การันตี เนื่องจาก UTF8 เป็น variable width ถ้าเป็น Character ที่ใช้ Byte เดียวก็จะได้ถึง 4000 bytes แต่ถ้าเป็น Character ที่ใช้ 3 Bytes ก็จะมีได้สูงสุดแค่ 4000/3 ตัวอักษร
...นั่นก็คือข้อแตกต่างของแต่ละตัว ดังนั้นก่อนที่ท่านผู้อ่านทุกท่านจะ set ค่าในการสร้าง database ลองดูรายละเอียดซักนิดนะครับ อย่าเพิ่งกด Next ๆๆ อย่างเดียวนะครับ ;)

อ้างอิง
ข้อเขียนนี้ช่วยฉัน:  

Thursday, August 19, 2010

Oracle Database 11g Installation on IBM-AIX 6

วันนี้เกิดคึกอยากจะเขียนบล็อคขึ้นมาครับ เพราะว่าพึ่งผ่าน case นี้มาและคิดว่าเป็น case ที่้น้อยคนจะได้เจอ ก็คือการติดตั้ง Oracle Database 11g บน AIX 6 นั่นเอง หลายคนอาจจะพึ่งเคยได้ยินว่า AIX คืออะไร ก็เลยขออธิบายนิดนึงว่ามันคือ OS ของ IBM ซึ่งเป็น Linux base ถ้าอยากรู้จัก AIX มากกว่านี้ก็ลอง search ดูได้เลยครับ

กลับมาในส่วนของเราดีกว่า อย่างที่ทราบๆกันว่า ในการติดตั้ง Oracle Database เนี่ยจะมีขั้นตอนหลักๆอยู่ 2 ขั้นตอนก็คือ

1. การเตรียม pre-requisite ให้พร้อมสำหรับการติดตั้ง Oracle Database
2. การติดตั้ง Oracle Database

ในที่นี้ผมจะกล่าวถึงเฉพาะข้อแรกก็คือการเตรียม pre-requisite นั่นเอง เพราะในส่วนของการติดตั้ง ก็จะสามารถหาอ่านได้จาก blog เก่าๆครับ
การ Install Oracle Database 11g และสร้าง Database

ที่อยากจะพูดถึงเรื่องการเตรียม pre-requisite เนี่ยเพราะว่าในแต่ละ platform ก็จะมี requirement ต่างๆที่เราต้องติดตั้งหรือแก้ไขเพิ่มเติมต่างกันไปและ AIX ก็เช่นกัน ซึ่ง case ที่ผมไปเจอก็คือ AIX นั้นจะติดตั้งมาแบบ default เลย มีการแบ่งพื้นที่ให้แก่ partition ต่างๆแค่นิดเดียว partition ละไม่ถึง 1GB (เอาไฟล์ installer ลงไปยังไม่ได้เลย - -") , swap space ไม่พอและไม่ได้ติดตั้ง fileset ที่จำเป็นสำหรับการติดตั้งเพิ่มเติม (คล้ายๆกับ package ของ linux) ทำให้เราต้องมาจัดการเองทั้งหมด ซึ่งถ้าไม่เคยได้เล่น AIX เลยเนี่ยอาจจะจิตตกได้ เพราะไม่รู้ว่าต้องแก้ไขอย่างไร, หา download fileset จากไหน หรือติดตั้งอย่างไร วันนี้เรามีข้อมูลจากประสบการณ์จริงที่พบมาเล่าสู่กันฟังครับ

1 การเพิ่มพื้นที่ให้แก่ partition ต่างๆ
- เข้าไปที่ Web-based System Manager (WSM) สามารถคลิกขวาที่ partition ที่ต้องการและเลือก properties และเพิ่มขนาดได้เลย ง่ายเกินคาด สามารถใช้ได้กับ /tmp ด้วย

2.การเพิ่ม swap space
- ตรวจสอบดูก่อนว่า swap space นั้นใช้ที่ partition ใด โดยใช้คำสั่ง sysdumpdev -l และดูผลลัพธ์ที่ primary เช่น primary /dev/hd6

- เมื่อทราบแล้วว่า swap space ใช้ path ใดก็ลองตรวจสอบขนาดของมันโดยใช้คำสั่ง lsps -a จะมีการระบุขนาดไว้

- ถ้าต้องการขยายขนาดเพิ่มไปอีก 1GB สามารถทำได้โดยใช้คำสั่ง extendlv hd6 1G

- reboot เครื่องซักรอบนึง แล้วลองตรวจสอบขนาดโดยใช้คำสั่ง lsps -a เช่นเดิม จะพบว่า swap space จะเพิ่มมาอีก 1 GB แล้วครับ

ประเด็นนี้ขออ้างอิงจากน้องที่เข้าไปช่วยกันทำนะครับ โดยได้บันทึกขั้นตอนไว้ในนี้
https://jira.oracle.in.th/browse/ORCL-364

3. การติดตั้ง fileset
- จะมี fileset ที่ต้องติดตั้งเพิ่มเติมอีก 3 ตัวดังนี้
bos.adt.libm
rsct.basic.rte
rsct.compat.clients.rte

- สามารถหาได้จากแผ่นติดตั้ง AIX 6 แผ่นที่ 1 นะครับ ตอนแรกผมก็ไปหาโหลดตั้งนาน เจอแต่ไฟล์ 200-300 MB ทั้งนั้น เหมือนมัดรวมเป็น pack มาให้โหลดกันเลย ถ้าใครต้องไปติดตั้ง Oracle Database อย่าลืมทวงหาแผ่นติดตั้ง AIX 6 นะครับ

- ขั้นตอนการติดตั้งเนี่ยจะต้องทำการ mount แผ่นเข้าไปและใช้ tool ที่ชื่อว่า "SMIT" ในการติดตั้ง fileset เหล่านั้น อยากจะเน้นชื่อเจ้า tool ตัวนี้จริงๆ เพราะมันเปรียบเสมือนพระเจ้าของ System Admin เลยทีเดียว SMIT นั้นย่อมาจาก System Management Interface Tool เป็น tool ครอบจักรวาลเกี่ยวกับการจัดการระบบ ซึ่งในช่วงที่เข้าไปติดตั้งเนี่ยผมมีสโลแกนประจำใจว่า "คิดไม่ออก บอก SMIT" :p

- วิธีการติดตั้งก็ใช้ command ดังนี้ SMIT install_latest หรือจะเข้าจาก SMIT แล้วไปไล่หา option เอาก็ได้

- จะมี interface ขึ้นมาจากนั้นก็เลือก fileset ที่จะติดตั้งตาม wizard ได้เลยครับซึ่งอาจจะปล่อย option ต่างๆให้เป็น default ไปก็ได้จากนั้นกด OK ก็จะเป็นการติดตั้ง

- เมื่อติดตั้งเสร็จแล้วลองตรวจสอบดูโดยใช้คำสั่ง lslpp -l ตามด้วยชื่อ fileset ที่ต้องการตรวจสอบ เช่น lslpp -l bos.adt.libm ก็น่าจะพบว่าติดตั้งเรียบร้อยแล้ว

ทั้ง 3 ข้อที่กล่าวมานั้นเป็นการกล่าวถึงขั้นตอนที่อาจแตกต่างจาก platform อื่นๆ ส่วน pre-requisite บางอย่างเช่น ค่า kernel นั้นก็แก้ได้เช่นเดียวกับ Linux อื่นๆครับ จากนั้นก็จะสามารถติดตั้ง Oracle Database 11g บน AIX 6 ได้แล้วครับ หวังว่าบล็อคนี้จะเป็นประโยชน์ต่อผู้ที่ต้องติดตั้งบน AIX 6 ไม่มากก็น้อยนะครับ :)
ข้อเขียนนี้ช่วยฉัน:  

Friday, July 9, 2010

Oracle Database Vault

Oracle Database Vault คืออะไร ? ในบทความวันนี้ ผมจะมาอธิบายข้อดีคร่าว ๆ ของการใช้เจ้าตัวนี้ ให้ทุกท่านได้อ่านกันนะครับ

Oracle Database Vault
คือส่วนหนึ่งของ database security ครับ โดยจะทำหน้าจำกัด user ผู้เข้าใช้ database ให้สามารถเข้าได้เฉพาะ user ที่ได้รับอนุญาติหรือเป็น DBA นั่นเองครับ ทั้งนี้เพื่อความปลอดภัยของ application ต่าง ๆ ที่ต้องการ security โดยมีหลักการ security ตามข้อบังคับต่าง ๆ เช่น Sarbanes-Oxley, Payment Card Industry (PCI) Data Security Standard (DSS), Health Insurance Portability and Accountability Act (HIPAA)และ อื่น ๆ ที่เกี่ยวข้องกับ security ใน data integrity และ data privacy โดย Oracle Database Vault จะทำการป้องกันการเข้าใช้ database ตาม environtment ต่างๆที่ต้องการ เช่น วันเวลาที่เข้าใช้, IP Address ของผู้เข้าใช้, ชื่อเข้า application ที่เข้ามาใช้ และการ authentication user ต่าง ๆ

โดยการใช้ Oracle Database Vault มีข้อดีดังนี้ครับ
  • Pro-actively safeguard application data stored in the Oracle database คือการป้องกันไม่ให้ผู้ใช้ที่ไม่ผ่านการ authentication เข้ามาใช้ข้อมูลได้
  • Address regulatory requirements คือการแบ่งความรับชอบตามหน้าที่ของ user
  • Restrict ad-hoc access to application data เป็นการป้องกันการใช้ application ที่ไม่ได้รับอนุญาติให้เข้าใช้ ด้วย multi-factor policies
  • Deploy with confidence สามารถติดตั้งได้กับ Oracle E-Business Suite, Oracle PeopleSoft, และ Oracle Siebel CRM
  • Realms เป็นการรวม schemas, object และ role ต่างๆที่ต้องการให้มี secure ไว้ด้วยกัน และกำหนดสิทธิ์ให้เฉพาะบาง user หรือ role มีสิทธิ์เข้าถึงข้อมูลเหล่านั้นได้
  • Command Rules เป็นการกำหนดให้ user สามารถ execute คำสั่งได้บางคำสั่ง
  • Factors เป็นการกำหนดการเข้าถึงข้อมูลโดยใช้ factor ซึ่งจะเก็บค่าต่างๆเช่น user location, database IP address หรือ user's session
  • Rule Sets คือ rule หรือกลุ่มของ rule ที่ใช้ร่วมกับ realms, command rule, factor และ secure application role
  • Secure Application Role เป็น special role ที่สามารถใช้ร่วมกับ rule set ได้
Credit by Ice, Yong

อ้างอิง
ข้อเขียนนี้ช่วยฉัน:  

Tuesday, June 15, 2010

มารู้จักกับ Oracle interMedia กันดีกว่า

Oracle interMedia เป็น feature ที่ทำให้ Oracle Database สามารถที่จะทำการเก็บ บริหารจัด หรือกู้คืนข้อมูลประเภท image, audio, video หรือ media data อื่นๆ โดย Oracle interMedia เพิ่ม reliacility, availability และ data management ในด้านของ multimedia ให้กับ Oracle Database ที่ multimedia เป็นเนื้อหาหรือส่วนต่างๆของ internet, e-commerce และ media-rich application

แต่ Oracle interMedia ไม่ได้ทำการควบคุม media capture หรือ output ของ device เนื่องจากส้วนนี้เป็นหน้าที่ของ application software

โดย Oracle interMedia ทำการบริหารจัดการกับ multimedia โดยรองรับสิ่งต่างๆเหล่านี้
  • การจัดเก็บและการกู้คืน
  • การบริหารจัดการกับ metadata ของ media และ application
  • สามารถที่จะรองรับได้หลาย format
  • สามารถ access ผ่านแบบปกติ และได้กับ web interface
  • ทำการ query ด้วยการใช้ความสัมพันธ์ของข้อมูล
  • ทำการ query ด้วย extracted metadata
  • ทำการ query ด้วยการใช้ media content ที่มี optional specialized indexing
Oracle interMedia รองรับ media content สำหรับ Oracle JDeveloper, Oracle Content Management SDK, Oracle Application Server Porta และ Oracle Partner ด้วย

ตัวอย่างการใช้งาน Oracle interMedia

1. ทำการ connect เข้า database ด้วย sqlplus และทำการ สร้าง table ที่ชื่อว่า "image_table" เพื่อใช้ในการเก็บรูป
connect hr/hr
create table image_table (id number primary key, image ordsys.ordimage);
2. ทำการสร้าง directory ที่เก็บรูปไว้โดย ตั้งให้ตรงกับ directory ที่เก็บรูปไว้อยู่ ด้วย user sys และทำการให้สิทธิในการอ่าน directory แก่ user hr
connect / as sysdba
create or replace directory imagedir as '/home/oracle/quickstart/';
grant read on directory imagedir to hr;
3. ใช้ user hr ในการสร้าง PL/SQL procedure ในการ import รูปเข้ามายัง table
create or replace procedure image_import(dest_id number, filename varchar2) is
img ordsys.ordimage;
ctx raw(64) := null;
begin
delete from image_table where id = dest_id;
insert into image_table (id,image)
values (dest_id, ordsys.ordimage.init())
returning image into img;

img.importFrom(ctx, 'file', 'IMAGEDIR', filename);
update image_table set image=img where id=dest_id;
end;
/
! ที่ IMAGEDIR จะต้องพิมพ์เป็นตัวใหญ่ทั้งหมด แม้ในตอนที่สร้าง directory ขึ้นมาจาพิมพ์ด้วยตัวพิมพ์เล็กก็ตาม

4. ทดลองเรียกใช้ procedure ที่สร้างขึ้นมา
call image_import(1,’book2.jpg’);
call image_import(2,’check.png’);
เสร็จแล้วรูปทั้งสองรูปจะถูกเพิ่มเข้าไปยัง table

5. ตรวจสอบรูปภาพด้วยคำสั่ง select ต่อไปนี้ โดยสามารถใช้ดูได้หลายคุณสมบัติของรูป แต่คำสั่งในตัวอย่างนี้จะเป็นการดูความกว้างความยาวของรูป
SQL> select id,t.image.getheight(),t.image.getwidth() from image t;

ID T.IMAGE.GETHEIGHT() T.IMAGE.GETWIDTH()
---------- ------------------- ------------------
1                 134                572
2                 464                667

ในลิ้งค์อ้างอิงยังมีตัวอย่างการใช้ Oracle interMedia อีก แต่ขอยกตัวอย่างมาเพียงเท่านี้ครับ

Credit by Ice

อ้างอิง
ข้อเขียนนี้ช่วยฉัน:  

Thursday, June 10, 2010

มาลดเวลาการ Start Oracle Database ด้วย Auto Start กันเถอะ

โดยปกติ เวลาผมจะ Start Database นั้น ผมจะ Start แบบ manual มีวันนึงผมก็เริ่มขี้เกียจมา อยากจะให้ Database มัน Start เองเลยหลังจาก Boot OS เสร็จ...ผมเลยไปหาวิธีที่จะให้มัน Auto Start Database หลังจากการ boot OS เลยโดยที่ผมไม่ต้องไปทำ manual start อีกต่อไป วันนี้เลยอยากจะแชร์บทความนี้ไว้ เผื่อใครอยากทำบ้างนะครับ

มาดูวิธีที่จะทำให้ Oracle Database auto start ขึ้นมาหลังจากการ boot OS โดยที่ admin ไม่ต้อง manual start กันเลยดีกว่า

1. login root

2. เข้าไปแก้ที่ /etc/oratab
โดยสังเกตุที่บรรทัด orcl:/oracle/db11201:N
ถ้าเป็น N อยู่ให้เปลี่ยนเป็น Y ดังนี้ orcl:/oracle/db11201:Y

3.สร้างไฟล์ใหม่ชื่อ dbora ไว้ที่ /etc/init.d/ โดยรายละเอียดตามด้านล่าง

#!/bin/sh
#chkconfig: 345 99 10
#description: Oracle auto start-stop script.
#
#Set ORA_HOME to be equivalent to the $ORACLE_HOME
#from which you wish to execute dbstart and dbshut;
#
#Set ORA_OWNER to the user id of the owner of the
#Oracle database in ORA_HOME.

ORA_HOME=/oracle/db11201
ORA_OWNER=oracle

if [ ! -f $ORA_HOME/bin/dbstart ]
then
echo "Oracle startup: cannot start"
exit
fi

case "$1" in
'start')
#Start the Oracle databases:
#The following command assumes that the oracle login
#will not prompt the user for any values
su - $ORA_OWNER -c "$ORA_HOME/bin/emctl start dbconsole" &
su - $ORA_OWNER -c "$ORA_HOME/bin/dbstart $ORA_HOME"
touch /var/lock/subsys/dbora
;;
'stop')
#Stop the Oracle databases:
#The following command assumes that the oracle login
#will not prompt the user for any values
su - $ORA_OWNER -c "$ORA_HOME/bin/emctl stop dbconsole" &
su - $ORA_OWNER -c "$ORA_HOME/bin/dbshut $ORA_HOME"
rm -f /var/lock/subsys/dbora
;;
esac

ข้อควรระวัง ต้องแก้ส่วน path ORA_HOME ให้ตรงตามที่เราเซ็ต $ORACLE_HOME ไว้ด้วย

4. ทำการ execute โดยใช้คำสั่งตามด้านล่างนี้

#chmod 750 /etc/init.d/dbora
#ln -s /etc/init.d/dbora /etc/rc.d/rc0.d/K01dbora
#ln -s /etc/init.d/dbora /etc/rc.d/rc3.d/S99dbora
#ln -s /etc/init.d/dbora /etc/rc.d/rc4.d/S99dbora
#ln -s /etc/init.d/dbora /etc/rc.d/rc5.d/S99dbora
#ln -s /etc/init.d/dbora /etc/rc.d/rc6.d/K01dbora

5. ทำการ reboot เครื่องใหม่ ก็เป็นอันเสร็จ

เราจะทราบได้อย่างไรว่าสิ่งที่เราทำไป database ได้ start หรือ shutdown ได้ถูกต้องจริงๆ
  • ตรวจสอบ log file เมื่อเปิดเครื่อง ที่ $ORACLE_HOME/startup.log
  • ตรวจสอบ log file ไฟล์เมื่อปิดเครื่อง ที่ $ORACLE_HOME/shutdown.log

Credit by Bie

อ้างอิงจาก
ข้อเขียนนี้ช่วยฉัน:  

Friday, June 4, 2010

การเลือก Shutdown database ให้เหมาะสม

หลายท่านที่ได้ทำ Database ต้องรู้จักการ Shutdown database อย่างแน่นอน ซึ่งบางคนก็จะใช้แต่คำสั่ง Shutdown immediate แต่คุณรู้ไหมว่าจริง ๆ แล้วการ shutdown นั้น มีหลายแบบแต่ละแบบนั้นมีความแตกต่างกันขึ้นอยู่กับความเหมาะสมของแต่ละงาน ฉะนั้น เรามาดูกันดีกว่าว่า เราควรจะ Shutdown database แบบไหนให้เหมาะสมที่สุด...


Mode ในการ Shutdown database มีด้วยกัน 4 mode ดังนี้

SHUTDOWN NORMAL mode นี้จะเป็น mode ปกติ ที่ต้องรอให้ผู้ใช้ ใช้งานเสร็จทั้งหมดก่อนถึงจะ shutdown ให้
  • หลังทำการรันคำสั่งนี้แล้ว จะไม่อนุญาตให้มีการเชื่อมต่อเข้ามาใหม่ และ จะรอจนกว่าการเชื่อมต่อที่มีอยู่ทำการยกเลิกการเชื่อมต่อก่อนจึงจะ shutdown
  • การ startup ครั้งต่อไป จะไม่มีการทำ instance recovery

SHUTDOWN TRANSACTIONAL mode นี้จะเป็นการ shutdown ไม่ต้องรอให้ผู้ใช้คนอื่นทำ sessions เสร็จก่อน โดยจะทำการปิด sessions ให้เลย แต่ถ้ายังมีการทำ transactions อยู่ก็รอจนกว่าจะทำเสร็จถึงจะปิดให้
  • หลังทำการรันคำสั่งนี้แล้ว จะไม่อนุญาตให้มีการเชื่อมต่อเข้ามาใหม่ รวมถึง transaction ที่ยังไม่ได้รัน
  • จะรอให้ Transaction ที่ทำงานค้างอยู่ทำงานให้เสร็จก่อน จากนั้นจะทำการยกเลิกการเชื่อมต่อทั้งหมด
  • มีประโยชน์สำหรับการป้องกันไม่ให้งานที่ทำอยู่เกิดข้อผิดพลาด เนื่องจากจะรอให้ทำ transaction ต่างๆที่ค้างอยู่เสร็จก่อน
  • การ startup ครั้งต่อไป จะไม่มีการทำ instance recovery

SHUTDOWN IMMEDIATE mode ไม่ต้องรอใน transactions mode นี้จะปิดให้เลยโดยไม่เลย transactions จบ
  • หลังทำการรันคำสั่งนี้แล้ว จะไม่อนุญาตให้มีการเชื่อมต่อเข้ามาใหม่ รวมถึง transaction ที่ยังไม่ได้รัน
  • Transaction ใดๆที่ยังไม่ได้มีการ commit จะถูก roll back ไปทั้งหมด
  • การเชื่อมต่อทั้งหมดจะถูกยกเลิกทันที
  • การ startup ครั้งต่อไป จะไม่มีการทำ instance recovery

SHUTDOWN ABORT mode นี้จะเป็นการ shutdown เร็วที่สุด เพราะ mode นี้จะไม่ต้องรออะไร
  • หลังทำการรันคำสั่งนี้แล้ว จะไม่อนุญาตให้มีการเชื่อมต่อเข้ามาใหม่ รวมถึง transaction ที่ยังไม่ได้รัน
  • SQL Statement ที่กำลังทำงานอยู่จะถูก terminate ทันที
  • Transaction ใดๆที่ยังไม่ได้มีการ commit จะไม่ถูก roll back
  • การเชื่อมต่อทั้งหมดจะถูกยกเลิกทันที
  • การ startup ครั้งต่อไป จะมีการทำ instance recovery

หรือสามารถดูสรุปได้จากตารางด้านล่างครับ

Database Behavior ABORT IMMEDIATE TRANSACTIONAL NORMAL

Permits new user connections

No

No

No

No

Waits until current sessions end

No

No

No

Yes

Waits until current transactions end

No

No

Yes

Yes

Performs a checkpoint and closes open files

No

Yes

Yes

Yes

Credit by Yong(@stigmatise)

อ้างอิง
ข้อเขียนนี้ช่วยฉัน:  

Thursday, May 27, 2010

10 อันดับแรก ของระบบฐานข้อมูล ที่น่าจับตามอง


ว่ากันด้วยเรื่องของระบบฐานข้อมูล หรือ Database System ถ้าผู้ที่เริ่มรู้จักหรือสนใจเรื่อง Database ได้ไม่นาน(ย้อนหลังไปซัก 5 ปี) จะไม่รู้ว่า Database นั้น ได้ถือกำเนิดมานานแล้วตั้งแต่ปลาย ๆ ปี 1970 โดยประมาณ ซึ่งพอหันกลับมามองในช่วงปีนี้ ก็ไม่สามารถจะแย้งได้เลยว่า วงการการตลาดของ Database นั้น มันเจริญเติบโตอย่างรวดเร็วเลยทีเดียว ยิ่งในช่วงปีนี้ เหล่าองค์กร Database ต่าง ๆ เกิดการปรับเปลี่ียนตัวผลิตภัณฑ์ของเขาเองเพื่อที่จะพร้อมแข่งขันกับคู่แข่งที่มากขึ้น ๆ ทุกวัน แถมยังมีประสิทธิภาพที่ดีมากขึ้นกว่าสมัยก่อนเป็นอย่างมาก

ฉะนั้นแล้ว สำหรับผู้ที่กำลังมองหา Database ซักตัว มาใช้ทำงานอะไรซักอย่าง บทความนี่้จะช่วยคุณในการ พิจารณา Database ที่ดีที่เหมาะแก่การใช้งานของคุณ โดยเรียงลำดับ 10 อันดับแรกของ Database ที่กำลังมาแรงในปัจจุบัน

1. Oracle
Oracle เริ่มมาตั้งแต่ปี 1979 ซึ่งเป็นองค์กรแรกก็ว่าได้ทีมี Database แบบ Relational database management system หรือที่เรียกย่อ ๆ ว่า RDBMS นั่นเอง โดยผู้ที่เป็นหัวเรือ CEO ของ Oracle จะเป็นใครไปไม่ได้นอกจาก Larry Ellison ซึ่งเป็นผู้ที่ทำให้ Oracle มีองค์กรที่เป็นลูกค้ากว่า 500 องค์กร และเป็นองค์กรที่ทำระบบฐานข้อมูลที่โด่งดังเกือบจะมากที่สุดก็ว่าได้

2. SQL Server
ถ้าพูดถึง Microsoft ที่เป็นบริษัทซอร์ฟแวร์ที่ใคร ๆ ก็รู้จัก ซึ่ง SQL Server ก็ส่วนหนึ่งที่ทำให้ Microsoft มีชื่อเสียงมากขึ้น เพราะ OS ของ Microsoft ก็มีอยู่เกือบทั่วทุกแห่ง และยิ่งถ้าคุณใช้ Microsoft Server แล้วละก็ คุณก็ต้องใช้ SQL Server ควบคู่กันไปเพราะมันทำงานได้ง่ายขึ้นและเหมาะที่จะรันบน Windows ที่ใคร ๆ ก็ใช้ด้วย

3. DB2
สำหรับ DB2 ที่ IBM เป็นเจ้าของนั้น สามารถทำงานได้บนหลายแฟลตฟอร์ม เช่น Linux, UNIX, Windows โดย IBM ได้ทำการพัฒนา DB2 เวอร์ชั่น 9.7 นี้ เพื่อมาแย่งตลาด Oracle โดยยึดแนวคิดที่ว่า "Lower costs. Easy to use. Secure." และเหมาะสำหรับองค์กรที่มีขนาดไม่ใหญ่โตนัก ซึ่งหากต้องการหาระบบจัดการฐานข้อมูลที่ดีและมีประสิทธิภาพสูง ดังนั้น DB2 เวอร์ชั่น 9.7 นี้น่าสนใจมากทีเดียว

4. Sybase
Sybase ยังคงเป็นผู้นำในด้าน Adaptive Server Enterprise หลังจาก 25 ปีแห่งความสำเร็จที่ผ่านมาและการปรับปรุงผลิตภัณฑ์ของ Adaptive Server Enterprise อยู่เรื่อย ๆ แต่เมื่อเร็ว ๆ นี้ Sybase ก็ได้ถูกซื้อโดย SAP ไปซะแล้ว

5. MySQL
เป็นระบบจัดการฐานข้อมูลโดยใช้ภาษา SQL แม้ว่า MySQL เป็นซอฟต์แวร์โอเพนซอร์ส แต่แตกต่างจากซอฟต์แวร์โอเพนซอร์สทั่วไป โดยมีการพัฒนาภายใต้บริษัท MySQL AB ในประเทศสวีเดน โดยจัดการ MySQL ทั้งในแบบที่ให้ใช้ฟรี และแบบที่ใช้ในเชิงธุรกิจ แต่อย่างไรก็ตาม ตอนนี้ Oracle ก็ได้ชื่อว่าเป็นเจ้าของ MySQL ไปซะแล้วและ Oracle ได้ประกาศต่อสาธารณะอย่างมุ่งมั่นว่าจะพัฒนาอย่างต่อเนื่องและสนับสนุน MySQL อย่างสุดกำลัง

6. PostgreSQL
PostgreSQL หรือนิยมเรียกว่า โพสต์เกรส (Postgres) เป็นระบบจัดการฐานข้อมูลในลักษณะของซอฟต์แวร์เสรีภายใต้สัญญาอนุญาตบีเอสดี ชื่อเดิมของซอฟต์แวร์คือ โพสต์เกรส ซึ่งต่อมาได้ถูกเปลี่ยนเป็นโพสต์เกรสคิวเอล โดยประกาศออกมาจากทีมหลักในปี 2550 ชื่อของโพสต์เกรสมาจากชื่อ post-Ingres ซึ่งหมายถึงตัวซอฟต์แวร์ที่พัฒนาต่อจากซอฟต์แวร์ชื่ออินเกรส
นั่นเอง

7. Teradata
ถ้าคุณเคยทำฐานข้อมูลในระดับใหญ่ ๆ คุณอาจจะเคยได้ยิน Teradata อยู่บ้าง Teradata เกิดขึ้นเมื่อปี 1970 เป็นผู้ที่วางรากฐานสำหรับคลังข้อมูลแรก ๆ ก่อนที่จะมีอย่างเป็นทางการ ซึ่งผู้เชี่ยวชาญด้านคลังสินค้าหรือ Data warehouse มักจะเรียก Teradata ในความหมายเดียวกับ บริษัทคลังข้อมูลขนาดใหญ่นั่นเอง

8. Informix
เป็นผลิตภัณฑ์อีกตัวหนึ่งของ IBM ที่ถูกพัฒนาออกมาหลายเวอร์ชั่นมาก ตั้งแต่ imited Developer Edition จนถึง entry-level Express Edition หรือ low-maintenance online transaction processing (OLTP) Workgroup Edition และ high-performance OLTP Enterprise Edition โดย Infomix จะยึดหลักที่ว่า "ลูกค้ามักจะได้ต้นทุนต่ำของการบำรุงรักษาและความน่าเชื่อถือสูงที่สุด"

9. Ingres
Ingres เป็นส่วนรากฐานของโอเพ่นซอร์สในตระกูล PostgreSQL และฐานข้อมูลอื่น ๆ หรือเรียดได้ง่าย ๆ ว่า คือ RDBMS (Relational Database Management System) แบบโอเพ่นซอร์สของบริษัทคอมพิวเตอร์ แอสโซซิเอทส์ จำกัด (Computer Associates - CA) ซึ่งเป็นหนึ่งในระบบจัดการฐานข้อมูลเชิงสัมพันธ์หรือ RDBMS อันดับต้นๆ ของโลก

10. Amazon's SimpleDB
ฐานข้อมูลแบบง่ายๆ มีตารางเดียว แต่รองรับปริมาณข้อมูลจำนวนมากได้ โดยทั่วไปแล้ว SimpleDB จะมีการใช้งานที่ใกล้เคียงกับ SQL ตามปรกติ ที่ต่างออกไปคือการทำ Query ต้องอยู่บนตารางเดียวเท่านั้น และสามารถใช้ Expression ได้เพียงพื้นฐาน แต่มีข้อดีคือการเพิ่มขนาดของ SimpleDB นั้นทำได้ค่อนข้างง่ายและที่สำคัญที่สุดคือไม่มีค่าธรรมเนียมขั้นต่ำ

อ้างอิง
ข้อเขียนนี้ช่วยฉัน:  

Thursday, March 11, 2010

การ Install Oracle Database 11g และสร้าง Database

เรามาดูิธีการ Install Oracle Database 11g กันเลยดีกว่า...

ขั้นตอนการ Install Oracle Database 11g ทำดังนี้
  1. ล็อคอินเข้าสู่ระบบโดยใช้ User ที่อยู่ใน Group ที่มีสิทธิ์ในการ Install และใช้งาน Oracle Database ได้
  2. ใส่แผ่น CD ที่จะทำการ Install จะมีหน้าต่าง Autorun ขึ้นมา
  3. ที่หน้า Configure Security Update จะมีให้ใส่ E-mail และ Oracle Support Password จากนั้นให้กด
    Next แต่ถ้าไม่ต้องการใส่ให้ Uncheck เครื่องหมายถูกออกไป และปล่อยเว้นว่างไว้ทั้ง2 ช่อง จากนั้นกด Next ถ้ามีหน้าต่างเตือนให้กด Yes
  4. ที่หน้า Installation Option ให้เลือก Create and configure a database จากนั้นกด Next
  5. ที่หน้า System Class เลือก Server Class จากนั้นกด Next
  6. ที่หน้า Grid Option เลือก Single instance database installation จากนั้นกด Next
  7. ที่หน้า Install Type เลือก Advanced Install จากนั้นกด Next
  8. ที่หน้า Product Languages เลือกภาษาที่ต้องการเพิ่มเติม (นอกเหนือจาก English) จากนั้นกด Next
  9. ที่หน้า Installation Location ปล่อยให้ค่าต่างๆเป็นไปตาม Default จากนั้นกด Next
  10. ที่หน้า Create Inventory ปล่อยให้ค่าต่างๆเป็นไปตาม Default จากนั้นกด Next
  11. ที่หน้า Create Inventory ปล่อยให้ค่าต่างๆเป็นไปตาม Default จากนั้นกด Next
  12. ที่หน้า Configuration Type เลือก General Purpose / Transaction Processing จากนั้นกด Next
  13. ที่หน้า Database Identifiers ปล่อยให้ค่าต่างๆเป็นไปตาม Default จากนั้นกด Nex
  14. ที่หน้า Configuration Options ที่แท็บ Memory ปล่อยให้ค่าเป็นไปตาม Default
  15. ที่แท็บ Character sets เลือก Choose from the following list of character sets และเลือก Thai TH8TISASCII จาก List
  16. ที่แท็บ Security ปล่อยให้ค่าเป็นไปตาม Default
  17. ที่แท็บ Sample Schema ถ้าต้องการสร้าง Sample Schema ให้ Check เครื่องหมายถูก ถ้าไม่ต้องการสร้างก็ไม่ต้อง Check เครื่องหมายถูกจากนั้นกด Next
  18. ที่หน้า Management Option ปล่อยให้ค่าเป็นไปตาม Default จากนั้นกด Next
  19. ที่หน้า Database Storage ปล่อยให้ค่าเป็นไปตาม Default จากนั้นกด Next
  20. ที่หน้า Backup and Recovery ปล่อยให้ค่าเป็นไปตาม Default จากนั้นกด Next
  21. ที่หน้า Schema Passwords เลือก Use the same password for all accounts จากนั้นให้ใส่ Password ที่ต้องการลงไป และใส่ Password เดิมซ้ำเพื่อยืนยัน
  22. ที่หน้า Operating System Groups ปล่อยให้ค่าเป็นไปตาม Default จากนั้นกด Next
  23. ที่หน้า Prerequisite Checks จะพบรายการที่ไม่ผ่านข้อกำหนดอยู่ ซึ่งถ้ารายการได้สามารถแก้ไขได้โดย OUI (Oracle Universal Installer) จะมีคำว่า Yes ต่อท้ายอยู่ที่ช่อง Fixable ถ้าต้องการให้ OUI ทำการสร้าง Script เพื่อทำการแก้ไขสามารถทำได้โดยกด Fix and check again
  24. หน้าต่าง Execute Fixup Scripts จะปรากฎขึ้นมา และแสดงวิธีการรัน Script แก้ไข
  25. su - root
    /tmp/CVU_11.2.0.0.2_oracle/runfixup.sh
  26. เปิดหน้าต่าง Terminal ขึ้นมา (โดยไม่ต้องปิดหน้าต่าง Execute Fixup Scripts) และรัน Script ด้วย User : Root ด้วยคำสั่งต่อไปนี้
  27. กลับไปยังหน้าต่าง Execute Fixup Scripts และกด OK ถ้าไม่มีปัญหาใดตกค้างอยู่ ก็จะไปหน้าถัดไป แต่ถ้ามีปัญหาตกค้างอยู่ ให้สังเกตว่าจะไม่มีคำว่า Yes ที่ช่อง Fixable ซึ่งปัญหาเหล่านี้ต้องลงมือแก้ไขด้วยตัวเอง ในตัวอย่างนี้มีปัญหาเกี่ยวกับ Package ที่ขาดหายไปดังภาพ แก้ไขโดยการ Install Package ดังกล่าวลงไป (อาจจะหาจากแผ่นที่ทำการ Boot Linux หรือหาโหลดตามเว็บต่างๆก็ได้ครับ) จากนั้นกด Check again
  28. ถ้าไม่พบปัญหาใดๆแล้วจะแสดงหน้า Summary จากนั้นกด Finish
  29. จะพบหน้าต่างแสดง Progress การ Install Oracle Database
  30. เมื่อในส่วนของ Software ถูก Install เสร็จแล้ว ในส่วนของ Database Configuration Assistant จะเริ่มและทำการสร้าง Database ให้
  31. เมื่อ Database ถูกสร้างเสร็จแล้ว กด OK
  32. จะต้องทำการรัน Script อีก 2 Script ด้วย User : Root
  33. เปิดหน้าต่าง Terminal ขึ้นมาแล้วใช้คำสั่งต่อไปนี้
  34. su -
    
    /u01/app/oraInventory/orainstRoot.sh
    /u01/app/oracle/product/11.2.0/dbhome_1/root.sh
  35. กลับมาหน้าต่างเดิมจากนั้นกด OK
  36. จะพบหน้าต่างแสดงการ Install และสร้าง Database เสร็จสมบูรณ์

...เท่านี้ ก็ถือว่าการ install Oracle 11g เสร็จเป็นที่เรียบร้อยครับ
ไว้บทความหน้า ผมจะมาบอกวิธีการสร้าง Database โดยใช้ Database Configuration Assistant (DBCA) นะครับ

อ้างอิง
ข้อเขียนนี้ช่วยฉัน:  

Wednesday, March 3, 2010

Oracle Database Lite

Oracle Database Lite ถูกออกแบบมาเพื่อเหมาะสำหรับการนำไปใช้งานบน mobile device หรือการนำมา embeded ลงกับโปรแกรมที่มีอยู่แล้ว ด้วยขนาดที่เล็กของมัน ทำให้ง่ายต่อการเข้าถึงข้อมูล สามารถใช้งานได้โดยไม่ต้องคำนึงถึงกรณีที่มีปัญหา Network ขัดข้อง (กรณีที่ Database อยู่บน Server)

เนื่องจากเป็นการทำงานบน Client แต่มี feature ของการ Synchronize กับ Oracle Database Lite Mobile Server และนอกจากนั้น Mobile Server ก็ยังสามารถทำการ Synchronize กับ Enterprise Oracle Database ได้อีกด้วย

ฟังดูแล้วน่าลองใช่ไหมครับ งั้นเรามาดูวิธีการ Embed ตัว Oracle Lite กัน...
สามารถทำได้โดยการ Copy ไฟล์จำนวน 5 ไฟล์ลงไปยัง Directory ที่เก็บไฟล์ .dll ของ Application อยู่ครับ โดยไฟล์ทั้ง 5 จะอยู่ใน ORACLE_HOME/Mobile/Sdk มีดังนี้
  • olite40.msb : Oracle Database Lite message file
  • olobj40.dll : Oracle Database Lite object kernel
  • olod2040.dll : Oracle Database Lite ODBC driver
  • olsql40.dll : Oracle Database Lite SQL runtime library
  • olstddll.dll : Oracle Lite Common library

เมื่อทำการ Copy Files ทั้งหมดแล้ว เราก็สามารถทำให้ Program สามารถเข้าถึงข้อมูลผ่านทาง ODBC interface ได้

ส่วน Data ล่ะ จะไปอยู่ที่ File ไหน ?
Database จะถูกเก็บไว้ในไฟล์ .odb ซึ่งการสร้าง Database ไว้บน Client แบบนี้ สามารถทำได้โดยการ Sync กับ Oracle Database Lite Server ครับ จากนั้นก็จะมีการสร้าง snapshot ไว้ที่ database ใน server ซึ่งเมื่อ Client มีการเปลี่ยนแปลงข้อมูลก็จะยังไม่ไปยุ่งเกี่ยวกับ data ที่อยู่บน server แต่จะไปยุ่งเกี่ยวกับ data บน server ก็ต่อเมื่อมีการ Sync กันครับ โดยใช้ Oracle Database Lite Mobile Synchronization application (msync)

แล้ว Database Lite กับ Database ธรรมดา มันต่างกันตรงไหนล่ะ ?
ในเรื่องของความแตกต่างระหว่าง Database แบบธรรมดากับแบบ Lite นั้น สามารถดู Link ได้จากด้านล่าง ที่แสดงตารางเปรียบเทียบ Feature ต่าง ๆ ที่แตกต่างกัน เช่น ขนาดของ Database, Spec ของเครื่อง, OS เป็นต้น
What’s the Difference with other Oracle Database Editions?

สามารถอ่านรายละเอียดเพิ่มเติมได้จากที่นี่ครับ
Understanding The Oracle Lite Database

อ้างอิง
ข้อเขียนนี้ช่วยฉัน:  

Tuesday, December 8, 2009

Oracle Database Backup and Recovery Concept

เมื่อต้นเดือนที่ผ่านมาได้รับโจทย์ให้ไปดูแล Oracle Database ที่ไซต์ของลูกค้า และสิ่งที่ขาดไม่ได้ในการดูแล database นั่นคือเรื่องของการ backup database เลยใช้เวลาหาเรื่องเกี่ยวกับการ backup ซักระยะแล้วก็เริ่มหงุดหงิดกับบทความภาษาไทยที่บอกไม่ละเอียดเลย มีบอกนั่นนิดมีบอกนี่หน่อย พอกันทีครับไป otn ดีกว่า มือใหม่อย่างผมก็นั่งงมอยู่ซักพักก็เริ่มจับหลักได้

ผมจึงตั้งใจจะเขียนเรื่องการ backup database โดยแบ่งออกมาได้เป็น 3 ตอน
1. Oracle Database Backup & Recovery Concept
2. Oracle Database Backup (RMAN)
3. Oracle Database Recovery


แล้วจะค่อยๆทยอยเขียนให้อ่านเรื่อยๆถ้ายังไม่เบื่อกันก่อน ok เข้าเรื่องเลย
สำหรับตอนนี้เป็นตอนแรกผมอยากให้เข้าใจ concept ของการทำ backup & recovery database กันก่อนให้เข้าใจก่อนว่า failure สามารถเกิดได้ในเหตุการณ์ไหนบ้าง

Backup และ Recovery จะเกี่ยวข้องกับยุทธวิธีและขั้นตอนการป้องกันข้อมูลไม่ให้สูญหายและคืนสภาพให้กับ database เมื่อข้อมูลเสียหาย
Backup คือการ copy ข้อมูลจาก database เพื่อนำมาใช้สร้าง database เมื่อ database มีข้อมูลเสียหาย แบ่งได้เป็น 2 ประเภท
  • Physical backup คือการ backup ข้อมูลจาก physical file เช่น data file, control file, archive redo log file วิธีการ backup มี 2 วิธี
    • Manual Backup คือการเราเข้าไป copy physical database file แต่ต้องทำขณะที่ shutdown database อยู่
    • Recovery Manager (RMAN) เป็น utility ที่ Oracle ทำขึ้นมาเพื่อทำหน้าที่ backup restore and recovery โดยเฉพาะสามารถทำได้ขณะที่ database กำลัง online อยู่
  • Logical backup คือการ backup พวกข้อมูลที่เป็น Logical เช่น Tables, stored procedures ซึ่งอาจใช้ Oracle export utilit
Physical backup เป็นรากฐานของการ backup ส่วน Logical backup ทำเพื่อช่วย support physical backup เพราะมันไม่สามารถกู้ Oracle database ส่วนที่เสียหายกลับคืนมาได้ทั้งหมด เช่นถ้า control file เสียหาย Logical backup ไม่สามารถกู้คืนกลับมาได้เนื่องจาก Logical มันเป็นแค่ข้อมูลที่ backup มาจาก data file

เป้าหมายของการทำ backup
Mean Time Between Failure (MTBF) หมายถึงเพิ่มเวลาเมื่อเกิด database failure แต่ User ยังสามารถทำงานต่อไปได้โดยไม่รู้สึกว่า database failure
Mean Time To Recover (MTTR) คือการใช้เวลาให้น้อยที่สุดในการ recovery database
ป้องกันไม่ให้เกิด Database Failure
เมื่อ Recovery กลับมาแล้วข้อมูลควรเสียหายน้อยที่สุด และต้องใช้งานได้เหมือนเดิม

Database Failure ที่อาจเกิดขึ้นได้
Statement Failure สาเหตุเกิดจาก
syntax ไม่ถูกต้อง
application logic failure
User ไม่มีสิทธิ์ส่งคำสั่งนั้น
User ใช้พื้นที่ tablespace เกิน quota ที่กำหนด ถ้าเกิดปัญหาในข้อนี้สามารถแก้ได้โดยให้ dba เพิ่ม quota ให้ user แต่เราสามารถดักให้ error ที่เกิดขึ้นนี้หน่วงเวลาออกไปได้โดยเข้าไปกำหนดใน parameter RESUMABLE_TIME=xxx (วินาที) ซึ่งในระหว่างนี้ให้ dba เข้าไปเพิ่ม quota ให้กับ user ที่เกิดปัญหาหลังจากนั้น statement ที่ error นั้นสามารถทำงานต่อไปได้
failure ประเภทนี้ที่ไม่ต้องมี backup และไม่ต้องทำ recovery เพราะไม่มีผลกระทบอะไรกับ database Oracle สามารถจัดการกับปัญหาที่เกิดขึ้นทั้งหมดได้

User Process Failure สาเหตุเกิดจาก
User ที่ disconnect database แบบผิดปกติ เช่น user ทำ transaction ต่างๆอยู่แล้วยังไม่ commit เกิดข้อผิดพลาดขึ้นใน application ทำให้ application ต้องหยุดการทำงานไปทำให้ user ออกจาก database แบบผิดปกติ
ซึ่งถ้าเกิดความผิดปกติประเภทนี้ เราจะรู้ได้ทันทีจาก background process Process Moniter (PMON) โดยสิ่งที่ Oracle จะแก้ไขปัญหานี้คือ Oracle จะ rollback transaction ที่ทำค้างของ User คนนั้น และปลดล็อคคืนให้กับระบบ failure ประเภทนี้ไม่ต้องมี backup และไม่ต้องทำ recovery

Network Failure สาเหตุเกิดจาก
Listener Fails เมื่อเกิดเหตุการณ์นี้ client จะไม่สามารถเข้ามาใช้งาน Oracle Database ได้เลย เป็น failure ที่เล็กน้อยแต่เป็นปัญหาใหญ่ การป้องกันไม่ให้เกิด failure ประเภทนี้คือ สร้างเส้นทางสำรองให้กับ listener ทำโดยสร้าง listener process อีก 1 ตัว แล้วเลือก option connection fail over เป็น advance option จากนั้นเราต้องทำให้ client รู้จัก listener รู้จักกับเส้นทางสำรองผ่าน listener โดยการ config tnsname.ora
ระบบ network fails
ปัญหาอย่างนี้ไม่เกี่ยวข้องกับข้อมูลของ database เลยไม่ต้องมี backup ไว้

User Error สาเหตุเกิดจาก
ความผิดพลาดจาก user เอง เช่นการลบ table ผิดซึ่งพบได้บ่อยมาก ใน Oracle Database 10g จึงได้เพิ่ม feature ใหม่เข้ามาคือ flashback ซึ่งสามารถเอา table ที่ถูกลบไปแล้วกลับมาได้ด้วย user คนนั้นเอง แต่ก็ต้องดูด้วยว่าข้อมูลที่จะ flashback กลับมานั้นยังอยู่ใน undo table หรือไม่
ตัวอย่างการใช้คำสั่ง flashback
SQL> DROP Table hr.job_history;
Table dropped.
SQL> FLASHBACK TABLE hr.job_history TO BEFORE DROP;
Flashback complete.
ตารางที่ลบไปแล้วจะถูกเปลี่ยนชื่อโดยขึ้นต้นว่า bin ถ้าเราต้องลบ table ที่อยู่ใน recycle bin คำสั่ง PURGE
ตัวอย่างการใช้คำสั่ง purge
SQL> purge recyclebin ; อันนี้ลบทั้งหมด
SQL> purge table ... ;
SQL> purge index ... ;
Failure ประเภทนี้อาจต้องใช้ backup เพื่อทำ recovery เพราะว่าถ้าใช้ คำสั่ง PURGE จะทำให้ table ที่อยู่ใน recycle bin จะถูกลบไปถาวร

Media Failure อาจเกิดขึ้นกับ disk ที่ไม่ว่ากรณีใดๆ เมื่อเกิดขึ้นแล้วต้องมี backup และต้องทำ recovery ให้กับ database

Instance Failure สาเหตุอาจเกิดจาก
ไฟดับ
Hardware failure
Background processes Failure
Emergency shutdown เช่นการส่งคำสั่ง shutdown ABORT และ start FORCE
Failure ประเภทนี้ต้องมี backup เพื่อเอาไว้ recovery Failure ประเภทนี้ Oracle สามารถตรวจเจอได้เอง
การที่ Instance Failure มีโอกาสสูงที่จะทำให้ข้อมูลไม่ synchonize กันเพราะเมื่อมีการส่งคำสั่ง update เข้ามามีผลทำให้ข้อมูลมีการเปลี่ยนแปลง ข้อมูลที่เปลี่ยนแปลงจะถูกเก็บลงใน redo log buffer แล้วเมื่อ user ส่ง commit เข้ามาข้อมูลที่เปลี่ยนแปลงจึงถูกเขียนลงใน redo log file แต่ยังไม่เขียนข้อมูลที่เปลี่ยนแปลงลงใน data file มันจะรอจนถึงกระบรวนการ checkpoint ให้ background process Database Writer (DBWR) เขียนข้อมูลลง data file ให้เป็นข้อมูลเดียวกันระหว่าง redo log file กับ data file ข้อมูลทั้งสอง file จึง synchonize กัน แต่ถ้าระหว่างนี้ เกิดเหตุการณ์ที่ทำให้เกิด Instace Failure ทำให้ข้อมูลที่ถูกเปลี่ยนแปลงล่าสุดจริงๆอยู่ที่ redo log file แต่ Oracle สามารถตรวจจับความผิดปกติตรงนี้ได้และแก้ไขให้เราแต่ต้องอาศัยให้ dba startup database ให้

ขั้นตอนการทำงานของ Instance Recovery
ข้อมูลตัวสำคัญที่บอกว่าข้อมูล synchonize กันหรือไม่นั่นค่าของ SCN (System Change Number) ค่า SCN จะบอกว่า ณ ตอนนี้ข้อมูลมีการเปลี่ยนแปลงไปครั้งที่เท่าไหร่แล้ว SCN จะเกิดขึ้นทุกครั้งที่มีการ commit Database จะสร้างเลข SCN ขึ้นมา 1 ตัวและบวกเพิ่มขึ้นไปเรื่อยๆ แล้วเก็บลงใน data file, control file, redo log group
ตัวอย่าง Instance Failure


ใน redo log group กับ control file ค่า SCN ล่าสุดคือ 143 แต่ data file ค่า SCN ล่าสุดคือ 140 จะเห็นว่าค่าตอนนี้ไม่ synchonize กัน ซึ่ง background process ที่จะมา stamp ให้ค่า SCN ตรงกันคือ background process Check Point (CKPT) เมื่อมา stamp แล้วเห็นว่าค่า SCN ไม่ตรงกันก็บอกให้รู้แล้วว่า Instance Failure จึงต้องทำ Instance Recovery จากนั้นจะไปเรียกให้ SMON ให้ทำงาน โดย SMON จะทำอยู่ 2 operation นั่นคือ Row forward กับ transaction ที่ commit แล้วคือเอาข้อมูลที่อยู่ใน redo log file ไป update ใน datafile ให้แล้ว, Row backward กับ transaction นั้นถูก rollback หรือถูก force ให้ rollback คือไปเอาข้อมูลใน undo data มาใส่ใน table เหมือนเดิม


การทำ Instance จะต้องมีจุดเริ่มทำซึ่งจะเกี่ยวข้องกับ checkpoint คือเริ่มทำในตำแหน่งที่ยังไม่ถูกทำ check point เป็นต้นมา จะเห็นว่า checkpoint ถี่ก็มีข้อดีคือ recvoery เร็วขึ้น แต่ก็ทำให้ performance ตกลงเช่นกันเมื่อทำ checkpoint การจะดูว่าควร checkpoint ถี่แค่ไหนให้ดูจาก MTTR

Mean Time To Recovery (MTTR) ระยะเวลาในการทำ recovery
เราสามารถเข้าไปกำหนดได้ว่าเมื่อมีการ recovery ให้ใช้เวลาเท่าไหร่ ถ้าเข้าไปดูที่ OEM จะมีบอกรายละเอียดด้วยว่าถ้ามีการ recovery ต้องใช้เวลาประมาณเท่าไหร่ หรือเราเข้าไปกำหนดได้ใน Parameter FAST_START_MTTR_TARGET ถ้าเรากำหนดค่าน้อยจะมีผลทำให้ checkpoint บ่อยขึ้น แต่ถ้าใส่ค่ามากจะมีผลทำให้ checkpoint นานขึ้น ซึ่งค่ามากที่สุดคือ 3600 วินาที (1 ชั่วโมง) ค่า default คือ 0 (disable) ซึ่งตรงนี้ถ้าเป็น disable Oracle จะเข้าไปดู paramter ตัวอื่นที่เกี่ยวข้องด้วยคือ LOG_CHECKPOINT_TIMEOUT (วินาที)

การวางแผนเรื่องการ backup
  • ควรมีตารางการ backup เช่น ทุกๆวัน, ทุกๆวันพุธ, ทุกเดือน ซึ่งตรงนี้จะถี่แค่ไหนขึ้นอยู่กับ data ว่ามีการเปลี่ยนแปลงบ่อยแค่ไหน
  • ควรทำ Multiplex Control Files ถ้าไม่มี control files Instance Database จะ statup ไม่ขึ้น
  • ควรทำ Multiplex Redo log groups
  • Production System ควร run อยู่ใน ArchivedLog mode เพื่อป้องกัน loss data
  • สร้าง redundancy ให้กับระบบของเราด้วยการใช้ RAID-based เพื่อให้ระบบสามารถทำงานต่อไปได้เมื่อ disk failure และแถมยังเป็นการการรันตีว่าข้อมูลจะไม่สูญหายไปเมื่อ disk failure
  • ทำการ backup เป็นประจำเพื่อเมื่อถึงเวลาที่ต้องทำการ recovery จะได้กลับไปจุดที่ทำการ backup ครั้งล่าสุดได้ไม่ไกลจากช่วงเวลาปัจจุบันนัก
  • รักษาอุปกรณ์เก็บข้อมูล และมั่นทดสอบว่าข้อมูลที่เก็บอยู่สามารถใช้งานได้จริง
  • run noarchivelog mode เมื่อคุณแน่ใจว่าระบบมีเวลา downtime
  • หลังจากมีการเปลี่ยนแปลงโครงสร้างของ database ควรมีการ backup control file อยู่เสมอ
  • ควรมีการ backup ลงใน tape และ tape ก็ควร backup อีกเช่นกัน
  • ควรมี 2 copies ของ archived redo logs อันนึงเก็บไว้ใน disk และอีกอันเก็บไว้ในอุปกรณ์เก็บข้อมูลอย่างอื่น เพื่อที่ว่าเมื่อมีปัญหาจะได้ดึง archived redo log ที่อยู่ใน disk มาใช้งานได้อย่างรวดเร็วหรือถ้ามีปัญหาอีกก็ดึงจากอุปกรณ์เก็บข้อมูลภายนอก
  • ไฟล์ที่เราควร backup ได้แก่ data files, log files, control files, spfile หรือ init.ora, sqlnet.ora, tnsnames.ora, listener.ora และ password file
  • เก็บมี copy backup อันเก่าไว้ด้วย เผื่อที่ว่า backup ปัจจุบันใช้งานไม่ได้ขึ้นมา(ซึ่งมีโอกาสเป็นไปได้)
  • script backup ควรมีเก็บ log file ได้ด้วยเผื่อมี error เกิดขึ้นระหว่างการ backup จะได้รู้
  • แต่ละ application ควรมีการใช้งานแยก tablespace กันเพื่อที่ว่าถ้า tablespace ใดมีปัญหาเกิดขึ้น application อื่นๆยังคงใช้งานได้ต่อ
  • ใช้ snapshot technology เพื่อเก็บ system backup เพราะว่ามัน backup ได้อย่างรวดเร็วกับ database ขนาดใหญ่
  • ใช้ data pump export utility เพื่อช่วยในการสนับสนุนการ backup
Control Files
เป็น file ควบคุมเก็บสถานะการทำงานของ database โดยสิ่งที่ Control File เก็บเช่น mode การทำงานของ database, เก็บ physical structure เช่นว่า data file กี่ตัวอยู่ path อะไรที่ไหนบ้าง
Control File จะถูกอ่านเมื่อ startup database MOUNT mode แต่ยังไม่ตรวจสอบความถูกต้องของ control file ซึ่งถ้าไม่มี control file จะ startup database ได้แค่ NOMOUNT mode ดังนั้น Oracle จึงแนะนำว่าควรทำ Multiplex Control files ทั้งหมด 3 file และแต่ละตัวควรอยู่คนละ disk กัน ซึ่งตรงนี้ถ้าใช้ DBCA เป็นตัว create database จะสร้าง control file ให้ทั้งหมด 3 file

การทำ Multiplex Control Files ต้องทำ 2 ขั้นตอนคือ
  • ทำในระดับ Database เข้าไปแก้ไข parameter CONTROL_FILE (static parameter) ต้อง shutdown ก่อนจึงจะเห็นผล
    ex. CONTROL_FILES=’’,’’
  • ทำในระดับ OS เริ่มแรกให้ shutdown database ก่อนจากนั้นเข้าไป copy control file ที่ใช้งานอยู่ปัจจุบัน แล้วไปวางใน path ที่ระบุไว้ใน parameter แล้วเปลี่ยนชื่อให้ตรงกับค่าใน paramter ด้วย จากนั้น startup database แล้วเข้าตรวจสอบความถูกต้อง โดยดูได้จาก view V$CONTROLFILE
  • ข้อดีของการทำ Multiplex Control Files คือถ้ามี Control File ตัวใดตัวหนึ่งเสียหายไปอีกตัวสามารถทำงานแทนกันได้โดย Database จะไปอ่าน Control File ที่ยังใช้งานได้อยู่จาก paramter CONTROL_FILES
Redo Log Files
เป็น file ที่เก็บข้อมูลที่เปลี่ยนแปลง โดยจะมี background process log writer (LGWR) ทำหน้าที่เขียน redo log file ให้ก่อนที่จะเขียนลงใน redo log file จะมี memory ตัวนึงที่เก็บข้อมูลที่เปลี่ยนแปลงอยู่เรียกว่า redo log buffer และจะเขียนลงใน redo log เมื่อมีคำสั่ง commit หรือเหตุการณ์อื่นๆ
โครงสร้างของ redo log จะเป็น group ในแต่ละ group จะมี redo log file เป็น member ถ้าใช้ DBCA เป็นตัว create database จะสร้าง redo log group ให้ 3 group และ redo log file ให้ group ละ 1 file ซึ่งเป็นค่า default ของ DBCA แต่อย่างนี้ยังไม่เป็น Multiplex redo log file จะเป็น Multiplex redo log file ก็ต่อเมื่อในแต่ละ redo log group มีมากกว่า 1 redo log file และถ้าให้ดีแต่ละ member ควรจะแยกอยู่กันคนละ disk
ข้อดีของการทำ Multiplex Redo Log File คือ ถ้า member ใดใน group นั้นเสียหายไป Database ก็ยังทำงานได้อยู่เพราะยังมี member อีกตัวทำงานแทนกันได้ และถ้าให้ดี member ที่อยู่ใน group
Note: ถ้าใช้ DBCA สร้าง database จะมี mulitplex control file แต่ไม่มี multiplex redo log file

Archived Log Files
เป็น file ที่เก็บ copy ของ redo log file ก่อนที่ LGWR จะเขียนทับลงใน redo log file path ที่เก็บ archive log file โดย default จะเก็บอยู่ที่ตำแหน่งเดียวกับ flash recovery area ดูได้จาก parameter DB_RECOVERY_FILE_DEST ตำแหน่งที่ 10
เราสามารถกำหนด path ของ archive log file เพิ่มเติมได้ นอกจากจะเก็บลงใน default path ยังสามารถกำหนดได้เองอีก 9 path จาก parameter LOG_ARCHIVE_DEST_<1-10>=""เท่ากับเป็นการ copy archive log file เพิ่มขึ้นเหมือนเป็นการ backup ซึ่งกันและกัน วิธีนี้จะมีประโยชน์ในกรณีที่ archive log file default ใช้งานไม่ได้ database จะย้ายไปใช้อีก path ให้
โดย default archive log file จะมีก็ต่อเมื่อเรา enable archivelog mode แต่ค่า default จะเป็น disable

การตรวจว่า database ขณะนี้ run อยู่ใน mode อะไร
SQL> select archiver from v$instance;
--ถ้าค่าคือ STARTED=archivedlog mode หรือ STOPPED=noarchivedlog mode
หรือ
SQL> select name, log_mode FROM v$database;
หรือ
SQL>ARCHIVE LOG LIST; --ถ้าอยู่ใน archivedlog mode จะแสดงรายละเอียดออกมา
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 18
Next log sequence to archive 20
Current log sequence 20

การเปลี่ยน mode database ให้เป็น archivelog mode หรือ noarchivelog mode
SQL > shutdown
SQL > startup mount
SQL > ALTER DATABASE [ARCHIVELOG | NOARCHIVELOG]
SQL > ALTER DATABASE OPEN;

ถ้าสงสัยตรงไหนหรืออยากให้เพิ่มตรงไหนบอกได้ครับ
สำหรับตอนนี้ขอจบไว้เพียงแค่นี้ครับ ตอนหน้าเทคนิคเน้นๆทำ backup ให้เห็นกันจะๆครับ

บทความที่เกี่ยวข้อง

Credit by tofu
ข้อเขียนนี้ช่วยฉัน:  

Wednesday, November 25, 2009

Profit Magazine หนังสือดีๆ แจกฟรีๆ จาก Oracle

หลังจากที่เราได้เชยชม Oracle Magazine ไปแล้วในตอนที่แล้ว คราวนี้ถึงตา หนังสืออีกเล่มนึง ซึ่งน่าสนใจไม่แพ้กันกับ Oracle Magazine เลยค่ะ
ส่วนใครที่พลาดตอนที่แล้ว และอยากได้ Oracle Magazine มาครอบครอง คลิกที่นี่เพื่อไปสมัคร Oracle Magazine กันก่อนก็ได้คะ
เรามาเข้าเรื่องกันดีกว่า...
Profit Magazine หนังสือสำหรับการบริหาร Oracle Application อย่างมืออาชีพ!
ซึ่งนิตยสารเล่มนี้ จะออกทุกๆ 4 เดือน โดยผู้บริหารหรือผู้นำธุรกิจจะได้รับความรู้ต่างๆ ที่ช่วยในการบริหาร หรือช่วยในการตัดสินใจ ในการลงทุนทางด้านเทคโนโลยี, บทความ, กลยุทธ์, และ เทคโนโลยีต่างๆ ที่น่าสนใจก็รวมอยู่ในนิตสารเล่มนี้ด้วย ถือได้ว่าเป็นหนังสือที่น่าสนใจไม่ใช่น้อยเลยทีเดียว

ดูรายละเอียดเพิ่มเติมได้ที่นี่ Profit Magazine

ขั้นตอนการสมัคร Profit Magazine

1. เข้าไปที่เว็บ Profit Magazine เพื่อสมัครสมาชิก

Go to Subscribe
1.1 คลิกเลือกที่ "I want a new subcription" เพื่อสมัครใหม่
1.2 กดปุ่ม Continue เพื่อไปหน้าต่อไป

Click to subscribe
2. หน้านี้จะให้กรอกข้อมูลเกี่ยวกับ ประวัติส่วนตัว , ที่อยู่, และข้อมูลของบริษัท
แต่ในการกรอกเอกสารนี้ ต้องกรอกที่อยู่จริง เพื่อที่ทาง Oracle จะได้ส่งเอกสารให้คุณได้ถูกต้อง และอย่าลืมใส่ Email ที่ถูกต้อง

2.1 คลิกเลือกที่ "Yes! I wish to receive/continue to receive PROFIT MAGAZINE FREE!"

2.2 ใส่ข้อมูลต่างๆให้ครบถ้วน อย่าลืม ใส่ที่อยู่จริงนะคะ


2.3 ในช่องนี้ ถ้าคุณต้องการรับข่าวสารเกี่ยวกับ Oracle หรือ โปรโมชั่นต่างๆ ให้ ติ๊กถูกที่ช่องนี้ แต่ถ้าไม่ต้องการรับ ไม่ต้องติ๊กค่ะ

2.4 ถ้าคุณไม่ต้องการแชร์รายชื่ออีเมลล์ กับทาง Oracle ให้ติ๊กถูกค่ะ


2.5 ใส่ข้อมูลต่างๆ เกี่ยวกับความสนใจของเรา และ ข้อมูลของบริษัท เมื่อใส่เสร็จ ให้ลงมากดปุ่ม Submit ด้านล่างเลยค่ะ


3. ถึงตอนนี้ ถือว่าคุณได้สมัคร Profit Magazine เป็นที่เรียบร้อย แล้วอีกซัก 6-8 อาทิตย์ Profit Magazine ก็จะส่งตรงมาถึงบ้านคุณเลยค่ะ



หรือ ถ้าไม่อยากรอนาน ลองเข้ามาอ่านแบบ Online กันก่อน ที่นี่เลยค่ะ Profit Magazine Online

ขอให้สนุกกับการอ่าน Profit Magazine นะคะ
ข้อเขียนนี้ช่วยฉัน:  

Monday, November 2, 2009

ส่งเมล์ง่าย ๆ ด้วย PL/SQL โดยใช้ UTL_MAIL

utl_mail package เป็น feature ที่มีเพิ่มเข้ามาตั้งแต่ oracle database version 10g เป็นต้นไป
จุดเด่นที่สำคัญของมัน คือ ทำให้การส่ง email สะดวกและง่ายมากขึ้น จาก version ก่อนที่ใช้ utl_smtp และ utl_tcp ซึ่งการเรียกใช้ค่อนข้างยุ่งยาก

โดยปกติ utl_mail package ยังไม่สามารถใช้งานได้ทันที หลังจากการติดตั้ง oracle database จำเป็นที่จะต้องติดตั้งเพิ่ม โดยมีขั้นตอน ดังต่อไปนี้
  • ติดต่อเชื่อมต่อ oracle database ด้วย sys
  • $ sqlplus sys/manager1@db as sysdba
  • run ORACLE_HOME/rdbms/admin/utlmail.sql
  • SQL>@ORACLE_HOME/rdbms/admin/utlmail.sql
  • grant สิทธิ์ให้กับ user ที่จะใช้ utl_mail package
  • SQL>grant execute to test_app;
เท่านี้ ก็จะสามารถใช้งาน utl_mail package ได้แล้ว ต่อไปเราจะมาดูรายละเอียดของ utl_mail กัน

ภายใน utl_mail package จะประกอบไปด้วย 3 procedure ดังนี้

1. send ใช้สำหรับส่ง email ทั่วไป โดยไม่ได้มีการแนบไฟล์
utl_mail.send(
sender        IN    VARCHAR2 CHARACTER SET ANY_CS,
recipients    IN    VARCHAR2 CHARACTER SET ANY_CS,
cc            IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
bcc           IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
subject       IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
message       IN    VARCHAR2 CHARACTER SET ANY_CS,
mime_type     IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT 'text/plain;charset=us-ascii',
priority      IN    PLS_INTEGER DEFAULT 3);
ตัวอย่าง
begin
execute immediate 'ALTER SESSION SET smtp_out_server = 'localhost';';
UTL_MAIL.send('test1@test.com',
'test2@test.com',
null,
null,
'Hello Send',
'Hello,How are you?',
'text; charset=us-ascii',
null);
end;
ใีนการอ้างอิง File ใน utl_file package เราจะต้องสร้าง
directory เพื่อ อ้างอิง location หรือ path ดังนี้
SQL>CREATE DIRECTORY d_file_path AS '/file/';

SQL>GRANT READ,WRITE ON DIRECTORY d_file_path TO test_app;

2. send_attach_raw ใช้สำหรับส่ง email ที่มีการแนบไฟล์
utl_mail.send_attach_raw (
sender  IN    VARCHAR2 CHARACTER SET ANY_CS,
recipients      IN    VARCHAR2 CHARACTER SET ANY_CS,
cc              IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
bcc             IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
subject         IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
message         IN    VARCHAR2 CHARACTER SET       ANY_CS DEFAULT NULL,
mime_type       IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT 'text/plain;charset=us-ascii',
priority        IN    PLS_INTEGER DEFAULT 3,
attachment      IN    RAW,
att_inline      IN    BOOLEAN DEFAULT TRUE,
att_mime_type   IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT 'text/plain; charset=us-ascii',
att_filename    IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL);
ตัวอย่าง
declare
v_file  utl_file.file_type;
v_raw_file RAW(32767);
v_file_length NUMBER;
v_block_size NUMBER;
v_exist  BOOLEAN;
v_location VARCHAR2(50):='d_file_path';
v_file_name VARCHAR2(50):='test.pdf';
begin
execute immediate 'ALTER SESSION SET smtp_out_server = 'localhost';';

utl_file.fgetattr(v_location,v_file_name,v_exist,v_file_length,v_block_size);
v_file:=utl_file.fopen(v_location,v_file_name,'R');
utl_file.get_raw(v_file,v_raw_file,v_file_length);
utl_file.fclose(v_file);

utl_mail.send_attach_raw('test1@test.com',
'test2@test.com',
null,
null,
'Hello Send Attach Raw',
'Hello,How are you?',
'text; charset=us-ascii',
null,
v_raw_file,
FALSE,
'text; charset=us-ascii',
v_file_name);
end;

3. send_attach_varchar2 ใช้สำหรับส่ง email ที่มีการแนบไฟล์ที่เป็น text

utl_mail.send_attach_varchar2(
sender         IN    VARCHAR2 CHARACTER SET ANY_CS,
recipients     IN    VARCHAR2 CHARACTER SET ANY_CS,
cc             IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
bcc            IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
subject        IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
message        IN    VARCHAR2 CHARACTER SET       ANY_CS DEFAULT NULL,
mime_type      IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT 'text/plain;charset=us-ascii',
priority       IN    PLS_INTEGER DEFAULT 3,
attachment     IN    VARCHAR2 CHARACTER SET ANY_CS,
att_inline     IN    BOOLEAN DEFAULT TRUE,
att_mime_type   IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT 'text/plain; charset=us-ascii,
att_filename    IN    VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL);
ตัวอย่าง
declare
v_file  utl_file.file_type;
v_raw_file RAW(32767);
v_file_length NUMBER;
v_block_size NUMBER;
v_exist  BOOLEAN;
v_location VARCHAR2(50):='d_file_path';
v_file_name VARCHAR2(50):='test.txt';
begin
execute immediate 'ALTER SESSION SET smtp_out_server = 'localhost';';

utl_file.fgetattr(v_location,v_file_name,v_exist,v_file_length,v_block_size);
v_file:=utl_file.fopen(v_location,v_file_name,'R');
utl_file.get_raw(v_file,v_raw_file,v_file_length);
utl_file.fclose(v_file);

utl_mail.send_attach_varchar2('test1@test.com',
'test2@test.com',
null,
null,
'Hello Send Attach Varchar2',
'Hello,How are you?',
'text; charset=us-ascii',
null,
v_raw_file,
FALSE,
'text; charset=us-ascii',
v_file_name);
end;
ข้อเขียนนี้ช่วยฉัน:  

Thursday, October 29, 2009

Real-Time Monitoring SQL กับ Database Control

Feature อีกอันที่ออกมาใหม่พร้อมกับ Oracle Database 11g Release 2 ใน Enterprise Manager คือ Real-Time SQL Monitoring ซึ่งโดยทั่วไป ใน 11g ก็สามารถทำ Real-Time SQL Monitor ได้อยู่แล้ว โดยใช้คำสั่ง

V $ SQL_MONITOR

และ

V $ SQL_PLAN_MONITOR

แต่สำหรับใน Enterprise Manage ของ 11gR2 นี้ มี GUI ที่เราสามารถทำการ Mornitor ได้โดยไม่ต้องพิมพ์ command

เราจะลองยกตัวอย่างสาธิตให้ดู โดย...สมมุติว่าเราต้องการ สร้างตารางการขาย ขนาดใหญ่ (560 M) เพื่อ Select statement ซึ่งกินเวลามากกว่า 30 วินาที

ขั้นแรก เราไปที่ Performance page > Top Activity ตามปรกติ
Real-Time Monitoring SQL - Step1Statement จะมี run หลายครั้งก่อนหน้านี้ ทำให้จะมีตัวเลขมีสถิติแสดงไว้ด้านหลัง

เราสามารถเห็นเวลาในการ run ได้ พร้อมกับในขณะที่ Statement มีการ run อยู่ (20 วินาที) ตามรูปด้านล่าง
Real-Time Monitoring SQL - Step2หลังจากที่ statement ทำการ run เสร็จเรียบร้อยแล้ว ก็จะแสดงดังภาพข้างล่างนี้
Real-Time Monitoring SQL - Step3แค่นี้ ก็จะทำให้ เราสามารถรู้ระยะเวลาในการ run real time ได้อย่างง่ายดาย

อ้างอิง

ข้อเขียนนี้ช่วยฉัน:  

Wednesday, October 21, 2009

การทำ Auto Startup Database, Listener และ Enterprise Manager

ปกติเมื่อทำการ Install Database นั้น เมื่อทำการ Boot OS จะไม่ได้มีการตั้งให้ Auto Startup แต่เราสามารถตั้งค่าให้มีการ Auto Startup ได้ โดยทำตามขั้นตอนต่างๆดังต่อไปนี้
  1. ขั้นแรก ทำการเข้าสู่ระบบด้วย User Root
  2. จากนั้น แก้ไขไฟล์ Oratab ซึ่งอยู่ใน /etc/oratab โดยแก้ไขที่บรรทัดล่างสุด จาก N ให้เปลี่ยนเป็น Y จะเป็นการกำหนดให้ Database มีค่า Default เป็น Auto Startup

    ORCL:/oracle/db11201:Y
  3. ทำการสร้าง Script ชื่อ oracle ไว้ที่ /etc/init.d ดังนี้
  4. #!/bin/bash
    # Initial file for auto starting and stopping database
    
    # Source function library.
    
    . /etc/rc.d/init.d/functions
    
    ORACLE_OWNER=”oracle”
    ORACLE_HOME=”/oracle/db11201″
    
    case “$1″ in
    start)
    echo -n $”Starting Oracle DB:”
    su – $ORACLE_OWNER -c “$ORACLE_HOME/bin/dbstart $ORACLE_HOME”
    echo “OK”
    ;;
    stop)
    echo -n $”Stopping Oracle DB:”
    su – $ORACLE_OWNER -c “$ORACLE_HOME/bin/dbshut $ORACLE_HOME”
    echo “OK”
    ;;
    *)
    echo $”Usage: $0 {start|stop}”
    esac
  5. ทำการ Add ให้ Oracle เข้าไปอยู่ใน Startup Process โดยใช้คำสั่งต่อไปนี้
  6. chmod 750 oracle
    
    chkconfig --add oracle
  7. เสร็จสิ้นการทำให้ฐานข้อมูลมีการ Auto Startup เมื่อทำการ Boot OS
  8. ถ้าต้องการให้มีการ Auto Startup Listener ก็ให้ทำการสร้าง Script ชื่อ Listener ไว้ที่ /etc/init.d เช่นเดิมดังนี้
  9. #!/bin/bash
    #
    # Initial file for auto starting and stopping Listener
    
    # Source function library.
    
    . /etc/rc.d/init.d/functions
    
    ORACLE_OWNER=”oracle”
    ORACLE_HOME=”/oracle/db11201″
    
    case “$1″ in
    start)
    echo -n $”Starting Oracle Listener:”
    su – $ORACLE_OWNER -c “$ORACLE_HOME/bin/lsnrctl start”
    echo “OK”
    ;;
    stop)
    echo -n $”Stopping Oracle Listener:”
    su – $ORACLE_OWNER -c “$ORACLE_HOME/bin/lsnrctl stop”
    echo “OK”
    ;;
    *)
    echo $”Usage: $0 {start|stop}”
    esac
  10. จากนั้น ทำการ Add ให้ Listener เข้าไปอยู่ใน Startup Process โดยใช้คำสั่ง
  11. chmod 750 Listener
    
    chkconfig --add Listener
  12. ถ้าต้องการให้มีการ Auto Startup Enterprise Manager ก็ให้ทำการสร้าง Script ชื่อ EM ไว้ที่ /etc/init.d เช่นเดิมดังนี้
  13. #!/bin/bash
    #
    # Initial file for auto starting and stopping Enterprise Manager
    
    # Source function library.
    
    . /etc/rc.d/init.d/functions
    
    ORACLE_OWNER=”oracle”
    ORACLE_HOME=”/oracle/db11201″
    
    case “$1″ in
    start)
    echo -n $”Starting Oracle EM DB Console:”
    su – $ORACLE_OWNER -c “$ORACLE_HOME/bin/emctl start dbconsole”
    echo “OK”
    ;;
    stop)
    echo -n $”Stopping Oracle EM DB Console:”
    su – $ORACLE_OWNER -c “$ORACLE_HOME/bin/emctl stop dbconsole”
    echo “OK”
    ;;
    *)
    echo $”Usage: $0 {start|stop}”
    esac
  14. และ ทำการ Add ให้ EM เข้าไปอยู่ใน Startup Process โดยใช้คำสั่ง
  15. chmod 750 EM
    
    chkconfig --add EM
เพียงเท่านี้ เมื่อเรา Install Database เมื่อไหร่ OS เราก็จะทำการ Startup ให้โดยอัตโนมัติ
ข้อเขียนนี้ช่วยฉัน:  

Monday, October 19, 2009

Annotation Part#3 (Final)

บทความสุดท้ายนี้ เราจะกล่าวถึง 3 ตัวที่เหลือ ก็คือ Default Value, Single Value Annotation, และ Marker Annotation ครับ

Default Value
บางครั้ง element ใน annotation เราสามารถกำหนดค่าเริ่มต้นให้กับ element ได้โดยใช้คำสงวนว่า default แล้วตามด้วยค่าที่ต้องการให้เป็นค่าเริ่มต้นของ element ดังตัวอย่างด้านล่าง
 () default "Default" ; 
เราลองไปดูในตัวอย่างใน file CTest.java โดยในนี้จะมีการประกาศ element ให้มีค่าเริ่มต้นไว้ทั้งหมด
@Retention(RetentionPolicy.RUNTIME)
@interface Author  {
String name() default "John Rambo" ;
String email() default "john@rambo.com";
}
จากนั้นลอง run ดูตามใน code ตัวอย่าง


Single Value Annotation
ในบางครั้งที่ annotation ของเรามี element แค่เพียง element เดียว ทำให้เราก็ไม่อยากจะมากำกับชื่อของ element ดัง เช่น @Author สังเกตได้ว่ามีเพียงแค่ element เดียวก็จริงแต่เวลาที่เราเรียกใช้นั้นเรายังต้องระบุชื่อในการกำหนด element
@Author( name = "John Rambo" )
แต่เราจะเรียกแบบไม่ระบุชื่อแบบตัวอย่างด้านล่างนี้ไม่ได้
@Author("John Rambo")
การที่เรามี element แค่เพียง element เดียว และเราต้องการที่จะไม่ต้องใส่ชื่อของ element ในตอนใช้ annotation เราต้องประกาศ element ที่มีชื่อว่า value
String value();
จากนั้นเราลองไปดูในตัวอย่างกัน
@Retention(RetentionPolicy.RUNTIME)
@interface Author {
String value();
}
จากนั้นเราลองเรียกใช้ดู
@Author("John Rambo")
class D { }

class DTest {
public static void main(String args[]) {
Author a = D.class.getAnnotation(Author.class);
System.out.println(a.value());
}
}
สังเกตเวลาเราเอาค่าออกมานั้นก็ยังใช้วิธีเหมือนเดิม

NOTE
ลองดูว่าเราสามารถประกาศ element value ปนกับ element อื่นได้ไหม ถ้าได้เราจะยังสามารถประกาศ Annotation แบบที่ไม่ต้องระบุชื่อ element ได้อีกไหม (คำตอบคือได้**แต่ต้องระบุค่า element อื่นให้มีค่าเป็น default ด้วย**)


Marker Annotation
เป็น annotation ที่ไม่มี element อะไรทั้งสิ้น โดยที่มีไว้เหมือนเป็นจุดมุ่งหมายเพื่อทำการ mark ยกตัวอย่างเช่น
// ETest.java   Marker
@Retention(RetentionPolicy.RUNTIME)
@interface John{ }

@Retention(RetentionPolicy.RUNTIME)
@interface Jack{ }

@John
class A {
@Jack
public void f() { }
}
ในตัวอย่างนี้มี @John และ @Jack ซึ่งเป็น annotation ที่ไว้ใช้ประกาศว่าใครเป็นผู้สร้าง source code อะไรซึ่งคล้ายกับ @Author เพียงแต่การต้องระบุ element name ลงไปเพื่อเป็นการแยกว่าเป็นใคร แต่ Mark Annotation นั้นใช้ annotation เป็นตัวแยกเลย ซึ่งวิธีการใช้ก็จะแตกต่างกันนิดหน่อย
class ETest {
public static void main(String args[]) throws Exception {
System.out.println(A.class.isAnnotationPresent(John.class));
System.out.println(A.class.isAnnotationPresent(Jack.class));

Method m = A.class.getMethod("f");
System.out.println(m.isAnnotationPresent(John.class));
System.out.println(m.isAnnotationPresent(Jack.class));
}
}
ของเดิมเราจะเอาค่าของ element ใน annotation มาใช้แต่ในของ Mark Annotation นั้นเราเอา annotation มาใช้เปรียบเทียบดังใน code ตัวอย่าง


Reference from : dr. Werasak Suengtaworn

Compose by : @plaumkamon
ข้อเขียนนี้ช่วยฉัน: