Thứ Tư, 25 tháng 6, 2025

Reorg và runstat có tác dụng gì trong DB2 từ A-Z

Trong DB2 (IBM Db2 Database), hai lệnh REORGRUNSTATS đóng vai trò rất quan trọng trong việc duy trì hiệu năng và ổn định hệ thống. Chúng phục vụ cho tối ưu hóa truy vấn, quản lý bộ nhớ, và cải thiện kế hoạch thực thi của optimizer.

I. SỬ DỤNG REORG, RUNSTATS 

🔧 1. REORG – Tái tổ chức bảng (Reorganization)

✅ Tác dụng:

  • Sắp xếp lại dữ liệu vật lý trong bảng theo thứ tự nhất định (theo index hoặc clustering key).

  • Loại bỏ phân mảnh: Khi dữ liệu được INSERT/UPDATE/DELETE liên tục, các page dữ liệu trở nên phân mảnh – REORG gom lại thành các page liên tục.

  • Giảm I/O vật lý, tăng hiệu suất truy vấn.

  • Tối ưu access path: Đặc biệt khi truy vấn theo index clustering.

🔁 Khi nào cần REORG?

  • Sau khi DELETE hoặc UPDATE hàng loạt.

  • Khi bảng bị phân mảnh nhiều (check qua REORGCHK).

  • Khi thấy hiệu năng giảm rõ rệt hoặc query scan nhiều page hơn cần thiết.

🛠️ Ví dụ:

sql
REORG TABLE schema_name.table_name;

📊 2. RUNSTATS – Cập nhật thống kê

✅ Tác dụng:

  • Thu thập lại thống kê dữ liệu (statistics) về bảng, index, cột (cardinality, distribution, histogram…).

  • Cung cấp dữ liệu đầu vào cho optimizer để lập kế hoạch thực thi query tốt hơn.

  • Giúp DB2 chọn access path tối ưu (chọn index hay table scan…).

🔁 Khi nào cần RUNSTATS?

  • Sau REORG hoặc LOAD, INSERT hàng loạt.

  • Khi query execution plan sai lệch hoặc không tối ưu.

  • Trước khi chạy truy vấn quan trọng hoặc truy vấn batch.

🛠️ Ví dụ:

sql
RUNSTATS ON TABLE schema_name.table_name WITH DISTRIBUTION AND DETAILED INDEXES ALL;

🔄 Trình tự khuyến nghị:

text
1. REORG → dọn dẹp dữ liệu, loại bỏ phân mảnh. 2. RUNSTATS → cập nhật thống kê sau khi dữ liệu đã gọn gàng.

📌 Kết luận ngắn gọn:

LệnhMục đích chínhKhi nào dùng
REORGTối ưu cấu trúc vật lýSau nhiều DELETE/UPDATE, khi dữ liệu phân mảnh
RUNSTATSCập nhật thống kê cho optimizerSau REORG hoặc thay đổi dữ liệu lớn

II. Kịch bản chạy tự động REORG và RUNSTATS theo định kỳ hoặc sau batch load

Dưới đây là kịch bản tự động REORG và RUNSTATS trong IBM Db2, bao gồm:

  1. Kiểm tra cần REORG không bằng REORGCHK

  2. Thực hiện REORG cho các bảng cần thiết

  3. Chạy RUNSTATS sau REORG

  4. Tự động hóa theo định kỳ bằng cron hoặc job scheduler


🧩 1. Tập lệnh shell script (Linux/Unix)

📄 File: db2_reorg_runstats.sh

#!/bin/bash
# Cấu hình DB_NAME="YOUR_DB_NAME" DB_USER="db2inst1" LOG_FILE="/home/db2inst1/reorg_runstats.log" DATE=$(date '+%Y-%m-%d %H:%M:%S') # Bắt đầu log echo "========== $DATE: START REORGCHK ==========" >> $LOG_FILE # Đăng nhập DB2 . ~db2inst1/sqllib/db2profile db2 connect to $DB_NAME >> $LOG_FILE # Kiểm tra thống kê REORGCHK cho TABLES và INDEXES db2 -x "REORGCHK CURRENT STATISTICS ON TABLE ALL" | \ grep -E '^\*|^Table:' > /tmp/reorgchk_output.txt # Xử lý các bảng cần REORG TABLES=$(awk '/^Table:/ {split($0,a," "); print a[2]"."a[3]}' /tmp/reorgchk_output.txt) for tbl in $TABLES do echo "==> Reorganizing table: $tbl" | tee -a $LOG_FILE db2 "REORG TABLE $tbl ALLOW NO ACCESS" >> $LOG_FILE echo "==> Runstats on table: $tbl" | tee -a $LOG_FILE db2 "RUNSTATS ON TABLE $tbl WITH DISTRIBUTION AND DETAILED INDEXES ALL" >> $LOG_FILE done db2 connect reset echo "========== $DATE: DONE ==========" >> $LOG_FILE

