在Linux环境中,数据库备份是保障数据安全的核心操作,无论是应对硬件故障、软件崩溃还是人为误操作,完善的备份机制都能快速恢复数据,降低业务损失,不同数据库系统的备份方法存在差异,本文将详细介绍MySQL/MariaDB、PostgreSQL、MongoDB等主流数据库在Linux中的备份实践,包括工具使用、命令参数、备份策略及自动化方案。
MySQL/MariaDB数据库备份
MySQL和MariaDB作为最常用的关系型数据库之一,支持多种备份方式,主要分为逻辑备份(导出SQL语句)和物理备份(直接复制数据文件)。
逻辑备份:mysqldump工具
mysqldump是官方提供的逻辑备份工具,可导出数据库结构(CREATE语句)和数据(INSERT语句),支持单表、单库或全库备份,且能在运行时加表锁(避免数据不一致),适合中小型数据库。
基础命令示例:
- 备份单个数据库(不包含创建数据库语句):
mysqldump -u root -p --databases db_name > db_backup.sql
- 备份所有数据库(包含创建数据库语句):
mysqldump -u root -p --all-databases > all_db_backup.sql
- 备份单表并压缩存储(节省空间):
mysqldump -u root -p db_name table_name | gzip > table_backup.sql.gz
关键参数说明:
--single-transaction
:InnoDB引擎下不加锁备份(避免阻塞写操作,推荐生产环境使用);--master-data=2
:记录备份时的binlog位置(用于主从同步或时间点恢复);--routines --triggers
:备份存储过程和触发器;--events
:备份事件调度器事件;--hex-blob
:二进制字段(如blob、binary)以十六进制格式导出,避免乱码。
物理备份:Percona XtraBackup
对于大型InnoDB数据库,物理备份(直接复制ibdata1、ibd等文件)效率更高,且支持热备份(不锁表),Percona XtraBackup是开源物理备份工具,通过复制数据页和redo log实现一致性备份。
基础命令示例:
- 全量物理备份(输出到指定目录):
innobackupex --user=root --password=your_password /backup/data
- 备份完成后应用日志(确保数据一致性):
innobackupex --apply-log /backup/data
- 恢复数据(需先停止MySQL服务):
service mysql stop innobackupex --copy-back /backup/data chown -R mysql:mysql /var/lib/mysql # 修改权限 service mysql start
自动化备份脚本
结合crontab可实现定时备份,例如每日凌晨2点备份数据库并保留7天:
#!/bin/bash DATE=$(date +%Y%m%d) BACKUP_DIR="/backup/mysql" MYSQL_USER="root" MYSQL_PASS="your_password" # 备份数据库并压缩 mysqldump -u$MYSQL_USER -p$MYSQL_PASS --all-databases | gzip > $BACKUP_DIR/mysql_$DATE.sql.gz # 删除7天前的备份 find $BACKUP_DIR -name "mysql_*.sql.gz" -mtime +7 -exec rm {} ;
将脚本保存为/usr/local/bin/mysql_backup.sh
,并添加到crontab:
0 2 * * * /usr/local/bin/mysql_backup.sh
PostgreSQL数据库备份
PostgreSQL支持逻辑备份(pg_dump)、物理备份(pg_basebackup)及WAL(Write-Ahead Logging)归档备份,适合不同场景需求。
逻辑备份:pg_dump工具
pg_dump是PostgreSQL官方逻辑备份工具,支持自定义、目录、归档三种格式,其中自定义格式(-Fc
)压缩率高且恢复灵活。
基础命令示例:
- 备份单个数据库(自定义格式):
pg_dump -U postgres -Fc -f db_backup.dump db_name
- 备份所有数据库(需pg_dumpall):
pg_dumpall -U postgres -f all_db_backup.sql
- 备份表结构(不含数据):
pg_dump -U postgres -s -f schema.sql db_name
关键参数说明:
-F
:指定输出格式(c=自定义,d=目录,t=纯文本);-v
:详细输出,便于调试;-Z
:压缩级别(0-9,默认6);-j
:并行备份(提升大库备份速度)。
物理备份:pg_basebackup
pg_basebackup用于流复制或主从架构的物理备份,直接复制数据目录,支持备份时运行(-R
参数会自动生成recovery.conf)。
基础命令示例:
- 本地物理备份(无需停止服务):
pg_basebackup -U postgres -D /backup/postgresql -Ft -z -P
- 远程物理备份(通过流复制协议):
pg_basebackup -h remote_host -U replication_user -D /backup/postgresql -Ft -z
WAL归档备份(时间点恢复)
PostgreSQL基于WAL实现事务日志记录,结合全量备份和WAL归档可恢复到任意时间点,配置步骤如下:
- 修改
postgresql.conf
:wal_level = replica archive_mode = on archive_command = 'cp %p /backup/wal/%f'
- 重启PostgreSQL服务,WAL日志会自动归档到
/backup/wal/
目录。 - 恢复时,先恢复全量备份,然后将WAL文件按顺序应用即可。
MongoDB数据库备份
MongoDB作为NoSQL数据库,支持逻辑备份(mongodump)和物理备份(文件系统复制),分片集群还需配合备份工具(如MongoDB Backup)。
逻辑备份:mongodump工具
mongodump是官方逻辑备份工具,支持全量备份和基于oplog的增量备份,可导出BSON格式数据。
基础命令示例:
- 全量备份(默认导出到dump目录):
mongodump --host localhost --port 27017 --db db_name --out /backup/mongo
- 备份并压缩:
mongodump --db db_name --archive=mongo_backup.archive --gzip
- 备份单个集合:
mongodump --collection collection_name --db db_name
关键参数说明:
--oplog
:记录备份期间的oplog(用于增量备份);--query
:按条件备份(如--query '{status: "active"}'
);--username
/--password
:认证用户备份。
物理备份:文件系统复制
对于独立MongoDB实例,可直接复制数据目录(/var/lib/mongo
),但需先锁定数据库(避免写入):
mongo --eval "db.fsyncLock()" # 锁定数据库 cp -r /var/lib/mongo /backup/mongo_data mongo --eval "db.fsyncUnlock()" # 解锁数据库
注意:物理备份需确保MongoDB服务停止,或通过fsyncLock
短暂锁定,否则可能导致数据不一致。
增量备份
通过oplog实现增量备份,需先开启oplog(默认大小5%磁盘空间):
# 备份全量数据并记录oplog时间点 mongodump --oplog --out /backup/mongo_full # 后续增量备份(基于oplog时间戳) mongodump --oplogReplay --db db_name --out /backup/mongo_incr
通用备份策略与最佳实践
不同数据库的备份工具和命令虽有差异,但通用策略可总结为以下几点:
备份类型组合
- 全量备份+增量备份:全量备份周期较长(如每周),增量备份周期较短(如每天),减少存储空间和备份时间;
- 全量备份+日志备份:如MySQL的binlog、PostgreSQL的WAL,可实现时间点恢复。
备份存储与安全
- 异地存储:备份数据同步至远程服务器或云存储(如AWS S3、阿里云OSS),避免本地灾难;
- 加密备份:使用
openssl
或工具自带加密功能(如mysqldump --aes-256-cbc
),防止数据泄露; - 权限控制:备份文件设置严格权限(
chmod 600
),仅授权用户可访问。
备份验证与恢复测试
- 定期验证:通过恢复备份文件检查数据完整性(如
mysql -u root -p < db_backup.sql
); - 恢复演练:模拟故障场景,测试恢复流程和时间,确保备份可用性。
不同数据库备份工具对比
数据库类型 | 工具名称 | 备份类型 | 适用场景 | 优点 |
---|---|---|---|---|
MySQL/MariaDB | mysqldump | 逻辑备份 | 中小型数据库、结构迁移 | 兼容性好,可跨版本恢复 |
MySQL/MariaDB | XtraBackup | 物理备份 | 大型InnoDB数据库、热备份 | 不锁表,效率高 |
PostgreSQL | pg_dump | 逻辑备份 | 精准备份(表/索引) | 支持多种输出格式,压缩率高 |
PostgreSQL | pg_basebackup | 物理备份 | 流复制、主从架构 | 直接复制数据文件,恢复快速 |
MongoDB | mongodump | 逻辑备份 | NoSQL数据库、增量备份 | 支持oplog,灵活过滤集合 |
MongoDB | 文件系统复制 | 物理备份 | 独立实例、快速备份 | 无需工具,直接复制数据目录 |
相关问答FAQs
Q1:如何设置MySQL自动定时备份并保留最近30天的备份?
A:可通过crontab结合mysqldump实现,首先编写备份脚本(如/usr/local/bin/mysql_auto_backup.sh
):
#!/bin/bash DATE=$(date +%Y%m%d) BACKUP_DIR="/backup/mysql" MYSQL_USER="root" MYSQL_PASS="your_password" RETENTION_DAYS=30 # 创建备份目录 mkdir -p $BACKUP_DIR # 执行备份并压缩 mysqldump -u$MYSQL_USER -p$MYSQL_PASS --all-databases --single-transaction | gzip > $BACKUP_DIR/mysql_$DATE.sql.gz # 删除30天前的备份 find $BACKUP_DIR -name "mysql_*.sql.gz" -mtime +$RETENTION_DAYS -exec rm {} ;
然后添加crontab任务(每天凌晨1点执行):
0 1 * * * /usr/local/bin/mysql_auto_backup.sh
最后赋予脚本执行权限:chmod +x /usr/local/bin/mysql_auto_backup.sh
。
Q2:PostgreSQL如何通过全量备份和WAL归档实现时间点恢复?
A:假设已配置WAL归档(archive_mode=on
),恢复步骤如下:
- 停止PostgreSQL服务:
systemctl stop postgresql
; - 替换数据目录:将备份的全量数据(如通过
pg_basebackup
获取)复制到数据目录(/var/lib/postgresql/data
),并修改权限:chown -R postgres:postgres /var/lib/postgresql/data
; - 创建恢复信号文件:在数据目录中创建
recovery.signal
文件(触发恢复模式); - 配置恢复目标(可选):在
postgresql.conf
中设置recovery_target_time
(如2023-10-01 12:00:00
)恢复到指定时间点,或recovery_target = 'latest'
恢复到最新可用状态; - 启动服务:
systemctl start postgresql
,PostgreSQL将自动应用WAL归档日志,直至达到恢复目标。
恢复完成后,recovery.signal
会自动删除,数据库进入正常读写模式。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/22552.html