Thứ Tư, 25 tháng 2, 2026

MODULE 20: QUẢN LÝ TÀI NGUYÊN (RESOURCE MANAGEMENT)

Bài toán ở đây là: Làm sao để một câu lệnh báo cáo (Report) chạy full-scan ngốn 100% CPU không kéo sập toàn bộ các giao dịch OLTP quan trọng của hệ thống?

Dưới đây là bản viết lại hoàn chỉnh và chi tiết nhất cho Module 20.

1. Tổng quan

Quản lý tài nguyên (Resource Management) là vách ngăn an toàn bảo vệ CSDL khỏi sự độc chiếm tài nguyên (CPU, RAM, I/O) của các truy vấn "xấu" hoặc các đợt tăng tải đột biến.

Trong thế giới Enterprise (Oracle, SQL Server), bộ điều phối tài nguyên được tích hợp cực kỳ sâu trong nhân Engine, cho phép DBA bóp băng thông CPU/RAM chi tiết đến từng User. Tuy nhiên, khi chuyển sang nhóm Open Source và NoSQL, triết lý thay đổi hoàn toàn: Hệ quản trị CSDL nhường lại quyền kiểm soát phần cứng cho Hệ điều hành (thông qua Linux cgroups hoặc Container).

2. Chi tiết các nội dung

A. Triết lý Quản lý Tài nguyên (Resource Governor/Manager)

Hệ thốngCông cụ quản lý tài nguyênCơ chế hoạt động cốt lõi
OracleDatabase Resource Manager (DBRM)Phân bổ người dùng vào các Consumer Groups. Dùng Resource Plan để chia tỷ lệ % CPU/IO cho từng nhóm.
SQL ServerResource GovernorKhởi tạo các Resource Pools (giới hạn cứng % RAM/CPU), gán Workload Groups vào Pool, và dùng Classifier Function để phân loại session lúc login.
PostgreSQLDựa vào Hệ điều hành (OS-based)Không có công cụ chia % CPU nội tại. Bắt buộc phải tích hợp với Linux cgroups (systemd slices) để cô lập tài nguyên phần cứng.
MySQLResource Groups (Từ bản 8.0)Quản lý theo luồng (Thread). Ép (Bind) một nhóm kết nối chỉ được phép chạy trên một số nhân CPU vật lý cụ thể (vCPU pinning).
MongoDBDựa vào Container / OSKhông có Resource Manager cấp user. DBA thường đóng gói MongoDB vào Docker/Kubernetes để giới hạn trần CPU/RAM cấp vùng chứa.

B. Kiểm soát tài nguyên bằng Timeout và Connection (Chi tiết 5 DB)

Nếu hệ thống không có công cụ chia % CPU tinh vi, vũ khí tốt nhất của DBA là "giết" các truy vấn chạy quá lâu hoặc cấm mở quá nhiều kết nối:

  • Oracle: Sử dụng Profile gán cho User. Anh có thể cấu hình CPU_PER_CALL hoặc LOGICAL_READS_PER_SESSION để tự động ngắt session nếu nó đốt quá nhiều CPU hoặc I/O.

  • SQL Server: Cung cấp tính năng query governor cost limit. Nếu bộ tối ưu hóa tính toán (Estimate) thấy câu lệnh tốn nhiều chi phí hơn mức cho phép, nó sẽ chặn không cho chạy ngay từ đầu.

  • PostgreSQL: Quản lý cực kỳ rạch ròi bằng các biến Timeout. Biến statement_timeout để giết truy vấn chạy lâu, biến idle_in_transaction_session_timeout để diệt các session treo (ngâm transaction), và CONNECTION LIMIT để chặn User mở quá nhiều luồng làm tràn RAM.

  • MySQL: Giới hạn thời gian chạy của truy vấn SELECT thông qua biến max_execution_time. Đồng thời dùng max_user_connections để ngăn một user spam kết nối.

  • MongoDB: Do đặc thù phân tán, anh gắn toán tử .maxTimeMS() trực tiếp vào câu lệnh truy vấn để ép Server hủy lệnh nếu tìm kiếm quá lâu, tránh hiện tượng chặn luồng (Thread blocking).

C. Câu lệnh Quản trị & Kết quả đầu ra (Thiết lập Giới hạn)

1. Oracle: Kích hoạt một Resource Plan có sẵn để chia CPU

SQL
ALTER SYSTEM SET resource_manager_plan = 'DEFAULT_PLAN' SCOPE=BOTH;
-- Kết quả: Hệ thống bắt đầu kích hoạt DBRM, điều tiết CPU theo các Consumer Groups định sẵn (ưu tiên SYS cao nhất, sau đó đến user thường).

2. SQL Server: Tạo Resource Pool bóp CPU tối đa 20% cho team Report

SQL
-- Bước 1: Tạo Pool chỉ cho phép dùng tối đa 20% CPU
CREATE RESOURCE POOL ReportPool WITH (MAX_CPU_PERCENT = 20);
-- Bước 2: Tạo Group gắn vào Pool
CREATE WORKLOAD GROUP ReportGroup USING ReportPool;
-- Bước 3: Áp dụng cấu hình
ALTER RESOURCE GOVERNOR RECONFIGURE;
-- (Thực tế, anh cần viết thêm một Classifier Function để map account 'report_user' vào ReportGroup này).