🕒 2. Tự động hóa bằng cron

✍️ Lệnh crontab -e để chạy mỗi Chủ nhật lúc 3:00 AM:


0 3 * * 0 /home/db2inst1/db2_reorg_runstats.sh >> /home/db2inst1/cron.log 2>&1

🧪 3. Kiểm tra thử thủ công

Bạn có thể chạy thủ công để xem bảng nào bị phân mảnh:


db2 "REORGCHK CURRENT STATISTICS ON TABLE ALL" | grep -E '^\*|^Table:'

Dòng bắt đầu bằng * nghĩa là một chỉ số vượt ngưỡng → cần REORG.

III. CẢI TIẾN SCRIPT BỔ SUNG CẢNH BÁO EMAIL

Dưới đây là phiên bản nâng cao của script tự động REORG & RUNSTATS, bao gồm các cải tiến:


Tính năng mở rộng

  1. Ghi log thời gian từng REORG/RUNSTATS, cảnh báo nếu vượt ngưỡng (ví dụ > 300 giây).

  2. 📧 Gửi email cảnh báo khi vượt ngưỡng.

  3. 🛡 Sao lưu DDL của bảng bằng db2look trước REORG (phục vụ rollback).

  4. 🔁 Có thể nhúng vào ETL hoặc batch job cuối ngày bằng shell call hoặc scheduling.


📄 Script: db2_reorg_runstats_advanced.sh

bash
#!/bin/bash # ==== Cấu hình ==== DB_NAME="YOUR_DB" DB_USER="db2inst1" MAIL_TO="you@example.com" DDL_BACKUP_DIR="/home/$DB_USER/ddl_backup" LOG_FILE="/home/$DB_USER/reorg_runstats.log" TIME_THRESHOLD=300 # giây mkdir -p $DDL_BACKUP_DIR # Load DB2 env . ~db2inst1/sqllib/db2profile db2 connect to $DB_NAME >> $LOG_FILE # Ghi log thời gian echo "[$(date)] --- START REORGCHK ---" >> $LOG_FILE # REORGCHK lấy các bảng cần tối ưu db2 -x "REORGCHK CURRENT STATISTICS ON TABLE ALL" | grep -E '^\*|^Table:' > /tmp/reorgchk_output.txt TABLES=$(awk '/^Table:/ {split($0,a," "); print a[2]"."a[3]}' /tmp/reorgchk_output.txt) # Lặp qua từng bảng cần tối ưu for tbl in $TABLES; do echo "==> PROCESSING: $tbl" | tee -a $LOG_FILE start_time=$(date +%s) # Backup DDL bằng db2look echo " > Dumping DDL..." | tee -a $LOG_FILE db2look -d $DB_NAME -e -z "$(echo $tbl | cut -d'.' -f1)" -t "$(echo $tbl | cut -d'.' -f2)" \ -o "$DDL_BACKUP_DIR/${tbl}_$(date +%Y%m%d_%H%M%S).sql" # Thực hiện REORG echo " > REORG..." | tee -a $LOG_FILE db2 "REORG TABLE $tbl ALLOW NO ACCESS" >> $LOG_FILE # RUNSTATS sau khi REORG echo " > RUNSTATS..." | tee -a $LOG_FILE db2 "RUNSTATS ON TABLE $tbl WITH DISTRIBUTION AND DETAILED INDEXES ALL" >> $LOG_FILE end_time=$(date +%s) duration=$((end_time - start_time)) echo " > DONE: $tbl in ${duration}s" | tee -a $LOG_FILE # Gửi cảnh báo nếu thời gian vượt ngưỡng if [ "$duration" -gt "$TIME_THRESHOLD" ]; then echo "⚠️ WARNING: Table $tbl REORG+RUNSTATS took ${duration}s (exceeds threshold ${TIME_THRESHOLD}s)" >> $LOG_FILE echo -e "Subject: [DB2 Alert] REORG quá lâu với bảng $tbl\n\nBảng: $tbl\nThời gian: ${duration}s\n" | \ sendmail "$MAIL_TO" fi done # Kết thúc db2 connect reset echo "[$(date)] --- FINISHED ---" >> $LOG_FILE

