Node.js 在 Linux 的数据备份与恢复实践
一 备份范围与策略
二 数据库备份与恢复
mysqldump -u [username] -p[password] [database_name] > /backup/db_$(date +%F).sqlconst { exec } = require('child_process');
const db = 'mydb', user = 'root', pass = '******', out = `/backup/db_${new Date().toISOString().slice(0,10)}.sql`;
exec(`mysqldump -u ${user} -p${pass} ${db} > ${out}`, (err) => {
if (err) console.error('备份失败:', err);
else console.log('备份成功:', out);
});
mysql -u [username] -p[password] [database_name] < /backup/db_YYYY-MM-DD.sqlmongodump --uri="mongodb://[user]:[pass]@[host:port]/[db]" --out /backup/mongo_$(date +%F)mongorestore --uri="mongodb://[user]:[pass]@[host:port]/[db]" /backup/mongo_YYYY-MM-DD/[db]三 文件与日志的备份与恢复
tar -czvf /backup/app_$(date +%F).tar.gz -C /var/www my_node_apprsync -avz --delete /var/www/my_node_app/ user@remote:/backup/my_node_app/tar -xzvf /backup/app_YYYY-MM-DD.tar.gz -C /restorersync -av /backup/my_node_app/ /var/www/my_node_app//var/log/nodejs/*.log {
daily
rotate 7
compress
missingok
notifempty
create 640 node node
postrotate
kill -USR1 $(cat /var/run/node.pid 2>/dev/null || pidof node) || true
endscript
}
logrotate -d /etc/logrotate.d/nodejs;logrotate -f /etc/logrotate.d/nodejs四 自动化与落地脚本
#!/usr/bin/env bash
set -Eeuo pipefail
APP=/var/www/my_node_app
BACKUP=/backup
DATE=$(date +%F)
mkdir -p "$BACKUP"
# 1) 代码与静态资源
tar -czf "$BACKUP/app_$DATE.tar.gz" -C "$APP" .
# 2) 数据库(MySQL)
mysqldump -u root -p'******' mydb > "$BACKUP/db_$DATE.sql"
# 3) 打包并清理旧备份(保留7天)
tar -czf "$BACKUP/full_$DATE.tar.gz" -C "$BACKUP" app_$DATE.tar.gz db_$DATE.sql
rm -f "$BACKUP"/{app_*,db_*} "$BACKUP"/full_*.tar.gz
find "$BACKUP" -type f -mtime +7 -delete
0 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1tar -xzvf /backup/full_YYYY-MM-DD.tar.gz -C /restoretar -xzvf /restore/app_YYYY-MM-DD.tar.gz -C /var/www/my_node_appmysql -u root -p mydb < /restore/db_YYYY-MM-DD.sqlsystemctl restart my_node_app 或 pm2 restart my_node_app。五 误删与灾难恢复建议
umount /dev/sdb1/usr/local/extundelete/bin/extundelete /dev/sdb1 --inode 2