3. PostgreSQL: Giới hạn kết nối để bảo vệ RAM

SQL
-- Cấm user 'analytics_user' mở quá 5 kết nối đồng thời
ALTER ROLE analytics_user CONNECTION LIMIT 5;
-- Kết quả: ALTER ROLE. Khi user này mở kết nối thứ 6, hệ thống sẽ báo lỗi "too many connections for role".

4. MySQL 8.0: Ép nhóm batch_job chỉ được chạy trên nhân CPU số 2 và 3

SQL
-- Bật tính năng Resource Group (Yêu cầu MySQL 8.0+)
CREATE RESOURCE GROUP batch_jobs TYPE = USER VCPU = 2-3;
-- Gán một kết nối đang chạy (VD ID là 1245) vào group này để giải phóng các CPU khác cho hệ thống
SET RESOURCE GROUP batch_jobs FOR 1245; 

5. MongoDB: Giới hạn số lượng kết nối tối đa đầu vào

MongoDB điều tiết tài nguyên tổng thể bằng cách không cho phép quá nhiều truy cập.

YAML
# Mở cấu hình /etc/mongod.conf
net:
  port: 27017
  bindIp: 0.0.0.0
  maxIncomingConnections: 1000  # Chặn cứng tại 1000 kết nối để chống quá tải RAM

(Yêu cầu restart service mongod để áp dụng).


3. Tóm tắt lại nội dung của bài học

  • Cú sốc về kiến trúc: Oracle và SQL Server chứng tỏ sức mạnh của hệ thống trả phí bằng các bộ Resource Manager cực kỳ thông minh. Nếu anh cấu hình cho User A dùng 20% CPU, nhưng hệ thống đang rảnh (User B đi vắng), User A vẫn được phép mượn CPU của B để chạy. Nó là giới hạn mềm (Soft Limit).

  • Với PostgreSQL và MongoDB, tư duy quản trị tài nguyên hiện đại là: Database Engine chỉ lo tối ưu truy vấn, còn việc bóp CPU/RAM là việc của OS. DBA quản trị Postgres/Mongo thường phải cực kỳ sành sỏi về Linux cgroups hoặc chạy DB trên Kubernetes để thiết lập mức giới hạn tài nguyên (Resource Quotas).

  • Tính năng Resource Groups của MySQL 8.0 là một cách tiếp cận khá hay dựa trên phần cứng. Bằng cách ghim chặt (Pin) các tác vụ nặng vào một vài nhân CPU cụ thể, anh đảm bảo các nhân CPU còn lại luôn rảnh rang để phục vụ khách hàng (End-user).


4. Câu hỏi ôn tập

  1. Hỏi (Oracle): Trong Database Resource Manager, khái niệm nào dùng để phân loại nhóm các user hoặc session có cùng yêu cầu ưu tiên về tài nguyên lại với nhau?

    • Đáp: Consumer Group (Nhóm người tiêu dùng).

  2. Hỏi (SQL Server): Hàm người dùng tự định nghĩa (UDF) nào bắt buộc phải được tạo và khai báo cho Resource Governor để nó nhận diện và phân loại các session mới đăng nhập vào đúng Workload Group?

    • Đáp: Classifier Function (Hàm phân loại).

  3. Hỏi (PostgreSQL): PostgreSQL không có công cụ nội tại để giới hạn % CPU cho một nhóm user. Nếu muốn ép tiến trình của Postgres chỉ chạy trên tối đa 50% CPU, DBA phải cấu hình ở đâu?

    • Đáp: Cấu hình ở tầng Hệ điều hành, thông qua Linux Control Groups (cgroups), thường bằng cách thiết lập tham số CPUQuota trong file cấu hình dịch vụ systemd của Postgres.

  4. Hỏi (MySQL): Thuật ngữ kỹ thuật mô tả hành động ép các luồng xử lý (threads) của một Resource Group chỉ được hoạt động trên một số nhân CPU vật lý được chỉ định sẵn là gì?

    • Đáp: CPU Affinity (hoặc vCPU pinning).

  5. Hỏi (MongoDB): Để ngăn chặn một truy vấn find() chạy full-scan làm nghẽn luồng xử lý của hệ thống, anh sử dụng toán tử nào gán trực tiếp vào câu lệnh để tự động hủy nó nếu chạy quá thời gian quy định?

    • Đáp: Toán tử .maxTimeMS().


5. Bài tập thực hành (Giới hạn truy vấn chạy lâu)

Đề bài tình huống: Hệ thống thường xuyên bị treo do các lập trình viên mới viết các câu lệnh truy vấn phức tạp không dùng Index. Hãy viết lệnh/cấu hình thiết lập giới hạn thời gian tối đa (Timeout) để hệ thống tự động hủy (KILL) bất kỳ câu lệnh nào chạy quá 10 giây, bảo vệ tài nguyên CPU cho 5 hệ thống.

Đáp án:

1. Oracle: (Gắn qua Profile áp dụng cho user)

