Thứ Ba, 15 tháng 8, 2017

Kiến trúc Oracle Database 11g

Kiến trúc Oracle Database 11g

Xét 1 server Oracle cơ bản, chúng ta có 3 kiến trúc:
Kiến trúc bộ nhớ (Memory Structure)
+ Kiến trúc process (Process Structure)   
==> Instance
Kiến trúc lưu trữ (Storage Structure) ==> Database

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.

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

– System Global Area (SGA): bao gồm Shared pool, database buffer cache, redo log buffer... 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 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 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
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 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 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.


Các tiến trình thực hiện các hoạt động trong hệ thống.

Khi user mở 1 tool ứng dụng lên, chẳng hạn như SQL*Plus, Toad… và kết nối đến database, ta gọi đó là user process. Mấy cái đó thì khỏi nói hen.
Phần process chúng ta sẽ tìm hiểu ở đây là các process chạy trên instance, bao gồm server process và các background process.

Server process

Server process là các process được sinh ra để phục vụ request từ user process.

– Trường hợp cấu hình Dedicated server: mỗi user process sẽ được phục vụ bởi 1 server process.

– Trường hợp cấu hình Shared server: các shared server process nằm chung trong 1 pool, dispatcher sẽ chuyển các request đến pool này, từ đó các server process chia nhau phục vụ client request, phục vụ xong lại quay về pool nằm chờ việc

Vậy công việc của server process là gì? Cơ bản có 3 nhiệm vụ:

    Phân tích (parse) và chạy các câu lệnh SQL từ client (user process)
    Đọc dữ liệu cần thiết từ disk lên database buffer cache nếu chưa có
    Trả kết quả về cho client
Background process

Cùng với các server process "chạy vòng ngoài", Oracle Database còn có các background process, là các process thực hiện các công việc nội tại database: quản lý memory, process, quản lý I/O, giao tiếp giữa các thành phần…

Database Writer Process (DBWn)

DBW có nhiệm vụ ghi những dữ liệu đã thay đổi (dirty buffer) xuống disk. Có thể cấu hình tối đa 20 process DBW (từ DBW0 -> DBW9 và DBWa -> DBWj).

Thường DBW sẽ ghi dữ liệu khi Database buffer cache gần đầy, thiếu chỗ trống, trong 1 số trường hợp như khi alter tablespace offline hoặc read only, hoặc ghi để gọi checkpoint.

DBW sẽ ghi dữ liệu theo batch (ghi multiblock) để tăng performance.

Log Writer Process (LGWR)

Log Writer Process chịu trách nhiệm ghi dữ liệu từ redo log buffer cache vào redo log file. LGWR là 1 trong những process hoạt động nhiều nhất, do phải ghi dữ liệu liên tục. LGWR ghi dữ liệu mỗi 3 giây, hoặc khi:

– Redo log buffer đầy 1/3

– User commit transaction, hoặc trước khi DBWn ghi dirty buffer vào disk (để đảm bảo không mất dữ liệu)

Archiver Process (ARCn)

Process này chỉ có nếu database chạy ở ARCHIVE LOG mode. Sau khi switch log, process này chịu trách nhiệm ghi redo log file ra file archive để lưu trữ. Ngoài ra process này còn thực hiện chuyển dữ liệu qua hệ thống standby nếu có cấu hình.

Checkpoint Process (CKPT)

Process này cập nhật checkpoint (thông tin về System Change Number (SCN)) trong control file và data header. CKPT cập nhật checkpoint khi redo log đầy, hoặc trước khi DBW ghi dữ liệu, để đánh dấu vị trí cần khôi phục khi instance crash (đảm bảo tất cả dữ liệu trước SCN đó đã ghi vào disk, đánh dấu điểm thực hiện quá trình instance recovery). Do đó giúp làm giảm thời gian chạy instance recovery (MTTR – Mean Time to Recovery).

System Monitor Process (SMON)

