詳見《MySQL mysqldump 導出導入命令大全》一文,此處列舉核心場景:
mysqldump -u... -p db > backup.sqlmysqldump ... | gzip > backup.sql.gzmysqldump --no-data ...--single-transaction --master-data=2mysql -u... -p db < backup.sql 或 gunzip -c backup.sql.gz | mysql ...# Windows 批次腳本 (bak.bat)
@echo off
net stop mysql
xcopy "D:\MySQL\data\*.*" "D:\mysqlbak\webbak%date:~0,10%\" /E /Y /C
net start mysql
Linux 對應:systemctl stop mysqld && rsync -av /var/lib/mysql/ /backup/mysql/ && systemctl start mysqld
# 安裝
yum install percona-xtrabackup-24 # 或 apt-get install percona-xtrabackup
# 完全備份
xtrabackup --backup --target-dir=/backup/full_$(date +%F) --user=root --password
# 增量備份 (基於上次完全備份)
xtrabackup --backup --target-dir=/backup/inc_$(date +%F) \
--incremental-basedir=/backup/full_2024-01-15 --user=root --password
# 準備/合併 (還原前必須)
xtrabackup --prepare --target-dir=/backup/full_2024-01-15
xtrabackup --prepare --apply-log-only --target-dir=/backup/full_2024-01-15 \
--incremental-dir=/backup/inc_2024-01-16
# 還原 (需停庫、清空 datadir)
xtrabackup --copy-back --target-dir=/backup/full_2024-01-15
chown -R mysql:mysql /var/lib/mysql
systemctl start mysqld
STOP SLAVE; mysqldump ...; START SLAVE;FLUSH TABLES WITH READ LOCK 獲取一致位置)<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
function copy_table($pdo, $from, $to) {
$stmt = $pdo->query("SELECT COUNT(*) FROM information_schema.tables WHERE table_schema=DATABASE() AND table_name='$to'");
if ($stmt->fetchColumn()) return false;
$pdo->exec("CREATE TABLE $to LIKE $from");
$pdo->exec("INSERT INTO $to SELECT * FROM $from");
return true;
}
copy_table($pdo, 'products', 'products_bak');
?>
| 場景 | 推薦方案 | RPO | RTO | 對主庫影響 |
|---|---|---|---|---|
| 中小型庫 (<50GB)、需跨版本遷移 | mysqldump 邏輯備份 | 小時級 | 小時級 | 輕微鎖表/IO |
| 大型庫 (>100GB)、同環境、有維護窗口 | 物理冷備份 (rsync/xtrabackup --backup) | 小時級 | 分鐘級 | 停機 |
| 核心業務 7×24、InnoDB 為主 | XtraBackup 熱備份 + 增量 | 分鐘級 | 分鐘級 | 極低 (僅 FLUSH TABLES) |
| 極低 RPO/RTO、跨機房容災 | 主從/主主 + 從庫備份 + Binlog 歸檔 | 秒級 | 秒級 | 無 |
gzip -c | openssl enc -aes-256-cbc -k "pass"