04 February 2020

Dead Connection Detection (CDC) with Expire Time of SQLNET

เมื่อ client เชื่อมต่อกับ Database แล้ว แต่เกิดปัญหาบางอย่างทำให้ client และ server processes ถูก terminate connection เป็นการเชื่อมต่อในระดับ OS
กระบวนการนี้  process ยังคง running บน server และ session ใน Database อาจจะยังไม่ถูก terminate

Dead Connection Detection
จาก http://www.nazmulhuda.info/dead-connection-detection-resource-limits-v-session-v-process-and-os-processes

- เมื่อ client เชื่อมต่อกับ Database แล้ว แต่เกิดปัญหาบางอย่างทำให้ client และ server processes ถูก terminate connection เป็นการเชื่อมต่อในระดับ OS
- กระบวนการนี้  process ยังคง running บน server และ session ใน Database อาจจะยังไม่ถูก terminate
  โดย session จะมี status คือ INACTIVE ใน V$SESSION
  และ process จะเรียกว่า Shadow Process คือ process ที่ไม่ได้ใช้งาน
- ขั้นตอนการทำงาน
1.หากไคลเอนต์ไม่มี respond กลับไปยัง DCD probe packet
2.กระบวนการฝั่งเซิร์ฟเวอร์ถูกทำเครื่องหมายว่าเป็นการเชื่อมต่อที่ไม่ทำงาน (marked as a dead connection)
    3.PMON ทำการ clean up Database processes และ resources
4.client OS processes ถูก terminate
- ตัวอย่างเหตุการณ์ 
- ขณะที่เครื่องของ user เชื่อมต่อ Database โดยเชื่อมต่อเฉยๆ หรือ run query จบแล้ว แต่ยังไม่จบ transaction 
- เกิดเหตุการณ์  CDC
- ถ้า user มีการ reboot หรือปิดเครื่อง โดยไม่ log off หรือ disconnect จาก Database
- ถ้ามีปัญหาจาก network ระหว่าง client กับ server เช่น การ disable ที่ Network Adapter อันที่กำลังใช้ connect เครื่อง Database
- ไม่เกิดเหตุการณ์  CDC
- ถ้าใช้ tool SSH ต่อ OS และเชื่อมต่อ Database ด้วย SQLPlus แล้วทำการ close tool SSH เลย โดยไม่ disconnect จาก SQLPlus ก่อน จะทำให้ transaction ทำการ rollback
- ถ้าเชื่อมต่อ Database ด้วย SQL Developer แล้วทำการ kill process ของ SQL Developer เลย โดยไม่ disconnect ก่อน จะทำให้ transaction ทำการ rollback
- ขณะที่เครื่องของ user เชื่อมต่อ Database โดยกำลัง run query อยู่
- เกิดเหตุการณ์  CDC
- ถ้า user มีการ reboot หรือปิดเครื่อง โดยไม่ log off หรือ disconnect จาก Database
- ถ้ามีปัญหาจาก network ระหว่าง client กับ server เช่น การ disable ที่ Network Adapter อันที่กำลังใช้ connect เครื่อง Database
- ถ้าใช้ tool SSH ต่อ OS และเชื่อมต่อ Database ด้วย SQLPlus แล้วทำการ close tool SSH เลย โดยไม่ disconnect จาก SQLPlus ก่อน
- ถ้าเชื่อมต่อ Database ด้วย SQL Developer แล้วทำการ kill process ของ SQL Developer เลย โดยไม่ disconnect ก่อน
- ถ้าเชื่อมต่อ Database ด้วย SQLPlus แล้วทำการปิดโปรแกรมทันที โดยไม่ disconnect ก่อน
- ไม่เกิดเหตุการณ์  CDC
- จากเหตุการณ์ต่างๆที่ทำให้เกิดเหตุการณ์  CDC ถ้า query ที่ active อยู่ เป็นลักษณะการหยุดรอด้วยการใช้คำสั่ง dbms_lock.sleep(...) (บางครั้งเกิด CDC ได้)
Database Resource Limits
- สามารถจัดการ Database Resource Limits ด้วยวิธีดังนี้
- กำหนด RESOURCE_LIMIT = TRUE ใน  parameter file (spfile หรือ pfile) เมื่อทำการ startup Database
- สร้าง user profile เพื่อใช้กำหนด resource limit และกำหนดให้กับ user ที่ต้องการ
- PMON สามารถจัดการ session ได้เพียงระดับ Database สามารถดูที่ V$SESSION แต่ไม่สามารถจัดการ process ระดับ OS ดูที่ V$PROCESS
      สังเกตุว่า SQLNET ยังคง send packet ได้ตามปกติจนกว่า session จะ logged off
                 เกิดปัญหาบางอย่างตามมา เช่น ระบบปฏิบัติการอาจถูกใช้ resource แบบสิ้นเปลืองให้กับ abandoned processes (โปรเซสที่ถูกละทิ้ง) ที่ไม่ได้ใช้งานแล้ว
      ทำให้ V$PROCESS ยังมี process นั้นอยู่ แต่ใน V$SESSION ไม่มี session นั้นทำงานด้วย
                 วิธีแก้ไขคือต้อง cleanup OS process ด้วย
- ขั้นตอนการทำงาน
ตัวอย่าง IDLE_TIME
1. เมื่อ resource ถูกใช้เกินที่กำหนดใน IDLE_TIME
2. PMON จะ mark status = SNIPED ดูที่ V$SESSION 
3. PMON ทำการ clean up database resources ของ session
4. PMON ทำการ kill session
Resource Manager
- สามารถจัดการ kill session ที่มีการใช้งานเกินค่าที่กำหนดได้
- PMON สามารถจัดการ session ได้เพียงระดับ Database เหมือน Database Resource Limits
- ขั้นตอนการทำงาน
ตัวอย่าง MAX_IDLE_TIME 
1. เมื่อ session มีสถานะ INACTIVE เกินที่กำหนดใน MAX_IDLE_TIME
2. PMON จะ mark status = KILLED ดูที่ V$SESSION 
3. PMON ทำการ clean up database resources ของ session
4. PMON ทำการ kill session
SQLNET
- สามารถจัดการ CDC ได้ โดยกำหนดระยะเวลา ด้วย parameter เหล่านี้
SQLNET.SEND_TIMEOUT
SQLNET.RECV_TIMEOUT
SQLNET.EXPIRE_TIME 
Firewall Configuration ในส่วนของ TCP keep-alive
- สามารถจัดการ CDC ได้ โดยกำหนดระยะเวลา ด้วย parameter เหล่านี้
  ใน Linux
tcp_keepalive_time
tcp_keepalive_intvl
tcp_keepalive_probes