在Linux环境下对MySQL数据库进行备份是系统管理员和开发人员的重要工作,确保数据安全性和可恢复性,MySQL提供了多种备份工具和命令,适用于不同场景和需求,如全量备份、增量备份、逻辑备份和物理备份等,以下是详细的备份命令及使用方法。

使用mysqldump进行逻辑备份
mysqldump是MySQL最常用的逻辑备份工具,可将数据库结构和数据导出为SQL文件,适用于小型到中型数据库,基本语法为:mysqldump [选项] 数据库名 [表名] > 备份文件.sql。
-
备份单个数据库
备份整个testdb数据库:mysqldump -u root -p testdb > testdb_backup.sql
执行后会提示输入密码,备份文件包含创建数据库、表结构和INSERT语句。
-
备份多个数据库
使用--databases选项可同时备份多个数据库:
(图片来源网络,侵删)mysqldump -u root -p --databases db1 db2 > multi_db_backup.sql
-
备份所有数据库
通过--all-databases选项备份整个MySQL服务器:mysqldump -u root -p --all-databases > all_db_backup.sql
-
备份指定表
若仅需备份testdb中的users和orders表:mysqldump -u root -p testdb users orders > tables_backup.sql
-
压缩备份文件
为节省磁盘空间,可通过管道压缩备份文件:mysqldump -u root -p testdb | gzip > testdb_backup.sql.gz
-
排除某些表
使用--ignore-table选项跳过特定表,例如备份testdb但排除logs表:
(图片来源网络,侵删)mysqldump -u root -p testdb --ignore-table=testdb.logs > backup_without_logs.sql
使用mysqlhotcopy进行快速备份
mysqlhotcopy适用于MyISAM和Archive引擎的表,通过锁定表并复制文件实现快速物理备份,语法为:mysqlhotcopy [选项] 数据库名 备份目录。
示例:
mysqlhotcopy -u root -p testdb /backup/testdb_backup
该命令会直接在/backup目录下创建testdb_backup文件夹,包含表文件(.MYD、.MYI)和结构文件(.frm)。
使用SELECT INTO OUTFILE进行数据导出
若仅需导出表数据(不含结构),可使用SELECT语句结合INTO OUTFILE:
mysql -u root -p -e "SELECT * FROM testdb.users INTO OUTFILE '/tmp/users_data.txt' FIELDS TERMINATED BY ',';"
注意:输出目录需有MySQL服务器写权限,且文件会被服务器直接创建。
增量备份与二进制日志
对于大型数据库,全量备份效率较低,可通过二进制日志(binlog)实现增量备份,首先需在MySQL配置文件中启用binlog:
[mysqld] log-bin=mysql-bin binlog-format=ROW
-
查看binlog状态
SHOW MASTER STATUS;
记录当前binlog文件名和位置(如
mysql-bin.000003, 12345)。 -
执行增量备份
全量备份后,后续只需定期备份binlog文件:cp /var/lib/mysql/mysql-bin.000003 /backup/
-
恢复数据
恢复时先导入全量备份,再应用binlog:mysql -u root -p testdb < testdb_backup.sql mysqlbinlog /backup/mysql-bin.000003 | mysql -u root -p
自动化备份脚本
使用cron定时任务可定期执行备份,每天凌晨2点备份testdb并保留7天备份:
#!/bin/bash DATE=$(date +%Y%m%d) BACKUP_DIR="/backup" mysqldump -u root -p testdb | gzip > $BACKUP_DIR/testdb_$DATE.sql.gz find $BACKUP_DIR -name "testdb_*.sql.gz" -mtime +7 -delete
将脚本保存为/backup/mysql_backup.sh,并添加到cron:
0 2 * * * /bin/bash /backup/mysql_backup.sh
备份恢复示例
-
恢复逻辑备份
mysql -u root -p testdb < testdb_backup.sql
-
恢复压缩备份
gunzip < testdb_backup.sql.gz | mysql -u root -p testdb
备份命令参数速查表
| 参数 | 说明 | 示例 |
|---|---|---|
-u |
指定用户名 | -u root |
-p |
提示输入密码 | -p |
--databases |
备份多个数据库 | --databases db1 db2 |
--all-databases |
备份所有数据库 | --all-databases |
--ignore-table |
排除指定表 | --ignore-table=testdb.logs |
--single-transaction |
适用于InnoDB,避免锁表 | --single-transaction |
--master-data |
记录binlog位置(增量备份用) | --master-data=2 |
相关问答FAQs
Q1: 如何备份远程MySQL数据库?
A1: 使用mysqldump时通过-h指定主机地址,
mysqldump -h 192.168.1.100 -u root -p testdb > remote_backup.sql
确保远程服务器允许从客户端IP连接,并正确配置防火墙和用户权限。
Q2: 备份时如何避免锁定表,避免影响业务?
A2: 对于InnoDB引擎,使用--single-transaction选项创建事务性备份,避免锁表:
mysqldump -u root -p --single-transaction testdb > backup.sql
但需注意,该选项不适用于MyISAM表,此时可考虑使用--master-data结合binlog实现热备份。
