Config send email from oracle database server

ORA-24247: network access denied by access control list (ACL)

Kiểm tra bằng cách chạy câu lệnh

select * from dba_network_acls;

Nếu có data dạng:

 HOST LOWER_PORT UPPER_PORT ACL  ACLID
 mail.vstv.vn    1   1024    /sys/acls/send_mail.xml D285E04B69B942688587AB8FE5B41C69 

Chạy câu lệnh này:

BEGIN
   DBMS_NETWORK_ACL_ADMIN.create_acl (
     acl          => 'send_mail.xml',
     description  => 'Purpose of the acl is to send mail',
     principal    => 'INTRANET',
     is_grant     => TRUE,
     privilege    => 'connect',
     start_date   => SYSTIMESTAMP,
     end_date     => NULL);
 DBMS_NETWORK_ACL_ADMIN.assign_acl (
     acl         => 'send_mail.xml',
     host        => 'mail.trituenhantao.info',
     lower_port  => 1,
     upper_port  => 1024);
 COMMIT;
 END;

Unlock user Workspace Administrator on Apex

Bên mình làm hệ thống báo cáo bằng Apex. Khi muốn tạo hoặc sửa báo cáo phải vào trang quản trị ứng dụng với tài khoản:
DB: XXX
User: ADMIN1
Pass: Abcd1234
Hôm nay vào vì bị lock do nhiều lần nhập sai mật khẩu.

Địa chỉ để vào quản trị ứng dụng là http://111.111.111.111:7778/apex/
Địa chỉ để vào ứng dụng là: http://111.111.111.111:7778/apex/f?p=104:LOGIN:11636406781643:::::

Ứng dụng vẫn vào được bình thường nhưng phần quản trị ứng dụng bị báo lock user.

Các bước để unlock:
B1: Vào CMD gõ lần lượt các lệnh sau:

sqlplus /nolog
connect /as sysdba
alter session set current_schema = APEX_050100;
commit;
UPDATE Apex_050100.Wwv_Flow_Fnd_User

SET Web_Password = 'Abcd1234'

WHERE User_Name = 'ADMIN'

AND Security_Group_Id = 10;

COMMIT; 
begin
wwv_flow_security.g_security_group_id := 10;
wwv_flow_fnd_user_api.UNLOCK_ACCOUNT('ADMIN');
commit;
end;

Nếu cmd không tự ngắt để enter lệnh thì gõ / và nhấn Enter.

B2: Sửa trên ứng dụng

Địa chỉ quản trị Workspace: http://111.111.111.111:7778/apex/f?p=4550:10:13666886988498::NO:::
Đăng nhập với tài khoản: ADMIN / Abcd1234

Bấm vào Manage Workspaces.
Chọn Manage Developers and Users trong mục Workspace Actions
Chọn User cần Unlock, ở đây là ADMIN1
Tìm đến mục Account Availability. Chọn Unlocked.

Thế là xong, chỉ cần vào lại trang quản trị ứng dụng và nhập thông tin cũ là được.

Một chiến lược đảm bảo an toàn dữ liệu

Hiện mình đang làm cho một công ty X về việc cung cấp dịch vụ cho khách hàng. Hệ thống lưu trữ thông tin khách hàng bao gồm nhiều thứ như họ tên, số điện thoại email, thời hạn dịch vụ, lịch sử thanh toán…

Như các bạn đã biết, dữ liệu về khách hàng của công ty là cực kỳ quan trọng. Bài toán đảm bảo an toàn dữ liệu khách như vấn đề bảo mật, tránh mất mát dữ liệu, đảm bảo hệ thống luôn sẵn sàng… là những bài toán lớn cần được giải quyết. Qua tìm hiểu hệ thống và cóp nhặt trên mạng, mình nốt lại một số thông tin về lý do và cách thức việc đảm bảo an toàn dữ liệu.

Dữ liệu thì được nằm trên cơ sở dữ liệu, từ đó các ứng dụng truy cập vào hệ thống để thực hiện các thao tác xem, thêm, sửa xóa dữ liệu. Cơ sở dữ liệu luôn phải được đảm bảo sống, nghĩa là bất kỳ lúc nào cũng có thể truy vấn được. Tuy nhiên, không phải lúc nào hệ thống cũng ổn định, có thể lỗi ở phía server(phần cứng), lỗi ở phía hệ điều hành, lỗi ở phía hệ quản trị cơ sở dữ liệu…

