mysqldump -u root -p --single-transaction --routines --triggers --events --all-databases > full_backup_$(date +%F).sql
關鍵參數:
--single-transaction:InnoDB 一致性快照,無阻塞--routines --triggers --events:包含存儲過程/觸發器/事件# 單庫 mysqldump -u root -p --single-transaction mydb > mydb.sql # 多庫 mysqldump -u root -p --single-transaction --databases db1 db2 db3 > multi_db.sql # 單表 mysqldump -u root -p --single-transaction mydb users > users.sql
# 僅結構(含 DROP IF EXISTS) mysqldump -u root -p --no-data --single-transaction mydb > schema.sql # 僅數據 mysqldump -u root -p --no-create-info --single-transaction mydb > data_only.sql
# 從 host1 同步到 host2(需 host2 已建庫) mysqldump -h host1 -u root -p --single-transaction --compress source_db | mysql -h host2 -u root -p target_db
--opt 為預設開啟,等效於:
--add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --quick --set-charset
效果:
DROP TABLE IF EXISTSINSERT 前後加 LOCK/UNLOCK TABLESINSERT(--extended-insert)--quick)# 編輯 /etc/crontab 30 2 * * * root mysqldump -u backup_user -p'Pass#123' --single-transaction --all-databases | gzip > /backup/mysql/full_$(date +\%F).sql.gz # 保留 30 天 0 3 * * * root find /backup/mysql -name "full_*.sql.gz" -mtime +30 -delete
#!/bin/bash
# /usr/local/bin/mysql_backup.sh
BACKUP_DIR="/backup/mysql"
LOG_FILE="/var/log/mysql_backup.log"
RETENTION_DAYS=30
DB_USER="backup_user"
DB_PASS="Pass#123"
mkdir -p "$BACKUP_DIR"
exec >> "$LOG_FILE" 2>&1
echo "[$(date)] 開始備份..."
FILENAME="full_$(date +%F_%H-%M).sql.gz"
mysqldump -u "$DB_USER" -p"$DB_PASS" --single-transaction --routines --triggers --events --all-databases | gzip > "$BACKUP_DIR/$FILENAME"
if [ $? -eq 0 ]; then
echo "[$(date)] 備份成功: $FILENAME ($(du -h "$BACKUP_DIR/$FILENAME" | cut -f1))"
# 清理舊備份
find "$BACKUP_DIR" -name "full_*.sql.gz" -mtime +$RETENTION_DAYS -delete
else
echo "[$(date)] 備份失敗!"
# 這裡可接入告警:發送郵件/鉚釘/企業微信
fi
# /etc/my.cnf [mysqld] log-bin = /var/log/mysql/mysql-bin binlog_format = ROW expire_logs_days = 7 server-id = 1
mysqldump -u root -p --single-transaction --flush-logs --master-data=2 --all-databases > backup_$(date +%F).sql
--master-data=2:輸出 CHANGE MASTER TO 註釋(含 Binlog 位置)
--flush-logs:切換新 Binlog 文件,增量起點清晰
# 1. 恢復全量備份 mysql -u root -p < backup_2024-01-15.sql # 2. 恢復增量 Binlog(假設從 mysql-bin.000003 開始) mysqlbinlog /var/log/mysql/mysql-bin.000003 | mysql -u root -p # 3. 指定時間點恢復(精確到秒) mysqlbinlog --stop-datetime="2024-01-16 10:30:00" /var/log/mysql/mysql-bin.000003 | mysql -u root -p # 4. 跳過故障時段恢復 mysqlbinlog --start-datetime="2024-01-16 10:35:00" /var/log/mysql/mysql-bin.000003 | mysql -u root -p
| 參數 | 用途 | 示例 |
|---|---|---|
| --start-datetime | 從指定時間開始 | --start-datetime="2024-01-01 00:00:00" |
| --stop-datetime | 到指定時間停止 | --stop-datetime="2024-01-01 23:59:59" |
| --start-position | 從指定位置開始 | --start-position=12345 |
| --stop-position | 到指定位置停止 | --stop-position=67890 |
| --database | 僅恢復指定庫 | --database=mydb |
mydumper/myloader 並行備份恢復(速度提升 5-10 倍)