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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
[postgres@postgresql ~]$ pg_controldata $PGDATA pg_control version number: 942 Catalog version number: 201409291 Database system identifier: 6276317622165361024 Database cluster state: in production pg_control last modified: Tue 26 Apr 2016 03:18:55 PM ICT Latest checkpoint location: 0/2096F18 Prior checkpoint location: 0/208FDF8 Latest checkpoint's REDO location: 0/2096F18 Latest checkpoint's REDO WAL file: 000000010000000000000002 Latest checkpoint's TimeLineID: 1 Latest checkpoint's PrevTimeLineID: 1 Latest checkpoint's full_page_writes: on Latest checkpoint's NextXID: 0/1709 Latest checkpoint's NextOID: 24590 Latest checkpoint's NextMultiXactId: 1 Latest checkpoint's NextMultiOffset: 0 Latest checkpoint's oldestXID: 1674 Latest checkpoint's oldestXID's DB: 1 Latest checkpoint's oldestActiveXID: 0 Latest checkpoint's oldestMultiXid: 1 Latest checkpoint's oldestMulti's DB: 1 Time of latest checkpoint: Tue 26 Apr 2016 03:18:54 PM ICT Fake LSN counter for unlogged rels: 0/1 Minimum recovery ending location: 0/0 Min recovery ending loc's timeline: 0 Backup start location: 0/0 Backup end location: 0/0 End-of-backup record required: no Current wal_level setting: archive Current wal_log_hints setting: off Current max_connections setting: 100 Current max_worker_processes setting: 8 Current max_prepared_xacts setting: 0 Current max_locks_per_xact setting: 64 Maximum data alignment: 8 Database block size: 8192 Blocks per segment of large relation: 131072 WAL block size: 8192 Bytes per WAL segment: 16777216 Maximum length of identifiers: 64 Maximum columns in an index: 32 Maximum size of a TOAST chunk: 1996 Size of a large-object chunk: 2048 Date/time type storage: 64-bit integers Float4 argument passing: by value Float8 argument passing: by value Data page checksum version: 0 |
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
1 2 3 4 5 |
[postgres@postgresql ~]$ pg_ctl -D $PGDATA start server starting [postgres@postgresql ~]$ LOG: database system was shut down at 2016-04-26 15:33:20 ICT LOG: database system is ready to accept connections LOG: autovacuum launcher started |
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
1 2 3 4 5 6 |
postgres=# show log_destination; LOG: duration: 0.162 ms statement: show log_destination; log_destination ----------------- stderr (1 row) |
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.
Leave a Reply