Để làm việc với Oracle database thì việc nắm vững kiến trúc của nó cũng khá quan trọng. Oracle đã tạo ra 1 RDBMS thuộc hàng top trên thế giới. Do đó kiến trúc của Oracle database nhìn vào đơn giản nhưng phức tạp, tuy dễ mà khó, nhưng nắm được rồi thì cũng … không quá khó đâu ^^. 

 

Xét 1 server Oracle database cơ bản, chúng ta sẽ có 3 kiến trúc:

  • Kiến trúc bộ nhớ (memory structure)
  • Kiến trúc process (process structure)
  • Kiến trúc về lưu trữ (storage structure)

Trong đó, bộ nhớ và các process sẽ tạo thành instance, phần lưu trữ là database.

 

Instance + database = 1 Oracle database system.

 

Với nonclustered database system, mỗi database sẽ chạy trên 1 instance. Trên 1 server, bạn tạo ra 3 database, thì sẽ có 3 instance, mỗi instance chạy cho 1 database.

Với clustered database system, mỗi database sẽ chạy trên nhiều instance. VD bạn có thể có 3 server cùng chạy 1 database, mỗi server là 1 instance.

 

 

Oracle_architect_overview

 

 

Trong phần 1 này chúng ta sẽ tìm hiểu về kiến trúc bộ nhớ, là kiến trúc cực kỳ quan trọng trong hoạt động của Oracle database.

 

Kiến trúc bộ nhớ của Oracle gồm 2 phần:

System Global Area (SGA): phần bộ nhớ chia sẻ, bao gồm nhiều phần bộ nhớ nhỏ bên trong, chứa thông tin về hoạt động database, thông tin về các session, process, code thực thi, dữ liệu đọc từ phần lưu trữ lên…

Program Global Area (PGA): phần bộ nhớ riêng cho mỗi server process (user session) hay background process.

 

System Global Area (SGA)

 

sga_1

 

SGA là phần bộ nhớ cực kỳ quan trọng trong Oracle instance. SGA chứa các dữ liệu, thông tin hoạt động của database, và được dùng chung cho các server/background processes. 

 

Trong SGA chia ra làm nhiều phần bộ nhớ nhỏ hơn, bao gồm:

Shared Pool

Shared pool

 

Shared pool bao gồm 1 số phần bộ nhớ nhỏ như sau:

Library cache: chứa những câu lệnh SQL, PL/SQL của các user, cũng như parse tree, execution plan của các câu lệnh đ. Do là bộ nhớ chia sẻ, nên có thể chứa các câu lệnh giống nhau của các session, cũng như khi đã có execution plan cho 1 câu lệnh, lần tiếp theo câu lệnh đó được chạy sẽ có execution plan để chạy luôn, tiết kiệm thời gian phân tích.

Data dictionary: chứa các database table của user SYS và SYSTEM, là các table chứa các thông tin về database, cấu trúc database, thông tin về user… để hỗ trợ trong việc thực thi các câu lệnh. Nếu phần này nhỏ, việc đọc thông tin từ data dictionary sẽ tốn thêm I/O, gọi là recursive calls

Server Result Cache: gồm SQL query result cache và PL/SQL function result cache, chứa 1 số kết quả thực thi để có thể dùng lại cho các câu lệnh tương tự. 

 

Database Buffer Cache

sga_2

 

Database buffer cache là phần bộ nhớ để chứa các block dữ liệu đọc từ đĩa lưu trữ lên. Khi 1 session cần dữ liệu, Oracle sẽ kiểm tra có trong Database buffer cache chưa. Nếu có rồi (cache hit), thì đọc luôn trong buffer cache. Nếu chưa có (cache miss), Oracle sẽ phải đọc từ thiết bị lưu trữ lên.

Buffer trong Database buffer cache được quản lý theo thuật toán LRU (Least Recently Used). Những buffer cũ ít xài sẽ được xóa dữ liệu đi để lấy chỗ cho dữ liệu mới cần thiết.

Ngoài Database buffer cache, phần KEEP buffer pool được dùng để chứa những dữ liệu cần sử dụng lâu hơn, phần RECYCLE buffer pool được dùng để chứa những dữ liệu cần xóa nhanh hơn, phần nK buffer cache sẽ dùng để chứa dữ liệu từ những block khác size mặc định (vd 16k, 32k).

 

Redo Log Buffer

Redo Log Buffer

 

Redo log buffer là phần bộ nhớ chứa những thay đổi trên database, do các câu lệnh DML, DDL hay do các hoạt động nội bộ trong database. Khi Redo log buffer đầy 1/3 hoặc cứ sau mỗi 3 giây, Log writer process sẽ ghi vào Redo log files, để lấy chỗ cho những nội dung thay đổi mới.

Do Redo log buffer chứa những thay đổi trên database, nên để đảm bảo toàn vẹn dữ liệu, 1 transaction chỉ được coi là đã commit khi đã ghi những thay đổi trong Redo log buffer vào Redo log files, đảm bảo nếu có sự cố có thể recover được những thay đổi gần nhất.

 

Large Pool

Large Pool

 

Large pool có khả năng cấp phát 1 lượng lớn block buffer, dùng cho các hoạt động lớn trong database, như các transaction liên quan tới nhiều database, các parallel query, backup/restore, các hoạt động I/O của server process, Advanced Queuing memory table…

Large pool không dùng thuật toán LRU để quản lý.

 

Java Pool

Phần bộ nhớ này được dùng để lưu tất cả những code và data Java trong session của user, cũng như của máy ảo Java (JVM). Khi chạy export/import chẳng hạn, phần bộ nhớ này sẽ được sử dụng.

 

Streams Pool

Streams Pool phục vụ cho Oracle Streams. Nếu cấu hình Streams Pool bằng 0, phần bộ nhớ cho các hoạt động Streams set được cấp phát từ Shared pool và tối đa là 10% Shared pool.

 

 Program Global Area (PGA)

 

Có 1 phần bộ nhớ trong hệ thống chứa thông tin về session, gọi là User Global Area (UGA).

Trong trường hợp instance dùng cấu hình shared server, UGA sẽ nằm trong SGA luôn.

Còn trường hợp instance cấu hình dedicated server, UGA sẽ nằm trong PGA.

 

PGA là phần bộ nhớ riêng cho mỗi server process. Ngoài UGA, PGA còn chứa Private SQL Area và SQL Work Areas.

Private SQL Area: chứa các bind variables, thông tin về câu query (ví dụ như số dòng khi thực hiện full table scan)…

SQL Work Areas: vùng bộ nhớ này dùng cho các hoạt động khác liên quan đến câu query như:

  • sort area dùng cho việc sắp xếp
  • hash area dùng cho thao tác hash join
  • bitmap merge area cho thao tác merge bitmap từ bitmap index scan…
 

Ngoài SGA và PGA, Oracle instance còn sử dụng Software code area, là 1 phần bộ nhớ riêng biệt, chứa code thực thi của Oracle. Phần bộ nhớ này là read-only, thường cố định và chỉ thay đổi khi update/reinstall software. 

 

Như vậy là ta đã tìm hiểu sơ qua về kiến trúc bộ nhớ trong Oracle instance. Trong các phần tiếp theo chúng ta sẽ tiếp tục tìm hiểu về các kiến trúc còn lại.