Maison  >  Article  >  base de données  >  Comment implémenter une sauvegarde planifiée de MySQL dans Node

Comment implémenter une sauvegarde planifiée de MySQL dans Node

王林
王林avant
2023-06-02 22:58:05760parcourir

    Avant-propos

    Il s'est passé quelque chose qui m'a fait rire ou pleurer. Le projet déployé sur le serveur Centos avait besoin d'être ré-uploadé et Déploiement. . J'ai donc exécuté la commande suivante : 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点 备份,具体时间格式可参考下图,或官方文档:

    Comment implémenter une sauvegarde planifiée de MySQL dans Node

    在备份成功的回调中,调用 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点 对数据库进行 备份,并发送至 邮箱rrreee

    Quand j'ai appuyé sur Entrée, j'ai trouvé les lignes de code qui défilaient dans le terminal. Du coup, j'ai senti que les choses n'étaient pas simples, j'ai rapidement ctrl c. pour interrompre. Après l'interruption du terminal, j'ai commencé à télécharger des fichiers via fpt, mais j'ai constaté que ftp n'avait pas de réponse. Maintenant, j'ai paniqué et le système n'a pas été détruit ! 🎜🎜Ensuite, j'ai décidé de redémarrer le serveur, mais, euh..., il n'a pas pu démarrer ! Cela a vraiment détruit le système ! Après avoir interrogé les experts, j'ai entendu dire que Alibaba Cloud pouvait être restauré s'il y avait un instantané, mais je n'ai pas enregistré l'instantané ! Juste GG, peu importe si le programme a disparu, mais la base de données a disparu. 🎜🎜À ce moment-là, j'ai réalisé que je devais créer une tâche planifiée pour sauvegarder régulièrement la base de données en combinaison avec la classe Email précédemment encapsulée. , la base de données sauvegardée Envoyer par e-mail. 🎜🎜Développement et déploiement🎜🎜Parce que mon backend utilise nodejs, j'utiliserai nodejs pour écrire des tâches planifiées ici. 🎜

    Installer les dépendances

    🎜Ici, vous avez besoin de la dépendance node-schedule pour exécuter les tâches planifiées et de la dépendance child_process pour exécuter la commande de sauvegarde. 🎜rrreee

    Ecrire du code

    🎜Créez un nouveau fichier BackupDB.ts dans le répertoire src/command et introduisez des dépendances dans ce fichier : 🎜rrreee🎜Définition Une méthode backupDb, toutes les opérations de sauvegarde se font dans cette méthode : 🎜rrreee🎜Utilisez timestamp dans la méthode pour définir le nom du fichier de sauvegarde unique, Et Créer un flux : 🎜rrreee🎜Définissez le script de sauvegarde dans la méthode : 🎜rrreee🎜 Ensuite, planifiez la commande exécuter la sauvegarde : 🎜rrreee🎜Bien sûr, les données codées en dur ici peut également être utilisé comme paramètres de fonction pouvant être contrôlés. De plus, 0 0 1 * * * signifie ici sauvegarde à 1 heure du matin tous les jours Pour le format d'heure spécifique, veuillez vous référer à l'image ci-dessous, ou au document officiel : 🎜🎜 Comment implémenter Node sauvegarde planifiée de MySQL🎜🎜Dans le rappel d'une sauvegarde réussie, appelez la classe Email pour envoyer le contenu de la sauvegarde à l'e-mail. Ce n'est pas l'objectif, donc Je n'en parlerai pas pour l'instant. 🎜🎜Enfin, introduire la méthode de sauvegarde dans le fichier src/command/index.js et appeler : 🎜rrreee

    déploiement pm2🎜Vous devez d'abord installer pm2 globalement : 🎜rrreee🎜pm2 Le format de la commande de déploiement est : pm2 start [fichier nodejs] --name [alias ] code>:🎜rrreee🎜Une fois le déploiement terminé, vous pouvez le visualiser via la commande <code>pm2 ls. 🎜🎜À ce stade, la base de données sera sauvegardée à 1h du matin tous les jours et envoyée à e-mail. 🎜

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

    Déclaration:
    Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer