在Linux服务器上管理业务系统,数据库往往是最核心的资产。一旦遭遇误删表、磁盘损坏或勒索攻击,能否快速还原直接决定业务停摆时间。不同数据库引擎在Linux下的备份机制有所区别,但总体思路都是把数据一致性状态固化为可迁移的文件,并在需要时重新加载。

一、备份前的环境准备
动手备份之前,先确认数据库类型与版本。以最常见的MySQL和PostgreSQL为例,它们各自带有官方命令行工具,不需要额外安装复杂组件。在Linux终端中用以下命令可快速查看MySQL版本:
mysql -V psql --version
同时要保证执行备份的Linux用户具备对应库的读权限。对于MySQL,通常创建一个专用备份账号并授予SELECT与LOCK TABLES权限,避免直接用root操作带来的安全风险。PostgreSQL则可以把备份用户加入pg_read_all_data角色。
另外,备份文件存放路径要有足够磁盘空间。建议使用独立的挂载盘或网络存储,防止系统盘满导致备份中断。可以用df -h命令观察各分区使用率,提前规划容量。
二、MySQL逻辑备份与还原
2.1 使用mysqldump备份
mysqldump是最基础的逻辑备份工具,它将库表结构及数据导出为SQL文本。单库备份命令如下,其中-u后接用户名,-p表示交互式输入密码:
mysqldump -u backup_user -p mydb > /backup/mydb_$(date +%F).sql
如果数据库较大,可以加上--single-transaction参数,利用InnoDB快照保证一致性而不锁表。对于含存储过程或触发器的库,应补充--routines与--triggers选项。导出后建议用gzip压缩,节省空间:
mysqldump -u backup_user -p --single-transaction mydb | gzip > /backup/mydb_$(date +%F).sql.gz
逻辑备份的优点是跨版本兼容性好,文本可审计;缺点是恢复慢,数据量上亿行时导入耗时明显。因此日常全量配合增量binlog是常见组合。
2.2 还原MySQL备份
还原时先确保目标实例已启动且库存在。如果是压缩文件,先解压再导入:
gunzip < /backup/mydb_2023-01-01.sql.gz | mysql -u root -p mydb
若需整实例恢复且原库已不存在,可先创建空库再导入。导入过程会重建表与写入数据,大文件建议用screen或nohup防止终端断开。还原后执行CHECK TABLE或业务校验脚本确认行数一致。
当误删发生在线时,还应结合mysqlbinlog工具回放误操作之后的正常事务,实现点到点恢复。这就要求日常开启log_bin并定期备份二进制日志。
三、PostgreSQL备份与还原
3.1 pg_dump与pg_dumpall
PostgreSQL提供pg_dump做单库导出,pg_dumpall导出全部库与全局对象。基础用法:
pg_dump -U backup_user -F c -b -v mydb -f /backup/mydb.dump
上面-F c表示自定义压缩格式,-b包含大对象。这种格式只能用pg_restore还原,支持选择性恢复表。若用纯文本格式(-F p),则可直接用psql执行。
相比MySQL的SQL文本,自定义格式在体积与恢复灵活性上更优,但可读性差。运维中常根据审计需求选择格式,核心交易库多用自定义格式加每日调度。
3.2 还原操作
使用pg_restore还原到新建库:
createdb -U postgres newdb pg_restore -U postgres -d newdb /backup/mydb.dump
如果目标库已含部分对象,可加--clean先清除再导入。还原完毕后用ANALYZE更新统计信息,保障查询计划准确。PostgreSQL还支持从基础备份加WAL归档做PITR,适合金融级场景。
物理备份方面,可借助pg_basebackup生成数据目录副本,配合归档命令实现热备。但逻辑备份仍是开发测试环境最常用的轻量手段。
四、自动化与校验策略
4.1 利用cron定时备份
在Linux上写备份脚本并用crontab调度,能免去人工遗忘。示例脚本片段:
#!/bin/bash DATE=$(date +%F) mysqldump -u backup_user -p$PASS --single-transaction mydb | gzip > /backup/mydb_$DATE.sql.gz # 保留最近七天 find /backup -name "mydb_*.sql.gz" -mtime +7 -delete
将脚本存为/opt/backup.sh,赋予执行权限,然后在crontab -e中加入:
0 2 * * * /opt/backup.sh >> /var/log/backup.log 2>&1
这样每天凌晨两点自动备份。注意密码明文写在脚本中有泄露风险,更好做法是使用配置文件或环境变量限定权限为600。
4.2 备份校验不可省
备份不等于能恢复。许多团队直到出事才发现文件损坏。可定期在备用机做还原演练,或用sha256sum记录校验值:
sha256sum /backup/mydb_*.sql.gz > /backup/checksum.txt
还原演练建议每季度一次,把备份恢复到隔离实例,跑核心查询比对。只有经过验证的备份,才会在真正故障时节省决策时间。
此外,将备份同步到异地或对象存储,能抵御机房级灾难。Linux下可用rsync推送到备机,或借助s3cmd传至兼容S3的存储。
五、常见误区与注意事项
一个典型误区是认为复制数据目录就是备份。对于正在写入的MySQL,直接cp数据文件极易导致页断裂不一致,必须用专业工具或停库。另一个误区是备份频率过低,靠单份周备应对日活业务,一旦周三故障就丢两天单。
权限方面,备份文件本身应包含敏感信息,Linux下需设置chmod 600并归属专用用户。还原到生产前,务必在测试库验证脚本兼容性,避免字符集不同引发乱码。掌握这些细节,Linux上的数据库备份还原才能从纸上流程变成可靠防线。