Node定時備份MySQL的實現

前言

前段時間發生瞭一件令我哭笑不得的事,部署在 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部署

這裡需要先全局安裝 pm2

npm i pm2 -g

pm2 部署的命令格式為:pm2 start [nodejs文件] --name [別名]

pm2 start ./src/command/index.js --name backupDb

部署完成之後,可以通過 pm2 ls 命令查看。

至此,將在 每天凌晨1點 對數據庫進行 備份,並發送至 郵箱

結語

到此這篇關於Node定時備份MySQL的實現的文章就介紹到這瞭,更多相關Node定時備份MySQL內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: