首頁 >資料庫 >mysql教程 >Node定時備份MySQL怎麼實現

Node定時備份MySQL怎麼實現

王林
王林轉載
2023-06-02 22:58:05779瀏覽

    前言

    前段時間發生了一件令我哭笑不得的事,部署在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點 備份,特定時間格式可參考下圖,或官方文件:

    Node定時備份MySQL怎麼實現

    在備份成功的回呼中,呼叫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怎麼實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述:
    本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除