Sau đây mình liệt kê các mức của hệ thống:

Tính sẵn sàng của hệ thống

Hiện tại hệ thống bên mình chỉ có duy nhất một DB đang Active. Hàng giờ hệ thống liên tục đồng bộ sang 2 DB ở chế độ Standby. Chỉ khi nào xảy ra sự cố đặc biệt nghiêm trọng, DB đang Active nguy cơ không thể hồi phục trong thời gian dài thì 1 trong 2 DB này mới được bật lên ở chế độ Active. Như vậy tính rủi ro khá cao.
Ở công ty Y cũ mình thì sử dụng cơ chế 3 Node DB để đảm bảo tính sẵn sàng của hệ thống. Nghĩa là hệ thống luôn luôn có 3 DB đều ở chế độ Active, sử dụng công nghệ RAC của Oracle. Khi 1 DB (1 Node) gặp trục trặc thì hệ thống vẫn hoạt động được bình thường. Tuy nhiên khả năng Failover của hệ thống thì mình không dám chắc (Failover là khái niệm về việc giao dịch đang xử lý ở Node lỗi có tiếp tục được xử lý ở Node khác không).

Đảm bảo an toàn dữ liệu

Mô hình hệ thống Active – Standby thì sau một khoảng thời gian cần phải cập nhật thông tin từ con Active sang con Standby sử dụng công nghệ Archive log của Oracle để copy các sự thay đổi sang con Standby. Hiện tại có 2 con Standby, một con nằm cùng Data Center với con Active, một con Standby nằm ở một Data Center khác.

  • Đối với việc lỗi phần cứng của con Active, trong thời gian ngắn không khắc phục được thì con Standby cùng Data Center sẽ được bật lên để tiếp tục đảm bảo dịch vụ.
  • Đối với việc lỗi cả Data Center về phần cứng, hạ tầng mạng… thì buộc phải bật con Standby ở Data Center khác.

Theo khuyến cáo thì các Data Center đặt dữ liệu của hệ thống nên đặt xa nhau hàng trăm KM. Việc này đề phòng các thiên tai có thể xảy đến trên một vùng lớn. Ví dụ bão đổ vào Miền Bắc, cụ thể là Hà Nội. Trường hợp các Data Center ở Hà Nội đều hỏng hết thì khi đó Data Center nằm ở Bình Dương hoặc TP Hồ Chí Minh phát huy tác dụng. Không những việc đảm bảo dịch vụ mà còn đảm bảo về tính toàn vẹn của dữ liệu.
Đối với công ty lớn, dịch vụ có thể là khu vực và toàn cầu thì việc đặt dữ liệu tại Data Center thứ cấp có thể phải đặt ở nước khác hoặc châu lục khác. Việc này đảm bảo khi có chiến tranh hoặc sự tấn công lên tầm quốc gia.

Đây là hiểu biết của mình ở thời điểm hiện tại. Sau mình cần tìm hiểu rõ hơn về các khái niệm: High Availability, Cluster, Network Load Balancer, Failover

Kết nối Python với MariaDB trên Anaconda