🧪 Nhúng vào ETL hoặc batch load

📌 Gọi trong ETL cuối ngày:

bash
sh /home/db2inst1/db2_reorg_runstats_advanced.sh

📌 Gọi trong Airflow, Control-M, Oracle Data Integrator, hoặc bash script cuối job load:

bash
status=$? if [ $status -ne 0 ]; then echo "Cảnh báo: Lỗi chạy REORG+RUNSTATS cuối ngày" | mail -s "[ETL JOB FAILED]" you@example.com fi

📊 Gợi ý nâng cao

Tính năngCách thực hiện thêm
Prometheus alertExport log về định dạng metrics → pushgateway
Slack/Telegram alertDùng curl gửi API message thay vì sendmail
Dashboard theo dõiParse log thành JSON → feed vào Grafana

IV.Gửi cảnh báo qua Telegram và xuất dashboard cho Grafana

1. Gửi cảnh báo Telegram khi REORG quá lâu
📊 2. Export log dạng Prometheus metrics để hiển thị qua Grafana


📍 PHẦN 1: Gửi cảnh báo qua Telegram

Cấu hình Telegram:

  1. Tạo bot tại https://t.me/BotFather
    → Ghi lại BOT_TOKEN

  2. Vào https://api.telegram.org/bot<YOUR_BOT_TOKEN>/getUpdates
    → Gửi tin nhắn bất kỳ cho bot → lấy chat_id


🔧 Thêm vào script:

bash
# Cấu hình Telegram BOT_TOKEN="YOUR_BOT_TOKEN" CHAT_ID="YOUR_CHAT_ID" send_telegram_alert() { local message="$1" curl -s -X POST https://api.telegram.org/bot$BOT_TOKEN/sendMessage \ -d chat_id=$CHAT_ID \ -d parse_mode="Markdown" \ -d text="$message" > /dev/null }

📦 Gửi khi thời gian REORG quá lâu:

Thay vì dùng sendmail, thay bằng:

bash
if [ "$duration" -gt "$TIME_THRESHOLD" ]; then MSG="⚠️ *REORG chậm vượt ngưỡng*\n• Table: \`$tbl\`\n• Time: *${duration}s* (> ${TIME_THRESHOLD}s)" echo "$MSG" | tee -a $LOG_FILE send_telegram_alert "$MSG" fi

📍 PHẦN 2: Xuất Prometheus Metrics

Để tạo dashboard Grafana, bạn cần:

  1. File metrics.prom xuất dữ liệu

  2. Sử dụng Node Exporter Textfile Collector để Prometheus scrape

  3. Grafana đọc Prometheus → hiển thị dashboard


📄 Tạo file Prometheus metrics:

Trong script, thêm:

bash
METRICS_FILE="/var/lib/node_exporter/db2_reorg.prom" echo "# HELP db2_reorg_duration_seconds Time spent on REORG+RUNSTATS per table" > $METRICS_FILE echo "# TYPE db2_reorg_duration_seconds gauge" >> $METRICS_FILE

Sau mỗi bảng xử lý:

bash
echo "db2_reorg_duration_seconds{table=\"$tbl\"} $duration" >> $METRICS_FILE

🔁 Cron job quét mỗi ngày:

Đảm bảo node_exporter bật --collector.textfile.directory=/var/lib/node_exporter


📊 Dashboard Grafana mẫu (JSON)

Bạn có thể dùng đoạn sau để import dashboard:

json
{ "title": "DB2 REORG Duration", "panels": [ { "type": "graph", "title": "REORG Duration by Table", "targets": [ { "expr": "db2_reorg_duration_seconds", "legendFormat": "{{table}}", "refId": "A" } ] } ], "time": { "from": "now-24h", "to": "now" } }

✅ Tổng kết các thành phần

Thành phầnMục đích
Telegram AlertCảnh báo tức thời khi REORG chậm
Prometheus MetricsTheo dõi thời gian xử lý REORG/RUNSTATS từng bảng
Grafana DashboardTrực quan hóa log vận hành theo thời gian

=============================
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

=============================
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, 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, 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