在Linux系统中,数据库备份是保障数据安全的核心操作,无论是应对硬件故障、误操作还是恶意攻击,完善的备份机制都能快速恢复数据,降低业务损失,Linux环境下主流数据库(如MySQL、PostgreSQL、MongoDB等)均有成熟的备份工具和方法,需根据数据库类型、业务需求(如恢复时间目标RTO、恢复点目标RPO)选择合适的备份策略,以下从不同数据库类型出发,详细说明备份方法、工具使用及最佳实践。
MySQL数据库备份方法
MySQL作为最常用的关系型数据库之一,提供了多种备份工具,逻辑备份工具mysqldump
最为通用,物理备份工具mysqlbackup
(企业版)或Percona XtraBackup
(开源)则适合大型数据库的高效备份。
逻辑备份:mysqldump
mysqldump
通过导出SQL语句实现备份,支持全量、单表、单库备份,适用于中小型数据库或需要跨版本迁移的场景。
- 全量备份(备份所有数据库):
mysqldump -u root -p --all-databases > /backup/mysql_full_$(date +%F).sql
执行后会提示输入密码,备份结果为包含所有数据库表结构和数据的SQL文件。
- 单库备份:
mysqldump -u root -p 数据库名 > /backup/db_name_$(date +%F).sql
- 单表备份:
mysqldump -u root -p 数据库名 表名 > /backup/table_name_$(date +%F).sql
- 压缩备份(节省存储空间):
mysqldump -u root -p --all-databases | gzip > /backup/mysql_full_$(date +%F).sql.gz
- 避免锁表(适用于InnoDB引擎):
添加--single-transaction
参数,通过事务快照实现热备份,避免阻塞业务:mysqldump -u root -p --single-transaction --all-databases > /backup/mysql_full_$(date +%F).sql
增量备份:基于二进制日志(binlog)
全量备份备份所有数据,但备份间隔内的数据变更需通过增量备份补充,MySQL的binlog记录所有数据修改操作,可通过mysqlbinlog
工具提取增量数据。
- 开启binlog(确保MySQL配置中已启用):
编辑/etc/my.cnf
,添加:[mysqld] log-bin=mysql-bin binlog-format=ROW
重启MySQL服务后,
/var/lib/mysql/
下会生成mysql-bin.000001
等binlog文件。 - 执行增量备份:
假设全量备份时的binlog文件为mysql-bin.000001
,当前最新binlog为mysql-bin.000003
,则增量备份命令为:mysqlbinlog --start-position=4 --stop-position=1073741824 /var/lib/mysql/mysql-bin.000002 /var/lib/mysql/mysql-bin.000003 > /backup/mysql_incremental_$(date +%F).sql
实际操作中可通过
mysqladmin flush-logs
刷新binlog,记录全量备份时的binlog文件名和位置,后续增量备份基于此位置提取。
物理备份:Percona XtraBackup
对于大型数据库,物理备份直接复制数据文件,恢复速度快且支持热备份,Percona XtraBackup是开源的MySQL物理备份工具。
- 安装XtraBackup:
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-8.0.28/binary/redhat/7/x86_64/percona-xtrabackup-80-8.0.28-1.el7.x86_64.rpm rpm -ivh percona-xtrabackup-80-8.0.28-1.el7.x86_64.rpm
- 全量物理备份:
innobackupex --user=root --password=密码 --defaults-file=/etc/my.cnf --backup --target-dir=/backup/full_$(date +%F)
- 应用日志并准备备份(确保备份一致性):
innobackupex --apply-log /backup/full_2023-10-01
- 恢复数据:
停止MySQL服务,替换数据文件:systemctl stop mysqld rm -rf /var/lib/mysql/* innobackupex --copy-back /backup/full_2023-10-01 chown -R mysql:mysql /var/lib/mysql systemctl start mysqld
PostgreSQL数据库备份方法
PostgreSQL提供了逻辑备份工具pg_dump
和物理备份工具pg_basebackup
,前者适合灵活导出,后者适合流复制和集群环境。
逻辑备份:pg_dump
pg_dump
支持自定义格式、目录格式等,可备份单表、单库或整个集群。
- 单库备份(纯文本格式):
pg_dump -U postgres -d 数据库名 > /backup/db_name_$(date +%F).sql
- 自定义格式备份(支持压缩和并行):
pg_dump -U postgres -d 数据库名 -Fc -f /backup/db_name_$(date +%F).dump
- 备份所有数据库(需
pg_dumpall
):pg_dumpall -U postgres > /backup/all_dbs_$(date +%F).sql
物理备份:pg_basebackup
pg_basebackup
直接复制数据文件,支持流式备份(适合异地容灾),需在PostgreSQL配置中启用wal_level=replica
。
- 本地物理备份:
pg_basebackup -U postgres -D /backup/full_$(date +%F) -Ft -z -P
参数说明:
-D
指定备份目录,-Ft
使用tar格式,-z
压缩,-P
显示进度。 - 流式备份(通过网络传输到远程服务器):
pg_basebackup -U postgres -h 192.168.1.100 -D /backup/full_$(date +%F) -Ft -z -P --progress
MongoDB数据库备份方法
MongoDB作为NoSQL数据库,提供逻辑备份工具mongodump
和物理备份(文件系统快照),前者适合灵活导出,后者适合大规模数据备份。
逻辑备份:mongodump
mongodump
支持备份单库、单集合或整个实例,可压缩备份。
- 全量备份:
mongodump --host localhost --port 27017 --out /backup/full_$(date +%F)
- 单库备份:
mongodump --host localhost --port 27017 --db 数据库名 --out /backup/db_name_$(date +%F)
- 压缩备份:
mongodump --host localhost --port 27017 --gzip --archive=/backup/mongo_backup_$(date +%F).gz
增量备份:基于oplog
MongoDB的oplog记录所有操作,可通过mongodump
的--oplog
参数实现增量备份,需先确保oplog大小足够(默认5%磁盘空间)。
- 开启oplog(默认已开启,检查配置文件
mongod.conf
):storage: oplogSizeMB: 1024 # 设置oplog大小为1GB
- 增量备份:
mongodump --host localhost --port 27017 --oplog --out /backup/incremental_$(date +%F)
物理备份:文件系统快照
对于MongoDB,最可靠的物理备份是使用LVM快照或云平台快照,需先执行fsync
并锁定写入:
mongosh --eval "db.fsyncLock()" # 执行LVM快照:lvcreate -L 100G -s -n mongo_snap /dev/vg/mongo_data mongosh --eval "db.fsyncUnlock()"
快照完成后,挂载快照目录并复制数据文件,最后卸载快照。
备份工具对比与适用场景
数据库类型 | 工具名称 | 备份类型 | 适用场景 | 优点 | 缺点 |
---|---|---|---|---|---|
MySQL | mysqldump | 逻辑 | 中小型数据库、跨版本迁移 | 兼容性好、支持灵活导出 | 大数据量时慢、可能锁表 |
MySQL | Percona XtraBackup | 物理 | 大型数据库、高并发场景 | 热备份、恢复快、支持增量 | 需额外安装工具、依赖特定存储引擎 |
PostgreSQL | pg_dump | 逻辑 | 单库/单表备份、逻辑迁移 | 支持自定义格式、压缩 | 恢复速度较慢 |
PostgreSQL | pg_basebackup | 物理 | 流复制、集群备份、快速恢复 | 恢复快、支持流式传输 | 需PostgreSQL集群支持、只能同版本恢复 |
MongoDB | mongodump | 逻辑 | 单库/单集合备份、灵活导出 | 支持压缩、易用 | 大数据量时性能开销大 |
MongoDB | 文件系统快照 | 物理 | 大规模数据、高可靠性要求 | 速度快、不影响业务 | 需底层存储支持(如LVM)、需短暂锁定 |
备份策略与最佳实践
- 定期性:根据RPO制定备份频率,如全量备份每天1次,增量备份每小时1次,binlog或oplog实时同步。
- 存储位置:备份文件需存储在独立磁盘或远程服务器(如NAS、SFTP、云存储),避免与数据服务器同时故障。
- 备份验证:定期执行恢复测试,确保备份文件可用性,例如MySQL可通过
mysql -u root -p 数据库名 < backup.sql
验证。 - 安全措施:备份文件加密(如
openssl
)、权限控制(仅管理员可读),避免敏感数据泄露。 - 监控与告警:通过脚本监控备份状态(如磁盘空间、备份成功率),失败时及时告警(如邮件、钉钉通知)。
注意事项
- 备份前检查:确保数据库运行正常,磁盘空间充足(
df -h
检查备份目录),避免备份过程中因空间不足中断。 - 锁表控制:生产环境优先使用热备份工具(如
mysqldump --single-transaction
、XtraBackup),避免长时间锁表影响业务。 - 备份文件命名:包含时间戳(如
backup_20231001.sql
),便于管理和恢复时定位。 - 日志记录:记录备份时间、大小、状态到日志文件(如
echo "$(date): Backup completed" >> /backup.log
),便于审计。
相关问答FAQs
Q1: 如何设置MySQL每天凌晨2点自动全量备份并压缩?
A: 使用crontab
添加定时任务,编辑crontab -e
,添加以下内容:
0 2 * * * /usr/bin/mysqldump -u root -p'密码' --all-databases | gzip > /backup/mysql_backup_$(date +%Y%m%d).sql.gz 2>&1
注意:密码明文不安全,建议通过配置文件.my.cnf
(权限600)存储密码,修改命令为:
0 2 * * * /usr/bin/mysqldump --defaults-file=/root/.my.cnf --all-databases | gzip > /backup/mysql_backup_$(date +%Y%m%d).sql.gz 2>&1
Q2: PostgreSQL物理备份和逻辑备份的主要区别是什么?
A: 区别主要体现在备份方式、恢复速度和适用场景:
- 物理备份(如
pg_basebackup
):直接复制数据文件(如表空间、WAL日志),恢复时直接替换数据文件,速度快(分钟级),适合大型数据库或快速恢复需求;但只能同版本恢复,且需数据库运行在归档模式。 - 逻辑备份(如
pg_dump
):导出SQL语句(CREATE TABLE、INSERT等),恢复时需执行SQL重建数据,速度较慢(小时级),但支持跨版本/跨平台迁移,适合小型数据库或数据迁移场景。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/22564.html