Trong nhiệm vụ crawl dữ liệu cho những dự án linh tinh của mình, việc cần thiết là phải lưu trữ lại các dữ liệu trong một hệ quản trị cơ sở dữ liệu nào đó, mình đã chọn MariaDB để làm điều này.
Vì việc lựa chọn Python trên Anaconda để thực hiện nên mình cần một hệ quản trị cơ sở dữ liệu nào đó vừa nhẹ, dễ sử dụng và quen thuộc. Đối với SQL Server và Oracle thì quá quen thuộc nhưng phải cài đặt nó mất rất nhiều thời gian mà không cần thiết vì nó hơi to so với dự án của mình. Với lại Oracle thì mình cũng đã kết nối được với Python rồi. Sử dụng No SQL thì mình đã từng sử dụng Nodejs kết nối với MongoDB thì thực sự mình không ưa cái anh MongoDB này lắm vì thấy cũng hơi phức tạp.
Cái tên quen thuộc nữa là MySQL, ban đầu định dùng nó nhưng đúng là lúc đó đang gặp vấn đề về việc cài đặt Xampp và Wampp lên máy tính ở nhà (do xung đột một số cổng của các phần mềm khác như Skype…). Với có thông tin rằng MySQL dần dần không còn là nguồn mở nữa, anh bạn Oracle đã mua lại và không còn được hào phóng như cộng đồng nguồn mở nữa. Cho nên cái nên MariaDB là lựa chọn cuối cùng của mình.

  • MariaDB là một phiên bản khác của MySQL và được cộng đồng nguồn mở dần chuyển qua để thay thế cho MySQL ngày càng đóng lại.
    Để cài đặt MariaDB thì khá đơn giản, hoàn toàn có thể cài đặt được ở máy tính cá nhân và trên server. Các bạn có thể vào địa chỉ: https://mariadb.com/downloads/#mariadb_platform-mariadb_server để tải về và cào đặt dễ dàng (chỉ cần next thôi).
  • Trong gói này mặc định có một GUID để thao tác các câu lệnh trên đó là HeidiSQL. Ta có thể sử dụng nó để thực hiện các truy vấn cơ bản tới cơ sở dữ liệu MySQL hoặc MariaDB.

Về phần DB là xong, để kết nối từ Python tới MariaDB ta cần sử dụng một thư viện để thực hiện kết nối và thực hiện các câu lệnh như Select, Insert, Update, Delete. Vì MariaDB là một phiên bản được fork từ MySQL nên ta có thể sử dụng thư viện mysql-connector.

Trên Anaconda ta có 2 cách để cài đặt thư viện là:

  1. Vào mục Environments, tìm gói đã được Anaconda tập hợp vừa tương thích Python và tương thích với các thư viện khác.
  2. Nếu cách trên không được do một lỗi nào đó hoặc Anaconda chưa hỗ trợ thì ta có thể cài đặt thực tiếp thông qua dòng lệnh. Có thể tham khảo thông qua hướng dẫn: https://enterprise-docs.anaconda.com/en/latest/data-science-workflows/data/mariadb.html

Khi mọi thứ done ta có thể sử dụng đoạn lệnh sau để test kết nối.

import pandas as pd
 import numpy as np
 import matplotlib.pyplot as plt
 import seaborn as sns
 %matplotlib inline
 from urllib.request import urlopen
 from bs4 import BeautifulSoup
 #
 import MySQLdb
 db = MySQLdb.connect(host="127.0.0.1", port=2017, user="root", passwd="test", db="test")
 c = db.cursor()
 a1="https://trituenhantao.info/posts"
 c.execute("SELECT url FROM test")
 d=c.fetchall()
 a2=0
 for url in d:
     #if url.startswith('http://trituenhantao.info'):
         a2=a2+1
         print(f'{a2} URL: {url}')
         print(url)
 print(c.fetchone())

Xóa dấu Tiếng Việt

Trong quá trình làm việc với Oracle trên Toad, mình hay lưu các câu lệnh SQL ra file SQL hoặc biên dịch các package, procedure có chứa các đoạn text có dấu Unicode – cụ thể là Tiếng Việt có dấu. Nhưng mình hay thấy sau khi load file SQL lại lên thì toàn bộ dấu Tiếng Việt bị lỗi, tự nó chuyển sang dấu hỏi. Việc này gây cho mình nhiều lúc bực mình vì bị lỗi hết đoạn text không đọc được, có thể do mình chưa config Toad để có thể phù hợp với Tiếng Việt.

Bình thường mình hay xử lý bằng cách làm thủ công bằng tay chuyển các đoạn text có dấu thành Tiếng Việt không dấu hoặc viết bằng Tiếng Anh. Nhưng như thế là không thuận lợi, mình không thích thế.

Tiện thể mình đang có 1 cái webtool bằng .NET tạo ra các tính năng dành riêng cho mình xử lý các công việc thường ngày. Mình liền xây dựng một tính năng nho nhỏ chuyển 1 đoạn text Tiếng Việt có dấu thành đoạn text Tiếng Việt không dấu.
Tính năng này rất đơn giản, chỉ có 2 ô textbox ở chế độ Multiline và một nút bấm. Nút bấm sẽ tiến hành việc xử lý lấy đoạn text ở textbox 1 tiến hành convert thành không dấu và chuyển sang ô textbox 2.

