Đồ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-id khác nhau.

2️⃣ Cấu hình my.cnf

Trên master:

[mysqld]
server-id = 1
log_bin = mysql-bin
binlog_format = ROW

Trên replica:

[mysqld]
server-id = 2
relay_log = mysql-relay-bin
read_only = 1

3️⃣ Tạo user replication

CREATE USER 'repl'@'192.168.1.%' IDENTIFIED BY 'ReplPass!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.%';
FLUSH PRIVILEGES;

4️⃣ Lấy vị trí binlog

FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

Kết quả mẫu:

File: mysql-bin.000003
Position: 157

5️⃣ Cấu hình replica

Trên máy replica:

CHANGE REPLICATION SOURCE TO
SOURCE_HOST='192.168.1.10',
SOURCE_USER='repl',
SOURCE_PASSWORD='ReplPass!',
SOURCE_LOG_FILE='mysql-bin.000003',
SOURCE_LOG_POS=157;
START REPLICA;

6️⃣ Kiểm tra trạng thái

SHOW REPLICA STATUS\G

✅ Nếu Replica_IO_RunningReplica_SQL_Running = Yes, replication hoạt động.

7️⃣ Kiểm thử

Trên master:

CREATE DATABASE demo_repl;
USE demo_repl;
CREATE TABLE t1 (id INT PRIMARY KEY, name VARCHAR(50));
INSERT INTO t1 VALUES (1,'test replication');

Trên replica:

SELECT * FROM demo_repl.t1;

🧩 Bài 2 — Sử dụng GTID (Global Transaction ID)

Trên cả master & replica, bật GTID:

gtid_mode = ON
enforce_gtid_consistency = ON

Cấu hình lại replication:

RESET REPLICA ALL;
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='192.168.1.10',
SOURCE_USER='repl',
SOURCE_PASSWORD='ReplPass!',
SOURCE_AUTO_POSITION=1;
START REPLICA;

Kiểm tra GTID:

SHOW GLOBAL VARIABLES LIKE 'gtid_mode';
SHOW REPLICA STATUS\G

🧩 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:

STOP REPLICA;
SET GLOBAL sql_slave_skip_counter = 1;
START REPLICA;

Hoặc dùng:

SET GLOBAL replica_skip_errors='1062';

💾 PHẦN B — BACKUP & RESTORE CƠ BẢN

🎯 Mục tiêu

  • Hiểu sự khác biệt giữa backup logicalphysical.

  • Thực hành sao lưu & phục hồi với mysqldumpxtrabackup.


🧩 Bài 4 — Backup bằng mysqldump

Sao lưu toàn bộ DB:

mysqldump -u root -p --all-databases --routines --triggers > full_backup.sql

Sao lưu riêng một schema:

mysqldump -u root -p sales_db > sales_backup.sql

Phục hồi:

mysql -u root -p < sales_backup.sql

🧩 Bài 5 — Backup vật lý với Percona XtraBackup (nâng cao)

Cài đặt (nếu chưa có):

sudo apt install percona-xtrabackup

Backup:

xtrabackup --backup --target-dir=/data/backup/2025-10-23/

Chuẩn bị restore:

xtrabackup --prepare --target-dir=/data/backup/2025-10-23/

Phục hồi:

systemctl stop mysql
xtrabackup --copy-back --target-dir=/data/backup/2025-10-23/
chown -R mysql:mysql /var/lib/mysql
systemctl start mysql

⏳ 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ở

mysqldump -u root -p --databases sales_db > base_backup.sql

2️⃣ Lưu lại vị trí binlog hiện tại

SHOW MASTER STATUS;

3️⃣ Giả lập lỗi

USE sales_db;
DELETE FROM orders;

4️⃣ Phục hồi cơ sở backup

mysql -u root -p < base_backup.sql

5️⃣ Áp dụng binlog đến thời điểm mong muốn

