Archive Log tràn ổ cứng gây dừng Database Oracle

Archived Log Mode là một chế độ của Orace phục vụ việc backup database. Archiver Process chính là process chịu trách nhiệm ghi log file ra file archive để lưu trữ. Ta có thể sử dụng các archive log này để tiến hành restore dữ liệu. Archiver Process chỉ chạy khi database đang được cấu hình chế độ chạy Archived Log Mode.

Hôm vừa hệ thống bên mình gặp tình trạng Database bị stop không rõ nguyên nhân. Qua kiểm tra một hồi thì phát hiện ổ cứng bị đầy do Archived Log sinh ra quá nhiều. Việc Archived Log bị tràn sẽ làm Archiver Process bị lỗi không thể chạy dẫn đến các thao tác mà Database không làm được nên treo cả hệ thống.

Archived Log Mode on Oracle

Sự cố này khá là nghiêm trọng vì nó gây dừng Database. Các hoạt động thực hiện đến nó không thể thực hiện được. Hiện tượng Archived Log bị tràn thỉnh thoảng mới xảy xa nhưng lần này nó phát sinh tới 100GB Archived Log thì đúng là bất thường.

Nguyên nhân gây nên tình trạng này là do 1 job hàng ngày tiến hành xóa và insert một lượng lớn dữ liệu nên Archived Log phát sinh ngày càng nhiều. Vì Archived Log có nhiệm vụ ghi lại toàn bộ sự thay đổi của table nên hàng ngày nó vẫn lưu trữ các thông tin này lại. Mặc dù thực tế dữ liệu đó chỉ có tác dụng nhất thời ghi ra để tiến hành xuất dữ liệu ra file để lưu trữ.

Job này có nhiệm vụ xóa dữ liệu cũ của bảng, tổng hợp lại dữ liệu ở nhiều nguồn rồi insert dữ liệu vào bảng đó để thực hiện 1 số tác vụ tiếp theo.

Cách xử lý để Archived Log không phát sinh nhiều đó là thay vì việc job tiến hành xóa dữ liệu thì tiến hành truncate table. Vì truncate table coi như drop table và create lại, Archived Log không lưu trữ lịch sử thông tin truncate table nên Archived Log phát sinh rất ít.

Để thao tác truncate table thực hiện được trong procedure (gói gọn trong job) ta phải viết lệnh sau:

EXECUTE IMMEDIATE 'TRUNCATE TABLE tablename';

Từ phần này mình để ý từ lâu mà nay mới phát hiện ra. Mình có một table dữ liệu khá lớn tầm 20Gb, dữ liệu được thêm vào liên tục nên ngày càng phình to. Mình sử dụng Toad để xem dữ liệu và thỉnh thoảng xóa bớt dữ liệu đi nhưng sau đó kiểm tra kích thước cũng không bị giảm đi tẹo nào.
Mình đã thử việc xóa dữ liệu đi nhưng kích thước vẫn thế. Chỉ khi sử dụng lệnh truncate table thì kích thước table mới về 0.

Để ý các job tương tự sếp viết thì mình thấy sếp đều dùng câu lệnh truncate để xóa dữ liệu. Đúng là người có kinh nghiệm vẫn cứ khác.

Quản lý testcase bằng Testlink

Nghe mọi người trong team nói tạo Testcase trên Testlink cho phần mềm mới. Mình đành lên mạng search thì biết được thông tin về phần mềm này.

Testlink là phần mềm mã nguồn mở được viết bằng PHP được sử dụng cho việc quản lý việc testcase cho một phần mềm hoặc một hệ thống nào đó. Ta có thể cài đặt về host riêng cho tất cả mọi người trong team dùng.

Nó có khá nhiều tính năng:

  • Tạo Project mới
  • Tạo các Tescase
  • Tạo các user
  • Gán các Testcase cho user
  • User có thể test và phản hồi trạng thái
  • Các báo cáo liên quan