Mình tách thành một hàm riêng để xử lý như sau:

public static string RemoveUnicode(string text)
         {
             string[] arr1 = new string[] { "á", "à", "ả", "ã", "ạ", "â", "ấ", "ầ", "ẩ", "ẫ", "ậ", "ă", "ắ", "ằ", "ẳ", "ẵ", "ặ",
         "đ",
         "é","è","ẻ","ẽ","ẹ","ê","ế","ề","ể","ễ","ệ",
         "í","ì","ỉ","ĩ","ị",
         "ó","ò","ỏ","õ","ọ","ô","ố","ồ","ổ","ỗ","ộ","ơ","ớ","ờ","ở","ỡ","ợ",
         "ú","ù","ủ","ũ","ụ","ư","ứ","ừ","ử","ữ","ự",
         "ý","ỳ","ỷ","ỹ","ỵ",};
             string[] arr2 = new string[] { "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a",
         "d",
         "e","e","e","e","e","e","e","e","e","e","e",
         "i","i","i","i","i",
         "o","o","o","o","o","o","o","o","o","o","o","o","o","o","o","o","o",
         "u","u","u","u","u","u","u","u","u","u","u",
         "y","y","y","y","y",};
             for (int i = 0; i < arr1.Length; i++)
             {
                 text = text.Replace(arr1[i], arr2[i]);
                 text = text.Replace(arr1[i].ToUpper(), arr2[i].ToUpper());
             }
             return text;
         }

Build lên thế là xong. Mình có thể triển khai ở các ngôn ngữ lập trình khác nhau một cách tương tự.

MySQL 1045 – Access denied for user

Mấy hôm nay cần cài wordpress ở máy tính cá nhân của mình để triển tool crawl dữ liệu. Các hạng mục crawl dữ liệu khá ok rồi, bây giờ mình muốn dựng wordpress để hiển thị thành quả. Mục tiêu là clone một trang web trong vòng 1 nốt nhạc và còn phương án cập nhật dữ liệu hàng ngày nữa.

Ở công ty cài anh bạn Wampserver cũng khá là suôn sẻ, tất nhiên phải đổi một số port mặc định cho apache, mysql… vì đã bị trùng cổng các phần mềm khác. Nhưng tới máy nhà mình thì cài Wampserver thì bị thiếu file dll gì đó, đành chuyển sang anh bạn Xampp mình biết từ lâu rồi.

Nhưng cũng chưa yên, cài xong thì bị trùng cổng của anh bạn Skype, đành phải gỡ Skype. Thế nhưng vẫn dính lỗi 1045 – Access denied for user, đổi sang cổng khác cổng 3306 thì MySQL đã chạy nhưng phpMyadmin lại lỗi vì không kết nối được. Mặc dù thử vài cách trên mạng nhưng vẫn không ăn thua. Mãi mới tìm thấy một cách xử lý mà mình đã nghi ngờ đó là sửa port trong file config của phpMyadmin.

Địa chỉ file config: C:\xampp\phpMyAdmin\config.inc.php

Thêm port cho nó: :3309

/* Bind to the localhost ipv4 address and tcp */
$cfg[‘Servers’][$i][‘host’] = ‘127.0.0.1:3309’;

Thế là xong, mặc định pass root của MySQL vẫn trống.

Quản lý tài khoản đặc quyền với CyberArk

Hôm nay đối tác CyberArk giới thiệu và đào tạo công ty mình chuẩn bị sử dụng CyberArk để quản lý tài khoản đặc quyền. Theo mình hiểu CyberArk cung cấp một giải pháp quản lý và bảo mật hạ tầng CNTT của doanh nghiệp nói chung. Bao gồm các thiết bị phần cứng, hạ tầng mạng, các server (vật lý và ảo hóa), các data center, cơ sở dữ liệu…