Khi hệ thống bị crash (vd cúp điện, 1 process khác chết làm instance crash) và được start lại, SMON sẽ thực hiện recovery, cập nhật dữ liệu từ redo log file vào datafile. Ngoài ra SMON còn dọn dẹp temporary segment trong các tablespace nếu không còn sử dụng nữa.

Process Monitor Process (PMON)

PMON làm nhiệm vụ theo dõi các user process. Nếu 1 user process không còn kết nối đến database nữa, nó sẽ rollback transaction của user nếu còn transaction dang dở, release lock của user nếu có, “thả” những block của user trong buffer cache ra, và xóa process ID khỏi danh sách active process.

PMON còn theo dõi dispatcher và server process, restart lại nếu chúng bị lỗi.

Ngoài ra, PMON đăng ký thông tin dispatcher, instance với listener để phục vụ cho việc nhận kết nối từ user.

Recoverer Process (RECO)

Process này theo dõi các transaction liên quan giữa database hiện tại với các database khác (distributed transaction). Trong trường hợp distributed transaction lỗi, RECO sẽ rollback transaction và dọn dẹp những thông tin liên quan đến  transaction đó trên các database.

Các process khác
Trên đây là các process cơ bản của instance database. Ngoài ra ta còn gặp 1 số background process khác trên hệ thống như:

– CJQ0 – Job Queue Coordinator: lấy job từ data dictionary và tạo ra các Job slave process để chạy job
– Jnnn – Job Slave process: các process con của CJQ0 thực hiện chạy job
– QMNC – AQ Coordinator Process: quản lý các hoạt động liên quan đến Advanced Queue, Oracle Streams
– Qnnn – AQ Slave process: các process con của QMNC thực hiện các công việc liên quan
– SMCO – Space Management Coordinator Process: quản lý dung lượng
– Wnnn – Space Management Slave process: các process con của SMCO thực hiện các công việc liên quan
– PSP0 – Process Spawner Process: process này tạo ra các background process sau khi instance startup
– MMAN – Memory Manager Process: quản lý instance memory
– MMON – Manageability Monitor Process: thực hiện các công việc liên quan đến quản trị, như AWR, ADDM…
– MMNL – Manageability Monitor Lite Process: thực hiện các công việc liên quan đến ASH, metrics…
– VKTM – Virtual Keeper of Time Process: quản lý giờ giấc, thời gian của instance
– DIAG – Diagnostic Capture Process: tạo ra các diagnostic dump
– DBRM – Database Resource Manager Process: quản lý các công việc liên quan đến Resource plan
– DIA0 – Diagnostic Process: xác định và giải quyết deadlock, sự cố treo trong hệ thống
– Pnnn – Parallel Query Slave Process: các process thực hiện query, DML, DDL parallel

ASM Background process

Trong trường hợp sử dụng ASM cho hệ thống lưu trữ, sẽ có thêm 1 số background process như:

    ASMB – ASM Background Process: quản lý ASM instance
    RBAL – ASM Rebalance Master Process: quản ly hoạt động rebalance trên ASM instance, và quản lý diskgroup trên database instance
    GMON – ASM Disk Group Monitor Process: monitor ASM diskgroup
    Onnn – ASM Connection Pool Process: quản lý giao tiếp với ASM instance

Có những process ít quan trọng và có thể được tạo lại khi bị crash, như ARC, CJQ0, MMON… Có những process là quan trọng và bắt buộc phải có, nếu process bị crash thì instance sẽ bị crash ngay, chẳng hạn như SMON, PMON, DBWR, …


Kiến trúc lưu trữ trong Oracle Database.
logical structure và physical structure
Phyical structure – kiến trúc vật lý – chính là các tập tin, là những gì chúng ta có thể thấy được trực tiếp trên hệ điều hành, được lưu trữ trên hệ thống lưu trữ (có thể là local disk, SAN, NAS…, disk có thể format theo file system như ext3, hay format thành ASM disk…), bao gồm:

Data files

