Cũng như Oracle, PostgreSQL có 1 tập tin gọi là control file, chứa các thông tin về cấu hình hoạt động của database, và được sử dụng khi start stop cũng như đảm bảo hoạt động của database.

 

Control file nằm trong thư mục $PGDATA\global với tên pg_control. Đây là binary file.

 

Để xem nội dung của control file, ta sử dụng công cụ pg_controldata

 

 

Control file do hệ thống tự quản lý, nên ta không được có các thao tác can thiệp chỉnh sửa tập tin này, nếu không có thể hệ thống database sẽ không hoạt động được. Và do mô hình cluster, control file này là control file của nguyên hệ thống cluster database, chứ không phải cho riêng mỗi database.

 

Cấu hình log file

 

PostgreSQL mặc định không enable việc ghi log. Trên hệ thống, logger process sẽ không tồn tại. Khi ta start database, log sẽ ghi ra màn hình như thế này

 

 

Bởi vì phương thức ghi log mặc định là dùng phương thức output standard error (stderr) của OS

 

 

Chúng ta có thể chỉ định logfile khi dùng lệnh pg_ctl. Tuy nhiên nên cấu hình việc ghi log sau khi khởi tạo cluster database thì tốt hơn, để ghi lại mọi hoạt động của database, tiện cho việc quản trị.

 

Ta sẽ stop database xuống và cấu hình file postgresql.conf, mục # ERROR REPORTING AND LOGGING, cơ bản có các tham số sau cần quan tâm:

 

log_destination = ‘stderr’

Có các cách ghi log như sau:

  • stderr: default, dùng cách thông báo lỗi của OS, như ở trên là output ra terminal
  • syslog: dùng cơ chế ghi log của hệ thống
  • eventlog: ghi vào Event log nếu chạy trên Windows
  • csvlog: ghi ra file csv

Mặc định là stderr, ta cũng không cần cấu hình lại.

 

logging_collector = on

Enable logger process. Ta set tham số này là on để start logger process khi start cluster database. Logger process sẽ ghi log lại cho chúng ta.

 

log_directory = ‘pg_log’

Đường dẫn thư mục log, mặc định là thư mục pg_log trong $PGDATA

 

log_filename = ‘postgresql-%Y-%m-%d_%H%M%S.log’

Cấu trúc tên log file.

 

log_rotation_age = 1d

Tạo file log mới mỗi ngày

 

log_rotation_size = 10MB

Tạo file log mới khi file log hiện tại quá 10MB

 

client_min_messages = notice

Cấu hình message level sẽ gửi đến cho client. Cấp độ càng thấp thì message càng ít thông tin.

 

log_min_messages = warning

Cấu hình mức độ nội dung khi ghi log lại. Cấp độ càng thấp thì log càng ít thông tin.

 

log_min_error_statement = error

Cấu hình việc ghi lại câu lệnh SQL nếu gây ra lỗi. Nếu muốn tắt có thể set về panic.

 

log_min_duration_statement = -1

Cấu hình ghi lại câu lệnh SQL và thời gian thực thi nếu thực thi lâu hơn 1 khoảng thời gian thiết lập. Nếu set = 0, ghi lại hết tất cả các câu SQL và thời gian thực thi. Nếu set = -1, disable.

 

log_checkpoints = on

Ghi lại hoạt động checkpoint trong database.

 

log_connections = on

Ghi lại thông tin đăng nhập từ client.

 

log_hostname = on

Ghi lại cả hostname trong thông tin log, bình thường chỉ ghi lại IP.

 

log_duration = off

Không ghi lại thời gian thực thi câu SQL. Tham số này khác log_min_duration_statement ở chỗ chỉ ghi lại thời gian thực thi, không ghi lại câu SQL.

 

log_line_prefix = ‘time=%t:db=%d;user=%u type=%i’

Thêm 1 số thông tin xác định vào trước thông tin log, chẳng hạn với thiết lập như trên ta sẽ có log như sau

 

time=2013-11-16 20:28:57 IST:db=postgres;user=postgres type=SELECT
LOG: duration: 0.151 ms statement: select now();
time=2013-11-16 20:28:58 IST:db=postgres;user=postgres type=INSERT
LOG: duration: 3.385 ms statement: insert into myt values(1);

 

log_lock_waits = on

Ghi lại thông tin nếu 1 session đang đợi để lấy lock mà thời gian đợi đã lớn hơn deadlock timeout.

 

log_statement = ‘none’

Ghi lại các câu lệnh trong log. Có thể là ‘none‘ -> không ghi lại, ‘ddl‘ -> ghi lại các câu lệnh DDL, ‘mod‘ -> ghi lại các câu lệnh DDL và các câu lệnh thay đổi dữ liệu như Insert, Delete, Update, Truncate…, ‘all‘ -> ghi lại tất cả các câu lệnh thực thi.

 

Cấu hình dọn dẹp logfile

 

Nếu hệ thống hoạt động nhiều, logfile sẽ nhanh chóng gia tăng kích thước. Ngày qua ngày, nếu không dọn dẹp, thư mục này có thể lên đến vài chục GB làm tốn tài nguyên hệ thống.

Để dọn dẹp, ta có thể đặt lịch chạy 1 lệnh trên OS xóa những tập tin log cũ hơn 1 tháng hay 1 tuần chẳng hạn.

 

Còn muốn PostgreSQL dọn dẹp cho ta, có thể cấu hình dựa vào đặc tính filename và truncate on rotation như sau, trong trường hợp muốn giữ lại 1 tuần:

log_filename = ‘server_log.%a’

log_truncate_on_rotation = on

log_rotation_age = 1440 (hay 1d)

 

Ở đây mỗi ngày hệ thống sẽ tạo ra 1 file log có tên là server_log.Mon, server_log.Tue… Sau 1 tuần, khi quay lại định tạo ra file server_log.Mon thì file đã tồn tại, nên sẽ thực hiện truncate file cũ rồi mới tiếp tục ghi log. Ta cũng có thể cấu hình giữ lại logfile theo giờ, theo tháng v.v… dựa trên quy tắc trên.