Trước đây đối với các công ty mà mình từng làm việc quản lý server khá thủ công. Mặc dù một số nơi có sử LDAP để quản trị user nhưng đối với mỗi server thì đều phải tự cài đặt và quản trị riêng cho nó. Đội ngũ phần cứng nắm giữ một user admin có quyền cao nhất và riêng biệt. Sau đó trưởng mỗi server sẽ được cung cấp một user admin cũng có quyền cao nhất sau đó là các nhân viên khác có quyền thấp hơn. Như vậy đối với mỗi server việc quản lý sẽ độc lập, từng người dùng phải server và tài khoản của mình. Như mình một lúc quản lý dưới chục server đã rất hay bị quên và thường xuyên phải dùng chung một mật khẩu duy nhất. Biết là thiếu tính bảo mật nhưng không còn cách nào khác, lưu ra một nơi riêng cũng không an toàn. Lưu trạng thái đăng nhập thì lại càng không an toàn nữa. Nói chung là khá bất cập.

Hơn nữa với việc quản lý cũ việc tra lại lịch sử thao tác tới server là hoàn toàn bất khả thi. Việc truy xuất thời gian đăng nhập đã là khó khăn, việc xem người dùng làm những gì thì hầu như không thể nào biết được.

CyberArk là giải pháp hữu hiệu có thể đáp ứng hầu như hoàn toàn cách quản lý trên. CyberArk được cài đặt trên ít nhất 1 server để có thể quản lý các tài khoản đặc quyền riêng. Mặc dù mới chỉ được giới thiệu và đào tạo nhưng mình có thể thấy được một số ưu nhược điểm như sau:

  • CyberArk được cài đặt trên server riêng và bán licensen theo số lượng user của hệ thống để thực hiện thao các trên các server.
  • Người dùng CyberArk có thể được cung cấp tài khoản riêng biệt hoặc sử dụng LDAP để xác thực như xác thực email, xác thực vào máy tính cá nhân, xác thực wifi công ty…
  • Từ CyberArk người dùng không phải nhớ bất kỳ IP cũng như tài khoản server nào. Tất cả sẽ được hiển thị hết trong danh sách các server được phép sử dụng.
  • CyberArk không chỉ quản trị server mà còn quản trị được nhiều các phần mềm khác nhau. CyberArk có tác dụng như là một server trung gian, phần mềm trung gian. Người dùng qua đó xác thực và sử dụng như trên chính thiết bị của mình.
  • Ví dụ remote hoặc SSH vào server thì nó đứng ở trung gian xác thực mình. Mình chỉ cần bấm vào là remote được luôn, không cần gõ mật khẩu hoặc tài khoản gì cả.
  • Ví dụ connect phần mềm quản trị Database Oracle là Toad. Bình thường máy cá nhân mình phải cài Toad để kết nối tới Oracle. Khi dùng CyberArk thì trên server cài CyberArk cũng phải cài Toad. Khi mình đăng nhập vào CyberArk, tìm đến phần Toad thì mình chỉ cần chọn, CyberArk sẽ tự động mở Toad ở máy mình, xác thực qua đó là mình đã có thể sử dụng được.
  • CyberArk tiến hành quay lại màn hình toàn bộ các thao tác của người dùng tác động lên server. Vì là đi qua nó nên nó bắt được toàn bộ các sự kiện click, các cửa sổ được mở, các lệnh được gõ vào server. Nó lưu lại vừa dưới dạng file text vừa dưới dạng video để người quản trị cao hơn có thể xem lại.
  • Vì nó có thể ghi nhận được các thao tác nên nó hoàn toàn có thể can thiệp được những lệnh, thao tác nguy hiểm hoặc không được phép lên hệ thống. Nó có thể quyết định không thực thi hoặc kết thúc phiên làm việc ngay lập tức.
  • Đối với các server đặc biệt, nó còn có tính năng yêu cầu quyền truy cập để cấp trên có thể phê duyệt thời gian vào để làm việc. Việc này rất tốt để lên kế hoạch bảo trì hoặc nâng cấp hệ thống.
  • Mặc dù test qua nhưng có một số vấn đề mà nó chưa thể xử lý được ngay cần phải check lại:
    — Đối với Linux, công việc thường ngày khi SSH vào hệ thống thì thường xuyên phải thay đổi vai trò lúc thì user thường lúc thì user root. Hiện tại nó không cho phép sự thay đổi này. Nhưng họ nó có 1 add-on cho phép làm việc này nên để nó test trước và thông tin lại.
    — Đối với Window, mỗi user thường tạo ra các schedule thực hiện các công việc khác nhau. Việc đổi pass liên tục sau mỗi phiên sẽ gây các schedule không thực hiện được cũng như những người khác muốn sửa sẽ rất khó khăn. Nó sẽ check lại giải pháp.
    — Đối với cả Linux và Window, nếu người dùng run một bath hoặc crontab, schedule thực thi các lệnh nguy hiểm thì CyberArk cũng không phát hiện và ngăn chặn được. CyberArk chỉ phát hiện được khi người dùng gõ hoặc dùng chuột. Cái này thì là hạn chế, nó không thể có giải pháp được.

