ปัญหาการเชื่อมต่อฐานข้อมูล Oracle ไม่ได้ เนื่องจาก Listener

สำหรับผู้ดูแลระบบที่เคยทำงานดูแลฐานข้อมูล Oracle คงเคยเจอกับปัญหาการเชื่อมต่อไปยังฐานข้อมูลไม่ได้ ซึ่งเมื่อไล่เรียงหาสาเหตุแล้ว ก็มีมากมายหลายสาเหตุด้วยกัน เช่น ปัญหาที่ตัวฐานข้อมูลเอง หรือ ปัญหาทางด้านระบบเครือข่าย ฯลฯ ซึ่งในบทความนี้จะเล่าถึงประสบการณ์ที่ได้พบเจอปัญหานี้เช่นกัน โดยสาเหตุนั้นเกี่ยวกับตัว Listener เหตุการณ์ที่เกิดขึ้นช่วงที่พบปัญหา ได้รับแจ้งจากผู้ใช้ว่าไม่สามารถเข้าใช้งานระบบได้  ซึ่งเมื่อได้รับแจ้งจึงทำการตรวจสอบและพบว่าปัญหาเกิดจากการที่ระบบไม่สามารถเชื่อมต่อไปยังฐานข้อมูลที่พัฒนาด้วย Oracle ได้ โดยที่ระบบเครือข่ายยังใช้งานได้ปกติ ดังนั้นสิ่งที่ทำต่อมาคือการตรวจสอบเฉพาะฐานข้อมูลว่าเกิดปัญหาอะไรขึ้น โดยสิ่งที่ทำคือ ทดลองเชื่อมต่อผ่าน SQL Developer ซึ่งเป็นเครื่องมือหนึ่งที่ใช้สำหรับบริหารจัดการฐานข้อมูล Oracle ผลลัพธ์คือ ไม่สามารถเชื่อมต่อได้ โดยมีข้อความแจ้งเตือนว่า socket timeout ทดลองเชื่อมต่อผ่าน Enterprise Manager ซึ่งเป็นเครื่องมือสำหรับบริหารจัดการฐานข้อมูลอีกตัวซึ่งได้ติดตั้งมาพร้อมกับตอนที่สร้างฐานข้อมูล  ซึ่งก็ไม่สามารถเชื่อมต่อได้เช่นกัน และได้ลองสั่ง Startup DB ฐานข้อมูล จากเครื่องมือตัวนี้ อาการผิดปกติก็ยังคงเหมือนเดิม ทดลองเชื่อมต่อผ่าน ผ่าน SQL Plus ซึ่งใช้งานผ่าน command prompt  ปราฏว่าสามารถเชื่อมต่อได้ ใช้คำสั่ง expdp เพื่อ dump ข้อมูลมาสำรองไว้ก่อน  สามารถทำได้เช่นกัน แสดงว่าตัวฐานข้อมูลยังสามารถเข้าถึงได้อยู่ จึงพุ่งประเด็นไปที่ Listener เพราะเป็นตัวกลางที่จัดการให้ระบบหรือเครื่องมือภายนอกสามารถเชื่อมต่อมายังฐานข้อมูลได้ ทดลอง config Listener ใหม่ ด้วยเครื่องมือ Net Configuration Assistant พบว่าใช้เวลาตั้งค่านานมาก แต่ก็สามารถ config ได้ ลอง restart Listener และ Windows แล้ว อาการยังเหมือนเดิม ใช้คำสั่งบน command prompt ที่เกี่ยวกับ Listener ได้แก่ lsnrctl และ tnsping เพื่อตรวจสอบ Listener และ TNS พบว่าใช้เวลานานมาก จึงสันนิษฐานว่า อาจจะเป็นปัญหาที่ Listener แน่นอน เพราะยังเข้าถึงฐานข้อมูลผ่านช่องทางบางช่องทางได้ การแก้ไขปัญหา เมื่อได้ข้อมูลจากการตรวจสอบแล้ว ว่ามีปัญหาจาก Listener จึงได้ค้นข้อมูลใน internet เกี่ยวกับการเชื่อมต่อ Listener ที่ใช้เวลานาน พบว่ามีผู้แนะนำให้ตรวจสอบที่ไฟล์ listener.log ใน \app\Administrator\diag\tnslsnr\Win-User\listener\trace (ตัวอย่างนี้จะเป็น path ที่เป็น oracle 11) ***หมายเหตุ โฟลเดอร์ Win-User เป็นโฟลเดอร์ที่ต้ังตามชื่อ user ใน Windows ถ้าขนาดไฟล์ถึง 4 GB จะมีปัญหาได้ ให้ทำการหยุด service ของ Listener แล้ว rename ชื่อไฟล์ listener.log  ใหม่ เมื่อ start listener แล้ว ไฟล์ listener.log ก็จะถูกสร้างมาใหม่ เมื่อได้ทำการตรวจสอบพบว่าไฟล์มีขนาด 4 GB จริง และได้ทำการแก้ไขตามวิธีที่มีการแนะนำ พบว่าสามารถเชื่อมต่อกับฐานข้อมูล Oracle ได้เป็นปกติ สำหรับกรณีศึกษาที่มีผู้นำเสนอไว้สามารถเข้าดูได้ผ่าน URL https://vjdba.wordpress.com/2013/09/24/93/