Nhìn chung khá là hay ho, chủ yếu để quản lý testcase mà thôi. Không có tính năng test tự động hay gì đó… Hiện tại đã có nhiều phần mềm test tự động nhưng mình nghe Testlink cũng lâu rồi và thấy khá nhiều người sử dụng nó.

Apex-Oracle: Phân quyền select cho table system

Ứng dụng phê duyệt theo quy trình của mình trên APEX cần thêm tính năng gửi email thông báo tới người nhận thông tin tiếp theo cũng như thông tin phê duyệt hoặc từ chối tới email của người dùng. Mình chỉ việc viết thêm hàm gửi email vào trong mỗi bước phê duyệt hoặc từ chối là xong. Code gửi email được viết bằng PL/SQL trên server Oracle mới đã có sẵn package đã được sử dụng từ trước rồi nhưng khi tiến hành dịch lại trên server này thì lại gặp lỗi thông báo bảng dba_directories không tồn tại. Lỗi này là do table không được phân quyền select trên Oracle.

Thực chất bảng dba_directories này là bảng của hệ thống nhưng với schema đang đăng nhập thì lại không có quyền gì thao tác trên bảng này. Đối với hàm gửi email cần truy cập bảng dba_directories để lấy đường dẫn nên ta phải tiến hành phân quyền select vào bảng dba_directories cho user (hay còn gọi là schema) chạy hàm gửi email này. Bởi vì bảng dba_directories là bảng của hệ thống nên ta phải sử dụng quyền sysdba để tiến hành phân quyền.

Sau đây là các bước phân quyền select cho table

Đối với server database Oracle chạy hệ điều hành Windown thì ta tiến hành các bước sau để phân quyền:

  • Bước 1: Login bằng tài khoản admin vào server database Oracle.
  • Bước 2: Mở cửa sổ command line cmd.exe lên
  • Bước 3: Bật sqlplus với quyền sysdba
    sqlplus “/ as sysdba”
  • Bước 4: Phân quyền select table cho user cần quyền select
    grant select on dba_directories to PKTUY_user;
  • Bước 5: Kết quả sau khi grant được thông báo là:
    Grant succeeded.

Sau khi đã phân quyền xong thì biên dịch lại package không còn bị lỗi nêu trên nữa.

Một số bài viết liên quan đến quản trị hệ thống Oracle:

Cài đặt keras và tensorflow trên CentOS 7

Sử dụng Linux để học ML và AI, ta cần cài đặt thư viện Keras để vọc thử.
nên cài đặt và đặt mặc định Python 3 để sử dụng.

 pip install --upgrade tensorflow
 pip install numpy scipy
 pip install scikit-learn
 pip install pillow
 pip install h5py
 pip install keras

https://www.pyimagesearch.com/2016/11/14/installing-keras-with-tensorflow-backend/

Tiếp theo làm ứng dụng luôn: Sử dụng Keras – Deep learning để phân loại ảnh

Nâng cấp và set mặc định Python 3 cho CentOS 7

Mặc định Python được đặt của CentOS 7 là Python 2.7. Để code ML và AI với keras và tensoflow thì cần dùng Python 3 do vậy ta cần cài đặt Python 3 và đặt mặc định lệnh Python là python 3.

Link chi tiết cách cài đặt: https://cloudvedas.com/solved-install-python-3-in-linux-and-set-it-as-default/

Python matplotlib.pyplot error tkinter not found

Trên CentOS, bình thường khi import thư viện import matplotlib.pyplot as plt thì bị báo lỗi No module named Tkinter.
Mình không thể cài đặt Tkinter nhưng tìm ra các import thư viện matplotlib như sau sẽ không bị lỗi:

import matplotlib
matplotlib.use('agg')
import matplotlib.pyplot as plt

Sử dụng Keras trên Anaconda3 – Deep learning để phân loại ảnh

https://nttuan8.com/bai-7-gioi-thieu-keras-va-bai-toan-phan-loai-anh/
Có code test.

Cách cài đặt Keras trên Anaconda 3- Win 10:

Trong mục Environments chọn All nhập keras và nhấn tìm kiếm.