Tất nhiên sâu, chi tiết và thực tế thì cần tìm hiểu và sử dụng thêm. Những cái này chỉ mà mới nhận định ban đầu sau một buổi nghe giới thiệu và đào tạo(chưa được thực hành).

Nhìn chung là khá tiên tiến, mặc dù nó lưu vết và quản trị rất khắt khe gây cảm giác khó chịu và luôn bị soi mói thao tác. Nhưng buộc phải chấp nhận thôi nhất là đối với các server product cần phải làm vậy để quy trách nhiệm cũng như đảm bảo an toàn hệ thống. Các công ty vừa và lớn nên mua và sử dụng vì nó cũng nằm một phần trong tiêu chuẩn ISO.

Quản lý phiên bản database với LiquiBase

Việc quản lý phiên bản đối với code đã xuất hiện từ rất lâu và đã có rất nhiều các phần mềm dành cho nó. Theo mình biết và đã từng sử dụng đó là

  • SVN (tiếp cận khá nhiều, coi như đầu tiên, khá cũ và có một số nhược điểm nhưng dễ dùng, phù hợp với các dự án về C#)
  • GIT (cái này khá tiên tiến, mạnh mẽ, càng ngày càng nhiều người dùng, Gitlab, GitHub…)
  • Source Safe (Visual Source Safe) được mua và tiếp tục phát triển bới Microsoft. Cái này mình mới nghe qua chứ chưa dùng bao giờ.

Đó là với code, thế với database thì như thế nào? Trước đây đúng là thuộc dạng 5 mức ngu dốt luôn. Đồng nghiệp hỏi làm mình đứng hình vì còn chưa bao giờ nghĩ đến nó cơ. Tìm hiểu thêm thì biết đúng là nó có tồn tại nhưng còn rất sơ khai. Mặc dù rất quan trọng nhưng lại rất sơ khai do tính đặc thù và khó khăn của nó.

Đại loại là trong quá trình phát triển phần mềm, nhiều phiên bản được nâng cấp và cải thiện, những thay đổi nhỏ thì chỉ cần sửa code nhưng với những thay đổi lớn thì có thể phải sửa cả việc thiết kế cơ sở dữ liệu. Để quản lý việc sửa đổi này thì ta cũng phải có công cụ tương đương như việc quản lý version của code.

Trước đây công ty cũ mình mua phần mềm nước ngoài thì khi nâng cấp nó sẽ gửi cho mình bản code nó đã build. Còn về phần mềm nó sẽ vứt do một loại các kettel Pentaho để chạy theo tuần tự để nâng cấp version cho Database, gọi với cái tên mỹ miều là Migrate dữ liệu.

Tìm hiểu qua thì mình thấy 3 cái tên được nhắc đến nhiều là:

  • SQL Server Data Tools: Cái này của Microsoft, mới nghe qua tên thôi, chắc chỉ support cho SQL Server
  • Flyway: Mới nghe đến tên
  • Liquibase: Thằng này hiện công ty mình đang dùng và được nghe nói đến nhiều nhất. Đang dùng nó để thay đổi với Oracle đi kèm là code ứng dụng bằng Java.

Đối với mình thì hiện tại chưa phải dùng đến nó nhưng chắc chắc sẽ tìm hiểu kỹ hơn về vấn đề này. Đặc biệt là đối với Liquibase để xem cách sử dụng với các trường hợp sử dụng nó như thế nào.

Hiện tại đối với mình quản lý thủ công bằng SVN hoặc GIT đó là viết ra các script thay đổi về DB để lưu trữ lại thôi. Phức tạp và cả team, nhiều team dùng thì chưa nghĩ đến.

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.