SQL
-- Tạo profile giới hạn CPU_PER_CALL (Đơn vị phần trăm giây, 1000 = 10 giây).
CREATE PROFILE limit_10s_profile LIMIT CPU_PER_CALL 1000;
-- Gán profile cho user
ALTER USER dev_user PROFILE limit_10s_profile;

2. SQL Server: (Dùng Resource Governor chặn mức tối đa cho một Workload Group)

SQL
-- Ép các truy vấn trong Workload Group default không được chạy quá 10 giây
ALTER WORKLOAD GROUP [default] WITH (REQUEST_MAX_CPU_TIME_SEC = 10);
ALTER RESOURCE GOVERNOR RECONFIGURE;

3. PostgreSQL: (Thiết lập 10 giây = 10000 mili-giây cho toàn hệ thống)

SQL
ALTER SYSTEM SET statement_timeout = 10000;
SELECT pg_reload_conf();

4. MySQL / MariaDB: (Thiết lập 10 giây = 10000 mili-giây chặn các lệnh SELECT)

SQL
SET GLOBAL max_execution_time = 10000;

5. MongoDB: (Ép giới hạn 10 giây = 10000 mili-giây trực tiếp trên một câu lệnh)

JavaScript
use app_db;
db.orders.find({ "status": "PENDING" }).maxTimeMS(10000);
=============================
TƯ VẤN: Click Here hoặc Hotline/Zalo 090.29.12.888
=============================
Website không chứa bất kỳ quảng cáo nào, mọi đóng góp để duy trì phát triển cho website (donation) xin vui lòng gửi về STK 90.2142.8888 - Ngân hàng Vietcombank Thăng Long - TRAN VAN BINH
=============================
Nếu bạn không muốn bị AI thay thế và tiết kiệm 3-5 NĂM trên con đường trở thành DBA chuyên nghiệp hay làm chủ Database thì hãy đăng ký ngay KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE, được Coaching trực tiếp từ tôi với toàn bộ bí kíp thực chiến, thủ tục, quy trình của gần 20 năm kinh nghiệm (mà bạn sẽ KHÔNG THỂ tìm kiếm trên Internet/Google) từ đó giúp bạn dễ dàng quản trị mọi hệ thống Core tại Việt Nam và trên thế giới, đỗ OCP.
- CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
- Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
2 khóa học online qua video giúp bạn nhanh chóng có những kiến thức nền tảng về Linux, Oracle, học mọi nơi, chỉ cần có Internet/4G:
- Oracle cơ bản: https://bit.ly/admin_1200
- Linux: https://bit.ly/linux_1200
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile/Zalo: 0902912888
👨 Facebook: https://www.facebook.com/BinhOracleMaster
👨 Inbox Messenger: https://m.me/101036604657441 (profile)
👨 Fanpage: https://www.facebook.com/tranvanbinh.vn
👨 Inbox Fanpage: https://m.me/tranvanbinh.vn
👨👩 Group FB: https://www.facebook.com/groups/DBAVietNam
👨 Website: https://www.tranvanbinh.vn
👨 Blogger: https://tranvanbinhmaster.blogspot.com
🎬 Youtube: https://www.youtube.com/@binhguru
👨 Tiktok: https://www.tiktok.com/@binhguru
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhguru
👨 Podcast: https://www.podbean.com/pu/pbblog-eskre-5f82d6
👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội

=============================
cơ sở dữ liệu, cơ sở dữ liệu quốc gia, database, AI, trí tuệ nhân tạo, artificial intelligence, machine learning, deep learning, LLM, ChatGPT, DeepSeek, Grok, oracle tutorial, học oracle database, Tự học Oracle, Tài liệu Oracle 12c tiếng Việt, Hướng dẫn sử dụng Oracle Database, Oracle SQL cơ bản, Oracle SQL là gì, Khóa học Oracle Hà Nội, Học chứng chỉ Oracle ở đầu, Khóa học Oracle online,sql tutorial, khóa học pl/sql tutorial, học dba, học dba ở việt nam, khóa học dba, khóa học dba sql, tài liệu học dba oracle, Khóa học Oracle online, học oracle sql, học oracle ở đâu tphcm, học oracle bắt đầu từ đâu, học oracle ở hà nội, oracle database tutorial, oracle database 12c, oracle database là gì, oracle database 11g, oracle download, oracle database 19c/21c/23c/23ai, oracle dba tutorial, oracle tunning, sql tunning , oracle 12c, oracle multitenant, Container Databases (CDB), Pluggable Databases (PDB), oracle cloud, oracle security, oracle fga, audit_trail,oracle RAC, ASM, oracle dataguard, oracle goldengate, mview, oracle exadata, oracle oca, oracle ocp, oracle ocm , oracle weblogic, postgresql tutorial, mysql tutorial, mariadb tutorial, ms sql server tutorial, nosql, mongodb tutorial, oci, cloud, middleware tutorial, docker, k8s, micro service, hoc solaris tutorial, hoc linux tutorial, hoc aix tutorial, unix tutorial, securecrt, xshell, mobaxterm, putty

ĐỌC NHIỀU

Trần Văn Bình - Oracle Database Master