Đúng như tên gọi, data files là các tập tin chứa dữ liệu của database, bao gồm cả dữ liệu của user hay ứng dụng, data dictionary của Oracle database.

Mỗi data file chỉ thuộc về 1 tablespace, có thể tự tăng kích thước (AUTOEXTEND) và tối đa đến 1 giới hạn (MAXSIZE) nếu ta cấu hình khi tạo.

Data file có thể là:

    Datafile: các tập tin chứa dữ liệu
    Tempfile: các tập tin chứa dữ liệu tạm thời phục vụ cho hoạt động của database
    Undo datafile: các tập tin chứa dữ liệu undo phục vụ cho hoạt động của database

Các tập tin này hay có đuôi là .dbf

Control files

Đây là tập tin hết sức quan trọng với database, nếu không có nó sẽ không open được database. Tập tin này chứa metadata về database, như tên database, vị trí các data files, redo log files, thông tin về backup,…

Do là tập tin quan trọng, nên chúng ta cần nhân bản (multiplex) file này ra làm 2, 3 bản ở các vị trí lưu trữ khác nhau, để trong trường hợp 1 file bị hư vẫn còn các file còn lại, đảm bảo hệ thống hoạt động.

Các tập tin này hay có đuôi là .ctl
Online redo log files

Đây chính là các tập tin mà process LGWR ghi dữ liệu ra từ Redo log buffer. Các tập tin này cần thiết trong trường hợp instance crash, phải recover lại.

Các redo log files được chia vào các log group. Mỗi log group cũng nên có 2 redo log files trở lên (cũng multiplex như control file), để đảm bảo khi có 1 file hư thì vẫn còn file còn lại để hệ thống hoạt động.

Do được sử dụng xoay vòng, cần ít nhất 2 log group trong database.



Khi hoạt động, log group có thể có các trạng thái sau:

    UNUSED: log group mới tạo, chưa sử dụng bao giờ
    CURRENT: log group đang được ghi dữ liệu
    ACTIVE: log group đang không ghi dữ liệu, nhưng đang cần phòng trường hợp instance crash
    INACTIVE: log group đang không ghi dữ liệu, không cần trong trường hợp instance crash

Archived redo log files

Nếu database chạy trong chế độ ARCHIVELOG, các redo log file khi đầy / khi switch sẽ được ghi ra archived log files. Các archived redo log files này dùng với các bản backup để đảm bảo có thể restore hệ thống đến 1 thời điểm xác định. Ngoài ra, archived redo log files còn dùng cho các tính năng khác như Data Guard.

Initialization files

Đây là tập tin chứa các tham số cấu hình liên quan đến bộ nhớ, vị trí control files, vị trí các thư mục log, các tham số cấu hình hoạt động của database… được dùng khi startup instance. Có 2 loại file:

    Pfile (parameter file): là dạng file text, thường có tên init<SID>.ora
    Spfile (server parameter file): là dạng file binary, thường có tên spfile<SID>.ora

Các tập tin này thường nằm trong ORACLE_HOME/dbs. Nếu dùng ASM để lưu trữ thì spfile hay nằm trong ASM.

Spfile có nhiều ưu điểm hơn pfile và thường được dùng chính cho database. Tuy vậy pfile cũng cần thiết trong nhiều trường hợp. Việc nắm vững thao tác với 2 loại file này sẽ rất có ích.

Password files

Tập tin này chứa password của các user được cấp quyền SYSDBA hay SYSOPER, cho phép các user có quyền admin này kết nối từ xa để thực hiện các thao tác cần xác thực bên ngoài database, chẳng hạn như startup.

Tập tin này thường có tên orapw<SID> nằm trong ORACLE_HOME/dbs.

Alert log & Trace files

Alert log là tập tin ghi lại log các hoạt động chính của database (startup, shutdown, switch log…), các thao tác liên quan đến tablespace và datafile, ALTER DATABASE, ALTER SYSTEM, các lỗi liên quan đến hoạt động database…

