-
Giới thiệu và khởi tạo môi trường MySQL
- Hướng dẫn cài đặt và cấu hình MySQL Server trên Windows cho kết nối từ xa
- Vận dụng tư duy phân tích dữ liệu với Mysql từ cơ bản đến nâng cao
- Vận dụng tư duy phân tích quản trị dữ liệu với MySQL
- Tối ưu hoá công việc quản trị với view và bảng tạm
- Tôi ưu hoá với thủ tục – procedure trong mysql
- Nhóm hàm windown
- Con trỏ và phân vùng trong mysql
- Làm việc với hàm tự tạo trong Mysql
- Làm việc với trigger trong Mysql
- Làm việc với giao dịch
- Tìm hiểu về truy vấn động
- Even – Sự kiện định kỳ trong Mysql
-
Quản trị dữ liệu trong doanh nghiệp
- Tổng quan về trục quản trị dữ liệu
- Quản trị & Giám sát hệ thống với cơ sở dữ liệu ảo information_schema
- Cấu hình và lưu trữ
- Cấu hình file my.ini
- An toàn và toàn vẹn dữ liệu – Bảo mật – Backup
- Hiệu năng và tối ưu hoá
- Đồng bộ và phục hồi
- Phân tích tối ưu hoá hiệu năng với dữ liệu bảng performance_schema
-
Chiến lược quản trị dữ liệu
Đồng bộ và phục hồi
TỔNG QUAN CHƯƠNG TRÌNH THỰC HÀNH
| Phần | Chủ đề | Mục tiêu | Thời lượng |
|---|---|---|---|
| A | Cấu hình Replication (đồng bộ dữ liệu) | Thiết lập master–replica, kiểm tra GTID, xử lý lỗi replication | 2 giờ |
| B | Backup & Restore cơ bản | Thực hành backup dạng logical (mysqldump) và physical (xtrabackup) | 1,5 giờ |
| C | Phục hồi từng phần & PITR | Thực hành khôi phục đến thời điểm cụ thể, kiểm tra toàn vẹn | 1,5 giờ |
⚙️ PHẦN A — THỰC HÀNH ĐỒNG BỘ (REPLICATION)
🎯 Mục tiêu
-
Hiểu cơ chế replication (binlog → relay log → SQL thread).
-
Cấu hình master – replica cơ bản.
-
Kiểm tra trạng thái và xử lý lỗi đồng bộ.
🧩 Bài 1 — Thiết lập replication master–replica (cơ bản)
1️⃣ Chuẩn bị
-
Hai máy (hoặc container):
-
master:
192.168.1.10, MySQL 8.x -
replica:
192.168.1.11, MySQL 8.x
-
-
Cả hai dùng InnoDB,
server-idkhác nhau.
2️⃣ Cấu hình my.cnf
Trên master:
Trên replica:
3️⃣ Tạo user replication
4️⃣ Lấy vị trí binlog
Kết quả mẫu:
5️⃣ Cấu hình replica
Trên máy replica:
6️⃣ Kiểm tra trạng thái
✅ Nếu Replica_IO_Running và Replica_SQL_Running = Yes, replication hoạt động.
7️⃣ Kiểm thử
Trên master:
Trên replica:
🧩 Bài 2 — Sử dụng GTID (Global Transaction ID)
Trên cả master & replica, bật GTID:
Cấu hình lại replication:
Kiểm tra GTID:
🧩 Bài 3 — Xử lý sự cố replication
Tình huống: Replica bị lỗi Duplicate entry
Hướng dẫn khắc phục:
Hoặc dùng:
💾 PHẦN B — BACKUP & RESTORE CƠ BẢN
🎯 Mục tiêu
-
Hiểu sự khác biệt giữa backup logical và physical.
-
Thực hành sao lưu & phục hồi với
mysqldumpvàxtrabackup.
🧩 Bài 4 — Backup bằng mysqldump
Sao lưu toàn bộ DB:
Sao lưu riêng một schema:
Phục hồi:
🧩 Bài 5 — Backup vật lý với Percona XtraBackup (nâng cao)
Cài đặt (nếu chưa có):
Backup:
Chuẩn bị restore:
Phục hồi:
⏳ PHẦN C — PHỤC HỒI THEO THỜI ĐIỂM (PITR)
🎯 Mục tiêu
-
Thực hành khôi phục đến một thời điểm cụ thể trước khi lỗi xảy ra.
-
Dùng binary log để áp dụng giao dịch.
🧩 Bài 6 — Phục hồi PITR
1️⃣ Sao lưu cơ sở
2️⃣ Lưu lại vị trí binlog hiện tại
3️⃣ Giả lập lỗi
4️⃣ Phục hồi cơ sở backup
5️⃣ Áp dụng binlog đến thời điểm mong muốn
✅ Kết quả: dữ liệu được khôi phục đến trước thời điểm lỗi.
BỘ BÀI TẬP NÂNG CAO (MYSQL REPLICATION – BACKUP – AUTOMATION)
🧩 Bài 1: Thiết lập Multi-Source Replication (1 replica từ 2 master)
🎯 Mục tiêu
- Cấu hình 1 replica đồng bộ dữ liệu từ hai master khác nhau (multi-source replication).
- Quan sát cơ chế tách biệt channel trên replica.
🔧 Bước 1: Chuẩn bị môi trường
| Máy | IP | Vai trò |
|---|---|---|
master1 |
192.168.1.10 | Nguồn 1 |
master2 |
192.168.1.11 | Nguồn 2 |
replica |
192.168.1.20 | Nhận dữ liệu từ cả hai |
Cấu hình chung:
- MySQL 8.x
- InnoDB
gtid_mode=ON,enforce_gtid_consistency=ONtrên cả 3 node.
⚙️ Bước 2: Cấu hình my.cnf
Trên replica:
[mysqld]
server-id = 3
relay_log = mysql-relay-bin
log_bin = mysql-bin
gtid_mode = ON
enforce_gtid_consistency = ON
log_slave_updates = 1
🔐 Bước 3: Tạo user replication trên hai master
Trên mỗi master:
CREATE USER 'repl'@'192.168.1.%' IDENTIFIED BY 'ReplPass!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.%';
FLUSH PRIVILEGES;
🧭 Bước 4: Cấu hình 2 channel replication
Trên replica:
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='192.168.1.10',
SOURCE_USER='repl',
SOURCE_PASSWORD='ReplPass!',
SOURCE_AUTO_POSITION=1
FOR CHANNEL 'master1';
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='192.168.1.11',
SOURCE_USER='repl',
SOURCE_PASSWORD='ReplPass!',
SOURCE_AUTO_POSITION=1
FOR CHANNEL 'master2';
Khởi động:
START REPLICA FOR CHANNEL 'master1';
START REPLICA FOR CHANNEL 'master2';
✅ Bước 5: Kiểm tra trạng thái
SHOW REPLICAS STATUS;
(hoặc SHOW REPLICA STATUS FOR CHANNEL 'master1'\G)
Nếu cả hai channel đều Running, replication hoạt động song song.
🔍 Kiểm thử
- Trên
master1:CREATE DATABASE db_sales; - Trên
master2:CREATE DATABASE db_hr; - Trên
replica:SHOW DATABASES;➜ Thấy cả
db_salesvàdb_hrxuất hiện.
⚠️ Ghi chú
- Tránh trùng tên DB giữa hai master.
- Khi gặp xung đột, nên chỉ định replication filter hoặc dùng schema riêng biệt.
- Dùng
STOP REPLICA FOR CHANNEL 'masterX'để tạm dừng từng luồng.
🧩 Bài 2: Tự động sao lưu hằng ngày bằng Event Scheduler
🎯 Mục tiêu
- Tạo event tự động chạy lệnh backup mỗi đêm.
- Ghi log backup vào
ADMIN_DB.backup_log.
🔧 Bước 1: Bật event scheduler
SET GLOBAL event_scheduler = ON;
⚙️ Bước 2: Tạo stored procedure sao lưu
DELIMITER $$
CREATE PROCEDURE sp_auto_backup()
BEGIN
SET @bk_file = CONCAT('/backups/full_backup_', DATE_FORMAT(NOW(),'%Y%m%d'), '.sql');
SET @cmd = CONCAT('mysqldump --all-databases > ', @bk_file);
SET @res = sys_exec(@cmd); -- (nếu dùng plugin sys)
INSERT INTO ADMIN_DB.backup_log (db_name, backup_type, file_path, backup_size_mb, duration_sec, status)
VALUES ('ALL', 'FULL', @bk_file, 0, 0, 'SUCCESS');
END$$
DELIMITER ;
💡 Nếu không có
sys_exec, bạn có thể chạy script shell bên ngoài hoặc dùng event chỉ ghi log.
⏰ Bước 3: Tạo event tự động
CREATE EVENT ev_daily_backup
ON SCHEDULE EVERY 1 DAY STARTS '2025-10-24 00:00:00'
DO CALL sp_auto_backup();
🔍 Kiểm thử
SHOW EVENTS FROM ADMIN_DB;
CALL sp_auto_backup();
SELECT * FROM ADMIN_DB.backup_log ORDER BY recorded_at DESC;
⚠️ Ghi chú
- Đảm bảo MySQL user có quyền ghi file (OUTFILE).
- Nên lưu backup ra thư mục mount ngoài container / server.
🧩 Bài 3: Tạo script kiểm tra replication & gửi cảnh báo
🎯 Mục tiêu
- Kiểm tra trạng thái replication định kỳ.
- Nếu có lỗi, ghi alert vào
ADMIN_DB.alert_log.
⚙️ Bước 1: Tạo procedure kiểm tra
DELIMITER $$
CREATE PROCEDURE sp_check_replication()
BEGIN
DECLARE io_state VARCHAR(10);
DECLARE sql_state VARCHAR(10);
SELECT Replica_IO_Running, Replica_SQL_Running
INTO io_state, sql_state
FROM performance_schema.replication_applier_status_by_worker
LIMIT 1;
IF io_state <> 'YES' OR sql_state <> 'YES' THEN
INSERT INTO ADMIN_DB.alert_log (alert_type, severity, message, status)
VALUES ('REPLICATION_ERROR','CRITICAL','Replica thread stopped!','OPEN');
END IF;
END$$
DELIMITER ;
⏰ Bước 2: Lên lịch kiểm tra mỗi 5 phút
CREATE EVENT ev_check_replica
ON SCHEDULE EVERY 5 MINUTE
DO CALL sp_check_replication();
🔍 Bước 3: Kiểm thử
- Tạm dừng replica:
STOP REPLICA; - Đợi 5 phút hoặc gọi thủ công:
CALL sp_check_replication(); SELECT * FROM ADMIN_DB.alert_log WHERE alert_type='REPLICATION_ERROR';
⚠️ Ghi chú
- Có thể mở rộng thêm: gửi email bằng script ngoài hoặc webhook API.
- DBA nên kiểm tra thủ công mỗi ngày nếu chưa có automation tool.
🧩 Bài 4: Ghi lịch sử backup & giám sát dung lượng
🎯 Mục tiêu
- Ghi lại metadata mỗi lần backup.
- So sánh kích thước DB với ngưỡng trong
quota_threshold.
⚙️ Bước 1: Bổ sung bảng ghi log
CREATE TABLE IF NOT EXISTS ADMIN_DB.backup_audit (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
db_name VARCHAR(100),
backup_path VARCHAR(255),
backup_date DATETIME DEFAULT CURRENT_TIMESTAMP,
size_mb DECIMAL(10,2),
verified ENUM('YES','NO') DEFAULT 'NO'
);
⚙️ Bước 2: Stored procedure ghi log sau mỗi backup
DELIMITER $$
CREATE PROCEDURE sp_record_backup(IN p_db VARCHAR(100), IN p_path VARCHAR(255), IN p_size DECIMAL(10,2))
BEGIN
INSERT INTO ADMIN_DB.backup_audit (db_name, backup_path, size_mb, verified)
VALUES (p_db, p_path, p_size, 'NO');
END$$
DELIMITER ;
⚙️ Bước 3: Kiểm tra quota và tạo cảnh báo
DELIMITER $$
CREATE PROCEDURE sp_check_quota_usage()
BEGIN
INSERT INTO ADMIN_DB.alert_log (alert_type, severity, message, db_name)
SELECT 'QUOTA_EXCEEDED','CRITICAL',
CONCAT('DB ', s.db_name, ' size ', s.total_size_mb, 'MB > threshold ', q.threshold_mb, 'MB'),
s.db_name
FROM ADMIN_DB.space_usage s
JOIN ADMIN_DB.quota_threshold q ON s.db_name=q.db_name
WHERE s.total_size_mb > q.threshold_mb;
END$$
DELIMITER ;
⏰ Bước 4: Lên lịch kiểm tra mỗi ngày
CREATE EVENT ev_check_quota_daily
ON SCHEDULE EVERY 1 DAY
DO CALL sp_check_quota_usage();
🔍 Kiểm thử
- Giả lập DB vượt ngưỡng bằng cách:
UPDATE ADMIN_DB.space_usage SET total_size_mb = 200 WHERE db_name='sales_db'; CALL sp_check_quota_usage(); SELECT * FROM ADMIN_DB.alert_log WHERE alert_type='QUOTA_EXCEEDED';
⚠️ Ghi chú
- Mỗi cảnh báo phải có severity rõ ràng để phân loại phản ứng.
- Có thể thêm trigger tự động cập nhật
verified='YES'khi restore thành công.
🧠 TỔNG KẾT SAU 4 BÀI NÂNG CAO
| Mảng | Bạn đã học được |
|---|---|
| Replication nâng cao | Multi-source setup, GTID auto-position, channel isolation |
| Automation | Event Scheduler cho backup & monitoring |
| Alerting | Tự động phát hiện lỗi & ghi log vào bảng quản trị |
| Auditing | Ghi lịch sử backup, theo dõi quota vượt ngưỡng |
🌟 Bài luyện tập mở rộng (tùy chọn)
- Tạo procedure tổng hợp nhật ký backup/alert gửi email hàng ngày.
- Dùng view kết hợp (
v_admin_dashboard) hiển thị tình trạng toàn hệ thống (replication, quota, alert count). - Tích hợp Prometheus exporter đọc dữ liệu từ bảng
space_usageđể vẽ dashboard trong Grafana.
bạn có thể viết file .js chạy trong MySQL Shell (mysqlsh) vì mysqlsh hỗ trợ cả JavaScript và Python; hoặc viết script Python (chạy ngoài mysqlsh) để gọi mysqldump hoặc dùng MySQL Shell API. Dưới đây là hướng dẫn từng bước, an toàn và thực tế — gồm 2 phương án rõ ràng để dùng trong lab/production:
- Phương án A (khuynh hướng chính xác & phổ biến): viết Python script (chạy trực tiếp trên Windows/Linux) dùng
mysqldump(subprocess) + nén + rotate. Đây là cách an toàn, portable và dễ debug. - Phương án B (dùng MySQL Shell với JavaScript hoặc Python): tạo file .js (hoặc .py) chạy bằng
mysqlshvà dùng MySQL Shell util (dump / load). Cách này tận dụng API của mysqlsh, thuận tiện nếu bạn đã dùng mysqlsh.
A. PHƯƠNG ÁN A — Script Python (gọi mysqldump) — đề xuất cho production/lab
Ưu điểm: dễ kiểm soát (backup file, nén, xoá file cũ), chạy tốt qua Task Scheduler.
Yêu cầu: có mysqldump (cài MySQL client) trong PATH.
1. Tạo file Python: mysql_backup.py
Lưu vào C:\scripts\mysql_backup.py (Windows) hoặc /usr/local/bin/mysql_backup.py (Linux).
#!/usr/bin/env python3
"""
mysql_backup.py
- Usage: python mysql_backup.py
- Config at top of file
"""
import os
import subprocess
import gzip
import shutil
from datetime import datetime, timedelta
# === CONFIG ===
MYSQLDUMP_PATH = r"C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqldump.exe" # or "mysqldump" if in PATH
BACKUP_DIR = r"D:\MySQL_Backup"
DB_NAME = "giangtt"
DB_USER = "hocvien"
DB_PASS = "hocvien@123"
KEEP_DAYS = 7
# =============
os.makedirs(BACKUP_DIR, exist_ok=True)
ts = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
sqlfile = os.path.join(BACKUP_DIR, f"{DB_NAME}_full_{ts}.sql")
gzfile = sqlfile + ".gz"
# Build mysqldump command
cmd = [
MYSQLDUMP_PATH,
f"-u{DB_USER}",
f"-p{DB_PASS}",
"--single-transaction",
"--routines",
"--events",
"--triggers",
DB_NAME
]
print("Running mysqldump...")
with open(sqlfile, "wb") as out:
proc = subprocess.run(cmd, stdout=out, stderr=subprocess.PIPE)
if proc.returncode != 0:
print("ERROR: mysqldump failed:", proc.stderr.decode())
# remove incomplete file
if os.path.exists(sqlfile):
os.remove(sqlfile)
raise SystemExit(1)
print("Compressing...")
with open(sqlfile, "rb") as f_in, gzip.open(gzfile, "wb") as f_out:
shutil.copyfileobj(f_in, f_out)
os.remove(sqlfile)
print("Backup created:", gzfile)
# Cleanup old backups
cutoff = datetime.now() - timedelta(days=KEEP_DAYS)
for fname in os.listdir(BACKUP_DIR):
if fname.endswith(".gz"):
path = os.path.join(BACKUP_DIR, fname)
mtime = datetime.fromtimestamp(os.path.getmtime(path))
if mtime < cutoff:
print("Removing old backup:", path)
os.remove(path)
print("Done.")
2. Chạy thử thủ công
- Mở PowerShell/CMD as Admin:
python "C:\scripts\mysql_backup.py"
- Kiểm tra thư mục
D:\MySQL_Backupcó file.sql.gz.
3. Lên lịch với Windows Task Scheduler
- Create Basic Task → chọ́n Daily → 02:00 AM → Start a program →
Program/script:python,Add arguments:C:\scripts\mysql_backup.py - Trong Properties: Run with highest privileges, Run whether user is logged on or not.
4. Khôi phục (test)
gzip -d D:\MySQL_Backup\giangtt_full_2025-10-23_02-00-00.sql.gz
mysql -u hocvien -p"hocvien@123" giangtt < giangtt_full_2025-10-23_02-00-00.sql
(Lưu ý: thay gzip -d bằng 7zip trên Windows nếu cần)
B. PHƯƠNG ÁN B — Dùng MySQL Shell (mysqlsh) với file .js hoặc .py
MySQL Shell hỗ trợ chạy script JavaScript hoặc Python bằng chính mysqlsh. Trong script bạn có thể dùng API util.dumpInstance / util.dumpSchemas và util.loadDump để dump/load. Dưới đây là ví dụ JS & Python chạy trong mysqlsh.
Lưu ý: tên hàm có thể khác chút theo phiên bản mysqlsh; ví dụ những hàm admin thường là
shell.dumpInstance()? Tuy nhiên bản chuẩn hiện tại cung cấp objectutilvới các hàmdumpInstance,dumpSchemas,loadDump. Mình đưa script theo API phổ biến — nếu mysqlsh báo lỗi, chạymysqlsh --helphoặchelp(util)trong mysqlsh để xác nhận.
1. File JavaScript dump_giangtt.js (dùng mysqlsh in JS mode)
Nội dung:
// dump_giangtt.js
// Run with: mysqlsh --uri root@localhost:3306 --file=dump_giangtt.js
var util = require('util'); // may not be necessary in some mysqlsh versions
// Config
var targetDir = "C:/temp/mysqlsh_dumps";
var dbList = ["giangtt"];
// Create folder if needed (Node fs not always available in mysqlsh; use shell command)
shell.run("mkdir -p \"" + targetDir + "\"");
// Run dumpSchemas
print("Starting dump of schemas:", dbList);
util.dumpSchemas(dbList, targetDir, {compression: "gzip"})
.then(function() {
print("Dump completed to:", targetDir);
})
.catch(function(err) {
print("ERROR during dump:", err);
});
Chạy script bằng mysqlsh:
cd "C:\Program Files\MySQL\MySQL Shell 8.0\bin"
mysqlsh --uri hocvien@127.0.0.1:3306 --password --file "C:\path\to\dump_giangtt.js"
# mysqlsh sẽ prompt password; hoặc use --password=YOURPWD (không khuyến nghị)
Giải thích: util.dumpSchemas([...], targetDir, {compression:'gzip'}) tạo dump dạng MySQL Shell dump (tổ chức file khác mysqldump), và có thể restore bằng util.loadDump().
Nếu mysqlsh báo
require('util')không tồn tại, thử dùng trực tiếputil.dumpSchemas(...)vìutilcó sẵn trong global context.
2. File Python cho mysqlsh dump_giangtt.py (nếu thích Python mode)
# dump_giangtt.py
target_dir = r"C:\temp\mysqlsh_dumps"
db_list = ["giangtt"]
import os
os.makedirs(target_dir, exist_ok=True)
print("Starting dump...")
util.dumpSchemas(db_list, target_dir, {"compression":"gzip"})
print("Done.")
Chạy:
mysqlsh --uri hocvien@127.0.0.1:3306 --password --py --file C:\path\to\dump_giangtt.py
3. Khôi phục bằng mysqlsh (load dump)
Sau khi dump với mysqlsh (dumpSchemas), phục hồi bằng util.loadDump():
// trong mysqlsh prompt hoặc file .js
util.loadDump("C:/temp/mysqlsh_dumps/giangtt/", { schema: "giangtt", skipCreateSchema: false });
Hoặc bằng CLI:
mysqlsh --uri hocvien@127.0.0.1:3306 --py -e "util.loadDump('C:/temp/mysqlsh_dumps/giangtt/')" --password
C. Vấn đề bảo mật & vận hành (quan trọng)
- Không để password plaintext trong file script. Trên Windows, dùng Windows Credential Manager, hoặc dùng file
my.cnf/%APPDATA%\MySQL\.mylogin.cnfđể lưu credential an toàn. - Luôn test restore sau mỗi vài backup. Backup không test = chưa backup.
- Nếu DB lớn, mysqlsh dump & xtrabackup (physical) có ưu thế hơn mysqldump.
D. Gợi ý chọn phương án
- Muốn đơn giản, portable → dùng Python + mysqldump (Phương án A).
- Muốn dùng tính năng dump/load của mysqlsh (hỗ trợ nén, restore cấu trúc phức tạp) → dùng mysqlsh scripts (Phương án B).
BACKUP VỚI MYSQL SHELL (JAVASCRIPT)
⚙️ 1. Cài MySQL Shell
Nếu chưa có:
- Tải tại https://dev.mysql.com/downloads/shell/
- Sau khi cài, mở Command Prompt và gõ thử:
mysqlsh --version
🧠 2. Tạo file script backup.js
Mở Notepad → dán nội dung sau:
// backup.js
// Backup dữ liệu MySQL bằng MySQL Shell
// Kết nối tới MySQL
shell.connect('hocvien@192.168.1.62:3306', 'hocvien@123');
// Khai báo thư mục backup (ví dụ D:\Backup)
var backupDir = "D:/Backup";
// Gọi hàm dump toàn bộ dữ liệu
var dumpInstance = util.dumpInstance(backupDir, {
threads: 4,
dryRun: false
});
print("✅ Backup hoàn tất! File được lưu tại: " + backupDir);
💡
util.dumpInstance()là hàm tích hợp trong MySQL Shell dùng để dump toàn bộ instance — tương đươngmysqldumpnhưng nhanh hơn, nén tốt hơn.
🚀 3. Chạy script
Mở Command Prompt, di chuyển đến thư mục chứa file backup.js, rồi chạy:
mysqlsh --js -f backup.js
Kết quả: MySQL Shell sẽ tạo một thư mục chứa các file
.sqlhoặc.zst(nếu nén), lưu tạiD:\Backup.
🧩 PHẦN 2. BACKUP VỚI PYTHON (MySQL Shell Mode)
MySQL Shell cũng chạy được Python mode.
1️⃣ Tạo file backup.py
# backup.py
# Backup dữ liệu MySQL bằng Python trong MySQL Shell
shell.connect('hocvien@192.168.1.62:3306', 'hocvien@123')
backup_dir = "D:/Backup_Python"
util.dumpInstance(backup_dir, {
threads: 4,
dryRun: False
})
print("✅ Backup hoàn tất! File được lưu tại:", backup_dir)
2️⃣ Chạy file:
mysqlsh --py -f backup.py
🕐 3. Thiết lập lịch backup tự động (Windows Task Scheduler)
- Mở Task Scheduler → Create Basic Task
- Đặt tên: “MySQL Auto Backup JS”
- Chọn Daily (hoặc Weekly)
- Action → Start a program
- Trong “Program/script”, nhập:
mysqlsh - Trong “Add arguments”, nhập:
--js -f "D:\Scripts\backup.js" - Chọn Finish.
✅ Từ nay Windows sẽ tự động chạy backup định kỳ qua MySQL Shell.
📦 4. Phục hồi lại (Restore)
Sau khi có thư mục backup, cô có thể dùng lại MySQL Shell:
mysqlsh --js
Rồi chạy:
util.loadDump("D:/Backup", {threads:4, dryRun:false});
🎯 Tóm tắt:
| Cách | Công cụ | Lợi thế |
|---|---|---|
mysqldump |
Truyền thống, dùng dòng lệnh | Dễ hiểu, dễ triển khai |
mysqlsh + util.dumpInstance() |
Hiện đại (JS/Python) | Nhanh, tự động hóa cao, tương thích cluster |
| Task Scheduler | Windows | Tự động hóa định kỳ |