Read More »

การสร้างฟอร์มกรอกข้อมูลใน Word

เราอาจจะสร้างฟอร์มเพื่อส่งให้ผู้อื่นกรอกเอกสาร ตามฟอร์มที่เราออกแบบไว้ โดยจะต้องไปเรียกใช้ Develper ที่แถบ Ribbon โดยไปที่เมนู File –> Options –> Customize Ribbon เลือก Develper ดังรูป จะเห็นว่ามีแถบ Developer ปรากฏอยู่ เรามาเริ่มสร้างฟอร์มกัน ในที่นี้จะสร้างฟอร์มเล็ก ๆ ดังรูป จากนั้นคลิกแถบ Developer แต่ละ Control ที่จะนำมาใช้ แต่ละตัวทำหน้าที่อะไรบ้าง หมายเลข 1 เป็นข้อความที่สามารถจัดรูปแบบได้ หมายเลข 2 เป็นข้อความที่กรอกอิสระ หมายเลข 3 เป็นการแทรกรูปภาพ หมายเลข 4 เป็นฟิลด์รายการที่มีตัวเลือก สามารถเลือกได้ หมายเลข 5 เป็นการแทรกฟิลด์แบบมีตัวเลือก เช่นเดียวกับหมายเลข 4 หมายเลข 6 เป็นรูปแบบวันที่ให้เลือก   จากนั้นเมื่อเรารู้จักหน้าที่ของแต่ละ Control แล้ว เราก็เลือกใช้ให้ตรงกับความต้องการ โดยในส่วนของตำแหน่ง เราจะใช้ Combo box เมื่อคลิก Combo box  1 ครั้งให้ไปเลือกที่ Properties จากนั้นจะปรากฏดังรูป เมื่อเรียบร้อยแล้วจะได้ดังรูป เพื่อป้องกันการแก้ไขข้อความหัวข้อ คือให้กรอกได้เฉพาะข้อมูลที่มีช่องให้กรอกเท่านั้น โดยไปที่แถบ Developer –> Restrict Editing จะแสดงดังรูป จากนั้นที่ข้อ 2 ให้ติ๊กเลือกและกำหนดเป็น Filling in forms เพื่อป้องกันการแก้ไขข้อความ แล้วคลิกปุ่ม “Yes, Start Enforcing Protection” จะแสดง Dialog ดังรูป ระบุ Password ที่จะใช้ป้องกันการแก้ไขข้อความ จากนั้นคลกปุ่ม “OK” จากนั้นลองไปคลิกที่หัวข้อจะไม่สามารถแก้ไขข้อความได้ จะแก้ไข/กรอกได้เฉพาะที่ให้กรอกข้อมูลนั้น            

Read More »
PHP Code snippets

เขียน PHP ใน wordpress