Tích vào keras, keras-base, keras-applications, keras-preprocessing. Sau đó nhấn Apply để cài đặt.

Tạo file PDF tự động bằng BIRT report bằng command line

Công ty mình có 1 công việc là hàng tháng gửi báo cáo bằng PDF gửi cho từng cửa hàng.
Trước đây việc này người trước xuất thủ công ra 1 file tổng PDF bằng Eclipse sau đó dùng tool để chia file ra và gửi đi bằng tay.
Sau đó mình sử dụng BIRT birt-viewer để xuất cả ra file tổng.
Đợt này mình muốn sử dụng lệnh để xuất thành từng file một để tự động gửi đi, mình có nghiên cứu sử dụng Python để xuất file theo từng mã cửa hàng (link tại đây) nhưng đúng là sử dụng Python khá mềm dẻo nhưng để căn được từng dòng để trình bày cho đẹp hoặc xử lý nhiều page một file rất khó khăn(một số thứ không làm được). Mình đành quay về sử dụng mẫu BIRT report cũ và tìm các xuất file bằng command line. May mắn đã có công cụ BIRT Runtime để chạy.

Sau đây là các bước mình đã làm, mọi người tham khảo nhé:

B1: Tải file nén BIRT Runtime về (địa chỉ tại đây)
B2: Giải nén file vào thư mục thuộc ổ C (đổi tên thư mục cho gọn, không sau sẽ không chạy được vì thằng này biến truyền vào giới hạn số lượng ký tự khá ít)
B3: set biến home cho nó vào thư mục ở B2:
Set BIRT_HOME=C:\birt-runtime
B4: Copy file rptdesign mà mình đã tạo bằng Eclipse vào thư mục: C:\birt-runtime\ReportEngine
B5: Sử dụng command line đi đến vị trí: C:\birt-runtime\ReportEngine
Ta có thể sử dụng luôn câu lệnh sau để gen ra file HuyEVET.pdf đặt ở ổ C thông qua file template HuyEVET.rptdesign.

.\genReport.bat --format PDF --output C:\HuyEVET.pdf .\HuyEVET.rptdesign

Đối với Linux ta cũng có thể làm tương tự nhưng ta chạy file .\genReport.sh

Để xuất file PDF với biến truyền vào mình vẫn chưa làm được, sắp tới làm được mình sẽ cập nhật nhé.

P/S: Nếu file rptdesign có kết nối tới DB oracle thì ta cần thêm thư viện JDBC: ojdbc6-11.2.0.4.jar vào trong thư mục lib: C:\birt-run\ReportEngine\lib

Oracle Cách print in dữ liệu ra console để fix bug

Trong lĩnh vực SQL Developer trên Oracle, ta thường xuyên phải lập trình với function hoặc procedure hoặc đơn giản chạy một script lệnh nào đó. Thỉnh thoảng ta sẽ gặp các bug mà không biết lỗi xử lý ở bước nào. Các nhanh nhất để tìm và fix các bug này là việc ghi log ra console hoặc ghi log vào một bảng nào đó để xem. Mình thì cách đơn giản nhất đó là ghi log ra console.

Rất may trên công cụ Toad for Oracle thì có tính năng DBMS Ouput để ta có thể đọc log mà mình viết bằng câu lệnh DBMS_OUTPUT.PUT_LINE(‘text’). Mặc định trên Toad thì tính năng này bị Disable để tối ưu công cụ. Để bật nó lên ta vào thanh menu ở phía dưới màn hình soạn thảo code, chọn đến tab DBMS Ouput và click vào nút màu đỏ phía dưới. Khi tính năng DBMS Ouput được bật ta sẽ thấy cái nút màu đỏ vừa rồi chuyển sang màu xanh lá cây. Tại đây ta có thể chọn thời gian Toad làm mới để lấy log ra, mặc định là 5s một lần.

Dưới đây là câu lệnh ghi log trong SQL:

var_log VARCHAR(100):= 'log'
DBMS_OUTPUT.PUT_LINE('I got here:'||var_log||' is the new value');