前段時間發生了一件令我哭笑不得的事,部署在Centos
伺服器上的項目,因為需要重新上傳· 部署
,所以我執行了下面一段命令:
rm -rf /*
當我按下回車之後,發現終端閃過的一行行程式碼,突然感覺事情並不簡單,情急之下,趕緊ctrl c
中斷終端,中斷之後,便開始透過fpt
上傳文件,卻發現ftp
毫無反應,這下慌了,不會把系統給乾沒了吧!
接下來我決定 重啟
伺服器,可是,emmm...,啟動不了了!真的把系統給幹沒了!詢問大佬們之後,聽說 阿里雲
如果存在 快照
,則可以恢復,可是我並沒有保存過快照!直接GG,程式沒了倒無所謂,可是 資料庫沒了。
這時我意識到,需要做個定時任務
,定時備份
資料庫,結合先前封裝的Email
類,將備份的資料庫發送至郵箱。
因為我後端使用的是 nodejs
,這裡就使用 nodejs
寫定時任務吧。
這裡需要 node-schedule
依賴來執行定時任務,需要 child_process
依賴來執行備份指令。
npm i node-schedule child_process
在src/command
目錄下新建一個BackupDB.ts
文件,在此文件中引入依賴:
import schedule from "node-schedule"; import { spawn } from "child_process"; import fs from "fs";
定義一個方法backupDb
,所有的備份操作都在此方法內:
export const backupDb = () => {}
在方法內使用時間戳
定義備份唯一
檔案名,並建立流程
:
export const backupDb = () => { const dumpFileName = `${Math.round(Date.now() / 1000)}.dump.sql`; const writeStream = fs.createWriteStream(dumpFileName); }
在方法內定義備份腳本:
export const backupDb = () => { const dumpFileName = `${Math.round(Date.now() / 1000)}.dump.sql`; const writeStream = fs.createWriteStream(dumpFileName); const dump = spawn("mysqldump",[ "-u", "你的mysql账户名", "-p", "你的mysql账户密码", "所要备份的数据库名" ]) }
接下來定時執行備份
指令:
export const backupDb = () => { const dumpFileName = `${Math.round(Date.now() / 1000)}.dump.sql`; const writeStream = fs.createWriteStream(dumpFileName); const dump = spawn("mysqldump",[ "-u", "你的mysql账户名", "-p", "你的mysql账户密码", "所要备份的数据库名" ]) schedule.scheduleJob("0 0 1 * * *", function(){ dump.stdout.pipe(writeStream) .on("finish",() => { console.log("备份成功") }) .on("error",() => { console.log("备份失败") }) }) }
當然這裡寫死的資料還可以當作函數參數可進行控制,另外這裡的0 0 1 * * *
表示每天凌晨1點
備份,特定時間格式可參考下圖,或官方文件:
在備份成功的回呼中,呼叫Email
類別將備份內容傳送至郵箱
,這裡不作為重點就暫且不寫。
最後在src/command/index.js
檔案中引入
備份方法並呼叫
:
import { backupDb } from "./BackupDB"; backupDb();
這裡需要先全域安裝pm2
:
npm i pm2 -g
#pm2
部署的指令格式為:pm2 start [nodejs檔案] -- name [別名]
:
pm2 start ./src/command/index.js --name backupDb
部署完成之後,可以透過pm2 ls
指令查看。
至此,將在 每天凌晨1點
對資料庫進行 備份
#,並發送至 郵箱
。
以上是Node定時備份MySQL怎麼實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!