{"id":74311,"date":"2023-11-23T13:28:01","date_gmt":"2023-11-23T12:28:01","guid":{"rendered":"https:\/\/kinqsta.com\/fr\/?p=74311&#038;preview=true&#038;preview_id=74311"},"modified":"2023-11-30T13:43:27","modified_gmt":"2023-11-30T12:43:27","slug":"plans-maintenance-base-de-donnees","status":"publish","type":"post","link":"https:\/\/kinqsta.com\/fr\/blog\/plans-maintenance-base-de-donnees\/","title":{"rendered":"Configurer les plans de maintenance des bases de donn\u00e9es pour PostgreSQL sur Node.js"},"content":{"rendered":"<p>Avec l&rsquo;\u00e9volution du d\u00e9veloppement d&rsquo;applications, les bases de donn\u00e9es constituent le c\u0153ur de la plupart des applications, car elles stockent et g\u00e8rent des donn\u00e9es cruciales pour les entreprises num\u00e9riques. \u00c0 mesure que ces donn\u00e9es augmentent et deviennent plus complexes, il est essentiel de garantir l&rsquo;efficacit\u00e9 de votre base de donn\u00e9es pour r\u00e9pondre aux besoins de votre application.<\/p>\n<p>C&rsquo;est l\u00e0 que la notion de maintenance des bases de donn\u00e9es entre en jeu. La maintenance des bases de donn\u00e9es comprend des t\u00e2ches telles que le nettoyage, les sauvegardes et l&rsquo;optimisation des indices pour augmenter les performances.<\/p>\n<p>Cet article offre des informations pr\u00e9cieuses sur les d\u00e9clencheurs de maintenance et pr\u00e9sente des instructions de configuration pratiques. Il explique le processus de mise en \u0153uvre de diverses t\u00e2ches de maintenance de base de donn\u00e9es telles que la sauvegarde des donn\u00e9es, la reconstruction des index, l&rsquo;archivage et le nettoyage des donn\u00e9es \u00e0 l&rsquo;aide de <a href=\"https:\/\/kinqsta.com\/fr\/sujets\/postgresql\/\">PostgreSQL<\/a>, int\u00e9gr\u00e9 \u00e0 un d\u00e9clencheur API dans une application <a href=\"https:\/\/kinqsta.com\/fr\/sujets\/node-js\/\">Node.js<\/a>.<\/p>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2>Comprendre les d\u00e9clencheurs<\/h2>\n<p>Avant de construire des op\u00e9rations de maintenance pour votre base de donn\u00e9es, il est important de comprendre les diff\u00e9rentes fa\u00e7ons dont elles peuvent \u00eatre d\u00e9clench\u00e9es. Chaque d\u00e9clencheur a des fonctions distinctes pour faciliter les t\u00e2ches de maintenance. Les trois principaux d\u00e9clencheurs couramment utilis\u00e9s sont les suivants<\/p>\n<ul>\n<li><strong>Manuel, bas\u00e9 sur l&rsquo;API <\/strong>: Ce d\u00e9clencheur vous permet d&rsquo;ex\u00e9cuter des op\u00e9rations ponctuelles \u00e0 l&rsquo;aide d&rsquo;un appel API. Il est utile dans des situations telles que la restauration d&rsquo;une sauvegarde de base de donn\u00e9es ou la reconstruction d&rsquo;index lorsque les performances chutent soudainement.<\/li>\n<li><strong>Planification (comme CRON) <\/strong>: Ce d\u00e9clencheur vous permet d&rsquo;automatiser les activit\u00e9s de maintenance planifi\u00e9es pendant les p\u00e9riodes de faible trafic utilisateur. Il est id\u00e9al pour ex\u00e9cuter des op\u00e9rations gourmandes en ressources telles que l&rsquo;archivage et le nettoyage. Vous pouvez utiliser des packages tels que <a href=\"https:\/\/www.npmjs.com\/package\/node-schedule\" target=\"_blank\" rel=\"noopener noreferrer\">node-schedule<\/a> pour configurer des planifications dans Node.js qui d\u00e9clenchent automatiquement les op\u00e9rations lorsque cela est n\u00e9cessaire.<\/li>\n<li><strong>Notifications de base de donn\u00e9es <\/strong>: Ce d\u00e9clencheur vous permet d&rsquo;effectuer des op\u00e9rations de maintenance en r\u00e9ponse \u00e0 des modifications de la base de donn\u00e9es. Par exemple, lorsqu&rsquo;un utilisateur publie un commentaire sur une plateforme, les donn\u00e9es enregistr\u00e9es peuvent instantan\u00e9ment d\u00e9clencher des v\u00e9rifications concernant les caract\u00e8res irr\u00e9guliers, le langage offensant ou les emojis. La mise en \u0153uvre de cette fonctionnalit\u00e9 dans Node.js est possible \u00e0 l&rsquo;aide de packages tels que <a href=\"https:\/\/github.com\/andywer\/pg-listen\" target=\"_blank\" rel=\"noopener noreferrer\">pg-listen<\/a>.<\/li>\n<\/ul>\n<h2>Pr\u00e9-requis<\/h2>\n<p>Pour suivre ce guide, vous devez disposer des outils suivants sur votre ordinateur local :<\/p>\n<ul>\n<li><a href=\"https:\/\/kinqsta.com\/fr\/blog\/installer-git-windows-macos-linux\/\">Git<\/a> : Pour g\u00e9rer le contr\u00f4le de version du code source de votre application<\/li>\n<li><a href=\"https:\/\/kinqsta.com\/fr\/blog\/comment-installer-node-js\/\">Node.js<\/a> : pour construire votre application backend<\/li>\n<li><a href=\"https:\/\/www.postgresql.org\/docs\/current\/app-psql.html\" target=\"_blank\" rel=\"noopener noreferrer\">psql<\/a> : Pour interagir avec votre base de donn\u00e9es PostgreSQL distante en utilisant votre terminal<\/li>\n<li><a href=\"https:\/\/www.pgadmin.org\/download\/\" target=\"_blank\" rel=\"noopener noreferrer\">PGAdmin<\/a> (optionnel) : Pour interagir avec votre base de donn\u00e9es PostgreSQL distante en utilisant une interface utilisateur graphique (GUI).<\/li>\n<\/ul>\n<h3>Cr\u00e9er et h\u00e9berger une application Node.js<\/h3>\n<p>Mettons en place un projet Node.js, livrons-le sur GitHub et mettons en place un pipeline de d\u00e9ploiement automatique vers Kinsta. Vous devez \u00e9galement provisionner une <a href=\"https:\/\/sevalla.com\/database-hosting\/\">base de donn\u00e9es PostgreSQL sur Kinsta<\/a> pour y tester vos routines de maintenance.<\/p>\n<p>Commencez par cr\u00e9er un nouveau r\u00e9pertoire sur votre syst\u00e8me local en utilisant la commande suivante :<\/p>\n<pre><code class=\"language-bash\">mkdir node-db-maintenance<\/code><\/pre>\n<p>Ensuite, allez dans le dossier nouvellement cr\u00e9\u00e9 et ex\u00e9cutez la commande suivante pour cr\u00e9er un nouveau projet :<\/p>\n<pre><code class=\"language-bash\">cd node-db-maintenance\nyarn init -y # or npm init -y<\/code><\/pre>\n<p>Ceci initialise un projet Node.js pour vous avec la configuration par d\u00e9faut. Vous pouvez maintenant installer les d\u00e9pendances n\u00e9cessaires en ex\u00e9cutant la commande suivante :<\/p>\n<pre><code class=\"language-bash\">yarn add express pg nodemon dotenv<\/code><\/pre>\n<p>Voici une description rapide de chaque paquet :<\/p>\n<ul>\n<li><code>express<\/code> : vous permet de mettre en place une API REST bas\u00e9e sur Express.<\/li>\n<li><code>pg<\/code> : le paquet REST : vous permet d&rsquo;interagir avec une base de donn\u00e9es PostgreSQL \u00e0 travers votre application Node.js.<\/li>\n<li><code>nodemon<\/code> : permet \u00e0 votre build de d\u00e9veloppement d&rsquo;\u00eatre mis \u00e0 jour au fur et \u00e0 mesure que vous d\u00e9veloppez votre application, vous lib\u00e9rant ainsi du besoin constant d&rsquo;arr\u00eater et de d\u00e9marrer votre application \u00e0 chaque fois que vous effectuez un changement.<\/li>\n<li><code>dotenv<\/code> : vous permet de charger des variables d&rsquo;environnement depuis un fichier <strong>.env<\/strong> dans votre objet <code>process.env<\/code>.<\/li>\n<\/ul>\n<p>Ensuite, ajoutez les scripts suivants dans votre fichier <strong>package.json<\/strong> pour pouvoir d\u00e9marrer facilement votre serveur de d\u00e9veloppement et l&rsquo;ex\u00e9cuter \u00e9galement en production :<\/p>\n<pre><code class=\"language-js\">{\n    \/\/ ... \n    \"scripts\": {\n      \"start-dev\": \"nodemon index.js\",\n      \"start\": \"NODE_ENV=production node index.js\"\n  },\n  \/\/ \u2026\n}<\/code><\/pre>\n<p>Vous pouvez maintenant cr\u00e9er un fichier <strong>index.js<\/strong> qui contient le code source de votre application. Collez le code suivant dans le fichier :<\/p>\n<pre><code class=\"language-js\">const express = require(\"express\")\nconst dotenv = require('dotenv');\n\nif (process.env.NODE_ENV !== 'production') dotenv.config();\nconst app = express()\nconst port = process.env.PORT || 3000\n\napp.get(\"\/health\", (req, res) =&gt; res.json({status: \"UP\"}))\n\napp.listen(port, () =&gt; {\n    console.log(`Server running at port: ${port}`);\n});<\/code><\/pre>\n<p>Ce code initialise un serveur <a href=\"https:\/\/kinqsta.com\/fr\/blog\/qu-est-express-js\/\">Express<\/a> et configure les variables d&rsquo;environnement en utilisant le paquetage <code>dotenv<\/code> si vous n&rsquo;\u00eates pas en mode production. Il met \u00e9galement en place une route <code>\/health<\/code> qui renvoie un objet JSON <code>{status: \"UP\"}<\/code>. Enfin, il d\u00e9marre l&rsquo;application \u00e0 l&rsquo;aide de la fonction <code>app.listen()<\/code> pour \u00e9couter sur le port sp\u00e9cifi\u00e9, par d\u00e9faut <code>3000<\/code> si aucun port n&rsquo;est fourni via la variable d&rsquo;environnement.<\/p>\n<p>Maintenant que vous avez une application de base pr\u00eate, initialisez un nouveau d\u00e9p\u00f4t git avec votre fournisseur git pr\u00e9f\u00e9r\u00e9 (<a href=\"https:\/\/docs.sevalla.com\/applications\/git\/bitbucket#grant-access-to-the-kinsta-bitbucket-application\">BitBucket<\/a>, <a href=\"https:\/\/docs.sevalla.com\/applications\/git\/github#authenticate-and-authorize\">GitHub<\/a>, ou <a href=\"https:\/\/docs.sevalla.com\/applications\/git\/gitlab#authorize-the-kinsta-gitlab-application\">GitLab<\/a>) et poussez votre code. Kinsta prend en charge le d\u00e9ploiement d&rsquo;applications \u00e0 partir de tous ces fournisseurs git. Pour cet article, nous utiliserons GitHub.<\/p>\n<p>Lorsque votre d\u00e9p\u00f4t est pr\u00eat, suivez les \u00e9tapes suivantes pour d\u00e9ployer votre application sur Kinsta :<\/p>\n<ol>\n<li>Connectez-vous ou cr\u00e9ez un compte pour afficher votre tableau de bord <a href=\"https:\/\/my.kinqsta.com\/?lang=fr\">MyKinsta<\/a>.<\/li>\n<li>Autorisez Kinsta avec votre fournisseur Git.<\/li>\n<li>Dans la colonne lat\u00e9rale de gauche, cliquez sur <strong>Applications<\/strong>, puis sur <strong>Ajouter une application<\/strong>.<\/li>\n<li>S\u00e9lectionnez le d\u00e9p\u00f4t et la branche \u00e0 partir desquels vous souhaitez effectuer le d\u00e9ploiement.<\/li>\n<li>S\u00e9lectionnez l&rsquo;un des centres de donn\u00e9es disponibles dans la liste des 27 options. Kinsta d\u00e9tecte automatiquement les param\u00e8tres de construction de vos applications via <a href=\"https:\/\/kinqsta.com\/fr\/changelog\/nixpacks\/\">Nixpacks<\/a>.<\/li>\n<li>Choisissez les ressources de votre application, telles que la m\u00e9moire vive et l&rsquo;espace disque.<\/li>\n<li>Cliquez sur <strong>Cr\u00e9er une application<\/strong>.<\/li>\n<\/ol>\n<p>Une fois le d\u00e9ploiement termin\u00e9, copiez le lien de l&rsquo;application d\u00e9ploy\u00e9e et naviguez vers <code>\/health<\/code>. Vous devriez voir le JSON suivant dans votre navigateur :<\/p>\n<pre><code class=\"language-js\">{status: \"UP\"}<\/code><\/pre>\n<p>Cela indique que l&rsquo;application a \u00e9t\u00e9 correctement configur\u00e9e.<\/p>\n<h3>Configurer une instance PostgreSQL sur Kinsta<\/h3>\n<p>Kinsta fournit une interface facile pour provisionner des instances de base de donn\u00e9es. Commencez par cr\u00e9er un nouveau <a href=\"https:\/\/kinqsta.com\/fr\/inscription\/\">compte Kinsta<\/a> si vous n&rsquo;en avez pas d\u00e9j\u00e0 un. Ensuite, suivez les \u00e9tapes ci-dessous :<\/p>\n<ol>\n<li>Connectez-vous \u00e0 votre tableau de bord MyKinsta.<\/li>\n<li>Dans la colonne lat\u00e9rale de gauche, cliquez sur <strong>Bases de donn\u00e9es<\/strong>, puis sur <strong>Ajouter une base de donn\u00e9es<\/strong>.<\/li>\n<li>S\u00e9lectionnez <strong>PostgreSQL<\/strong> comme type de base de donn\u00e9es et choisissez votre version pr\u00e9f\u00e9r\u00e9e. Choisissez un nom pour votre base de donn\u00e9es et modifiez le nom d&rsquo;utilisateur et le mot de passe si vous le souhaitez.<\/li>\n<li>S\u00e9lectionnez un emplacement de centre de donn\u00e9es dans la liste des 27 options.<\/li>\n<li>Choisissez la taille de votre base de donn\u00e9es.<\/li>\n<li>Cliquez sur <strong>Cr\u00e9er une base de donn\u00e9es<\/strong>.<\/li>\n<\/ol>\n<p>Une fois la base de donn\u00e9es cr\u00e9\u00e9e, veillez \u00e0 r\u00e9cup\u00e9rer l&rsquo;h\u00f4te, le port, le nom d&rsquo;utilisateur et le mot de passe de la base de donn\u00e9es.<\/p>\n<figure id=\"attachment_168402\" aria-describedby=\"caption-attachment-168402\" style=\"width: 1024px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-168402 size-large\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2023\/11\/database-credentials-from-kinsta-1024x435.jpg\" alt=\"Identifiants de la base de donn\u00e9es g\u00e9n\u00e9r\u00e9s par Kinsta\" width=\"1024\" height=\"435\"><figcaption id=\"caption-attachment-168402\" class=\"wp-caption-text\">Identifiants de la base de donn\u00e9es g\u00e9n\u00e9r\u00e9s par Kinsta<\/figcaption><\/figure>\n<p>Vous pouvez ensuite ins\u00e9rer ces valeurs dans votre CLI psql (ou l&rsquo;interface graphique PGAdmin) pour g\u00e9rer la base de donn\u00e9es. Pour tester votre code localement, cr\u00e9ez un fichier <strong>.env<\/strong> dans le r\u00e9pertoire racine de votre projet et stockez-y les secrets suivants :<\/p>\n<pre><code class=\"language-bash\">DB_USER_NAME=your database user name\nDB_HOST=your database host\nDB_DATABASE_NAME=your database\u2019s name\nDB_PORT=your database port\nPGPASS=your database password<\/code><\/pre>\n<p>Lors du d\u00e9ploiement sur Kinsta, vous devez ajouter ces valeurs en tant que <a href=\"https:\/\/docs.sevalla.com\/applications\/overviewenvironment-variables\">variables d&rsquo;environnement<\/a> au d\u00e9ploiement de votre application.<\/p>\n<p>Pour pr\u00e9parer les op\u00e9rations de base de donn\u00e9es, t\u00e9l\u00e9chargez et ex\u00e9cutez <a href=\"https:\/\/github.com\/krharsh17\/node-db-maintenance\/blob\/main\/test-data.sql\" target=\"_blank\" rel=\"noopener noreferrer\">ce script SQL<\/a> pour cr\u00e9er des tables (utilisateurs, messages, commentaires) et ins\u00e9rer des donn\u00e9es d&rsquo;exemple. Utilisez la commande ci-dessous, en rempla\u00e7ant les espaces r\u00e9serv\u00e9s par vos propres donn\u00e9es, pour ajouter les donn\u00e9es \u00e0 votre base de donn\u00e9es PostgreSQL nouvellement cr\u00e9\u00e9e :<\/p>\n<pre><code class=\"language-bash\">psql -h &lt;host&gt; -p &lt;port&gt; -U &lt;username&gt; -d &lt;db_name&gt; -a -f &lt;sql file e.g. test-data.sql&gt;<\/code><\/pre>\n<p>Veillez \u00e0 saisir le nom et le chemin d&rsquo;acc\u00e8s exacts du fichier dans la commande ci-dessus. L&rsquo;ex\u00e9cution de cette commande vous invite \u00e0 saisir le mot de passe de votre base de donn\u00e9es pour autorisation.<\/p>\n<p>Une fois cette commande ex\u00e9cut\u00e9e, vous \u00eates pr\u00eat \u00e0 \u00e9crire des op\u00e9rations pour la maintenance de votre base de donn\u00e9es. N&rsquo;h\u00e9sitez pas \u00e0 pousser votre code vers votre d\u00e9p\u00f4t Git lorsque vous avez termin\u00e9 chaque op\u00e9ration pour le voir en action sur la plateforme Kinsta.<\/p>\n<h2>\u00c9crire des routines de maintenance<\/h2>\n<p>Cette section explique plusieurs op\u00e9rations couramment utilis\u00e9es pour la maintenance des bases de donn\u00e9es PostgreSQL.<\/p>\n<h3>1. Cr\u00e9er des sauvegardes<\/h3>\n<p>Sauvegarder r\u00e9guli\u00e8rement les bases de donn\u00e9es est une op\u00e9ration courante et essentielle. Elle consiste \u00e0 cr\u00e9er une copie de l&rsquo;ensemble du contenu de la base de donn\u00e9es, qui est stock\u00e9e dans un endroit s\u00fbr. Ces sauvegardes sont cruciales pour restaurer les donn\u00e9es en cas de perte accidentelle ou d&rsquo;erreurs affectant l&rsquo;int\u00e9grit\u00e9 des donn\u00e9es.<\/p>\n<p>Bien que <a href=\"https:\/\/docs.sevalla.com\/databases\/backups\">des plateformes comme Kinsta proposent des sauvegardes automatis\u00e9es<\/a> dans le cadre de leurs services, il est important de savoir comment mettre en place une routine de sauvegarde personnalis\u00e9e si n\u00e9cessaire.<\/p>\n<p>PostgreSQL propose l&rsquo;outil <a href=\"https:\/\/www.postgresql.org\/docs\/current\/app-pgdump.html\" target=\"_blank\" rel=\"noopener noreferrer\">pg_dump<\/a> pour cr\u00e9er des sauvegardes de bases de donn\u00e9es. Cependant, il doit \u00eatre ex\u00e9cut\u00e9 directement depuis la ligne de commande, et il n&rsquo;existe pas de paquetage npm pour cet outil. Vous devez donc utiliser le paquet <a href=\"https:\/\/www.npmjs.com\/package\/@getvim\/execute\" target=\"_blank\" rel=\"noopener noreferrer\">@getvim\/execute<\/a> pour ex\u00e9cuter la commande <code>pg_dump<\/code> dans l&rsquo;environnement local de votre application Node.<\/p>\n<p>Installez le paquetage en ex\u00e9cutant la commande suivante :<\/p>\n<pre><code class=\"language-bash\">yarn add @getvim\/execute<\/code><\/pre>\n<p>Ensuite, importez le paquetage dans votre fichier <strong>index.js <\/strong>en ajoutant cette ligne de code en haut :<\/p>\n<pre><code class=\"language-js\">const {execute} = require('@getvim\/execute');<\/code><\/pre>\n<p>Les sauvegardes sont g\u00e9n\u00e9r\u00e9es sous forme de fichiers sur le syst\u00e8me de fichiers local de votre application Node. Il est donc pr\u00e9f\u00e9rable de cr\u00e9er un r\u00e9pertoire d\u00e9di\u00e9 \u00e0 ces sauvegardes sous le nom de <strong>backup<\/strong> dans le r\u00e9pertoire racine du projet.<\/p>\n<p>Vous pouvez maintenant utiliser la route suivante pour g\u00e9n\u00e9rer et t\u00e9l\u00e9charger des sauvegardes de votre base de donn\u00e9es lorsque cela est n\u00e9cessaire :<\/p>\n<pre><code class=\"language-js\">app.get('\/backup', async (req, res) =&gt; {\n\n    \/\/ Create a name for the backup file\n    const fileName = \"database-backup-\" + new Date().valueOf() + \".tar\";\n\n    \/\/ Execute the pg_dump command to generate the backup file\n    execute(\"PGPASSWORD=\" + process.env.PGPASS  + \" pg_dump -U \" + process.env.DB_USER_NAME \n    + \" -d \" + process.env.DB_DATABASE_NAME \n    + \" -h \" + process.env.DB_HOST\n    + \" -p \" + process.env.DB_PORT\n    + \" -f backup\/\" + fileName + \" -F t\"\n\n).then(async () =&gt; {\n        console.log(\"Backup created\");\n        res.redirect(\"\/backup\/\" + fileName)\n    }).catch(err =&gt; {\n        console.log(err);\n        res.json({message: \"Something went wrong\"})\n    })\n\n})<\/code><\/pre>\n<p>Vous devez \u00e9galement ajouter la ligne suivante au d\u00e9but de votre fichier <strong>index.js<\/strong> apr\u00e8s l&rsquo;initialisation de l&rsquo;application Express :<\/p>\n<pre><code class=\"language-js\">app.use('\/backup', express.static('backup'))<\/code><\/pre>\n<p>Cela permet au dossier <strong>backup<\/strong> d&rsquo;\u00eatre servi statiquement en utilisant la fonction middleware <code>express.static<\/code>, permettant \u00e0 l&rsquo;utilisateur de t\u00e9l\u00e9charger les fichiers de sauvegarde g\u00e9n\u00e9r\u00e9s \u00e0 partir de l&rsquo;application Node.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Si vous rencontrez une erreur <code>server version mismatch<\/code> avec PostgreSQL, cela signifie que la version de la base de donn\u00e9es diff\u00e8re de votre outil local <code>pg_dump<\/code>. R\u00e9solvez ce probl\u00e8me en v\u00e9rifiant votre version <code>pg_dump<\/code> et en mettant \u00e0 jour l&rsquo;outil ou la base de donn\u00e9es.<\/p>\n<\/aside>\n\n<h3>2. Restauration \u00e0 partir d&rsquo;une sauvegarde<\/h3>\n<p>Postgres permet de restaurer des sauvegardes \u00e0 l&rsquo;aide de l&rsquo;outil de ligne de commande <code>pg_restore<\/code>. Cependant, vous devez l&rsquo;utiliser via le paquetage <code>execute<\/code> de la m\u00eame mani\u00e8re que vous avez utilis\u00e9 la commande <code>pg_dump<\/code>. Voici le code de la route :<\/p>\n<pre><code class=\"language-js\">app.get('\/restore', async (req, res) =&gt; {\n\n    const dir = 'backup'\n\n    \/\/ Sort the backup files according to when they were created\n    const files = fs.readdirSync(dir)\n        .filter((file) =&gt; fs.lstatSync(path.join(dir, file)).isFile())\n        .map((file) =&gt; ({ file, mtime: fs.lstatSync(path.join(dir, file)).mtime }))\n        .sort((a, b) =&gt; b.mtime.getTime() - a.mtime.getTime());\n\n    if (!files.length){\n        res.json({message: \"No backups available to restore from\"})\n    }\n\n    const fileName = files[0].file\n\n    \/\/ Restore the database from the chosen backup file\n    execute(\"PGPASSWORD=\" + process.env.PGPASS  + \" pg_restore -cC \"\n    + \"-U \" + process.env.DB_USER_NAME\n    + \" -h \" + process.env.DB_HOST\n    + \" -p \" + process.env.DB_PORT\n    + \" -d postgres backup\/\" + fileName\n)\n\n        .then(async ()=&gt; {\n            console.log(\"Restored\");\n            res.json({message: \"Backup restored\"})\n        }).catch(err=&gt; {\n        console.log(err);\n        res.json({message: \"Something went wrong\"})\n    })\n})<\/code><\/pre>\n<p>L&rsquo;extrait de code ci-dessus recherche d&rsquo;abord les fichiers stock\u00e9s dans le r\u00e9pertoire <strong>backup<\/strong> local. Ensuite, il les trie en fonction de leur date de cr\u00e9ation pour trouver le fichier de sauvegarde le plus r\u00e9cent. Enfin, il utilise le paquet <code>execute<\/code> pour restaurer le fichier de sauvegarde choisi.<\/p>\n<p>Veillez \u00e0 ajouter les importations suivantes \u00e0 votre fichier <strong>index.js<\/strong> afin que les modules n\u00e9cessaires \u00e0 l&rsquo;acc\u00e8s au syst\u00e8me de fichiers local soient import\u00e9s, ce qui permettra \u00e0 la fonction de s&rsquo;ex\u00e9cuter correctement :<\/p>\n<pre><code class=\"language-js\">const fs = require('fs')\nconst path = require('path')<\/code><\/pre>\n<h3>3. Reconstruction d&rsquo;un index<\/h3>\n<p>Les index des tables Postgres sont parfois corrompus, ce qui d\u00e9grade les performances de la base de donn\u00e9es. Cela peut \u00eatre d\u00fb \u00e0 des bogues ou \u00e0 des erreurs logicielles. Parfois, les index peuvent \u00e9galement devenir trop volumineux en raison d&rsquo;un trop grand nombre de pages vides ou presque vides.<\/p>\n<p>Dans ce cas, vous devez reconstruire l&rsquo;index pour vous assurer que vous obtenez les meilleures performances de votre instance Postgres.<\/p>\n<p>Postgres propose la commande <a href=\"https:\/\/www.postgresql.org\/docs\/current\/sql-reindex.html\" target=\"_blank\" rel=\"noopener noreferrer\">REINDEX<\/a> \u00e0 cette fin. Vous pouvez utiliser le paquetage <a href=\"https:\/\/node-postgres.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">node-postgres<\/a> pour ex\u00e9cuter cette commande (et pour ex\u00e9cuter d&rsquo;autres op\u00e9rations plus tard \u00e9galement), donc installez-le en ex\u00e9cutant d&rsquo;abord la commande suivante :<\/p>\n<pre><code class=\"language-bash\">yarn add pg<\/code><\/pre>\n<p>Ensuite, ajoutez les lignes suivantes au d\u00e9but du fichier <strong>index.js<\/strong>, sous les importations, afin d&rsquo;initialiser correctement la connexion \u00e0 la base de donn\u00e9es :<\/p>\n<pre><code class=\"language-js\">const {Client} = require('pg')\nconst client = new Client({\n    user: process.env.DB_USER_NAME,\n    host: process.env.DB_HOST,\n    database: process.env.DB_DATABASE_NAME,\n    password: process.env.PGPASS,\n    port: process.env.DB_PORT\n})\n\n\n\nclient.connect(err =&gt; {\n    if (err) throw err;\n    console.log(\"Connected!\")\n})<\/code><\/pre>\n<p>La mise en \u0153uvre de cette op\u00e9ration est assez simple :<\/p>\n<pre><code class=\"language-js\">app.get(\"\/reindex\", async (req, res) =&gt; {\n\n    \/\/ Run the REINDEX command as needed\n    await client.query(\"REINDEX TABLE Users;\")\n\n    res.json({message: \"Reindexed table successfully\"})\n})<\/code><\/pre>\n<p>La commande pr\u00e9sent\u00e9e ci-dessus r\u00e9indexe l&rsquo;ensemble de la table Utilisateurs. Vous pouvez personnaliser la commande en fonction de vos besoins pour reconstruire un index particulier ou m\u00eame pour r\u00e9indexer la base de donn\u00e9es compl\u00e8te.<\/p>\n<h3>4. Archivage et purge des donn\u00e9es<\/h3>\n<p>Pour les bases de donn\u00e9es qui deviennent volumineuses au fil du temps (et dont les donn\u00e9es historiques sont rarement consult\u00e9es), il peut \u00eatre judicieux de mettre en place des routines qui d\u00e9chargent les anciennes donn\u00e9es dans un lac de donn\u00e9es o\u00f9 elles peuvent \u00eatre stock\u00e9es et trait\u00e9es plus facilement.<\/p>\n<p>Les fichiers Parquet sont une norme courante pour le stockage et le transfert de donn\u00e9es dans de nombreux lacs de donn\u00e9es. Gr\u00e2ce \u00e0 la biblioth\u00e8que <a href=\"https:\/\/www.npmjs.com\/package\/parquetjs\" target=\"_blank\" rel=\"noopener noreferrer\">ParquetJS<\/a>, vous pouvez cr\u00e9er des fichiers Parquet \u00e0 partir de vos donn\u00e9es Postgres et utiliser des services comme <a href=\"https:\/\/ahana.io\/answers\/query-parquet-using-amazon-athena\/\" target=\"_blank\" rel=\"noopener noreferrer\">AWS Athena<\/a> pour les lire directement sans avoir \u00e0 les recharger dans la base de donn\u00e9es \u00e0 l&rsquo;avenir.<\/p>\n<p>Installez la biblioth\u00e8que ParquetJS en ex\u00e9cutant la commande suivante :<\/p>\n<pre><code class=\"language-bash\">yarn add parquetjs<\/code><\/pre>\n<p>Lorsque vous cr\u00e9ez des archives, vous devez interroger un grand nombre d&rsquo;enregistrements de vos tables. Le stockage d&rsquo;une telle quantit\u00e9 de donn\u00e9es dans la m\u00e9moire de votre application peut \u00eatre gourmand en ressources, co\u00fbteux et source d&rsquo;erreurs.<\/p>\n<p>C&rsquo;est pourquoi il est judicieux d&rsquo;utiliser des <a href=\"https:\/\/node-postgres.com\/apis\/cursor\" target=\"_blank\" rel=\"noopener noreferrer\">curseurs<\/a> pour charger des morceaux de donn\u00e9es depuis la base de donn\u00e9es et les traiter. Installez le module <code>cursors<\/code> du paquetage <code>node-postgres<\/code> en ex\u00e9cutant la commande suivante :<\/p>\n<pre><code class=\"language-bash\">yarn add pg-cursor<\/code><\/pre>\n<p>Veillez ensuite \u00e0 importer les deux biblioth\u00e8ques dans votre fichier <strong>index.js<\/strong>:<\/p>\n<pre><code class=\"language-js\">const Cursor = require('pg-cursor')\nconst parquet = require('parquetjs')<\/code><\/pre>\n<p>Vous pouvez maintenant utiliser l&rsquo;extrait de code ci-dessous pour cr\u00e9er des fichiers parquet \u00e0 partir de votre base de donn\u00e9es :<\/p>\n<pre><code class=\"language-js\">app.get('\/archive', async (req, res) =&gt; {\n\n    \/\/ Query all comments through a cursor, reading only 10 at a time\n    \/\/ You can change the query here to meet your requirements, such as archiving records older than at least a month, or only archiving records from inactive users, etc.\n    const queryString = \"SELECT * FROM COMMENTS;\"\n\n    const cursor = client.query(new Cursor(queryString))\n\n    \/\/ Define the schema for the parquet file\n    let schema = new parquet.ParquetSchema({\n        comment_id: { type: 'INT64' },\n        post_id: { type: 'INT64' },\n        user_id: { type: 'INT64' },\n        comment_text: { type: 'UTF8' },\n        timestamp: { type: 'TIMESTAMP_MILLIS' }\n    });\n\n\n\n    \/\/ Open a parquet file writer\n    let writer = await parquet.ParquetWriter.openFile(schema, 'archive\/archive.parquet');\n\n    let rows = await cursor.read(10)\n\n    while (rows.length &gt; 0) {\n\n        for (let i = 0; i &lt; rows.length; i++) {\n            \/\/ Write each row from table to the parquet file\n            await writer.appendRow(rows[i])\n        }\n\n        rows = await cursor.read(10)\n    }\n\n    await writer.close()\n    \n    \/\/ Once the parquet file is generated, you can consider deleting the records from the table at this point to free up some space\n\n    \/\/ Redirect user to the file path to allow them to download the file\n    res.redirect(\"\/archive\/archive.parquet\")\n})<\/code><\/pre>\n<p>Ensuite, ajoutez le code suivant au d\u00e9but de votre fichier <strong>index.js<\/strong> apr\u00e8s l&rsquo;initialisation de l&rsquo;application Express :<\/p>\n<pre><code class=\"language-js\">app.use('\/archive', express.static('archive'))<\/code><\/pre>\n<p>Cela permet au dossier d&rsquo;<strong>archive<\/strong> d&rsquo;\u00eatre servi statiquement, ce qui vous permet de t\u00e9l\u00e9charger les fichiers parquet g\u00e9n\u00e9r\u00e9s depuis le serveur.<\/p>\n<p>N&rsquo;oubliez pas de cr\u00e9er un r\u00e9pertoire d&rsquo;<strong>archives<\/strong> dans le r\u00e9pertoire du projet pour stocker les fichiers d&rsquo;archives.<\/p>\n<p>Vous pouvez personnaliser davantage cet extrait de code pour t\u00e9l\u00e9charger automatiquement les fichiers de parquet vers un <a href=\"https:\/\/sparkbyexamples.com\/spark\/spark-read-write-parquet-file-from-amazon-s3\/\" target=\"_blank\" rel=\"noopener noreferrer\">seau AWS S3<\/a> et utiliser des t\u00e2ches CRON pour d\u00e9clencher automatiquement l&rsquo;op\u00e9ration sur une routine.<\/p>\n<h3>5. Nettoyage des donn\u00e9es<\/h3>\n<p>Les op\u00e9rations de maintenance des bases de donn\u00e9es ont souvent pour but de nettoyer les donn\u00e9es qui deviennent obsol\u00e8tes ou non pertinentes avec le temps. Cette section aborde deux cas courants de nettoyage de donn\u00e9es dans le cadre de la maintenance.<\/p>\n<p>En r\u00e9alit\u00e9, vous pouvez mettre en place votre propre routine de nettoyage des donn\u00e9es en fonction des mod\u00e8les de donn\u00e9es de votre application. Les exemples ci-dessous ne sont donn\u00e9s qu&rsquo;\u00e0 titre de r\u00e9f\u00e9rence.<\/p>\n<h4>Suppression d&rsquo;enregistrements en fonction de leur \u00e2ge (derni\u00e8re modification ou dernier acc\u00e8s)<\/h4>\n<p>Le nettoyage des enregistrements en fonction de leur anciennet\u00e9 est relativement simple par rapport aux autres op\u00e9rations de cette liste. Vous pouvez \u00e9crire une requ\u00eate de suppression qui supprime les enregistrements ant\u00e9rieurs \u00e0 une date donn\u00e9e.<\/p>\n<p>Voici un exemple de suppression de commentaires ant\u00e9rieurs au 9 octobre 2023 :<\/p>\n<pre><code class=\"language-js\">app.get(\"\/clean-by-age\", async (req, res) =&gt; {\n\n    \/\/ Filter and delete all comments that were made on or before 9th October, 2023\n    const result = await client.query(\"DELETE FROM COMMENTS WHERE timestamp &lt; '09-10-2023 00:00:00'\")\n\n    if (result.rowCount &gt; 0) {\n        res.json({message: \"Cleaned up \" + result.rowCount + \" rows successfully!\"})\n    } else {\n        res.json({message: \"Nothing to clean up!\"})\n    }\n})<\/code><\/pre>\n<p>Vous pouvez l&rsquo;essayer en envoyant une requ\u00eate GET \u00e0 la route <code>\/clean-by-age<\/code>.<\/p>\n<h4>Suppression d&rsquo;enregistrements sur la base de conditions personnalis\u00e9es<\/h4>\n<p>Vous pouvez \u00e9galement mettre en place des nettoyages bas\u00e9s sur d&rsquo;autres conditions, comme la suppression d&rsquo;enregistrements qui ne sont pas li\u00e9s \u00e0 d&rsquo;autres enregistrements actifs dans le syst\u00e8me (ce qui cr\u00e9e une situation d&rsquo;<em>orphelin<\/em> ).<\/p>\n<p>Par exemple, vous pouvez mettre en place une op\u00e9ration de nettoyage qui recherche les commentaires li\u00e9s \u00e0 des articles supprim\u00e9s et les supprime car ils ne feront probablement plus jamais surface dans l&rsquo;application :<\/p>\n<pre><code class=\"language-js\">app.get('\/conditional',  async (req, res) =&gt; {\n\n    \/\/ Filter and delete all comments that are not linked to any active posts\n    const result = await client.query(\"DELETE FROM COMMENTS WHERE post_id NOT IN (SELECT post_id from Posts);\")\n\n    if (result.rowCount &gt; 0) {\n        res.json({message: \"Cleaned up \" + result.rowCount + \" rows successfully!\"})\n    } else {\n        res.json({message: \"Nothing to clean up!\"})\n    }\n})<\/code><\/pre>\n<p>Vous pouvez d\u00e9finir vos propres conditions en fonction de votre cas d&rsquo;utilisation.<\/p>\n<h3>6. Manipulation des donn\u00e9es<\/h3>\n<p>Les op\u00e9rations de maintenance des bases de donn\u00e9es sont \u00e9galement utilis\u00e9es pour effectuer des manipulations et des transformations de donn\u00e9es, telles que la censure d&rsquo;un langage obsc\u00e8ne ou la conversion de combinaisons de texte en emoji.<\/p>\n<p>Contrairement \u00e0 la plupart des autres op\u00e9rations, il est pr\u00e9f\u00e9rable d&rsquo;ex\u00e9cuter ces op\u00e9rations lors des mises \u00e0 jour de la base de donn\u00e9es (plut\u00f4t que de les ex\u00e9cuter sur toutes les lignes \u00e0 un moment fixe de la semaine ou du mois).<\/p>\n<p>Cette section pr\u00e9sente deux de ces op\u00e9rations, mais la mise en \u0153uvre de toute autre op\u00e9ration de manipulation personnalis\u00e9e reste assez similaire \u00e0 celles-ci.<\/p>\n<h4>Convertir du texte en Emoji<\/h4>\n<p>Vous pouvez envisager de convertir des combinaisons de texte telles que \u00ab \ud83d\ude42 \u00bb et \u00ab xD \u00bb en v\u00e9ritables emojis afin d&rsquo;offrir une meilleure exp\u00e9rience \u00e0 l&rsquo;utilisateur et de maintenir la coh\u00e9rence des informations. Voici un extrait de code qui vous aidera \u00e0 le faire :<\/p>\n<pre><code class=\"language-js\">app.get(\"\/emoji\", async (req, res) =&gt; {\n    \/\/ Define a list of emojis that need to be converted\n    const emojiMap = {\n        xD: '\ud83d\ude01',\n        ':)': '\ud83d\ude0a',\n        ':-)': '\ud83d\ude04',\n        ':jack_o_lantern:': '\ud83c\udf83',\n        ':ghost:': '\ud83d\udc7b',\n        ':santa:': '\ud83c\udf85',\n        ':christmas_tree:': '\ud83c\udf84',\n        ':gift:': '\ud83c\udf81',\n        ':bell:': '\ud83d\udd14',\n        ':no_bell:': '\ud83d\udd15',\n        ':tanabata_tree:': '\ud83c\udf8b',\n        ':tada:': '\ud83c\udf89',\n        ':confetti_ball:': '\ud83c\udf8a',\n        ':balloon:': '\ud83c\udf88'\n    }\n\n    \/\/ Build the SQL query adding conditional checks for all emojis from the map\n    let queryString = \"SELECT * FROM COMMENTS WHERE\"\n\n    queryString += \" COMMENT_TEXT LIKE '%\" + Object.keys(emojiMap)[0] + \"%' \"\n\n    if (Object.keys(emojiMap).length &gt; 1) {\n        for (let i = 1; i &lt; Object.keys(emojiMap).length; i++) {\n            queryString += \" OR COMMENT_TEXT LIKE '%\" + Object.keys(emojiMap)[i] + \"%' \"\n        }\n    }\n\n    queryString += \";\"\n\n    const result = await client.query(queryString)\n\n    if (result.rowCount === 0) {\n        res.json({message: \"No rows to clean up!\"})\n    } else {\n        for (let i = 0; i &lt; result.rows.length; i++) {\n\n            const currentRow = result.rows[i]\n            let emoji\n\n            \/\/ Identify each row that contains an emoji along with which emoji it contains\n            for (let j = 0; j &lt; Object.keys(emojiMap).length; j++) {\n                if (currentRow.comment_text.includes(Object.keys(emojiMap)[j])) {\n                    emoji = Object.keys(emojiMap)[j]\n                    break\n                }\n            }\n\n            \/\/ Replace the emoji in the text and update the row before moving on to the next row\n            const updateQuery = \"UPDATE COMMENTS SET COMMENT_TEXT = '\" + currentRow.comment_text.replace(emoji, emojiMap[emoji]) + \"' WHERE COMMENT_ID = \" + currentRow.comment_id + \";\"\n\n            await client.query(updateQuery)\n        }\n\n        res.json({message: \"All emojis cleaned up successfully!\"})\n    }\n\n})<\/code><\/pre>\n<p>Cet extrait de code vous demande tout d&rsquo;abord de d\u00e9finir une liste d&#8217;emojis et leurs repr\u00e9sentations textuelles. Ensuite, il interroge la base de donn\u00e9es pour rechercher ces combinaisons textuelles et les remplacer par des emojis.<\/p>\n<h4>Censurer le langage obsc\u00e8ne<\/h4>\n<p>Une op\u00e9ration assez courante dans les applications qui autorisent le contenu g\u00e9n\u00e9r\u00e9 par les utilisateurs consiste \u00e0 censurer tout langage ind\u00e9cent. L&rsquo;approche ici est similaire : identifiez les cas de langage obsc\u00e8ne et remplacez-les par des ast\u00e9risques. Vous pouvez utiliser le paquetage bad-words pour v\u00e9rifier et censurer facilement les grossi\u00e8ret\u00e9s.<\/p>\n<p>Installez le paquetage en ex\u00e9cutant la commande suivante :<\/p>\n<pre><code class=\"language-bash\">yarn add bad-words<\/code><\/pre>\n<p>Ensuite, initialisez le paquet dans votre fichier <strong>index.js :<\/strong><\/p>\n<pre><code class=\"language-js\">const Filter = require('bad-words');\nfilter = new Filter();<\/code><\/pre>\n<p>Maintenant, utilisez l&rsquo;extrait de code suivant pour censurer le contenu obsc\u00e8ne dans votre tableau de commentaires :<\/p>\n<pre><code class=\"language-js\">app.get('\/obscene', async (req, res) =&gt; {\n\n    \/\/ Query all comments using a cursor, reading only 10 at a time\n    const queryString = \"SELECT * FROM COMMENTS;\"\n\n    const cursor = client.query(new Cursor(queryString))\n\n    let rows = await cursor.read(10)\n\n    const affectedRows = []\n\n    while (rows.length &gt; 0) {\n\n        for (let i = 0; i &lt; rows.length; i++) {\n            \/\/ Check each comment for profane content\n            if (filter.isProfane(rows[i].comment_text)) {\n                affectedRows.push(rows[i])\n            }\n        }\n\n        rows = await cursor.read(10)\n    }\n\n    cursor.close()\n\n    \/\/ Update each comment that has profane content with a censored version of the text\n    for (let i = 0; i &lt; affectedRows.length; i++) {\n        const row = affectedRows[i]\n        const updateQuery = \"UPDATE COMMENTS SET COMMENT_TEXT = '\" + filter.clean(row.comment_text) + \"' WHERE COMMENT_ID = \" + row.comment_id + \";\"\n        await client.query(updateQuery)\n    }\n\n    res.json({message: \"Cleanup complete\"})\n\n})<\/code><\/pre>\n<p>Vous pouvez trouver le code complet de ce tutoriel dans <a href=\"https:\/\/github.com\/krharsh17\/node-db-maintenance\" target=\"_blank\" rel=\"noopener noreferrer\">ce d\u00e9p\u00f4t GitHub<\/a>.<\/p>\n<h2>Comprendre l&rsquo;aspiration de PostgreSQL et son but<\/h2>\n<p>En plus de mettre en place des routines de maintenance personnalis\u00e9es telles que celles discut\u00e9es ci-dessus, vous pouvez \u00e9galement utiliser l&rsquo;une des fonctionnalit\u00e9s de maintenance natives que PostgreSQL offre pour assurer la sant\u00e9 et la performance de votre base de donn\u00e9es : <a href=\"https:\/\/www.postgresql.org\/docs\/current\/routine-vacuuming.html\" target=\"_blank\" rel=\"noopener noreferrer\">le processus Vacuum<\/a>.<\/p>\n<p>Le processus Vacuum permet d&rsquo;optimiser les performances de la base de donn\u00e9es et de r\u00e9cup\u00e9rer de l&rsquo;espace disque. PostgreSQL ex\u00e9cute les op\u00e9rations de vide selon un calendrier en utilisant son d\u00e9mon auto-vacuum, mais vous pouvez \u00e9galement le d\u00e9clencher manuellement si n\u00e9cessaire. Voici quelques exemples de l&rsquo;utilit\u00e9 d&rsquo;une mise \u00e0 vide fr\u00e9quente :<\/p>\n<ul>\n<li><strong>R\u00e9cup\u00e9ration de l&rsquo;espace disque bloqu\u00e9 <\/strong>: L&rsquo;un des principaux objectifs de Vacuum est de r\u00e9cup\u00e9rer l&rsquo;espace disque bloqu\u00e9 dans la base de donn\u00e9es. Comme les donn\u00e9es sont constamment ins\u00e9r\u00e9es, mises \u00e0 jour et supprim\u00e9es, PostgreSQL peut \u00eatre encombr\u00e9 par des lignes \u00ab mortes \u00bb ou obsol\u00e8tes qui occupent encore de l&rsquo;espace sur le disque. Vacuum identifie et supprime ces lignes mortes, rendant l&rsquo;espace disponible pour les nouvelles donn\u00e9es. Sans Vacuum, l&rsquo;espace disque s&rsquo;\u00e9puiserait progressivement, ce qui pourrait entra\u00eener une d\u00e9gradation des performances, voire un blocage du syst\u00e8me.<\/li>\n<li><strong>Mise \u00e0 jour des mesures du planificateur de requ\u00eates <\/strong>: L&rsquo;aspiration aide \u00e9galement PostgreSQL \u00e0 maintenir \u00e0 jour les statistiques et les m\u00e9triques utilis\u00e9es par son planificateur de requ\u00eates. Le planificateur de requ\u00eates s&rsquo;appuie sur une distribution pr\u00e9cise des donn\u00e9es et des informations statistiques pour g\u00e9n\u00e9rer des plans d&rsquo;ex\u00e9cution efficaces. En ex\u00e9cutant r\u00e9guli\u00e8rement Vacuum, PostgreSQL s&rsquo;assure que ces m\u00e9triques sont \u00e0 jour, ce qui lui permet de prendre de meilleures d\u00e9cisions sur la fa\u00e7on de r\u00e9cup\u00e9rer les donn\u00e9es et d&rsquo;optimiser les requ\u00eates.<\/li>\n<li><strong>Mise \u00e0 jour de la carte de visibilit\u00e9 <\/strong>: La carte de visibilit\u00e9 est un autre aspect crucial du processus de Vacuum de PostgreSQL. Elle aide \u00e0 identifier les blocs de donn\u00e9es d&rsquo;une table qui sont enti\u00e8rement visibles par toutes les transactions, ce qui permet \u00e0 Vacuum de cibler uniquement les blocs de donn\u00e9es n\u00e9cessaires au nettoyage. Cela am\u00e9liore l&rsquo;efficacit\u00e9 du processus de Vacuum en minimisant les op\u00e9rations d&rsquo;entr\u00e9es-sorties inutiles, qui seraient co\u00fbteuses en temps et en argent.<\/li>\n<li><strong>Pr\u00e9vention des \u00e9checs de contournement de l&rsquo;ID de transaction <\/strong>: Vacuum joue \u00e9galement un r\u00f4le essentiel dans la pr\u00e9vention des \u00e9checs de contournement des identifiants de transaction. PostgreSQL utilise un compteur d&rsquo;ID de transaction de 32 bits, qui peut conduire \u00e0 un d\u00e9passement lorsqu&rsquo;il atteint sa valeur maximale. Vacuum marque les anciennes transactions comme \u00ab gel\u00e9es \u00bb, emp\u00eachant le compteur d&rsquo;ID de s&#8217;emballer et de provoquer une corruption des donn\u00e9es. N\u00e9gliger cet aspect peut conduire \u00e0 des d\u00e9faillances catastrophiques de la base de donn\u00e9es.<\/li>\n<\/ul>\n<p>Comme mentionn\u00e9 pr\u00e9c\u00e9demment, PostgreSQL offre deux options pour ex\u00e9cuter Vacuum : <a href=\"https:\/\/www.postgresql.org\/docs\/current\/routine-vacuuming.html#AUTOVACUUM\" target=\"_blank\" rel=\"noopener noreferrer\">Autovacuum<\/a> et <a href=\"https:\/\/www.postgresql.org\/docs\/current\/sql-vacuum.html\" target=\"_blank\" rel=\"noopener noreferrer\">Manual Vacuum<\/a>.<\/p>\n<p>Autovacuum est le choix recommand\u00e9 pour la plupart des sc\u00e9narios car il g\u00e8re automatiquement le processus de Vacuum en fonction des r\u00e9glages pr\u00e9d\u00e9finis et de l&rsquo;activit\u00e9 de la base de donn\u00e9es. Manual Vacuum, quant \u00e0 lui, offre plus de contr\u00f4le mais n\u00e9cessite une compr\u00e9hension plus approfondie de la maintenance des bases de donn\u00e9es.<\/p>\n<p>Le choix entre les deux d\u00e9pend de facteurs tels que la taille de la base de donn\u00e9es, la charge de travail et les ressources disponibles. Les bases de donn\u00e9es de petite ou moyenne taille peuvent souvent compter sur Autovacuum, tandis que les bases de donn\u00e9es plus importantes ou plus complexes peuvent n\u00e9cessiter une intervention manuelle.<\/p>\n<h2>R\u00e9sum\u00e9<\/h2>\n<p>La maintenance des bases de donn\u00e9es n&rsquo;est pas seulement une question d&rsquo;entretien de routine ; c&rsquo;est le fondement d&rsquo;une application saine et performante. En optimisant, nettoyant et organisant r\u00e9guli\u00e8rement vos donn\u00e9es, vous vous assurez que votre base de donn\u00e9es PostgreSQL continue \u00e0 fournir des performances optimales, reste exempte de corruption et fonctionne efficacement, m\u00eame lorsque votre application \u00e9volue.<\/p>\n<p>Dans ce guide complet, nous avons explor\u00e9 l&rsquo;importance critique d&rsquo;\u00e9tablir des plans de maintenance de base de donn\u00e9es bien structur\u00e9s pour PostgreSQL lorsque vous travaillez avec Node.js et Express.<\/p>\n<p><em>Avons-nous oubli\u00e9 des op\u00e9rations de maintenance de routine que vous avez mises en \u0153uvre pour votre base de donn\u00e9es ? Ou connaissez-vous une meilleure fa\u00e7on de mettre en \u0153uvre l&rsquo;une de ces op\u00e9rations ? N&rsquo;h\u00e9sitez pas \u00e0 nous en faire part dans les commentaires !<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Avec l&rsquo;\u00e9volution du d\u00e9veloppement d&rsquo;applications, les bases de donn\u00e9es constituent le c\u0153ur de la plupart des applications, car elles stockent et g\u00e8rent des donn\u00e9es cruciales pour &#8230;<\/p>\n","protected":false},"author":238,"featured_media":74312,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[1012,994,1002],"class_list":["post-74311","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-conseils-techniques","topic-node-js","topic-postgresql"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Configurer la maintenance des bases de donn\u00e9es pour PostgreSQL sur Node<\/title>\n<meta name=\"description\" content=\"Apprenez la maintenance transparente de la base de donn\u00e9es PostgreSQL sur Node.js avec notre guide complet. Am\u00e9liorez votre gestion de base de donn\u00e9es sans effort !\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinqsta.com\/fr\/blog\/plans-maintenance-base-de-donnees\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Configurer les plans de maintenance des bases de donn\u00e9es pour PostgreSQL sur Node.js\" \/>\n<meta property=\"og:description\" content=\"Apprenez la maintenance transparente de la base de donn\u00e9es PostgreSQL sur Node.js avec notre guide complet. Am\u00e9liorez votre gestion de base de donn\u00e9es sans effort !\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinqsta.com\/fr\/blog\/plans-maintenance-base-de-donnees\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstafrance\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-11-23T12:28:01+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-11-30T12:43:27+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinqsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/11\/database-maintenance-plan.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Kumar Harsh\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Apprenez la maintenance transparente de la base de donn\u00e9es PostgreSQL sur Node.js avec notre guide complet. Am\u00e9liorez votre gestion de base de donn\u00e9es sans effort !\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinqsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/11\/database-maintenance-plan.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@kinsta_fr\" \/>\n<meta name=\"twitter:site\" content=\"@kinsta_fr\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kumar Harsh\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"20 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinqsta.com\/fr\/blog\/plans-maintenance-base-de-donnees\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinqsta.com\/fr\/blog\/plans-maintenance-base-de-donnees\/\"},\"author\":{\"name\":\"Kumar Harsh\",\"@id\":\"https:\/\/kinqsta.com\/fr\/#\/schema\/person\/3a80efffa9cbb0333cc9c22b754415d9\"},\"headline\":\"Configurer les plans de maintenance des bases de donn\u00e9es pour PostgreSQL sur Node.js\",\"datePublished\":\"2023-11-23T12:28:01+00:00\",\"dateModified\":\"2023-11-30T12:43:27+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinqsta.com\/fr\/blog\/plans-maintenance-base-de-donnees\/\"},\"wordCount\":3992,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinqsta.com\/fr\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinqsta.com\/fr\/blog\/plans-maintenance-base-de-donnees\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinqsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/11\/database-maintenance-plan.jpg\",\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinqsta.com\/fr\/blog\/plans-maintenance-base-de-donnees\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinqsta.com\/fr\/blog\/plans-maintenance-base-de-donnees\/\",\"url\":\"https:\/\/kinqsta.com\/fr\/blog\/plans-maintenance-base-de-donnees\/\",\"name\":\"Configurer la maintenance des bases de donn\u00e9es pour PostgreSQL sur Node\",\"isPartOf\":{\"@id\":\"https:\/\/kinqsta.com\/fr\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinqsta.com\/fr\/blog\/plans-maintenance-base-de-donnees\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinqsta.com\/fr\/blog\/plans-maintenance-base-de-donnees\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinqsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/11\/database-maintenance-plan.jpg\",\"datePublished\":\"2023-11-23T12:28:01+00:00\",\"dateModified\":\"2023-11-30T12:43:27+00:00\",\"description\":\"Apprenez la maintenance transparente de la base de donn\u00e9es PostgreSQL sur Node.js avec notre guide complet. Am\u00e9liorez votre gestion de base de donn\u00e9es sans effort !\",\"breadcrumb\":{\"@id\":\"https:\/\/kinqsta.com\/fr\/blog\/plans-maintenance-base-de-donnees\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinqsta.com\/fr\/blog\/plans-maintenance-base-de-donnees\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/kinqsta.com\/fr\/blog\/plans-maintenance-base-de-donnees\/#primaryimage\",\"url\":\"https:\/\/kinqsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/11\/database-maintenance-plan.jpg\",\"contentUrl\":\"https:\/\/kinqsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/11\/database-maintenance-plan.jpg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinqsta.com\/fr\/blog\/plans-maintenance-base-de-donnees\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinqsta.com\/fr\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PostgreSQL\",\"item\":\"https:\/\/kinqsta.com\/fr\/sujets\/postgresql\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Configurer les plans de maintenance des bases de donn\u00e9es pour PostgreSQL sur Node.js\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinqsta.com\/fr\/#website\",\"url\":\"https:\/\/kinqsta.com\/fr\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Solutions d&#039;h\u00e9bergement premium, rapides et s\u00e9curis\u00e9es\",\"publisher\":{\"@id\":\"https:\/\/kinqsta.com\/fr\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinqsta.com\/fr\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinqsta.com\/fr\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinqsta.com\/fr\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/kinqsta.com\/fr\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinqsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinqsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinqsta.com\/fr\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstafrance\/\",\"https:\/\/x.com\/kinsta_fr\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinqsta.com\/fr\/#\/schema\/person\/3a80efffa9cbb0333cc9c22b754415d9\",\"name\":\"Kumar Harsh\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/kinqsta.com\/fr\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/de2d8d6273bdcc3dfa2f8270428f95b2?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/de2d8d6273bdcc3dfa2f8270428f95b2?s=96&d=mm&r=g\",\"caption\":\"Kumar Harsh\"},\"description\":\"Kumar is a software developer and a technical author based in India. He specializes in JavaScript and DevOps. You can learn more about his work on his website.\",\"sameAs\":[\"https:\/\/kumarharsh.me\"],\"url\":\"https:\/\/kinqsta.com\/fr\/blog\/author\/kumarharsh\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Configurer la maintenance des bases de donn\u00e9es pour PostgreSQL sur Node","description":"Apprenez la maintenance transparente de la base de donn\u00e9es PostgreSQL sur Node.js avec notre guide complet. Am\u00e9liorez votre gestion de base de donn\u00e9es sans effort !","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinqsta.com\/fr\/blog\/plans-maintenance-base-de-donnees\/","og_locale":"fr_FR","og_type":"article","og_title":"Configurer les plans de maintenance des bases de donn\u00e9es pour PostgreSQL sur Node.js","og_description":"Apprenez la maintenance transparente de la base de donn\u00e9es PostgreSQL sur Node.js avec notre guide complet. Am\u00e9liorez votre gestion de base de donn\u00e9es sans effort !","og_url":"https:\/\/kinqsta.com\/fr\/blog\/plans-maintenance-base-de-donnees\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstafrance\/","article_published_time":"2023-11-23T12:28:01+00:00","article_modified_time":"2023-11-30T12:43:27+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinqsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/11\/database-maintenance-plan.jpg","type":"image\/jpeg"}],"author":"Kumar Harsh","twitter_card":"summary_large_image","twitter_description":"Apprenez la maintenance transparente de la base de donn\u00e9es PostgreSQL sur Node.js avec notre guide complet. Am\u00e9liorez votre gestion de base de donn\u00e9es sans effort !","twitter_image":"https:\/\/kinqsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/11\/database-maintenance-plan.jpg","twitter_creator":"@kinsta_fr","twitter_site":"@kinsta_fr","twitter_misc":{"\u00c9crit par":"Kumar Harsh","Dur\u00e9e de lecture estim\u00e9e":"20 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinqsta.com\/fr\/blog\/plans-maintenance-base-de-donnees\/#article","isPartOf":{"@id":"https:\/\/kinqsta.com\/fr\/blog\/plans-maintenance-base-de-donnees\/"},"author":{"name":"Kumar Harsh","@id":"https:\/\/kinqsta.com\/fr\/#\/schema\/person\/3a80efffa9cbb0333cc9c22b754415d9"},"headline":"Configurer les plans de maintenance des bases de donn\u00e9es pour PostgreSQL sur Node.js","datePublished":"2023-11-23T12:28:01+00:00","dateModified":"2023-11-30T12:43:27+00:00","mainEntityOfPage":{"@id":"https:\/\/kinqsta.com\/fr\/blog\/plans-maintenance-base-de-donnees\/"},"wordCount":3992,"commentCount":0,"publisher":{"@id":"https:\/\/kinqsta.com\/fr\/#organization"},"image":{"@id":"https:\/\/kinqsta.com\/fr\/blog\/plans-maintenance-base-de-donnees\/#primaryimage"},"thumbnailUrl":"https:\/\/kinqsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/11\/database-maintenance-plan.jpg","inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinqsta.com\/fr\/blog\/plans-maintenance-base-de-donnees\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinqsta.com\/fr\/blog\/plans-maintenance-base-de-donnees\/","url":"https:\/\/kinqsta.com\/fr\/blog\/plans-maintenance-base-de-donnees\/","name":"Configurer la maintenance des bases de donn\u00e9es pour PostgreSQL sur Node","isPartOf":{"@id":"https:\/\/kinqsta.com\/fr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinqsta.com\/fr\/blog\/plans-maintenance-base-de-donnees\/#primaryimage"},"image":{"@id":"https:\/\/kinqsta.com\/fr\/blog\/plans-maintenance-base-de-donnees\/#primaryimage"},"thumbnailUrl":"https:\/\/kinqsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/11\/database-maintenance-plan.jpg","datePublished":"2023-11-23T12:28:01+00:00","dateModified":"2023-11-30T12:43:27+00:00","description":"Apprenez la maintenance transparente de la base de donn\u00e9es PostgreSQL sur Node.js avec notre guide complet. Am\u00e9liorez votre gestion de base de donn\u00e9es sans effort !","breadcrumb":{"@id":"https:\/\/kinqsta.com\/fr\/blog\/plans-maintenance-base-de-donnees\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinqsta.com\/fr\/blog\/plans-maintenance-base-de-donnees\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/kinqsta.com\/fr\/blog\/plans-maintenance-base-de-donnees\/#primaryimage","url":"https:\/\/kinqsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/11\/database-maintenance-plan.jpg","contentUrl":"https:\/\/kinqsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/11\/database-maintenance-plan.jpg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinqsta.com\/fr\/blog\/plans-maintenance-base-de-donnees\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinqsta.com\/fr\/"},{"@type":"ListItem","position":2,"name":"PostgreSQL","item":"https:\/\/kinqsta.com\/fr\/sujets\/postgresql\/"},{"@type":"ListItem","position":3,"name":"Configurer les plans de maintenance des bases de donn\u00e9es pour PostgreSQL sur Node.js"}]},{"@type":"WebSite","@id":"https:\/\/kinqsta.com\/fr\/#website","url":"https:\/\/kinqsta.com\/fr\/","name":"Kinsta\u00ae","description":"Solutions d&#039;h\u00e9bergement premium, rapides et s\u00e9curis\u00e9es","publisher":{"@id":"https:\/\/kinqsta.com\/fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinqsta.com\/fr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/kinqsta.com\/fr\/#organization","name":"Kinsta","url":"https:\/\/kinqsta.com\/fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/kinqsta.com\/fr\/#\/schema\/logo\/image\/","url":"https:\/\/kinqsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinqsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinqsta.com\/fr\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstafrance\/","https:\/\/x.com\/kinsta_fr","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinqsta.com\/fr\/#\/schema\/person\/3a80efffa9cbb0333cc9c22b754415d9","name":"Kumar Harsh","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/kinqsta.com\/fr\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/de2d8d6273bdcc3dfa2f8270428f95b2?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/de2d8d6273bdcc3dfa2f8270428f95b2?s=96&d=mm&r=g","caption":"Kumar Harsh"},"description":"Kumar is a software developer and a technical author based in India. He specializes in JavaScript and DevOps. You can learn more about his work on his website.","sameAs":["https:\/\/kumarharsh.me"],"url":"https:\/\/kinqsta.com\/fr\/blog\/author\/kumarharsh\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinqsta.com\/fr\/wp-json\/wp\/v2\/posts\/74311","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinqsta.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinqsta.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinqsta.com\/fr\/wp-json\/wp\/v2\/users\/238"}],"replies":[{"embeddable":true,"href":"https:\/\/kinqsta.com\/fr\/wp-json\/wp\/v2\/comments?post=74311"}],"version-history":[{"count":5,"href":"https:\/\/kinqsta.com\/fr\/wp-json\/wp\/v2\/posts\/74311\/revisions"}],"predecessor-version":[{"id":74675,"href":"https:\/\/kinqsta.com\/fr\/wp-json\/wp\/v2\/posts\/74311\/revisions\/74675"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinqsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/74311\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinqsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/74311\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinqsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/74311\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinqsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/74311\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinqsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/74311\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinqsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/74311\/translations\/jp"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinqsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/74311\/translations\/es"},{"href":"https:\/\/kinqsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/74311\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinqsta.com\/fr\/wp-json\/wp\/v2\/media\/74312"}],"wp:attachment":[{"href":"https:\/\/kinqsta.com\/fr\/wp-json\/wp\/v2\/media?parent=74311"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinqsta.com\/fr\/wp-json\/wp\/v2\/tags?post=74311"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinqsta.com\/fr\/wp-json\/wp\/v2\/topic?post=74311"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}