สิ่งที่ต้องมี ไซต์ wordpress และ user ที่สามารถติดตั้งและใช้งาน Plugins ได้ ส่วนใหญ่คือ user ที่มีสิทธิ administrator ติดตั้ง Plugins ชื่อ PHP Code snippets (จริง ๆ Plugins ที่ทำหน้าที่นี้มีหลายตัว แต่ใช้ตัวนี้มานานแล้ว) แล้วเปิดการใช้งานให้เรียบร้อย เมื่อติดตั้งและเปิดใช้แล้วจะมีเมนู PHP snippets ปรากฏขึ้นที่แถบด้านซ้ายมือ เมื่อคลิกที่ PHP snippets จะได้ดังรูป (แต่อันนี้จะมี code ของผู้เขียนอยู่แล้วสาม code) คลิก Add snippet เพื่อสร้าง code ใส่ชื่อ code ในช่องแรก และใส่ code PHP ในช่องที่สอง คลิก Where there is a shortcode เพื่อให้ code ทำงานเฉพาะหน้าที่มีการระบุ  shortcode แต่หากต้องการให้ code นี้ทำงานทุกหน้าสามารถคลิกที่ Run everywhere และสามารถเขียนคำอธิบายได้ในช่อง  Description คลิก Publish เพื่อเปิดการใช้งาน code คลิก snippet เพื่อดูสถานะ ถ้าได้ดังรูปแปลว่า code ถูกเปิดใช้งานแล้ว ถ้าต้องการปิดไม่ให้ code ทำงานสามารถคลิกปุ่ม Deactivate ได้ วิธีเรียกใช้งานให้สร้าง Pages หรือ Posts แล้วนำ shortcode ไปใส่ไว้ shortcode สามารถดูได้ในช่อง  Where use? ตัวอย่าง จาก code นี้ถ้าเรียกหน้า https://licensing.psu.ac.th/login โดย user ที่ยังไม่ login จะ redirect ไปหน้า login ก่อน จบขอให้สนุก  

Read More »

Download multiple files as Zip Archive (Compressed) file in ASP.Net MVC

