log-bin=mysql-bin,支援時間點恢復(PITR)。dbname_YYYY-MM-DD_HHMM.sql.gz,易於識別版本。gzip 節省空間。mysqldump -u root -p --single-transaction --routines --triggers --events db_name > /backup/db_name_$(date +%F_%H%M).sql
mysqldump -u root -p --single-transaction --routines --triggers --events --all-databases > /backup/all_dbs_$(date +%F_%H%M).sql
mysqldump -u root -p --single-transaction db_name | gzip > /backup/db_name_$(date +%F_%H%M).sql.gz
參數說明:
--single-transaction:InnoDB 熱備份不鎖表;
--routines --triggers --events:包含預存程序、觸發器、事件;
--master-data=2:在輸出檔頭部記錄 binlog 位置,利於 PITR。
FLUSH TABLES WITH READ LOCK;cp -a /var/lib/mysql /backup/mysql_$(date +%F) 或使用 tar/rsync。UNLOCK TABLES;適用 MyISAM 或已停止服務的 InnoDB;InnoDB 熱備份建議改用 Percona XtraBackup(開源、非阻塞、支援增量)。
mysql -u root -p db_name < /backup/db_name_2024-01-15_0300.sql
# 或壓縮檔
zcat /backup/db_name_2024-01-15_0300.sql.gz | mysql -u root -p db_name
mysqlbinlog --start-datetime="2024-01-15 03:00:00" --stop-datetime="2024-01-15 14:30:00" /var/lib/mysql/mysql-bin.000001 | mysql -u root -p#!/bin/bash
# /usr/local/bin/mysql_backup.sh
BACKUP_DIR="/backup/mysql"
DB_USER="backup_user"
DB_PASS="strong_password"
RETENTION_DAYS=7
mkdir -p "$BACKUP_DIR"
databases=$(mysql -u"$DB_USER" -p"$DB_PASS" -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema|sys)")
for db in $databases; do
mysqldump -u"$DB_USER" -p"$DB_PASS" --single-transaction --routines --triggers --events "$db" | gzip > "$BACKUP_DIR/${db}_$(date +%F_%H%M).sql.gz"
done
find "$BACKUP_DIR" -type f -mtime +$RETENTION_DAYS -name "*.gz" -delete
加入 crontab:0 3 * * * /usr/local/bin/mysql_backup.sh >> /var/log/mysql_backup.log 2>&1
| 方式 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| mysqldump | 跨版本/架構遷移、可編輯 SQL、支援 PITR | 大資料庫較慢、需鎖表或單一交易 | 中小型資料庫、異構遷移、開發測試 |
| XtraBackup | 非阻塞、支援增量、恢復快 | 僅限同主版本 InnoDB、檔案較大 | 生產大型 InnoDB、高可用環境 |
| 檔案複製 | 極速 | 需停服務/鎖表、不支援 PITR | 唯讀副本、MyISAM、離線維護窗口 |