Ở bài viết Các lỗi có thể gặp liên quan đến shared memory, mình có đề cập đến lệnh ipcs của Linux và công cụ sysresv của Oracle để kiểm tra và dọn dẹp shared memory segment. Trong phần này chúng ta sẽ tìm hiểu chi tiết về 2 công cụ trên.

 

Hiện trạng hệ thống: instance database đã start với SGA = 3GBkernel.shmmax = 1073741824

 

Lệnh ipcs

 

Để kiểm tra shared memory segment đã được cấp phát sử dụng trên hệ thống, ta dùng lệnh ipcs với tham số -m

 

 

Ta thấy có các segment được cấp cho root, còn lại được cấp cho oracle. Trong đó có các segment có trạng thái “dest“, tức là các segment này không còn được sử dụng nữa và sẽ được dọn dẹp khi hệ thống thiếu segment để cấp phát. Còn nattch là số process đang sử dụng vùng bộ nhớ đó.

 

Ở phía dưới ta thấy các segment lớn được cấp phát cho oracle và đang được sử dụng

 

 

Đây chính là SGA của chúng ta với dung lượng

(1073741824 + 1073741824 + 33554432 + 1040187392) = 3221225472 bytes = 3GB

 

Trong đó hệ thống cấp phát được 2 segment với kích thước tối đa (1GB), 1GB còn lại phải cấp trên 2 segment nhỏ hơn.

 

Để xem chi tiết về 1 segment, ta có thể xem dựa vào shmid 

 

 

Và nếu muốn tự xử những segment có trạng thái dest, ta có thể dùng lệnh ipcrm

 

[warningbox]Cẩn thận khi sử dụng lệnh này, vì có thể remove nhầm segment đang được sử dụng [/warningbox]

 

Để xem số semaphore đã cấp phát cho oracle, ta dùng lệnh ipcs với tham số -s

 

 

Công cụ sysresv

 

Công cụ này hình như có từ thời Oracle version 8, vậy mà gần đây mình mới biết tới. Đến version 11gR2 vẫn có nhé

 

 

Công cụ này cũng kiểm tra shared memory segment và semaphore oracle đang sử dụng, tuy nhiên thông tin đơn giản hơn

 

 

Thường 1 server ta chỉ chạy 1 instance, nếu chạy nhiều instance, ta có thể dùng tham số -l ORACLE_SID1 ORACLE_SID2 … để liệt kê thông tin cho tất cả các instance.

 

Để dọn dẹp segment khi database bị crash mà hệ thống không dọn dẹp kịp thời, dẫn đến startup bị lỗi, ta có thể dùng tham số -i

 

 

Nếu instance đang chạy, công cụ này sẽ không dọn dẹp các segment để tránh rủi ro

 

 

Như vậy, sử dụng lệnh ipcs để kiểm tra hiện trạng shared memory segment và dùng sysresv để xử lý trong trường hợp shared memory segment của oracle không được giải phóng kịp thời, sẽ hợp lý hơn.