{"id":67115,"date":"2023-11-23T13:27:12","date_gmt":"2023-11-23T12:27:12","guid":{"rendered":"https:\/\/kinqsta.com\/de\/?p=67115&#038;preview=true&#038;preview_id=67115"},"modified":"2023-11-30T13:32:22","modified_gmt":"2023-11-30T12:32:22","slug":"datenbank-wartungs-plan","status":"publish","type":"post","link":"https:\/\/kinqsta.com\/de\/blog\/datenbank-wartungs-plan\/","title":{"rendered":"Einrichten von Datenbank-Wartungspl\u00e4nen f\u00fcr PostgreSQL auf Node.js"},"content":{"rendered":"<p>Im Zuge der Anwendungsentwicklung sind Datenbanken das Herzst\u00fcck der meisten Anwendungen. Sie speichern und verwalten Daten, die f\u00fcr digitale Unternehmen wichtig sind. Da diese Daten wachsen und immer komplexer werden, ist es wichtig, dass du die Effizienz deiner Datenbank sicherstellst, um die Anforderungen deiner Anwendung zu erf\u00fcllen.<\/p>\n<p>Hier kommt die Idee der Datenbankwartung ins Spiel. Zur Datenbankwartung geh\u00f6ren Aufgaben wie Reinigung, Backups und die Optimierung von Indizes, um die Leistung zu steigern.<\/p>\n<p>Dieser Artikel bietet wertvolle Einblicke in die Wartungstrigger und stellt praktische Anleitungen zur Einrichtung vor. Er erkl\u00e4rt, wie man verschiedene Datenbankwartungsaufgaben wie Datensicherung, Neuaufbau von Indizes, Archivierung und Datenbereinigung mit <a href=\"https:\/\/kinqsta.com\/de\/thema\/postgresql\/\">PostgreSQL<\/a>, integriert mit einem API-Trigger in einer <a href=\"https:\/\/kinqsta.com\/de\/thema\/node-js\/\">Node.js-Anwendung<\/a>, durchf\u00fchrt.<\/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>Trigger verstehen<\/h2>\n<p>Bevor du Wartungsvorg\u00e4nge f\u00fcr deine Datenbank erstellst, ist es wichtig, die verschiedenen M\u00f6glichkeiten, wie sie ausgel\u00f6st werden k\u00f6nnen, zu verstehen. Jeder Trigger dient einem bestimmten Zweck, um die Wartungsaufgaben zu erleichtern. Die drei wichtigsten Trigger, die h\u00e4ufig verwendet werden, sind:<\/p>\n<ul>\n<li><strong>Manuell, API-basiert<\/strong>: Dieser Trigger erm\u00f6glicht es dir, einmalige Vorg\u00e4nge \u00fcber einen API-Aufruf auszuf\u00fchren. Er ist z. B. n\u00fctzlich, um ein Datenbank-Backup wiederherzustellen oder Indizes neu aufzubauen, wenn die Leistung pl\u00f6tzlich abf\u00e4llt.<\/li>\n<li><strong>Zeitplan (wie CRON)<\/strong>: Mit diesem Trigger kannst du geplante Wartungsaktivit\u00e4ten in Zeiten mit geringem Nutzeraufkommen automatisieren. Er ist ideal f\u00fcr ressourcenintensive Vorg\u00e4nge wie Archivierung und Bereinigung. Mit Paketen wie <a href=\"https:\/\/www.npmjs.com\/package\/node-schedule\" target=\"_blank\" rel=\"noopener noreferrer\">node-schedule<\/a> kannst du Zeitpl\u00e4ne in Node.js einrichten, die die Vorg\u00e4nge bei Bedarf automatisch ausl\u00f6sen.<\/li>\n<li><strong>Datenbank-Benachrichtigungen<\/strong>: Dieser Trigger erm\u00f6glicht es dir, Wartungsarbeiten als Reaktion auf Datenbank\u00e4nderungen durchzuf\u00fchren. Wenn zum Beispiel ein Nutzer einen Kommentar auf einer Plattform postet, k\u00f6nnen die gespeicherten Daten sofort eine \u00dcberpr\u00fcfung auf unregelm\u00e4\u00dfige Zeichen, anst\u00f6\u00dfige Sprache oder Emojis ausl\u00f6sen. Diese Funktion l\u00e4sst sich in Node.js mit Paketen wie <a href=\"https:\/\/github.com\/andywer\/pg-listen\" target=\"_blank\" rel=\"noopener noreferrer\">pg-listen<\/a> implementieren.<\/li>\n<\/ul>\n<h2>Voraussetzungen<\/h2>\n<p>Um diesem Leitfaden folgen zu k\u00f6nnen, solltest du die folgenden Tools auf deinem lokalen Computer haben:<\/p>\n<ul>\n<li><a href=\"https:\/\/kinqsta.com\/de\/blog\/git-installieren\/\">Git<\/a>: Um die Versionskontrolle f\u00fcr den Quellcode deiner Anwendung zu verwalten<\/li>\n<li><a href=\"https:\/\/kinqsta.com\/de\/blog\/so-installierst-du-node-js\/\">Node.js<\/a>: F\u00fcr die Erstellung deiner Backend-Anwendung<\/li>\n<li><a href=\"https:\/\/www.postgresql.org\/docs\/current\/app-psql.html\" target=\"_blank\" rel=\"noopener noreferrer\">psql<\/a>: F\u00fcr die Interaktion mit deiner PostgreSQL-Datenbank \u00fcber dein Terminal<\/li>\n<li><a href=\"https:\/\/www.pgadmin.org\/download\/\" target=\"_blank\" rel=\"noopener noreferrer\">PGAdmin<\/a> (optional): F\u00fcr die Interaktion mit deiner PostgreSQL-Datenbank \u00fcber eine grafische Benutzeroberfl\u00e4che (GUI).<\/li>\n<\/ul>\n<h3>Erstellen und Hosten einer Node.js-Anwendung<\/h3>\n<p>Richte ein Node.js-Projekt ein, \u00fcbertrage es auf GitHub und richte eine Auto-Deploy-Pipeline zu Kinsta ein. Du musst auch eine <a href=\"https:\/\/sevalla.com\/database-hosting\/\">PostgreSQL-Datenbank auf Kinsta<\/a> einrichten, um deine Wartungsroutinen darauf zu testen.<\/p>\n<p>Beginne damit, ein neues Verzeichnis auf deinem lokalen System mit dem folgenden Befehl zu erstellen:<\/p>\n<pre><code class=\"language-bash\">mkdir node-db-maintenance<\/code><\/pre>\n<p>Wechsle dann in das neu erstellte Verzeichnis und f\u00fchre den folgenden Befehl aus, um ein neues Projekt zu erstellen:<\/p>\n<pre><code class=\"language-bash\">cd node-db-maintenance\nyarn init -y # or npm init -y<\/code><\/pre>\n<p>Dadurch wird ein Node.js-Projekt mit der Standardkonfiguration f\u00fcr dich initialisiert. Du kannst nun die notwendigen Abh\u00e4ngigkeiten installieren, indem du den folgenden Befehl ausf\u00fchrst:<\/p>\n<pre><code class=\"language-bash\">yarn add express pg nodemon dotenv<\/code><\/pre>\n<p>Hier ist eine kurze Beschreibung der einzelnen Pakete:<\/p>\n<ul>\n<li><code>express<\/code>: erm\u00f6glicht es dir, eine Express-basierte REST-API einzurichten.<\/li>\n<li><code>pg<\/code>mit diesem Paket kannst du \u00fcber deine Node.js-Anwendung mit einer PostgreSQL-Datenbank interagieren.<\/li>\n<li><code>nodemon<\/code>mit diesem Paket kannst du deinen Dev-Build w\u00e4hrend der Entwicklung deiner Anwendung aktualisieren, sodass du deine Anwendung nicht jedes Mal stoppen und starten musst, wenn du eine \u00c4nderung vornimmst.<\/li>\n<li><code>dotenv<\/code>: erm\u00f6glicht es dir, Umgebungsvariablen aus einer <strong>.env-Datei<\/strong> in dein <code>process.env<\/code> Objekt zu laden.<\/li>\n<\/ul>\n<p>Als N\u00e4chstes f\u00fcgst du die folgenden Skripte in deine <strong>package.json-Datei<\/strong> ein, damit du deinen Entwicklungsserver einfach starten und deinen Server auch in der Produktion betreiben kannst:<\/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>Du kannst nun eine <strong>index.js-Datei<\/strong> erstellen, die den Quellcode deiner Anwendung enth\u00e4lt. F\u00fcge den folgenden Code in diese Datei ein:<\/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>Der obige Code initialisiert einen <a href=\"https:\/\/kinqsta.com\/de\/blog\/was-ist-express-js\/\">Express-Server<\/a> und konfiguriert die Umgebungsvariablen mit Hilfe des <code>dotenv<\/code> Pakets, wenn es sich nicht im Produktionsmodus befindet. Er richtet auch eine <code>\/health<\/code> Route ein, die ein JSON-Objekt <code>{status: \"UP\"}<\/code> zur\u00fcckgibt. Schlie\u00dflich wird die Anwendung mit der Funktion <code>app.listen()<\/code> gestartet, um auf dem angegebenen Port zu lauschen. Wenn kein Port \u00fcber die Umgebungsvariable angegeben wird, wird standardm\u00e4\u00dfig <code>3000<\/code> verwendet.<\/p>\n<p>Nachdem du nun eine einfache Anwendung erstellt hast, initialisiere ein neues Git-Repository mit deinem bevorzugten Git-Anbieter (<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> oder <a href=\"https:\/\/docs.sevalla.com\/applications\/git\/gitlab#authorize-the-kinsta-gitlab-application\">GitLab<\/a>) und ver\u00f6ffentliche deinen Code. Kinsta unterst\u00fctzt die Bereitstellung von Anwendungen \u00fcber all diese Git-Anbieter. F\u00fcr diesen Artikel verwenden wir GitHub.<\/p>\n<p>Wenn dein Repository fertig ist, befolge die folgenden Schritte, um deine Anwendung auf Kinsta bereitzustellen:<\/p>\n<ol>\n<li>Melde dich an oder erstelle ein Konto, um dein <a href=\"https:\/\/my.kinqsta.com\/?lang=de\">MyKinsta-Dashboard<\/a> zu sehen.<\/li>\n<li>Autorisiere Kinsta mit deinem Git-Anbieter.<\/li>\n<li>Klicke in der linken Seitenleiste auf <strong>Anwendungen<\/strong> und dann auf <strong>Anwendung hinzuf\u00fcgen<\/strong>.<\/li>\n<li>W\u00e4hle das Repository und den Zweig aus, von dem aus du bereitstellen m\u00f6chtest.<\/li>\n<li>W\u00e4hle einen der verf\u00fcgbaren Rechenzentrumsstandorte aus der Liste der 27 Optionen aus. Kinsta erkennt automatisch die Build-Einstellungen f\u00fcr deine Anwendungen \u00fcber <a href=\"https:\/\/kinqsta.com\/de\/changelog\/nixpacks\/\">Nixpacks<\/a>.<\/li>\n<li>W\u00e4hle die Ressourcen f\u00fcr deine Anwendung, z. B. RAM und Festplattenplatz.<\/li>\n<li>Klicke auf <strong>Anwendung erstellen<\/strong>.<\/li>\n<\/ol>\n<p>Sobald die Bereitstellung abgeschlossen ist, kopierst du den Link der bereitgestellten Anwendung und navigierst zu <code>\/health<\/code>. In deinem Browser sollte das folgende JSON angezeigt werden:<\/p>\n<pre><code class=\"language-js\">{status: \"UP\"}<\/code><\/pre>\n<p>Dies zeigt an, dass die Anwendung korrekt eingerichtet wurde.<\/p>\n<h3>Einrichten einer PostgreSQL-Instanz auf Kinsta<\/h3>\n<p>Kinsta bietet eine einfache Schnittstelle zur Bereitstellung von Datenbankinstanzen. Beginne damit, ein neues <a href=\"https:\/\/kinqsta.com\/de\/anmelden\/\">Kinsta-Konto<\/a> zu erstellen, falls du noch keines hast. Befolge dann die folgenden Schritte:<\/p>\n<ol>\n<li>Logge dich in dein MyKinsta-Dashboard ein.<\/li>\n<li>Klicke in der linken Seitenleiste auf <strong>Datenbanken<\/strong> und dann auf <strong>Datenbank hinzuf\u00fcgen<\/strong>.<\/li>\n<li>W\u00e4hle <strong>PostgreSQL<\/strong> als Datenbanktyp und w\u00e4hle deine bevorzugte Version. W\u00e4hle einen Namen f\u00fcr deine Datenbank und \u00e4ndere den Benutzernamen und das Passwort, wenn du m\u00f6chtest.<\/li>\n<li>W\u00e4hle einen Standort f\u00fcr das Rechenzentrum aus der Liste von 27 aus.<\/li>\n<li>W\u00e4hle die Gr\u00f6\u00dfe deiner Datenbank.<\/li>\n<li>Klicke auf <strong>Datenbank erstellen<\/strong>.<\/li>\n<\/ol>\n<p>Sobald die Datenbank erstellt ist, stelle sicher, dass du den Datenbank-Host, den Port, den Benutzernamen und das Passwort abrufst.<\/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=\"Der Bildschirm zeigt den externen Hostnamen, den Port, den Benutzernamen, das Passwort, den Datenbanknamen und einen externen Verbindungsstring f\u00fcr die Datenbank an, die auf Kinsta erstellt wurde.\" width=\"1024\" height=\"435\"><figcaption id=\"caption-attachment-168402\" class=\"wp-caption-text\">Von Kinsta generierte Datenbank-Anmeldedaten<\/figcaption><\/figure>\n<p>Du kannst diese Werte dann in dein psql CLI (oder PGAdmin GUI) eingeben, um die Datenbank zu verwalten. Um deinen Code lokal zu testen, erstelle eine <strong>.env-Datei<\/strong> im Hauptverzeichnis deines Projekts und speichere darin die folgenden Secrets:<\/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>Wenn du auf Kinsta bereitstellst, musst du diese Werte als <a href=\"https:\/\/docs.sevalla.com\/applications\/overviewenvironment-variables\">Umgebungsvariablen<\/a> zu deiner Anwendungsimplementierung hinzuf\u00fcgen.<\/p>\n<p>Um die Datenbankoperationen vorzubereiten, lade <a href=\"https:\/\/github.com\/krharsh17\/node-db-maintenance\/blob\/main\/test-data.sql\" target=\"_blank\" rel=\"noopener noreferrer\">dieses SQL-Skript<\/a> herunter und f\u00fchre es aus, um Tabellen (Benutzer, Beitr\u00e4ge, Kommentare) zu erstellen und Beispieldaten einzuf\u00fcgen. Verwende den folgenden Befehl, indem du die Platzhalter durch deine eigenen Angaben ersetzt, um die Daten zu deiner neu erstellten PostgreSQL-Datenbank hinzuzuf\u00fcgen:<\/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>Achte darauf, dass du den genauen Dateinamen und den Pfad im obigen Befehl eingibst. Bei der Ausf\u00fchrung dieses Befehls wirst du aufgefordert, dein Datenbankpasswort zur Autorisierung einzugeben.<\/p>\n<p>Sobald dieser Befehl ausgef\u00fchrt wurde, kannst du mit dem Schreiben von Operationen f\u00fcr die Wartung deiner Datenbank beginnen. Du kannst deinen Code in dein Git-Repository stellen, wenn du mit jeder Operation fertig bist, um ihn auf der Kinsta-Plattform in Aktion zu sehen.<\/p>\n<h2>Wartungsroutinen schreiben<\/h2>\n<p>In diesem Abschnitt werden mehrere h\u00e4ufig verwendete Operationen f\u00fcr die Wartung von PostgreSQL-Datenbanken erkl\u00e4rt.<\/p>\n<h3>1. Backups erstellen<\/h3>\n<p>Regelm\u00e4\u00dfige Backups von Datenbanken sind ein g\u00e4ngiger und wichtiger Vorgang. Dabei wird eine Kopie des gesamten Datenbankinhalts erstellt, die an einem sicheren Ort gespeichert wird. Diese Backups sind wichtig f\u00fcr die Wiederherstellung von Daten im Falle eines versehentlichen Verlusts oder von Fehlern, die die Datenintegrit\u00e4t beeintr\u00e4chtigen.<\/p>\n<p>Auch wenn <a href=\"https:\/\/docs.sevalla.com\/databases\/backups\">Plattformen wie Kinsta automatische Backups<\/a> als Teil ihrer Dienste anbieten, ist es wichtig zu wissen, wie man bei Bedarf eine eigene Backup-Routine einrichtet.<\/p>\n<p>PostgreSQL bietet das Tool <a href=\"https:\/\/www.postgresql.org\/docs\/current\/app-pgdump.html\" target=\"_blank\" rel=\"noopener noreferrer\">pg_dump<\/a> f\u00fcr die Erstellung von Datenbanksicherungen. Es muss jedoch direkt von der Kommandozeile aus ausgef\u00fchrt werden und es gibt kein npm-Paket daf\u00fcr. Du musst also das Paket <a href=\"https:\/\/www.npmjs.com\/package\/@getvim\/execute\" target=\"_blank\" rel=\"noopener noreferrer\">@getvim\/execute<\/a> verwenden, um den Befehl <code>pg_dump<\/code> in der lokalen Umgebung deiner Node-Anwendung auszuf\u00fchren.<\/p>\n<p>Installiere das Paket, indem du den folgenden Befehl ausf\u00fchrst:<\/p>\n<pre><code class=\"language-bash\">yarn add @getvim\/execute<\/code><\/pre>\n<p>Als N\u00e4chstes importierst du das Paket in deine <strong>index.js-Datei <\/strong>, indem du diese Codezeile am Anfang einf\u00fcgst:<\/p>\n<pre><code class=\"language-js\">const {execute} = require('@getvim\/execute');<\/code><\/pre>\n<p>Die Backups werden als Dateien im lokalen Dateisystem deiner Node-Anwendung erstellt. Daher ist es am besten, wenn du im Stammverzeichnis des Projekts ein eigenes Verzeichnis mit dem Namen <strong>backup<\/strong> anlegst.<\/p>\n<p>Jetzt kannst du die folgende Route verwenden, um bei Bedarf Backups deiner Datenbank zu erstellen und herunterzuladen:<\/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>Au\u00dferdem musst du die folgende Zeile am Anfang deiner <strong>index.js-Datei<\/strong> einf\u00fcgen, nachdem die Express-Anwendung initialisiert wurde:<\/p>\n<pre><code class=\"language-js\">app.use('\/backup', express.static('backup'))<\/code><\/pre>\n<p>Dadurch kann der <strong>Backup-Ordner<\/strong> statisch mit der Middleware-Funktion <code>express.static<\/code> bedient werden, so dass der Nutzer die erzeugten Backup-Dateien von der Node-Anwendung herunterladen kann.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Wenn du eine <code>server version mismatch<\/code> Fehlermeldung mit PostgreSQL erh\u00e4ltst, bedeutet das, dass die Datenbankversion von der deines lokalen <code>pg_dump<\/code> Tools abweicht. \u00dcberpr\u00fcfe deine <code>pg_dump<\/code> Version und aktualisiere entweder das Tool oder die Datenbank, damit sie \u00fcbereinstimmen.<\/p>\n<\/aside>\n\n<h3>2. Wiederherstellung aus einem Backup<\/h3>\n<p>Postgres erm\u00f6glicht die Wiederherstellung von Backups mit dem Kommandozeilentool <code>pg_restore<\/code>. Allerdings musst du es \u00fcber das Paket <code>execute<\/code> verwenden, \u00e4hnlich wie du es mit dem Befehl <code>pg_dump<\/code> gemacht hast. Hier ist der Code f\u00fcr die 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>Das obige Codeschnipsel sucht zun\u00e4chst nach Dateien, die im lokalen <strong>Sicherungsverzeichnis<\/strong> gespeichert sind. Dann sortiert er sie nach dem Datum, an dem sie erstellt wurden, um die neueste Sicherungsdatei zu finden. Schlie\u00dflich verwendet er das Paket <code>execute<\/code>, um die ausgew\u00e4hlte Sicherungsdatei wiederherzustellen.<\/p>\n<p>Achte darauf, dass du die folgenden Importe in deine <strong>index.js-Datei<\/strong> einf\u00fcgst, damit die notwendigen Module f\u00fcr den Zugriff auf das lokale Dateisystem importiert werden und die Funktion korrekt ausgef\u00fchrt werden kann:<\/p>\n<pre><code class=\"language-js\">const fs = require('fs')\nconst path = require('path')<\/code><\/pre>\n<h3>3. Einen Index wiederherstellen<\/h3>\n<p>Die Indizes von Postgres-Tabellen werden manchmal besch\u00e4digt und die Leistung der Datenbank wird beeintr\u00e4chtigt. Das kann an Software-Bugs oder Fehlern liegen. Manchmal k\u00f6nnen Indizes auch durch zu viele leere oder fast leere Seiten aufgebl\u00e4ht werden.<\/p>\n<p>In solchen F\u00e4llen musst du den Index neu erstellen, um sicherzustellen, dass du die beste Leistung aus deiner Postgres-Instanz herausholst.<\/p>\n<p>Postgres bietet zu diesem Zweck den Befehl <a href=\"https:\/\/www.postgresql.org\/docs\/current\/sql-reindex.html\" target=\"_blank\" rel=\"noopener noreferrer\">REINDEX<\/a> an. Du kannst das Paket <a href=\"https:\/\/node-postgres.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">node-postgres<\/a> verwenden, um diesen Befehl auszuf\u00fchren (und sp\u00e4ter auch einige andere Operationen), also installiere es, indem du zuerst den folgenden Befehl ausf\u00fchrst:<\/p>\n<pre><code class=\"language-bash\">yarn add pg<\/code><\/pre>\n<p>Als N\u00e4chstes f\u00fcgst du die folgenden Zeilen am Anfang der Datei <strong>index.js<\/strong> unter den Importen ein, um die Datenbankverbindung korrekt zu initialisieren:<\/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>Die Implementierung dieses Vorgangs ist recht einfach:<\/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>Der oben gezeigte Befehl indiziert die gesamte Tabelle Users neu. Du kannst den Befehl an deine Bed\u00fcrfnisse anpassen, um einen bestimmten Index neu zu erstellen oder sogar die gesamte Datenbank neu zu indizieren.<\/p>\n<h3>4. Archivierung und Bereinigung von Daten<\/h3>\n<p>F\u00fcr Datenbanken, die im Laufe der Zeit sehr gro\u00df werden (und auf historische Daten wird nur selten zugegriffen), kann es sinnvoll sein, Routinen einzurichten, die die alten Daten in einen Data Lake auslagern, wo sie bequemer gespeichert und verarbeitet werden k\u00f6nnen.<\/p>\n<p>Parquet-Dateien sind ein g\u00e4ngiger Standard f\u00fcr die Speicherung und \u00dcbertragung von Daten in vielen Data Lakes. Mit der <a href=\"https:\/\/www.npmjs.com\/package\/parquetjs\" target=\"_blank\" rel=\"noopener noreferrer\">ParquetJS-Bibliothek<\/a> kannst du Parquet-Dateien aus deinen Postgres-Daten erstellen und Dienste wie <a href=\"https:\/\/ahana.io\/answers\/query-parquet-using-amazon-athena\/\" target=\"_blank\" rel=\"noopener noreferrer\">AWS Athena<\/a> nutzen, um sie direkt zu lesen, ohne sie in Zukunft wieder in die Datenbank laden zu m\u00fcssen.<\/p>\n<p>Installiere die ParquetJS-Bibliothek, indem du den folgenden Befehl ausf\u00fchrst:<\/p>\n<pre><code class=\"language-bash\">yarn add parquetjs<\/code><\/pre>\n<p>Wenn du Archive erstellst, musst du eine gro\u00dfe Anzahl von Datens\u00e4tzen aus deinen Tabellen abfragen. Das Speichern einer so gro\u00dfen Datenmenge im Speicher deiner Anwendung kann ressourcenintensiv, kostspielig und fehleranf\u00e4llig sein.<\/p>\n<p>Deshalb ist es sinnvoll, <a href=\"https:\/\/node-postgres.com\/apis\/cursor\" target=\"_blank\" rel=\"noopener noreferrer\">Cursors<\/a> zu verwenden, um Daten aus der Datenbank zu laden und zu verarbeiten. Installiere das Modul <code>cursors<\/code> aus dem Paket <code>node-postgres<\/code>, indem du den folgenden Befehl ausf\u00fchrst:<\/p>\n<pre><code class=\"language-bash\">yarn add pg-cursor<\/code><\/pre>\n<p>Als n\u00e4chstes musst du beide Bibliotheken in deine <strong>index.js-Datei<\/strong> importieren:<\/p>\n<pre><code class=\"language-js\">const Cursor = require('pg-cursor')\nconst parquet = require('parquetjs')<\/code><\/pre>\n<p>Jetzt kannst du den folgenden Codeschnipsel verwenden, um Parkettdateien aus deiner Datenbank zu erstellen:<\/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>Als N\u00e4chstes f\u00fcgst du den folgenden Code am Anfang deiner <strong>index.js-Datei<\/strong> ein, nachdem die Express-Anwendung initialisiert wurde:<\/p>\n<pre><code class=\"language-js\">app.use('\/archive', express.static('archive'))<\/code><\/pre>\n<p>Damit kann der <strong>Archivordner<\/strong> statisch bedient werden, so dass du die erzeugten Parkettdateien vom Server herunterladen kannst.<\/p>\n<p>Vergiss nicht, ein <strong>Archivverzeichnis<\/strong> im Projektverzeichnis anzulegen, um die Archivdateien zu speichern.<\/p>\n<p>Du kannst dieses Codeschnipsel weiter anpassen, um die Parquet-Dateien automatisch in einen <a href=\"https:\/\/sparkbyexamples.com\/spark\/spark-read-write-parquet-file-from-amazon-s3\/\" target=\"_blank\" rel=\"noopener noreferrer\">AWS S3-Bucket<\/a> hochzuladen und CRON-Jobs zu verwenden, um den Vorgang automatisch in einer Routine auszul\u00f6sen.<\/p>\n<h3>5. Datenbereinigung<\/h3>\n<p>Ein h\u00e4ufiger Grund f\u00fcr die Durchf\u00fchrung von Datenbankwartungsoperationen ist die Bereinigung von Daten, die mit der Zeit veraltet oder irrelevant geworden sind. In diesem Abschnitt geht es um zwei h\u00e4ufige F\u00e4lle, in denen Datenbereinigungen als Teil der Wartung durchgef\u00fchrt werden.<\/p>\n<p>In Wirklichkeit kannst du deine eigene Datenbereinigungsroutine einrichten, je nachdem, was die Datenmodelle deiner Anwendung erfordern. Die folgenden Beispiele dienen nur als Referenz.<\/p>\n<h4>L\u00f6schen von Datens\u00e4tzen nach Alter (letzte \u00c4nderung oder letzter Zugriff)<\/h4>\n<p>Das Bereinigen von Datens\u00e4tzen anhand des Alters ist im Vergleich zu den anderen Vorg\u00e4ngen auf dieser Liste relativ einfach. Du kannst eine L\u00f6schabfrage schreiben, die Datens\u00e4tze l\u00f6scht, die \u00e4lter als ein bestimmtes Datum sind.<\/p>\n<p>Hier ist ein Beispiel f\u00fcr das L\u00f6schen von Kommentaren, die vor dem 9. Oktober 2023 gemacht wurden:<\/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>Du kannst es ausprobieren, indem du eine GET-Anfrage an die Route <code>\/clean-by-age<\/code> sendest.<\/p>\n<h4>L\u00f6schen von Datens\u00e4tzen basierend auf benutzerdefinierten Bedingungen<\/h4>\n<p>Du kannst auch Bereinigungen basierend auf anderen Bedingungen einrichten, z. B. das Entfernen von Datens\u00e4tzen, die nicht mit anderen aktiven Datens\u00e4tzen im System verkn\u00fcpft sind (wodurch eine <em>verwaiste<\/em> Situation entsteht).<\/p>\n<p>Du kannst zum Beispiel einen Bereinigungsvorgang einrichten, der nach Kommentaren sucht, die mit gel\u00f6schten Beitr\u00e4gen verkn\u00fcpft sind, und diese l\u00f6scht, da sie wahrscheinlich nie wieder in der Anwendung auftauchen:<\/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>Du kannst dir deine eigenen Bedingungen f\u00fcr deinen Anwendungsfall ausdenken.<\/p>\n<h3>6. Datenmanipulation<\/h3>\n<p>Datenbankpflegeoperationen werden auch zur Datenmanipulation und -umwandlung verwendet, z. B. zum Zensieren obsz\u00f6ner Sprache oder zum Umwandeln von Textkombinationen in Emoji.<\/p>\n<p>Im Gegensatz zu den meisten anderen Operationen sollten diese Operationen am besten dann ausgef\u00fchrt werden, wenn die Datenbank aktualisiert wird (und nicht zu einem bestimmten Zeitpunkt in der Woche oder im Monat f\u00fcr alle Zeilen).<\/p>\n<p>In diesem Abschnitt werden zwei dieser Operationen aufgef\u00fchrt, aber die Implementierung f\u00fcr alle anderen benutzerdefinierten Manipulationsoperationen ist diesen recht \u00e4hnlich.<\/p>\n<h4>Text in Emoji umwandeln<\/h4>\n<p>Du kannst Textkombinationen wie &#8222;:)&#8220; und &#8222;xD&#8220; in echte Emojis umwandeln, um ein besseres Nutzererlebnis zu bieten und die Konsistenz der Informationen zu wahren. Hier ist ein Codeschnipsel, der dir dabei hilft:<\/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>In diesem Codeschnipsel musst du zun\u00e4chst eine Liste von Emojis und ihren textuellen Darstellungen definieren. Dann wird die Datenbank nach diesen Textkombinationen durchsucht und sie werden durch Emojis ersetzt.<\/p>\n<h4>Obsz\u00f6ne Sprache zensieren<\/h4>\n<p>In Anwendungen, die nutzergenerierte Inhalte zulassen, wird h\u00e4ufig versucht, anst\u00f6\u00dfige Sprache zu zensieren. Die Herangehensweise ist hier \u00e4hnlich &#8211; identifiziere die Stellen mit obsz\u00f6ner Sprache und ersetze sie durch Sternchen. Mit dem bad-words-Paket kannst du ganz einfach nach Schimpfw\u00f6rtern suchen und sie zensieren.<\/p>\n<p>Installiere das Paket, indem du den folgenden Befehl ausf\u00fchrst:<\/p>\n<pre><code class=\"language-bash\">yarn add bad-words<\/code><\/pre>\n<p>Dann initialisiere das Paket in deiner <strong>index.js-Datei<\/strong>:<\/p>\n<pre><code class=\"language-js\">const Filter = require('bad-words');\nfilter = new Filter();<\/code><\/pre>\n<p>Verwende nun den folgenden Codeschnipsel, um obsz\u00f6ne Inhalte in deiner Kommentartabelle zu zensieren:<\/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>Den vollst\u00e4ndigen Code f\u00fcr dieses Tutorial findest du in <a href=\"https:\/\/github.com\/krharsh17\/node-db-maintenance\" target=\"_blank\" rel=\"noopener noreferrer\">diesem GitHub Repo<\/a>.<\/p>\n<h2>Das Vakuumieren von PostgreSQL und sein Zweck verstehen<\/h2>\n<p>Neben der Einrichtung von benutzerdefinierten Wartungsroutinen, wie sie oben beschrieben wurden, kannst du auch eine der nativen Wartungsfunktionen von PostgreSQL nutzen, um den Zustand und die Leistung deiner Datenbank zu erhalten: den <a href=\"https:\/\/www.postgresql.org\/docs\/current\/routine-vacuuming.html\" target=\"_blank\" rel=\"noopener noreferrer\">Vakuum-Prozess<\/a>.<\/p>\n<p>Der Vakuum-Prozess hilft dabei, die Leistung der Datenbank zu optimieren und Speicherplatz zur\u00fcckzugewinnen. PostgreSQL f\u00fchrt die Vakuumoperationen nach einem Zeitplan mit seinem Auto-Vacuum-Daemon aus, aber du kannst sie bei Bedarf auch manuell ausl\u00f6sen. Hier sind ein paar M\u00f6glichkeiten, wie h\u00e4ufiges Vakuumieren hilft:<\/p>\n<ul>\n<li><strong>Wiederherstellung von blockiertem Speicherplatz<\/strong>: Eines der Hauptziele von Vacuum ist es, blockierten Speicherplatz in der Datenbank wiederherzustellen. Da st\u00e4ndig Daten eingef\u00fcgt, aktualisiert und gel\u00f6scht werden, kann PostgreSQL mit &#8222;toten&#8220; oder veralteten Zeilen \u00fcberladen werden, die noch Platz auf der Festplatte belegen. Vacuum identifiziert und entfernt diese toten Zeilen und macht den Platz f\u00fcr neue Daten verf\u00fcgbar. Ohne Vacuum w\u00fcrde der Speicherplatz auf der Festplatte nach und nach ersch\u00f6pft sein, was zu Leistungseinbu\u00dfen und sogar zu Systemabst\u00fcrzen f\u00fchren kann.<\/li>\n<li><strong>Aktualisieren der Query Planner Metriken<\/strong>: Das Vakuumieren hilft PostgreSQL auch dabei, die vom Query Planner verwendeten Statistiken und Metriken auf dem neuesten Stand zu halten. Der Query Planner ist auf eine genaue Datenverteilung und statistische Informationen angewiesen, um effiziente Ausf\u00fchrungspl\u00e4ne zu erstellen. Durch regelm\u00e4\u00dfiges Ausf\u00fchren von Vacuum stellt PostgreSQL sicher, dass diese Metriken auf dem neuesten Stand sind und kann so bessere Entscheidungen dar\u00fcber treffen, wie Daten abgerufen und Abfragen optimiert werden.<\/li>\n<li><strong>Visibility Map aktualisieren<\/strong>: Die Visibility Map ist ein weiterer wichtiger Aspekt des PostgreSQL Vacuum-Prozesses. Sie hilft dabei, herauszufinden, welche Datenbl\u00f6cke in einer Tabelle f\u00fcr alle Transaktionen vollst\u00e4ndig sichtbar sind, damit Vacuum nur die notwendigen Datenbl\u00f6cke bereinigen kann. Dies erh\u00f6ht die Effizienz des Vakuum-Prozesses, da unn\u00f6tige E\/A-Operationen, die kostspielig und zeitaufw\u00e4ndig w\u00e4ren, minimiert werden.<\/li>\n<li><strong>Verhinderung von Transaktions-ID-Wraparound-Fehlern<\/strong>: Vacuum spielt auch eine wichtige Rolle bei der Vermeidung von Transaktions-ID-Wraparound-Fehlern. PostgreSQL verwendet einen 32-Bit Transaktions-ID-Z\u00e4hler, der zu einem Wraparound f\u00fchren kann, wenn er seinen Maximalwert erreicht. Vacuum markiert alte Transaktionen als &#8222;eingefroren&#8220; und verhindert so, dass der ID-Z\u00e4hler einen Wraparound ausl\u00f6st und Daten besch\u00e4digt. Wenn du diesen Aspekt vernachl\u00e4ssigst, kann das zu katastrophalen Datenbankausf\u00e4llen f\u00fchren.<\/li>\n<\/ul>\n<p>Wie bereits erw\u00e4hnt, bietet PostgreSQL zwei Optionen f\u00fcr die Ausf\u00fchrung von Vacuum: <a href=\"https:\/\/www.postgresql.org\/docs\/current\/routine-vacuuming.html#AUTOVACUUM\" target=\"_blank\" rel=\"noopener noreferrer\">Autovacuum<\/a> und <a href=\"https:\/\/www.postgresql.org\/docs\/current\/sql-vacuum.html\" target=\"_blank\" rel=\"noopener noreferrer\">Manual Vacuum<\/a>.<\/p>\n<p>Autovacuum ist die empfohlene Wahl f\u00fcr die meisten Szenarien, da es den Vakuumprozess automatisch anhand der vordefinierten Einstellungen und der Datenbankaktivit\u00e4t verwaltet. Manuelles Vakuum hingegen bietet mehr Kontrolle, erfordert aber ein tieferes Verst\u00e4ndnis der Datenbankwartung.<\/p>\n<p>Die Entscheidung zwischen den beiden Varianten h\u00e4ngt von Faktoren wie der Gr\u00f6\u00dfe der Datenbank, der Arbeitslast und den verf\u00fcgbaren Ressourcen ab. Kleine bis mittelgro\u00dfe Datenbanken k\u00f6nnen sich oft auf Autovacuum verlassen, w\u00e4hrend gr\u00f6\u00dfere oder komplexere Datenbanken m\u00f6glicherweise einen manuellen Eingriff erfordern.<\/p>\n<h2>Zusammenfassung<\/h2>\n<p>Datenbankwartung ist nicht nur eine Frage der Routine, sondern die Grundlage f\u00fcr eine gesunde und leistungsf\u00e4hige Anwendung. Indem du deine Daten regelm\u00e4\u00dfig optimierst, bereinigst und organisierst, stellst du sicher, dass deine PostgreSQL-Datenbank weiterhin Spitzenleistungen erbringt, nicht besch\u00e4digt wird und effizient arbeitet, auch wenn deine Anwendung skaliert.<\/p>\n<p>In diesem umfassenden Leitfaden haben wir untersucht, wie wichtig es ist, gut strukturierte Datenbankwartungspl\u00e4ne f\u00fcr PostgreSQL zu erstellen, wenn du mit Node.js und Express arbeitest.<\/p>\n<p><em>Haben wir irgendwelche routinem\u00e4\u00dfigen Datenbankwartungsvorg\u00e4nge \u00fcbersehen, die du f\u00fcr deine Datenbank implementiert hast? Oder kennst du einen besseren Weg, um eine der oben genannten Ma\u00dfnahmen umzusetzen? Lass es uns in den Kommentaren wissen!<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im Zuge der Anwendungsentwicklung sind Datenbanken das Herzst\u00fcck der meisten Anwendungen. Sie speichern und verwalten Daten, die f\u00fcr digitale Unternehmen wichtig sind. Da diese Daten wachsen &#8230;<\/p>\n","protected":false},"author":238,"featured_media":67116,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[965,973,983],"class_list":["post-67115","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-node-js","topic-postgresql","topic-technische-tipps"],"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>Einrichten der Datenbankwartung f\u00fcr PostgreSQL auf Node - Kinsta\u00ae<\/title>\n<meta name=\"description\" content=\"Lerne mit unserem umfassenden Leitfaden die nahtlose Wartung von PostgreSQL-Datenbanken unter Node.js. Verbessere dein Datenbankmanagement m\u00fchelos!\" \/>\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\/de\/blog\/datenbank-wartungs-plan\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Einrichten von Datenbank-Wartungspl\u00e4nen f\u00fcr PostgreSQL auf Node.js\" \/>\n<meta property=\"og:description\" content=\"Lerne mit unserem umfassenden Leitfaden die nahtlose Wartung von PostgreSQL-Datenbanken unter Node.js. Verbessere dein Datenbankmanagement m\u00fchelos!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinqsta.com\/de\/blog\/datenbank-wartungs-plan\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-11-23T12:27:12+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-11-30T12:32:22+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinqsta.com\/de\/wp-content\/uploads\/sites\/5\/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=\"Lerne mit unserem umfassenden Leitfaden die nahtlose Wartung von PostgreSQL-Datenbanken unter Node.js. Verbessere dein Datenbankmanagement m\u00fchelos!\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinqsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/11\/database-maintenance-plan.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@Kinsta_DE\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_DE\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kumar Harsh\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"18\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinqsta.com\/de\/blog\/datenbank-wartungs-plan\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinqsta.com\/de\/blog\/datenbank-wartungs-plan\/\"},\"author\":{\"name\":\"Kumar Harsh\",\"@id\":\"https:\/\/kinqsta.com\/de\/#\/schema\/person\/3a80efffa9cbb0333cc9c22b754415d9\"},\"headline\":\"Einrichten von Datenbank-Wartungspl\u00e4nen f\u00fcr PostgreSQL auf Node.js\",\"datePublished\":\"2023-11-23T12:27:12+00:00\",\"dateModified\":\"2023-11-30T12:32:22+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinqsta.com\/de\/blog\/datenbank-wartungs-plan\/\"},\"wordCount\":3109,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinqsta.com\/de\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinqsta.com\/de\/blog\/datenbank-wartungs-plan\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinqsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/11\/database-maintenance-plan.jpg\",\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinqsta.com\/de\/blog\/datenbank-wartungs-plan\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinqsta.com\/de\/blog\/datenbank-wartungs-plan\/\",\"url\":\"https:\/\/kinqsta.com\/de\/blog\/datenbank-wartungs-plan\/\",\"name\":\"Einrichten der Datenbankwartung f\u00fcr PostgreSQL auf Node - Kinsta\u00ae\",\"isPartOf\":{\"@id\":\"https:\/\/kinqsta.com\/de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinqsta.com\/de\/blog\/datenbank-wartungs-plan\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinqsta.com\/de\/blog\/datenbank-wartungs-plan\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinqsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/11\/database-maintenance-plan.jpg\",\"datePublished\":\"2023-11-23T12:27:12+00:00\",\"dateModified\":\"2023-11-30T12:32:22+00:00\",\"description\":\"Lerne mit unserem umfassenden Leitfaden die nahtlose Wartung von PostgreSQL-Datenbanken unter Node.js. Verbessere dein Datenbankmanagement m\u00fchelos!\",\"breadcrumb\":{\"@id\":\"https:\/\/kinqsta.com\/de\/blog\/datenbank-wartungs-plan\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinqsta.com\/de\/blog\/datenbank-wartungs-plan\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/kinqsta.com\/de\/blog\/datenbank-wartungs-plan\/#primaryimage\",\"url\":\"https:\/\/kinqsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/11\/database-maintenance-plan.jpg\",\"contentUrl\":\"https:\/\/kinqsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/11\/database-maintenance-plan.jpg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinqsta.com\/de\/blog\/datenbank-wartungs-plan\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinqsta.com\/de\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PostgreSQL\",\"item\":\"https:\/\/kinqsta.com\/de\/thema\/postgresql\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Einrichten von Datenbank-Wartungspl\u00e4nen f\u00fcr PostgreSQL auf Node.js\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinqsta.com\/de\/#website\",\"url\":\"https:\/\/kinqsta.com\/de\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Schnelle, sichere und hochwertige Hosting-L\u00f6sungen\",\"publisher\":{\"@id\":\"https:\/\/kinqsta.com\/de\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinqsta.com\/de\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinqsta.com\/de\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinqsta.com\/de\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/kinqsta.com\/de\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinqsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinqsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinqsta.com\/de\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/\",\"https:\/\/x.com\/Kinsta_DE\",\"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\/de\/#\/schema\/person\/3a80efffa9cbb0333cc9c22b754415d9\",\"name\":\"Kumar Harsh\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/kinqsta.com\/de\/#\/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\/de\/blog\/author\/kumarharsh\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Einrichten der Datenbankwartung f\u00fcr PostgreSQL auf Node - Kinsta\u00ae","description":"Lerne mit unserem umfassenden Leitfaden die nahtlose Wartung von PostgreSQL-Datenbanken unter Node.js. Verbessere dein Datenbankmanagement m\u00fchelos!","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\/de\/blog\/datenbank-wartungs-plan\/","og_locale":"de_DE","og_type":"article","og_title":"Einrichten von Datenbank-Wartungspl\u00e4nen f\u00fcr PostgreSQL auf Node.js","og_description":"Lerne mit unserem umfassenden Leitfaden die nahtlose Wartung von PostgreSQL-Datenbanken unter Node.js. Verbessere dein Datenbankmanagement m\u00fchelos!","og_url":"https:\/\/kinqsta.com\/de\/blog\/datenbank-wartungs-plan\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/","article_published_time":"2023-11-23T12:27:12+00:00","article_modified_time":"2023-11-30T12:32:22+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinqsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/11\/database-maintenance-plan.jpg","type":"image\/jpeg"}],"author":"Kumar Harsh","twitter_card":"summary_large_image","twitter_description":"Lerne mit unserem umfassenden Leitfaden die nahtlose Wartung von PostgreSQL-Datenbanken unter Node.js. Verbessere dein Datenbankmanagement m\u00fchelos!","twitter_image":"https:\/\/kinqsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/11\/database-maintenance-plan.jpg","twitter_creator":"@Kinsta_DE","twitter_site":"@Kinsta_DE","twitter_misc":{"Verfasst von":"Kumar Harsh","Gesch\u00e4tzte Lesezeit":"18\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinqsta.com\/de\/blog\/datenbank-wartungs-plan\/#article","isPartOf":{"@id":"https:\/\/kinqsta.com\/de\/blog\/datenbank-wartungs-plan\/"},"author":{"name":"Kumar Harsh","@id":"https:\/\/kinqsta.com\/de\/#\/schema\/person\/3a80efffa9cbb0333cc9c22b754415d9"},"headline":"Einrichten von Datenbank-Wartungspl\u00e4nen f\u00fcr PostgreSQL auf Node.js","datePublished":"2023-11-23T12:27:12+00:00","dateModified":"2023-11-30T12:32:22+00:00","mainEntityOfPage":{"@id":"https:\/\/kinqsta.com\/de\/blog\/datenbank-wartungs-plan\/"},"wordCount":3109,"commentCount":0,"publisher":{"@id":"https:\/\/kinqsta.com\/de\/#organization"},"image":{"@id":"https:\/\/kinqsta.com\/de\/blog\/datenbank-wartungs-plan\/#primaryimage"},"thumbnailUrl":"https:\/\/kinqsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/11\/database-maintenance-plan.jpg","inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinqsta.com\/de\/blog\/datenbank-wartungs-plan\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinqsta.com\/de\/blog\/datenbank-wartungs-plan\/","url":"https:\/\/kinqsta.com\/de\/blog\/datenbank-wartungs-plan\/","name":"Einrichten der Datenbankwartung f\u00fcr PostgreSQL auf Node - Kinsta\u00ae","isPartOf":{"@id":"https:\/\/kinqsta.com\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinqsta.com\/de\/blog\/datenbank-wartungs-plan\/#primaryimage"},"image":{"@id":"https:\/\/kinqsta.com\/de\/blog\/datenbank-wartungs-plan\/#primaryimage"},"thumbnailUrl":"https:\/\/kinqsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/11\/database-maintenance-plan.jpg","datePublished":"2023-11-23T12:27:12+00:00","dateModified":"2023-11-30T12:32:22+00:00","description":"Lerne mit unserem umfassenden Leitfaden die nahtlose Wartung von PostgreSQL-Datenbanken unter Node.js. Verbessere dein Datenbankmanagement m\u00fchelos!","breadcrumb":{"@id":"https:\/\/kinqsta.com\/de\/blog\/datenbank-wartungs-plan\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinqsta.com\/de\/blog\/datenbank-wartungs-plan\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/kinqsta.com\/de\/blog\/datenbank-wartungs-plan\/#primaryimage","url":"https:\/\/kinqsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/11\/database-maintenance-plan.jpg","contentUrl":"https:\/\/kinqsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/11\/database-maintenance-plan.jpg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinqsta.com\/de\/blog\/datenbank-wartungs-plan\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinqsta.com\/de\/"},{"@type":"ListItem","position":2,"name":"PostgreSQL","item":"https:\/\/kinqsta.com\/de\/thema\/postgresql\/"},{"@type":"ListItem","position":3,"name":"Einrichten von Datenbank-Wartungspl\u00e4nen f\u00fcr PostgreSQL auf Node.js"}]},{"@type":"WebSite","@id":"https:\/\/kinqsta.com\/de\/#website","url":"https:\/\/kinqsta.com\/de\/","name":"Kinsta\u00ae","description":"Schnelle, sichere und hochwertige Hosting-L\u00f6sungen","publisher":{"@id":"https:\/\/kinqsta.com\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinqsta.com\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/kinqsta.com\/de\/#organization","name":"Kinsta","url":"https:\/\/kinqsta.com\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/kinqsta.com\/de\/#\/schema\/logo\/image\/","url":"https:\/\/kinqsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinqsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinqsta.com\/de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/","https:\/\/x.com\/Kinsta_DE","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\/de\/#\/schema\/person\/3a80efffa9cbb0333cc9c22b754415d9","name":"Kumar Harsh","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/kinqsta.com\/de\/#\/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\/de\/blog\/author\/kumarharsh\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinqsta.com\/de\/wp-json\/wp\/v2\/posts\/67115","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinqsta.com\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinqsta.com\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinqsta.com\/de\/wp-json\/wp\/v2\/users\/238"}],"replies":[{"embeddable":true,"href":"https:\/\/kinqsta.com\/de\/wp-json\/wp\/v2\/comments?post=67115"}],"version-history":[{"count":5,"href":"https:\/\/kinqsta.com\/de\/wp-json\/wp\/v2\/posts\/67115\/revisions"}],"predecessor-version":[{"id":67467,"href":"https:\/\/kinqsta.com\/de\/wp-json\/wp\/v2\/posts\/67115\/revisions\/67467"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinqsta.com\/de\/wp-json\/kinsta\/v1\/posts\/67115\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinqsta.com\/de\/wp-json\/kinsta\/v1\/posts\/67115\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinqsta.com\/de\/wp-json\/kinsta\/v1\/posts\/67115\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinqsta.com\/de\/wp-json\/kinsta\/v1\/posts\/67115\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinqsta.com\/de\/wp-json\/kinsta\/v1\/posts\/67115\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinqsta.com\/de\/wp-json\/kinsta\/v1\/posts\/67115\/translations\/jp"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinqsta.com\/de\/wp-json\/kinsta\/v1\/posts\/67115\/translations\/es"},{"href":"https:\/\/kinqsta.com\/de\/wp-json\/kinsta\/v1\/posts\/67115\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinqsta.com\/de\/wp-json\/wp\/v2\/media\/67116"}],"wp:attachment":[{"href":"https:\/\/kinqsta.com\/de\/wp-json\/wp\/v2\/media?parent=67115"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinqsta.com\/de\/wp-json\/wp\/v2\/tags?post=67115"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinqsta.com\/de\/wp-json\/wp\/v2\/topic?post=67115"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}