Ubuntu上MySQL备份与恢复方法
mysqldump是MySQL自带的逻辑备份工具,可导出数据库结构(表结构、视图、存储过程等)和数据,生成可执行的SQL文件。
mysqldump -u [用户名] -p[密码] [数据库名] > [备份文件路径].sql
示例:备份mydatabase数据库到/home/user/backup目录,文件名包含时间戳:mysqldump -u root -p mydatabase > /home/user/backup/mydatabase_$(date +%Y%m%d_%H%M%S).sql
--all-databases选项,导出MySQL服务器上的所有数据库:mysqldump -u root -p --all-databases > /home/user/backup/all_databases.sql
gzip,减少存储空间占用:mysqldump -u root -p mydatabase | gzip > /home/user/backup/mydatabase.sql.gz
mysqlpump是MySQL 5.7及以上版本引入的并行备份工具,支持多线程导出,提升备份速度。
mysqlpump -u [用户名] -p[密码] [数据库名] > [备份文件路径].sql
示例:备份mydatabase数据库:mysqlpump -u root -p mydatabase > /home/user/backup/mydatabase_pump.sql
--all-databases选项:mysqlpump -u root -p --all-databases > /home/user/backup/all_databases_pump.sql
物理备份通过复制MySQL数据目录(默认/var/lib/mysql)实现,恢复速度快,但需停止MySQL服务。
sudo systemctl stop mysql
tar命令压缩数据目录:sudo tar -czvf /home/user/backup/mysql_physical_backup.tar.gz /var/lib/mysql
sudo systemctl start mysql
使用crontab设置定时任务,实现每日/每周自动备份。
/home/user/backup/mysql_backup.sh):#!/bin/bash
BACKUP_DIR="/home/user/backup"
DB_USER="root"
DB_PASS="yourpassword"
DATE=$(date +%Y%m%d_%H%M%S)
mysqldump -u $DB_USER -p$DB_PASS mydatabase | gzip > "$BACKUP_DIR/mydatabase_$DATE.sql.gz"
# 删除7天前的备份
find "$BACKUP_DIR" -type f -name "*.sql.gz" -mtime +7 -exec rm {} \;
chmod +x /home/user/backup/mysql_backup.sh
crontab(crontab -e),添加以下内容(每日凌晨2点执行):0 2 * * * /home/user/backup/mysql_backup.sh
通过mysql命令将备份的SQL文件导入数据库。
mysql -u [用户名] -p[密码] [数据库名] < [备份文件路径].sql
示例:恢复mydatabase数据库:mysql -u root -p mydatabase < /home/user/backup/mydatabase.sql
--all-databases选项:mysql -u root -p --all-databases < /home/user/backup/all_databases.sql
mysql -u root -p -e "CREATE DATABASE new_database;"
mysql -u root -p new_database < /home/user/backup/mydatabase.sql
若备份文件是.gz格式,需先解压再导入。
gunzip /home/user/backup/mydatabase.sql.gz
mysql -u root -p mydatabase < /home/user/backup/mydatabase.sql
物理恢复需停止MySQL服务,替换数据目录后重启。
sudo systemctl stop mysql
sudo mv /var/lib/mysql /var/lib/mysql_old
sudo mkdir /var/lib/mysql
sudo cp -R /home/user/backup/mysql_physical_backup/* /var/lib/mysql/
mysql)拥有数据目录的所有权:sudo chown -R mysql:mysql /var/lib/mysql
sudo systemctl start mysql
mysqlcheck工具检查并修复数据库:sudo mysqlcheck -u root -p --all-databases --auto-repair
若MySQL开启了二进制日志(log_bin=ON),可通过mysqlbinlog工具恢复指定时间段的增量数据。
SHOW VARIABLES LIKE 'log_bin';
若结果为ON,则表示已开启。/var/log/mysql/目录,文件名类似mysql-bin.000001。mysqlbinlog解析日志并过滤时间范围,再导入MySQL:mysqlbinlog --start-datetime="2025-10-10 10:00:00" --stop-datetime="2025-10-10 11:00:00" /var/log/mysql/mysql-bin.000001 | mysql -u root -p
Percona XtraBackup是开源热备份工具,支持InnoDB和XtraDB存储引擎,可在不锁表的情况下备份大型数据库。
sudo apt-get install percona-xtrabackup-24
sudo xtrabackup --backup --target-dir=/home/user/backup/xtrabackup
sudo xtrabackup --prepare --target-dir=/home/user/backup/xtrabackup
sudo xtrabackup --copy-back --target-dir=/home/user/backup/xtrabackup --datadir=/var/lib/mysql
sudo chown -R mysql:mysql /var/lib/mysql
sudo systemctl restart mysql