ในบทความนี้จะขอกล่าวถึงการ  download file ครั้งละหลายๆไฟล์ โดยมีการระบุว่าต้องการ   download file ใดบ้าง โดย  ผู้ใช้สามารถกดเลือกได้ทั้งละหลายๆไฟล์ หรือไฟล์เดียว แล้วแต่ความต้องการของผู้ใช้งาน โดยหลังจากที่มีการกดปุ่มแล้วระบบจะทำการ zip ไฟล์รวมเป็น 1 ไฟล์ โดยในบทความนี้จะขอเสนอวิธีการพัฒนาโดยใช้ ASP.NET  ในรูปแบบ MVC ค่ะ     ในส่วนของ java script function DownloadFiles() { var items = []; $(“input:checkbox[name=chkThis]:checked”).each(function () { items.push($(this).val());   });   if (items.length <= 0) { alert(‘กรุณาเลือกข้อมูลที่ต้องการ Download ด้วยค่ะ/ครับ!!’); } else { $.ajax({ type: ‘POST’, contentType: ‘application/json; charset=utf-8’, url: ‘@Url.Action(“DownloadAndZipFile”, “NoteUpload”)’, data: JSON.stringify({ fileItemsAll: items }), success: function (resultDownload) { //window.location = ‘/NoteUpload/Download?fileGuid=’ + resultDownload.FileGuid //                   + ‘&filename=’ + resultDownload.FileName; window.location = ‘/NoteUpload/Download?fileGuid=’ + resultDownload.FileGuid; }, error: function (data) { alert(data); } }); } //   return items; } ในส่วนของ controller public ActionResult DownloadAndZipFile(IEnumerable<int> fileItemsAll) { if (!(ViewBag.IsAuthorized = (azResult = azService.Authorize(AccountingOperation.NoteUploadReader, this).Result).IsAuthorize)) { Danger(string.Format(“ไม่มีสิทธิ์ใช้งานในส่วนนี้: {0} ({1})”, azResult.Operation.OP_NAME, Convert.ToString(azResult.OperationEnum))); return View(); }   string handle = Guid.NewGuid().ToString(); MemoryStream output = new MemoryStream();   var zipMs = new MemoryStream(); string strZipName = “Accounting” + DateTime.Now.ToString(“yyyyMMdd”);   TempData[handle] = fileItemsAll;   var resultDownload = new { FileGuid = handle, FileName = strZipName + “.zip” }; return this.Json(resultDownload, JsonRequestBehavior.AllowGet); }   public FileResult Download(string fileGuid) { if (!(ViewBag.IsAuthorized = (azResult = azService.Authorize(AccountingOperation.NoteUploadReader, this).Result).IsAuthorize)) { Danger(string.Format(“ไม่มีสิทธิ์ใช้งานในส่วนนี้: {0} ({1})”, azResult.Operation.OP_NAME, Convert.ToString(azResult.OperationEnum))); return null; }   var zipMs = new MemoryStream(); string zipFisYear, zipPeriod, fileC, FileF, FileFinance,

Read More »

การบริหารโครงการโดยใช้เครื่องมือ Team Foundation Server (Phase 4 : การวางแผนงาน)

จาก บทความ “การบริหารโครงการโดยใช้เครื่องมือ Team Foundation Server (Phase 3 : ขั้นตอนการคัดเลือกความต้องการ และความหมายของ State)” ทำให้เราทราบแล้วว่าในรอบการพัฒนา (Sprint) เราจะต้องดำเนินการตามความต้องการ หรือ Backlog item ใดบ้างแล้วนั้น ต่อไปเราจะมาดูเรื่องการกำหนดทรัพยากรบุคคล และมอบหมายงานต่อไป ขั้นตอนการกำหนดทรัพยากรบุคคล ที่จะมาทำโครงการ เป็นขั้นตอนของการสร้าง Team และการเลือกคนเข้ามาอยู่ในทีมนั้นเอง ซึ่งแต่ละโครงการทีมงานอาจจะเป็นคนละคนกันได้ ในการสร้าง Team และกำหนดบุคลากร สามารถดำเนินการได้ตามขั้นตอนดังนี้ จาก TFS เลือก หมายเลข 1 ตามรูปที่ 1 รูปที่ 1 ทำการสร้าง Team โดยทำตามขั้นตอนตามรูปที่ 2 รูปที่ 2 จะปรากฎหน้าจอ เพื่อให้ใส่ข้อมูลรายละเอียดต่างๆ เกี่ยวกับข้อมูล Team ที่จะสร้าง ดังรูปที่ 3 รูปที่ 3 โดย หมายเลข 1 คือ ชื่อของ Team ที่ต้องการเพิ่ม หมายเลข 2 รายละเอียดเพิ่มเติม เกี่ยวกับ Team หมายเลข 3 ประเภทของการตั้ง Team เพื่อจุดประสงค์ ใด โดย TFS มีให้เลือก ดังรูปที่ 4 รูปที่ 4 เมื่อเราได้ Team แล้ว เราจะมา Add สมาชิก หรือทรัพยากรบุคคล ใน Team ที่สร้าง โดยทำตามขั้นตอน ในรูปที่ 5 รูปที่ 5 จะปรากฎหน้าจอ ดังรูปที่ 6 จากนั้น จะทำการ Add Members หรือสมาชิกในทีม โดยทำตามขั้นตอน ข้อ 1 ในรูปที่ 6 รูปที่ 6 จะปรากฎหน้าจอ เพื่อให้การพิมพ์ชื่อ เพื่อจะ Add Member ดังรูปที่ 7 โดยสามารถ ได้ ทีละหลายๆ คน และทำการ Save changes เพียงครั้งเดียว รูปที่ 7 จากขั้นตอนนี้ เราจะได้สมาชิกในทีมที่จะมาดำเนินการโครงการ หรือทรัพยากรบุคคลที่จะมาทำให้โครงการสำเร็จนั่นเอง ขั้นตอนการกำหนดงานย่อย (Tasks) และมอบหมายงาน จากบทความก่อนหน้า นั้น เราได้มีการสร้างรอบการพัฒนา ที่เรียกว่า Sprint ไว้แล้ว และได้ตกลงกับผู้ใช้เพื่อเลือกความต้องการ หรือ Backlog items ที่จะทำให้แล้วเสร็จในรอบการพัฒนาที่สร้างไว้ ซึ่งจะทำให้เห็นว่ามีความต้องการอะไรบ้างที่จะต้องทำให้เสร็จ จากนี้ Project Manager จะต้องทำการแตกงาน หรือ Task ลงไปว่าในแต่ละ Backlog item แต่ละตัวนั้น จะมีงานย่อย หรือ Task อะไร บ้าง ซึ่ง Project Manager จะต้องวางแผนไว้ และสามารถมาบันทึกใน TFS ได้ ดังขั้นตอนต่อไปนี้   จาก TFS เลือกโครงการที่ต้องการสร้าง Task ย่อย ตามหมายเลข 1 รูปที่ 8 รูปที่ 8 คลิกเลือก ตามรูปที่ 9 เพื่อไปสู่การบันทึก Task รูปที่ 9 เมื่อทำตามขั้นตอนข้างต้น ทำการเลือก Sprint และ Backlog ในขั้นตอนที่ 1 และ 2 ของรูปที่ 10 จะได้หน้าจอเหมือนรูปที่ 10 รูปที่

Read More »