mysqlbinlog --stop-datetime="2025-10-23 15:30:00" /var/lib/mysql/mysql-bin.000001 | mysql -u root -p

✅ 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=ON trê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_salesdb_hr xuấ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)

  1. Tạo procedure tổng hợp nhật ký backup/alert gửi email hàng ngày.
  2. 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).
  3. Tích hợp Prometheus exporter đọc dữ liệu từ bảng space_usage để vẽ dashboard trong Grafana.

 

 

 

 

Thiết lập cơ chế sao lưu tự động hằng ngày cho MySQL bằng Task Scheduler trên Windows.
Kết quả sau khi làm xong:
✅ Mỗi ngày Windows tự động tạo bản sao lưu .sql của database.
✅ File backup được lưu theo ngày/tháng/năm.
✅ Có thể kiểm tra log và khôi phục khi cần.
🔧 PHẦN 1 — CHUẨN BỊ MÔI TRƯỜNG
Bước 1. Xác định vị trí MySQL
Mặc định MySQL Workbench và MySQL Server cài tại:
C:\Program Files\MySQL\MySQL Server 8.0\bin
Kiểm tra xem có file mysqldump.exe ở đó không.
Nếu có, ta sẽ dùng đường dẫn này trong script.
📁 PHẦN 2 — TẠO SCRIPT SAO LƯU
Bước 1. Mở Notepad và nhập nội dung sau
@echo off
REM ===============================
REM  MySQL Auto Backup Script
REM  Author: Trần Thu Giang (Giảng viên CNTT)
REM  Purpose: Tự động sao lưu MySQL mỗi ngày
REM ===============================
REM — Cấu hình các biến —
set MYSQL_PATH=”C:\Program Files\MySQL\MySQL Server 8.0\bin”
set BACKUP_DIR=D:\MySQL_Backup
set DB_NAME=labdb
set USER=root
set PASSWORD=12345
set DATESTAMP=%DATE:~10,4%-%DATE:~4,2%-%DATE:~7,2%_%TIME:~0,2%-%TIME:~3,2%
set FILENAME=%BACKUP_DIR%\%DB_NAME%_%DATESTAMP%.sql
REM — Tạo thư mục nếu chưa có —
if not exist %BACKUP_DIR% mkdir %BACKUP_DIR%
REM — Thực hiện sao lưu —
echo [INFO] Bắt đầu backup %DB_NAME% lúc %DATESTAMP%
%MYSQL_PATH%\mysqldump.exe -u %USER% -p%PASSWORD% –routines –events –triggers %DB_NAME% > “%FILENAME%”
REM — Nén file (nếu có 7zip) —
REM “C:\Program Files\7-Zip\7z.exe” a “%FILENAME%.zip” “%FILENAME%” && del “%FILENAME%”
REM — Ghi log —
echo [%DATE% %TIME%] Backup completed: %FILENAME% >> %BACKUP_DIR%\backup_log.txt
REM — Xoá file cũ hơn 7 ngày —
forfiles /p %BACKUP_DIR% /s /m *.sql /d -7 /c “cmd /c del @file”
echo [INFO] Backup hoàn tất!
Bước 2. Lưu file
Lưu thành:
D:\MySQL_Backup\mysql_auto_backup.bat
⚙️ PHẦN 3 — KIỂM TRA THỬ SCRIPT
Bước 1. Chạy thủ công
 • Chuột phải file → Run as Administrator.
 • Quan sát cửa sổ dòng lệnh: nếu thấy thông báo [INFO] Backup hoàn tất!, là OK.
