Ubuntu 上备份 MySQL 的实用做法
一 手动备份常用命令
mysqldump -u 用户名 -p 数据库名 > /path/备份名.sqlmysqldump -u root -p mydb > /var/backups/mysql/mydb.sqlmysqldump -u 用户名 -p 数据库名 表1 [表2] > /path/表备份.sqlmysqldump -u root -p mydb users orders > /var/backups/mysql/mydb_tables.sqlmysqldump -u 用户名 -p --databases 库1 库2 > /path/多库备份.sqlmysqldump -u 用户名 -p --all-databases > /path/all_databases.sql--single-transaction--no-create-info--add-drop-tablemysqldump ... | gzip > /path/备份.sql.gzgzip /path/备份.sqlmysqldump -h 主机 -P 端口 -u 用户 -p 数据库 > /path/备份.sql二 自动化定时备份脚本
sudo mkdir -p /var/backups/mysql/usr/local/bin/backup_mysql.sh#!/usr/bin/env bash
set -Eeuo pipefail
DB_USER="backup_user"
DB_PASS="StrongPass!23"
DB_NAME="mydb"
BACKUP_DIR="/var/backups/mysql"
RETENTION_DAYS=7
DATE=$(date +"%Y%m%d_%H%M%S")
LOG="$BACKUP_DIR/backup_$DATE.log"
mkdir -p "$BACKUP_DIR"
echo "[$DATE] 开始备份: $DB_NAME" >> "$LOG"
mysqldump -u "$DB_USER" -p"$DB_PASS" \
--single-transaction \
--routines --triggers --events \
--hex-blob --set-gtid-purged=OFF \
"$DB_NAME" \
| gzip > "$BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz" 2>>"$LOG"
if [ $? -eq 0 ]; then
echo "[$DATE] 备份成功: ${DB_NAME}_${DATE}.sql.gz" >> "$LOG"
else
echo "[$DATE] 备份失败" >> "$LOG"
exit 1
fi
# 清理过期备份
find "$BACKUP_DIR" -name "${DB_NAME}_*.sql.gz" -mtime +$RETENTION_DAYS -delete >> "$LOG" 2>&1
echo "[$DATE] 清理完成,保留最近 $RETENTION_DAYS 天" >> "$LOG"
sudo chmod +x /usr/local/bin/backup_mysql.sh/usr/local/bin/backup_mysql.shsudo crontab -e0 2 * * * /usr/local/bin/backup_mysql.sh~/.my.cnf 配置凭据(见下文)。三 备份文件的安全与传输
rsync -avz /var/backups/mysql/ user@remote:/backup/mysql/scp /var/backups/mysql/mydb_*.sql.gz user@remote:/backup/mysql/sudo chown -R backup_user:backup_user /var/backups/mysql && sudo chmod 700 /var/backups/mysql四 恢复数据的常用方法
mysql -u 用户名 -p 数据库名 < /path/备份.sqlgunzip < /path/备份.sql.gz | mysql -u 用户名 -p 数据库名mysql -u 用户名 -p < /path/all_databases.sqlmysql 命令导入。五 实用建议与排错要点
CREATE USER 'backup_user'@'localhost' IDENTIFIED BY 'StrongPass!23';
GRANT SELECT, SHOW VIEW, RELOAD, LOCK TABLES, PROCESS, EVENT, TRIGGER ON *.* TO 'backup_user'@'localhost';
FLUSH PRIVILEGES;
~/.my.cnf 避免命令行暴露密码:[client]
user=backup_user
password=StrongPass!23
host=localhost
然后命令可简化为:mysqldump --single-transaction 数据库名 > backup.sql--single-transaction;MyISAM 需要全局读锁时可配合 --lock-all-tables(会短暂阻塞写入)。