Đây là tập tin cần thường xuyên theo dõi kiểm tra để đảm bảo hoạt động của database. Tập tin này thường có tên alert_<SID>.log

Trace files là các file log ghi lại các lỗi xảy ra trên các background process và server process. Ngoài ra cũng có lúc DBA chủ động ghi trace file để kiểm tra 1 số thông tin rõ ràng hơn.
Backup files

Backup files là các file sao lưu lại nội dung database, mục đích chính là phòng trường hợp có hư hỏng gì thì dùng để khôi phục database.

Backup files có thể là các file copy của các file khác (data file, control file, redo log, archived log…) nếu sử dụng “cold backup”, hoặc có thể là các tập tin do RMAN sinh ra nếu dùng RMAN để backup.

Logical Structure

Nếu như trên OS ta thấy các tập tin database đơn giản chỉ là … các tập tin, thì trong database, việc lưu trữ logic lại tổ chức phức tạp hơn, theo nhiều cấp.


Oracle data block

Data block là cấp độ lưu trữ logic nhỏ nhất trong Oracle database. Thường 1 Oracle data block sẽ gồm nhiều OS block để tăng I/O. Mặc định block size là 8KB. Tuy nhiên khi tạo tablespace, có thể đặt block size khác tùy theo nhu cầu. 
Extents

Extent là mức độ lưu trữ cao hơn, bao gồm nhiều data block liền kề (về mặt logical, còn về mặt physical có thể là các block rải rác trên disk). Khi 1 object cần tăng thêm kích thước, Oracle sẽ cấp phát thêm ở mức độ extent.
Segments

Segment là đơn vị lưu trữ logic bao gồm nhiều extent. Có 4 loại segment chính:

    Data segment: là segment tạo nên table. Mỗi table được lưu hoàn toàn trong 1 segment (với partitioned table thì mỗi partition là 1 segment)
    Index segment: là segment tạo nên index.  Mỗi index được lưu hoàn toàn trong 1 segment (với partitioned index thì mỗi partition là 1 segment)
    Undo segment: các segment lưu trữ thông tin undo trong undo tablespace
    Temporary segment: các segment lưu trữ thông tin tạm thời trong temporary tablespace

Tablespace

Việc lưu trữ nhìn từ trong database, ở mức độ cao nhất sẽ là các tablespace.

Tablespace là tập hợp các data files (quan hệ giữa physical và logical nhìn thấy rõ nhất là đây), mục đích tất nhiên là … để lưu trữ dữ liệu. Có 3 loại tablespace lưu trữ:

    Data tablespace: tablespace chứa dữ liệu. Khi cài đặt thường có sẵn tablespace SYSTEM và SYSAUX, là các tablespace hệ thống chứa dữ liệu của Oracle (ta không nên lưu trữ dữ liệu khác vào đây), 1 tablespace USERS để chứa dữ liệu của user/ứng dụng. Thường ta sẽ tạo thêm các tablespace khác để quy hoạch việc lưu trữ
    Undo tablespace: là các tablespace chứa dữ liệu undo, liên quan đến hoạt động của database, do Oracle quản lý. Chỉ có 1 undo tablespace trong database
    Temporary tablespace: là các tablespace chứa dữ liệu tạm thời, liên quan đến hoạt động của database, cũng do Oracle quản lý. Có thể có nhiều temporary tablespace trong database

Về cách tổ chức, tablespace có thể được tổ chức theo 1 trong 2 kiểu:

    Smallfile tablespace: tablespace gồm nhiều datafile, kích thước tối đa mỗi datafile phụ thuộc vào kích thước block (vd với block 8KB thì kích thước datafile tối đa là 32GB)
    Bigfile tablespace: tablespace chỉ có 1 datafile duy nhất, tuy nhiên kích thước tối đa rất lớn (vd với block 8KB thì kích thước datafile tối đa là 32TB)

Share This!


Không có nhận xét nào:

Đăng nhận xét