Kiểm tra thư mục D:\MySQL_Backup → có file như:
labdb_2025-10-23_07-30.sql
backup_log.txt
Bước 2. Thử khôi phục (kiểm tra tính toàn vẹn)
Mở Workbench → chạy:
DROP DATABASE IF EXISTS labdb_test;
CREATE DATABASE labdb_test;
USE labdb_test;
SOURCE D:/MySQL_Backup/labdb_2025-10-23_07-30.sql;
Nếu không lỗi → file backup hợp lệ ✅.
🕒 PHẦN 4 — TẠO LỊCH TỰ ĐỘNG VỚI TASK SCHEDULER
Bước 1. Mở Task Scheduler
 • Gõ Task Scheduler trong Start Menu → Enter.
Bước 2. Chọn Create Basic Task
 • Đặt tên: MySQL Daily Backup
 • Mô tả: “Tự động sao lưu database labdb mỗi ngày”.
Bước 3. Chọn thời gian chạy
 • Chọn Daily
 • Đặt giờ chạy (ví dụ: 02:00 AM)
Bước 4. Chọn hành động
 • Chọn Start a program
Bước 5. Chỉ định chương trình
 • Program/script:
D:\MySQL_Backup\mysql_auto_backup.bat
 • Không cần thêm đối số.
Bước 6. Hoàn tất
 • Tick chọn “Open the Properties dialog…” trước khi Finish.
Bước 7. Trong cửa sổ Properties:
 • Tab General → tick Run with highest privileges
 • Tab Conditions → bỏ chọn “Start the task only if the computer is on AC power” (nếu là laptop)
 • Tab Settings → tick “Run task as soon as possible after a scheduled start is missed”
Nhấn OK → nhập mật khẩu tài khoản quản trị Windows nếu được yêu cầu.
🧾 PHẦN 5 — KIỂM TRA VÀ GIÁM SÁT
1️⃣ Kiểm tra lịch chạy
Trong Task Scheduler → click chuột phải → Run → quan sát log backup_log.txt.
2️⃣ Xem lịch sử
Tab History → xác nhận task chạy thành công (Event ID = 102).
3️⃣ Mẹo nâng cao
 • Dùng biến %DATE% & %TIME% để đánh dấu thời gian chính xác.
 • Dùng công cụ nén (7zip, WinRAR) để tiết kiệm dung lượng.
 • Dùng user backup riêng, chỉ cấp quyền SELECT, LOCK TABLES, SHOW VIEW, TRIGGER.
🧠 GỢI Ý MỞ RỘNG CHO SINH VIÊN (Thực hành nâng cao)
 1. Tự viết script backup nhiều database (–all-databases).
 2. Gửi email thông báo khi backup thành công/thất bại (PowerShell hoặc Blat).
 3. Chia ổ lưu trữ (E:\ hoặc NAS) để đảm bảo tách biệt dữ liệu – backup.
 4. Kết hợp với OneDrive / Google Drive để tự động đồng bộ bản sao.
🧩 TÓM TẮT QUY TRÌNH
Bước Nội dung Kết quả
1 Viết file .bat backup Tạo file dump .sql
2 Test chạy thủ công Kiểm tra hoạt động đúng
3 Tạo Task Scheduler Lên lịch chạy tự động
4 Theo dõi log backup Xác minh tính ổn định
5 Kiểm thử phục hồi Đảm bảo restore được
——————–

 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 mysqlsh và 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: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_Backup có 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.dumpSchemasutil.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 object util với các hàm dumpInstance, dumpSchemas, loadDump. Mình đưa script theo API phổ biến — nếu mysqlsh báo lỗi, chạy mysqlsh --help hoặc help(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ếp util.dumpSchemas(...)util có 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ó:

🧠 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 đương mysqldump như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 .sql hoặc .zst (nếu nén), lưu tại D:\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)

  1. Mở Task SchedulerCreate Basic Task
  2. Đặt tên: “MySQL Auto Backup JS”
  3. Chọn Daily (hoặc Weekly)
  4. Action → Start a program
  5. Trong “Program/script”, nhập:
    mysqlsh
    
  6. Trong “Add arguments”, nhập:
    --js -f "D:\Scripts\backup.js"
    
  7. 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ỳ

 

 

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *