Nhắc đến Undo, chúng ta đang nói đến "trái tim" của sự bền bỉ và tính nhất quán (Read Consistency) trong cơ sở dữ liệu. Với Oracle DBA, ám ảnh lớn nhất luôn là lỗi huyền thoại ORA-01555 (Snapshot too old).
Nhưng khi bước sang các hệ thống khác, anh sẽ bất ngờ khi biết rằng có những hệ thống hoàn toàn không có khái niệm "Undo Tablespace", hoặc xử lý nó theo một cơ chế hoàn toàn trái ngược.
Chào mừng anh em đến với Module 9: Quản trị Undo và cơ chế MVCC (Multi-Version Concurrency Control).
1. Tổng quan
Undo sinh ra để giải quyết 2 bài toán sống còn:
Rollback: Hủy bỏ (Undo) một giao dịch chưa Commit.
Read Consistency (Tính nhất quán đọc): Đảm bảo user A đang đọc báo cáo mất 30 phút sẽ không bị ảnh hưởng bởi user B đang
UPDATEdữ liệu đó (MVCC).
Sự khác biệt cốt lõi:
Oracle & MySQL: Dùng một không gian riêng biệt (Undo Tablespace / Undo Logs) để lưu ảnh cũ (Before-Image) của dữ liệu.
SQL Server: Dùng
tempdbđể lưu ảnh cũ (nếu bật tính năng RCSI), hoặc lưu trực tiếp trong User DB từ bản 2019 (tính năng ADR).PostgreSQL: Hoàn toàn không có Undo Tablespace. Ảnh cũ và ảnh mới của dữ liệu nằm đan xen ngay trong cùng một block dữ liệu (In-place MVCC).
2. Chi tiết các nội dung
A. Kiến trúc Quản lý "Ảnh cũ" (Before-Image)
| Hệ thống | Nơi lưu trữ "Ảnh cũ" (Undo Data) | Cơ chế dọn dẹp (Purge/Clean up) | Rủi ro lớn nhất cho DBA |
| Oracle | Undo Tablespace | Tự động ghi đè khi hết thời gian UNDO_RETENTION. | Lỗi ORA-01555 nếu retention quá ngắn hoặc tablespace đầy. |
| SQL Server | Version Store (Nằm trong tempdb). | Tự động dọn dẹp bởi tiến trình ngầm (Garbage Collector). | Nếu giao dịch quá dài, tempdb sẽ phình to làm treo toàn bộ server. |
| PostgreSQL | Nằm trực tiếp tại Data Page (cùng chỗ với dữ liệu mới). | Tiến trình Autovacuum quét và đánh dấu tái sử dụng. | Dữ liệu bị "Bloat" (phình to) cực nhanh nếu Autovacuum cấu hình sai hoặc bị chết. |
| MySQL | Undo Tablespaces (Của engine InnoDB). | Tiến trình Purge Thread chạy ngầm để xóa. | Undo log phình to nếu có giao dịch "treo" quá lâu (Long-running transaction). |
| MongoDB | Trong bộ nhớ cache của WiredTiger (Update in-memory). | Tự động loại bỏ khỏi cache khi không còn giao dịch nào cần đọc ảnh cũ đó. | Cache bị đầy nếu transaction chạy quá lâu, ảnh hưởng tốc độ ghi. |
B. Ánh xạ cơ chế MVCC (Đọc không chặn Ghi)
Trong Oracle, thao tác Đọc (SELECT) không bao giờ chặn thao tác Ghi (UPDATE), và ngược lại. Điều này là mặc định.
Tuy nhiên, trong SQL Server (trước bản 2019), mặc định là Đọc sẽ chặn Ghi và Ghi sẽ chặn Đọc (Pessimistic Locking). Đây là cú sốc lớn cho các Oracle DBA. Để SQL Server hành xử giống Oracle, anh bắt buộc phải bật tính năng Read Committed Snapshot Isolation (RCSI) cho từng Database.
C. Câu lệnh Quản trị & Kết quả đầu ra
1. SQL Server: Kiểm tra kích thước Version Store trong tempdb
Khi bật RCSI, tempdb phải gánh toàn bộ Undo của hệ thống.
SELECT
db_name(database_id) as 'Database',
reserved_page_count * 8.0 / 1024 as 'Version_Store_Size_MB'
FROM sys.dm_tran_version_store_space_usage;
-- Kết quả: Liệt kê dung lượng MB mà các bản ghi Undo đang chiếm dụng trong tempdb.
2. PostgreSQL: Kiểm tra các giao dịch đang giữ lại Dead Tuples (Ngăn cản Vacuum)
Vì Postgres lưu Undo ngay tại chỗ, một transaction chạy quá lâu sẽ làm toàn bộ hệ thống không thể dọn rác.
SELECT pid, datname, usename, state, backend_xmin, query_start
FROM pg_stat_activity
WHERE backend_xmin IS NOT NULL ORDER BY age(backend_xmin) DESC;
-- Kết quả: Hiển thị các session đang "níu giữ" ảnh cũ của hệ thống.
3. MySQL: Kiểm tra cấu hình Undo Tablespace
SHOW VARIABLES LIKE 'innodb_undo_tablespaces';
-- Kết quả: 2 (Từ MySQL 8.0, mặc định có ít nhất 2 file undo độc lập).
3. Tóm tắt lại nội dung của bài học
PostgreSQL giải quyết bài toán MVCC bằng cách ghi thêm dòng mới và giữ lại dòng cũ (Dead Tuple) ngay trên cùng một page dữ liệu. Lợi ích là không bao giờ bị lỗi
ORA-01555như Oracle, nhưng hậu quả là bảng bị phình to (Table Bloat) và phải dọn dẹp liên tục bằngVACUUM.SQL Server nếu không cấu hình gì thì không có MVCC như Oracle (dùng Lock vật lý). Nếu muốn có MVCC, anh phải bật RCSI, và khi đó tempdb sẽ đóng vai trò chính là Undo Tablespace của toàn bộ Instance.
MySQL (InnoDB) có kiến trúc Undo sao chép gần như y hệt Oracle (cũng có Undo segment, Purge thread).
4. Câu hỏi ôn tập
Hỏi (Oracle): Tham số nào quyết định thời gian (tính bằng giây) mà Oracle cố gắng giữ lại dữ liệu cũ trong Undo Tablespace để phục vụ các câu lệnh SELECT chạy lâu?
Đáp:
UNDO_RETENTION.
Hỏi (SQL Server): Nếu ứng dụng phàn nàn rằng câu lệnh SELECT bị treo cứng (blocking) do một ai đó đang chạy lệnh UPDATE trên cùng một bảng, anh cần bật tính năng gì cấp Database để khắc phục?
Đáp: Bật tính năng RCSI (Read Committed Snapshot Isolation).
Hỏi (PostgreSQL): PostgreSQL không có Undo Tablespace, vậy ảnh cũ của một dòng dữ liệu (Before-Image) nằm ở đâu sau khi bị UPDATE?
Đáp: Nằm ngay tại Data Page cũ (cùng chỗ với dữ liệu hiện tại), được gọi là một "Dead Tuple" cho đến khi tiến trình
VACUUMdọn dẹp nó.
Hỏi (MySQL): Nếu một lập trình viên mở một giao dịch (
BEGIN) nhưng quên khôngCOMMIThoặcROLLBACKvà bỏ đi uống cà phê, hệ lụy gì sẽ xảy ra với không gian Undo?Đáp: Tiến trình Purge Thread không thể dọn dẹp các Undo log cũ, khiến Undo Tablespace phình to liên tục và suy giảm hiệu năng.
Hỏi (SQL Server 2019+): Tính năng mới nào của Microsoft giúp giải phóng gánh nặng Undo cho
tempdbvà giúp Rollback cực nhanh (Instant Rollback) bất kể giao dịch dài đến đâu?Đáp: Accelerated Database Recovery (ADR) - lưu Version Store ngay trong chính User Database thay vì
tempdb.
5. Bài tập thực hành (Cấu hình MVCC / Undo)
Đề bài: Là một DBA, anh được giao nhiệm vụ kiểm tra và cấu hình cơ chế lưu giữ phiên bản (MVCC/Undo) để đảm bảo các câu lệnh báo cáo (SELECT) không bị chặn bởi các lệnh UPDATE. Hãy viết câu lệnh thao tác cho 4 hệ thống (MongoDB xử lý in-memory tự động nên bỏ qua).
Đáp án:
1. Oracle: Xem và cấu hình thời gian giữ Undo lên 2 tiếng (7200 giây)
SHOW PARAMETER undo_retention;
ALTER SYSTEM SET undo_retention = 7200 SCOPE=BOTH;
2. SQL Server: Bật tính năng RCSI cho Database sopirs_new để hành xử giống Oracle (Đọc không chặn Ghi)
-- Lưu ý: Phải ngắt các kết nối khác trước khi chạy lệnh này
ALTER DATABASE sopirs_new SET READ_COMMITTED_SNAPSHOT ON;
-- Kiểm tra lại:
SELECT name, is_read_committed_snapshot_on FROM sys.databases WHERE name = 'sopirs_new';
3. PostgreSQL: Mặc định Postgres đã là MVCC. Anh chỉ cần kiểm tra xem tiến trình tự động dọn rác (Autovacuum) có đang chạy không.
SHOW autovacuum;
-- Kết quả chuẩn phải là 'on'
4. MySQL / MariaDB: Xem lịch sử Undo log đã được dọn dẹp (Purge) đến đâu.
-- Xem thông tin chi tiết của Engine InnoDB, phần TRANSACTIONS sẽ báo History list length
SHOW ENGINE INNODB STATUS;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