[Oracle DB] Cấu hình trước khi tăng dung lượng SGA (Memory, shmmax, shmall)

 Chuyện là một ngày đẹp trời tôi có thử tăng tham số SGA (System Global Area) của Oracle DB trên con máy ảo từ 4GB lên 5GB. Và bạn biết điều gì xảy ra không:

- DB không startup lên được vì khi đó dung lượng SGA đã vượt quá dung lượng mà hệ thống cho phép sử dụng (shmmax).

- DB không startup lên được thì cũng không thể điều chỉnh SGA về mức cũ được.

- Chỉnh sửa SPFILE không khả dụng vì FPFILE của Oracle DB là dạng binary, không thể chỉnh sửa bằng trình soạn thảo như vim. Sau khi bị chỉnh sửa, DB sẽ bỏ qua SPFILE đó -> Vẫn không startup được DB.

Vậy chúng ta nên làm gì với một cái DB lab (Chú ý, là lab chứ không phải DB Prod).

Thực ra vì đây là máy lab nên cách giải quyết khá là ngắn gọn:

1. Tăng RAM cho máy ảo để dung lượng SGA nằm gọn trong giới hạn Shareable Memory.

2. Boot DB lên và điều chỉnh SGA cho hợp lí, đảm bảo không vượt quá giới hạn cho phép.

Vậy để đáp ứng việc muốn tăng SGA của Oracle DB từ 4GB lên 5GB thì chúng ta cần làm những gì để không lặp lại sai lầm như trên??

Điều đầu tiên, chúng ta xem lại một chút về tham số trên hệ thống Linux có liên quan:

- kernel.shmmax: Đây là giá trị tối đa của phân đoạn bộ nhớ chia sẻ (Sharedable Memory) mà một tiến trình có thể được phân bổ. Nói chung, giá trị này nên được thiết lập để bằng hoặc cao hơn dung lượng SGA tối đa mà bạn mong muốn cho Oracle DB. Ví dụ, nếu bạn muốn SGA là 5GB, bạn nên cấu hình kernel.shmmax ít nhất là 5GB.

- kernel.shmall: Tham số này định nghĩa tổng số trang bộ nhớ (Pages) chia sẻ mà hệ thống có thể sử dụng. Giá trị của kernel.shmall nên được thiết lập sao cho tổng số trang bộ nhớ chia sẻ không ít hơn tổng dung lượng SGA. Mỗi trang bộ nhớ thường là 4KB trên nhiều hệ thống Linux, vì vậy bạn có thể tính tổng số trang cần thiết bằng cách chia tổng dung lượng SGA cho kích thước trang. Kiểm tra Page size trên hệ thống của bạn thông qua câu lệnh.

getconf PAGE_SIZE

Vậy với nhu cầu như trên (tăng SGA của Oracle DB lên 5GB) ta cần làm việc theo lưu trình sau:

  • 1. Tính toán kernel.shmmaxkernel.shmall:
    •     a. Đối với kernel.shmmax, thiết lập giá trị bằng hoặc lớn hơn 5GB. Trong trường hợp này mình chọn 5.5GB => 5.5 * 1024 * 1024 * 1024 bytes.
5.5 GB = 5.5 * 1024 MB = 5632 MB = 5632 * 1024 KB = 5767168 KB = 5767168 * 1024 bytes
    •     b. Đối với kernel.shmall, giá trị này cần đảm bảo tổng số trang (pages) bộ nhớ chia sẻ không ít hơn tổng dung lượng SGA. Vì vậy, nếu mỗi trang bộ nhớ mặc định của Linux là 4KB, bạn sẽ cần 5.5GB / 4KB pages.
5767168 KB / 4 KB per page = 1441792 pages
  • 2. Cấu hình các giá trị này trong file /etc/sysctl.conf bằng cách sử dụng trình soạn thảo như vim. Sau khi cập nhật, cần chạy lệnh sysctl -p để áp dụng các thay đổi:

vim /etc/sysctl.conf

sysctl -p

Kết quả: Oracle Database khởi động bình thường sau khi điều chỉnh tăng SGA. Hình dưới là ví dụ cho việc tăng SGA từ 5GB lên 5.5GB:
SQL> alter system set sga_max_size=5632M scope=spfile;
System altered.
SQL> alter system set sga_target=5632M scope=spfile;
System altered.
SQL> alter system set pga_aggregate_target=1536M scope=spfile;
System altered.
SQL> shutdown immediate;

Nhận xét

Bài đăng phổ biến