在Linux环境下备份数据库是系统管理和运维中的重要任务,不同类型的数据库(如MySQL、PostgreSQL、MongoDB等)有其专属的备份命令和工具,掌握这些命令能够有效保障数据安全,以下将详细介绍常见数据库的备份方法、命令参数及注意事项。

MySQL/MariaDB数据库备份
MySQL和MariaDB作为广泛使用的开源关系型数据库,提供了mysqldump工具进行逻辑备份,支持全量备份、增量备份和特定表备份。
基础全量备份
全量备份是指导出数据库中的所有数据,适合定期完整备份场景,基本命令如下:
mysqldump -u [用户名] -p[密码] --all-databases > /backup/mysql_full_backup.sql
-u:指定数据库用户名,如root;-p:后接密码(注意密码与p之间无空格),或交互式输入密码;--all-databases:备份所有数据库,若需备份单个数据库,替换为数据库名(如mydb);>:将输出重定向到备份文件,建议使用.sql或.sql.gz后缀。
压缩备份
为节省存储空间,可在备份时直接压缩文件:
mysqldump -u root -p mydb | gzip > /backup/mydb_backup.sql.gz
或使用--compress参数启用压缩(需MySQL支持):

mysqldump -u root -p --compress mydb > /backup/mydb_backup.sql
单表备份
仅需备份特定表时,可在数据库名后添加表名:
mysqldump -u root -p mydb table1 table2 > /backup/mydb_tables_backup.sql
排除特定表
备份时需忽略某些表(如日志表),使用--ignore-table参数:
mysqldump -u root -p mydb --ignore-table=mydb.logs > /backup/mydb_no_logs.sql
备份二进制日志(增量备份基础)
MySQL的二进制日志(binlog)可用于增量备份,需先启用binlog(在my.cnf中配置log-bin=mysql-bin),备份binlog的命令:
mysqladmin -u root -p flush-logs # 生成新的binlog文件 cp /var/lib/mysql/mysql-bin.* /backup/ # 复制binlog文件
结合mysqlbinlog工具可恢复增量数据:
mysqlbinlog /backup/mysql-bin.000001 | mysql -u root -p
参数优化
--single-transaction:对于InnoDB引擎,此参数可避免锁表,确保备份期间数据库可正常写入;--routines:包含存储过程和函数;--triggers:包含触发器;--events:包含事件调度器。
示例:mysqldump -u root -p --single-transaction --routines --triggers mydb > /backup/mydb_complete.sql
PostgreSQL数据库备份
PostgreSQL提供pg_dump和pg_dumpall工具进行逻辑备份,pg_dumpall适合备份所有数据库(包括角色和权限)。
单数据库备份
pg_dump -U [用户名] -d [数据库名] -f /backup/pgsql_backup.sql
-U:指定超级用户(如postgres);-d:指定数据库名,若省略则需通过环境变量PGDATABASE设置;-f:指定输出文件路径。
自定义格式备份
PostgreSQL支持自定义格式(-Fc),压缩效率高且支持增量恢复:
pg_dump -U postgres -Fc -f /backup/pgsql_backup.dump mydb
备份所有数据库
pg_dumpall -U postgres > /backup/pgsql_all_databases.sql
备份期间允许连接
使用--no-password避免交互式输入密码(需配置.pgpass文件),或--if-exists避免表不存在时报错:
pg_dump -U postgres --if-exists mydb > /backup/pgsql_safe.sql
恢复数据
恢复时使用psql命令:
psql -U postgres -d mydb -f /backup/pgsql_backup.sql
MongoDB数据库备份
MongoDB作为NoSQL数据库,使用mongodump工具进行备份,支持全量、增量和快照备份。
全量备份
mongodump --host [主机名] --port [端口] --db [数据库名] --out /backup/mongodb_backup
--host:MongoDB服务地址,默认localhost;--port:端口,默认27017;--db:指定数据库名,若省略则备份所有数据库;--out:输出目录,备份结果以bson格式存储。
压缩备份
添加--gzip参数直接压缩备份文件:
mongodump --db mydb --out /backup/mongodb_backup --gzip
备份集合(表)
mongodump --db mydb --collection users --out /backup/mongodb_users
认证备份(需启用用户认证)
mongodump --host localhost --port 27017 --username admin --password password --db mydb --out /backup/mongodb_auth
恢复数据
使用mongorestore命令:
mongorestore --db mydb --dir /backup/mongodb_backup/mydb
Redis数据库备份
Redis作为内存数据库,支持RDB快照和AOF日志备份,通常通过redis-cli工具操作。
RDB快照备份
RDB是Redis默认的持久化方式,可通过SAVE或BGSAVE命令生成快照:
SAVE:阻塞式生成快照(不推荐生产环境使用);BGSAVE:后台异步生成快照(推荐)。
手动触发BGSAVE:redis-cli BGSAVE
快照文件默认保存在Redis配置的
dir目录下(如/var/lib/redis/dump.rdb),需定期复制备份文件:cp /var/lib/redis/dump.rdb /backup/redis_backup.rdb
AOF日志备份
AOF(Append Only File)记录所有写操作,数据更安全,可通过redis-cli重写AOF文件:
redis-cli BGREWRITEAOF
AOF文件默认为appendonly.aof,备份方式与RDB类似。
备份策略与自动化
定时备份
使用cron实现定时备份,例如每天凌晨2点备份MySQL数据库:
0 2 * * * mysqldump -u root -p'password' mydb | gzip > /backup/mysql_$(date +\%Y\%m\%d).sql.gz
注意:密码明文存储不安全,建议使用.my.cnf配置文件(设置[client]段的password,权限设为600)。
备份文件管理
- 定期清理旧备份(如保留30天),避免磁盘占满:
find /backup -name "*.sql.gz" -mtime +30 -delete
- 备份文件异地存储,避免单点故障。
备份验证
定期测试备份文件的可用性,例如恢复MySQL备份:
mysql -u root -p mydb < /backup/mysql_backup.sql
常见数据库备份命令对比
| 数据库 | 备份工具 | 全量备份示例 | 压缩选项 | 增量备份支持 |
|---|---|---|---|---|
| MySQL/MariaDB | mysqldump | mysqldump -u root -p mydb > backup.sql |
| gzip |
Binlog |
| PostgreSQL | pg_dump | pg_dump -U postgres mydb > backup.sql |
-Fc |
无(需第三方工具) |
| MongoDB | mongodump | mongodump --db mydb --out backup |
--gzip |
是(oplog) |
| Redis | redis-cli | redis-cli BGSAVE |
手动压缩 | RDB/AOF |
相关问答FAQs
Q1: MySQL备份时出现“mysqldump: Got error: 1449: The user specified as a definer does not exist”错误,如何解决?
A: 该错误通常因备份的存储过程或函数中使用了不存在的DEFINER用户导致,解决方法:
- 使用
--skip-definer参数跳过DEFINER定义:mysqldump -u root -p --skip-definer mydb > backup.sql
- 或修改存储过程,将
DEFINER改为当前用户:mysql -u root -p mydb -e "ALTER PROCEDURE procedure_name DEFINER = CURRENT_USER;"
Q2: 如何在Linux中实现MongoDB的增量备份?
A: MongoDB可通过oplog(操作日志)实现增量备份,步骤如下:
- 确保MongoDB已启用oplog(默认启用,存储大小通常为磁盘空间的5%):
rs.status() # 检查oplog信息
- 使用
mongodump的--oplog参数备份oplog:mongodump --db mydb --out /backup/incremental --oplog
- 恢复时先恢复全量备份,再应用oplog:
mongorestore --db mydb /backup/full_backup/mydb mongorestore --oplogRecover --db mydb /backup/incremental
注意:增量备份需基于全量备份,且oplog需保留足够时间。
