{"id":65088,"date":"2023-11-23T09:29:24","date_gmt":"2023-11-23T12:29:24","guid":{"rendered":"https:\/\/kinqsta.com\/pt\/?p=65088&#038;preview=true&#038;preview_id=65088"},"modified":"2023-11-30T09:47:57","modified_gmt":"2023-11-30T12:47:57","slug":"plano-manutencao-banco-dados","status":"publish","type":"post","link":"https:\/\/kinqsta.com\/pt\/blog\/plano-manutencao-banco-dados\/","title":{"rendered":"Configura\u00e7\u00e3o de Planos de Manuten\u00e7\u00e3o de Banco de Dados para PostgreSQL no Node.js"},"content":{"rendered":"<p>\u00c0 medida que o desenvolvimento de aplicativos evolui, os bancos de dados permanecem sendo o n\u00facleo da maioria dos aplicativos, armazenando e gerenciando dados cruciais para os neg\u00f3cios digitais. E quando esses dados crescem e se tornam mais complexos, garantir a efici\u00eancia do seu banco de dados \u00e9 vital para atender \u00e0s necessidades do seu aplicativo.<\/p>\n<p>E \u00e9 a\u00ed que entra em cena a ideia da manuten\u00e7\u00e3o do banco de dados, que envolve tarefas como limpeza, backups e otimiza\u00e7\u00e3o de \u00edndices para turbinar o desempenho.<\/p>\n<p>Este artigo oferece ideias valiosas sobre gatilhos de manuten\u00e7\u00e3o e apresenta instru\u00e7\u00f5es pr\u00e1ticas de configura\u00e7\u00e3o. E explica o processo de implementa\u00e7\u00e3o de v\u00e1rias tarefas de manuten\u00e7\u00e3o do banco de dados, como backup de dados, reconstru\u00e7\u00e3o de \u00edndices, arquivamento e limpeza de dados usando <a href=\"https:\/\/kinqsta.com\/pt\/topicos\/postgresql\/\">PostgreSQL<\/a>, integrado a um gatilho de API em um aplicativo <a href=\"https:\/\/kinqsta.com\/pt\/topicos\/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>Entendendo os gatilhos<\/h2>\n<p>Antes de realizar opera\u00e7\u00f5es de manuten\u00e7\u00e3o no seu banco de dados, \u00e9 importante entender as diversas formas como elas podem ser acionadas. Cada gatilho serve a prop\u00f3sitos distintos para facilitar as tarefas de manuten\u00e7\u00e3o. Os tr\u00eas principais gatilhos comumente usados s\u00e3o:<\/p>\n<ul>\n<li><strong>Manual, baseado em API<\/strong>: Esse gatilho permite executar opera\u00e7\u00f5es pontuais usando uma chamada de API. \u00c9 \u00fatil em situa\u00e7\u00f5es como a restaura\u00e7\u00e3o de um backup de banco de dados ou a reconstru\u00e7\u00e3o de \u00edndices quando o desempenho cai repentinamente.<\/li>\n<li><strong>Agendamento (como o CRON)<\/strong>: Esse gatilho permite automatizar atividades de manuten\u00e7\u00e3o programadas durante per\u00edodos de baixo tr\u00e1fego de usu\u00e1rios. \u00c9 ideal para executar opera\u00e7\u00f5es com uso intensivo de recursos, como arquivamento e limpeza. Voc\u00ea pode usar pacotes como <a href=\"https:\/\/www.npmjs.com\/package\/node-schedule\" target=\"_blank\" rel=\"noopener noreferrer\">node-schedule<\/a> para configurar agendamentos no Node.js que acionam opera\u00e7\u00f5es automaticamente quando necess\u00e1rio.<\/li>\n<li><strong>Notifica\u00e7\u00f5es de banco de dados<\/strong>: Esse gatilho permite executar opera\u00e7\u00f5es de manuten\u00e7\u00e3o como resposta a altera\u00e7\u00f5es no banco de dados. Por exemplo, quando um usu\u00e1rio publica um coment\u00e1rio em uma plataforma, os dados salvos podem acionar instantaneamente verifica\u00e7\u00f5es de caracteres irregulares, linguagem ofensiva ou emojis. Voc\u00ea pode implementar essa funcionalidade no Node.js usando pacotes como o <a href=\"https:\/\/github.com\/andywer\/pg-listen\" target=\"_blank\" rel=\"noopener noreferrer\">pg-listen<\/a>.<\/li>\n<\/ul>\n<h2>Pr\u00e9-requisitos<\/h2>\n<p>Para seguir este guia, voc\u00ea deve ter as seguintes ferramentas em seu computador local:<\/p>\n<ul>\n<li><a href=\"https:\/\/kinqsta.com\/pt\/blog\/instalar-git\/\">Git<\/a>: Para gerenciar o controle de vers\u00e3o do c\u00f3digo-fonte do seu aplicativo<\/li>\n<li><a href=\"https:\/\/kinqsta.com\/pt\/blog\/como-instalar-o-node-js\/\">Node.js<\/a>: para criar seu aplicativo de backend<\/li>\n<li><a href=\"https:\/\/www.postgresql.org\/docs\/current\/app-psql.html\" target=\"_blank\" rel=\"noopener noreferrer\">psql<\/a>: Para interagir com seu banco de dados PostgreSQL remoto usando seu terminal<\/li>\n<li><a href=\"https:\/\/www.pgadmin.org\/download\/\" target=\"_blank\" rel=\"noopener noreferrer\">PGAdmin<\/a> (opcional): Para interagir com seu banco de dados PostgreSQL remoto usando uma interface gr\u00e1fica de usu\u00e1rio (GUI).<\/li>\n<\/ul>\n<h3>Cria\u00e7\u00e3o e hospedagem de um aplicativo Node.js<\/h3>\n<p>Vamos configurar um projeto Node.js, fazer o commit dele para o GitHub e configurar um pipeline de implanta\u00e7\u00e3o autom\u00e1tica na Kinsta. Voc\u00ea tamb\u00e9m precisa provisionar um <a href=\"https:\/\/sevalla.com\/database-hosting\/\">banco de dados PostgreSQL na Kinsta<\/a> para testar suas rotinas de manuten\u00e7\u00e3o nele.<\/p>\n<p>Comece criando um novo diret\u00f3rio em seu sistema local usando o seguinte comando:<\/p>\n<pre><code class=\"language-bash\">mkdir node-db-maintenance<\/code><\/pre>\n<p>Em seguida, v\u00e1 para a pasta rec\u00e9m-criada e execute o seguinte comando para criar um novo projeto:<\/p>\n<pre><code class=\"language-bash\">cd node-db-maintenance\nyarn init -y # or npm init -y<\/code><\/pre>\n<p>Isso inicializa um projeto Node.js para voc\u00ea com a configura\u00e7\u00e3o padr\u00e3o. Agora voc\u00ea pode instalar as depend\u00eancias necess\u00e1rias executando o seguinte comando:<\/p>\n<pre><code class=\"language-bash\">yarn add express pg nodemon dotenv<\/code><\/pre>\n<p>Aqui est\u00e1 uma r\u00e1pida descri\u00e7\u00e3o de cada pacote:<\/p>\n<ul>\n<li><code>express<\/code>: permite que voc\u00ea configure uma API REST baseada em Express.<\/li>\n<li><code>pg<\/code>: permite que voc\u00ea interaja com um banco de dados PostgreSQL por meio do seu aplicativo Node.js.<\/li>\n<li><code>nodemon<\/code>: permite que a sua build de desenvolvimento seja atualizada \u00e0 medida que voc\u00ea desenvolve o aplicativo, liberando-o da necessidade constante de parar e iniciar o aplicativo cada vez que fizer uma altera\u00e7\u00e3o.<\/li>\n<li><code>dotenv<\/code>: permite carregar vari\u00e1veis de ambiente de um arquivo <strong>.env<\/strong> para seu objeto <code>process.env<\/code>.<\/li>\n<\/ul>\n<p>Em seguida, adicione os seguintes scripts ao seu arquivo <strong>package.json<\/strong> para poder iniciar seu servidor de desenvolvimento com facilidade, bem como executar o seu servidor em produ\u00e7\u00e3o:<\/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>Agora voc\u00ea pode criar um arquivo <strong>index.js<\/strong> que cont\u00e9m o c\u00f3digo-fonte do seu aplicativo. Cole o seguinte c\u00f3digo no arquivo:<\/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>O c\u00f3digo acima inicializa um servidor <a href=\"https:\/\/kinqsta.com\/pt\/blog\/o-que-e-express-js\/\">Express<\/a> e configura vari\u00e1veis de ambiente usando o pacote <code>dotenv<\/code> se n\u00e3o estiver no modo de produ\u00e7\u00e3o. Tamb\u00e9m configura um caminho <code>\/health<\/code> que retorna um objeto JSON <code>{status: \"UP\"}<\/code>. Por fim, inicia o aplicativo usando a fun\u00e7\u00e3o <code>app.listen()<\/code> para escutar na porta especificada, com o padr\u00e3o <code>3000<\/code> se nenhuma porta for fornecida por meio da vari\u00e1vel de ambiente.<\/p>\n<p>Agora que voc\u00ea tem um aplicativo b\u00e1sico pronto, inicialize um novo reposit\u00f3rio git com seu provedor git de prefer\u00eancia (<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>) e envie seu c\u00f3digo. A Kinsta suporta a implanta\u00e7\u00e3o de aplicativos de todos esses provedores git. Para este artigo, vamos usar o GitHub.<\/p>\n<p>Quando seu reposit\u00f3rio estiver pronto, siga estes passos para implantar seu aplicativo na Kinsta:<\/p>\n<ol>\n<li>Fa\u00e7a login ou crie uma conta para visualizar seu painel <a href=\"https:\/\/my.kinqsta.com\/?lang=pt\">MyKinsta<\/a>.<\/li>\n<li>Autorize a Kinsta com seu provedor Git.<\/li>\n<li>Na barra lateral esquerda, clique em <strong>Aplicativos<\/strong>, e da\u00ed em <strong>Adicionar aplicativo<\/strong>.<\/li>\n<li>Selecione o reposit\u00f3rio e o branch do qual voc\u00ea deseja implantar.<\/li>\n<li>Selecione um dos locais de centros de dados dispon\u00edveis na lista de 27 op\u00e7\u00f5es. A Kinsta detecta automaticamente as configura\u00e7\u00f5es de build para seus aplicativos por meio do <a href=\"https:\/\/kinqsta.com\/pt\/changelog\/nixpacks\/\">Nixpacks<\/a>.<\/li>\n<li>Escolha os recursos do aplicativo, como RAM e espa\u00e7o em disco.<\/li>\n<li>Clique em <strong>Criar aplicativo<\/strong>.<\/li>\n<\/ol>\n<p>Quando a implanta\u00e7\u00e3o estiver conclu\u00edda, copie o link do aplicativo implantado e navegue at\u00e9 <code>\/health<\/code>. Voc\u00ea dever\u00e1 ver o seguinte JSON em seu navegador:<\/p>\n<pre><code class=\"language-js\">{status: \"UP\"}<\/code><\/pre>\n<p>Isso indica que o aplicativo foi configurado corretamente.<\/p>\n<h3>Configura\u00e7\u00e3o de uma inst\u00e2ncia do PostgreSQL na Kinsta<\/h3>\n<p>A Kinsta fornece uma interface f\u00e1cil para voc\u00ea provisionar inst\u00e2ncias de banco de dados. Comece criando uma nova <a href=\"https:\/\/kinqsta.com\/pt\/inscreva-se\/\">conta na Kinsta<\/a>, se voc\u00ea ainda n\u00e3o tiver uma. Em seguida, siga as etapas abaixo:<\/p>\n<ol>\n<li>Fa\u00e7a login em seu painel MyKinsta.<\/li>\n<li>Na barra lateral esquerda, clique em <strong>Bancos de dados<\/strong>, e ent\u00e3o em <strong>Adicionar banco de dados<\/strong>.<\/li>\n<li>Selecione <strong>PostgreSQL<\/strong> como o tipo de banco de dados e escolha a vers\u00e3o que preferir. Escolha um nome para o seu banco de dados e modifique o nome de usu\u00e1rio e a senha, se desejar.<\/li>\n<li>Selecione um local de centro de dados na lista de 27 op\u00e7\u00f5es.<\/li>\n<li>Escolha o tamanho do seu banco de dados.<\/li>\n<li>Clique em <strong>Criar banco de dados<\/strong>.<\/li>\n<\/ol>\n<p>Depois que o banco de dados for criado, certifique-se de recuperar o host, a porta, o nome de usu\u00e1rio e a senha do banco de dados.<\/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=\"Credenciais de banco de dados geradas pela Kinsta.\" width=\"1024\" height=\"435\"><figcaption id=\"caption-attachment-168402\" class=\"wp-caption-text\">Credenciais de banco de dados geradas pela Kinsta.<\/figcaption><\/figure>\n<p>Voc\u00ea pode ent\u00e3o inserir esses valores na sua CLI do psql (ou na interface do PGAdmin) para gerenciar o banco de dados. Para testar seu c\u00f3digo localmente, crie um arquivo <strong>.env<\/strong> no diret\u00f3rio raiz do seu projeto e armazene os seguintes segredos nele:<\/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>Ao fazer a implanta\u00e7\u00e3o na Kinsta, voc\u00ea precisa adicionar esses valores como <a href=\"https:\/\/docs.sevalla.com\/applications\/overviewenvironment-variables\">vari\u00e1veis de ambiente<\/a> para a implanta\u00e7\u00e3o do seu aplicativo.<\/p>\n<p>Para preparar as opera\u00e7\u00f5es de banco de dados, baixe e execute <a href=\"https:\/\/github.com\/krharsh17\/node-db-maintenance\/blob\/main\/test-data.sql\" target=\"_blank\" rel=\"noopener noreferrer\">este script SQL<\/a> para criar tabelas (usu\u00e1rios, publica\u00e7\u00f5es, coment\u00e1rios) e inserir dados de amostra. Use o comando abaixo, substituindo os espa\u00e7os reservados por seus dados espec\u00edficos, para adicionar os dados ao seu banco de dados PostgreSQL rec\u00e9m-criado:<\/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>Certifique-se de inserir o nome e o caminho exatos do arquivo no comando acima. A execu\u00e7\u00e3o desse comando solicita que voc\u00ea digite a senha do banco de dados para obter autoriza\u00e7\u00e3o.<\/p>\n<p>Quando esse comando terminar de ser executado, voc\u00ea estar\u00e1 pronto para come\u00e7ar a escrever opera\u00e7\u00f5es para a manuten\u00e7\u00e3o do seu banco de dados. Sinta-se \u00e0 vontade para enviar seu c\u00f3digo para o seu reposit\u00f3rio Git quando terminar cada opera\u00e7\u00e3o para v\u00ea-lo em a\u00e7\u00e3o na plataforma da Kinsta.<\/p>\n<h2>Escrevendo rotinas de manuten\u00e7\u00e3o<\/h2>\n<p>Esta se\u00e7\u00e3o explica v\u00e1rias opera\u00e7\u00f5es comumente usadas para a manuten\u00e7\u00e3o de bancos de dados PostgreSQL.<\/p>\n<h3>1. Cria\u00e7\u00e3o de backups<\/h3>\n<p>O backup regular de bancos de dados \u00e9 uma opera\u00e7\u00e3o comum e essencial. Envolve criar uma c\u00f3pia de todo o conte\u00fado do banco de dados, e armazen\u00e1-la em um local seguro. Esses backups s\u00e3o cruciais para restaurar os dados em caso de perda acidental ou erros que afetem a integridade dos dados.<\/p>\n<p>Embora <a href=\"https:\/\/docs.sevalla.com\/databases\/backups\">plataformas como a Kinsta ofere\u00e7am backups automatizados<\/a> como parte de seus servi\u00e7os, \u00e9 importante saber como configurar uma rotina de backup personalizada, se necess\u00e1rio.<\/p>\n<p>O PostgreSQL oferece a ferramenta <a href=\"https:\/\/www.postgresql.org\/docs\/current\/app-pgdump.html\" target=\"_blank\" rel=\"noopener noreferrer\">pg_dump<\/a> para criar backups de banco de dados. No entanto, ela precisa ser executada diretamente da linha de comando, e n\u00e3o h\u00e1 um pacote npm para ela. De modo que voc\u00ea precisa usar o pacote <a href=\"https:\/\/www.npmjs.com\/package\/@getvim\/execute\" target=\"_blank\" rel=\"noopener noreferrer\">@getvim\/execute<\/a> para executar o comando <code>pg_dump<\/code> no ambiente local do seu aplicativo Node.<\/p>\n<p>Instale o pacote executando o seguinte comando:<\/p>\n<pre><code class=\"language-bash\">yarn add @getvim\/execute<\/code><\/pre>\n<p>Em seguida, importe o pacote em seu arquivo <strong>index.js <\/strong>adicionando esta linha de c\u00f3digo na parte superior:<\/p>\n<pre><code class=\"language-js\">const {execute} = require('@getvim\/execute');<\/code><\/pre>\n<p>Os backups s\u00e3o gerados como arquivos no sistema de arquivos local do seu aplicativo Node. Assim, \u00e9 melhor criar um diret\u00f3rio dedicado para eles com o nome <strong>backup<\/strong> no diret\u00f3rio raiz do projeto.<\/p>\n<p>Agora, voc\u00ea pode usar o seguinte caminho para gerar e baixar backups do seu banco de dados quando necess\u00e1rio:<\/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>Al\u00e9m disso, voc\u00ea precisa adicionar a seguinte linha no in\u00edcio do seu arquivo <strong>index.js<\/strong> depois que o aplicativo Express for inicializado:<\/p>\n<pre><code class=\"language-js\">app.use('\/backup', express.static('backup'))<\/code><\/pre>\n<p>Isso permite que a pasta <strong>backup<\/strong> seja servida estaticamente usando a fun\u00e7\u00e3o de middleware <code>express.static<\/code>, permitindo que o usu\u00e1rio baixe os arquivos de backup gerados a partir do aplicativo Node.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Se voc\u00ea encontrar um erro <code>server version mismatch<\/code> com o PostgreSQL, isso significa que a vers\u00e3o do banco de dados \u00e9 diferente da sua ferramenta local <code>pg_dump<\/code>. Para resolver isso, verifique a vers\u00e3o do <code>pg_dump<\/code> e atualize a ferramenta ou o banco de dados para que correspondam um ao outro.<\/p>\n<\/aside>\n\n<h3>2. Restaura\u00e7\u00e3o a partir de um backup<\/h3>\n<p>O Postgres permite a restaura\u00e7\u00e3o de backups usando a ferramenta de linha de comando <code>pg_restore<\/code>. No entanto, voc\u00ea precisa us\u00e1-la por meio do pacote <code>execute<\/code>, da mesma forma que usou o comando <code>pg_dump<\/code>. Aqui est\u00e1 o c\u00f3digo do caminho:<\/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>O snippet de c\u00f3digo acima procura primeiro os arquivos armazenados no diret\u00f3rio <strong>backup<\/strong> local. Em seguida, classifica-os pelas datas em que foram criados para localizar o arquivo de backup mais recente. Por fim, usa o pacote <code>execute<\/code> para restaurar o arquivo de backup escolhido.<\/p>\n<p>Certifique-se de adicionar as seguintes importa\u00e7\u00f5es ao seu arquivo <strong>index.js<\/strong> de forma que os m\u00f3dulos necess\u00e1rios para acessar o sistema de arquivos local sejam importados, permitindo que a fun\u00e7\u00e3o seja executada corretamente:<\/p>\n<pre><code class=\"language-js\">const fs = require('fs')\nconst path = require('path')<\/code><\/pre>\n<h3>3. Reconstru\u00e7\u00e3o de um \u00edndice<\/h3>\n<p>\u00c0s vezes os \u00edndices das tabelas do Postgres ficam corrompidos, e o desempenho do banco de dados \u00e9 prejudicado. Isso pode ocorrer devido a bugs ou erros de software. Al\u00e9m disso, os \u00edndices tamb\u00e9m podem ficar pesados devido ao excesso de p\u00e1ginas vazias ou quase vazias.<\/p>\n<p>Nesses casos, voc\u00ea precisa reconstruir o \u00edndice para garantir que est\u00e1 obtendo o melhor desempenho da sua inst\u00e2ncia do Postgres.<\/p>\n<p>O Postgres oferece o comando <a href=\"https:\/\/www.postgresql.org\/docs\/current\/sql-reindex.html\" target=\"_blank\" rel=\"noopener noreferrer\">REINDEX<\/a> para essa finalidade. Voc\u00ea pode usar o pacote <a href=\"https:\/\/node-postgres.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">node-postgres<\/a> para executar esse comando (e tamb\u00e9m para executar algumas outras opera\u00e7\u00f5es posteriormente); portanto, instale-o, executando primeiro o seguinte comando:<\/p>\n<pre><code class=\"language-bash\">yarn add pg<\/code><\/pre>\n<p>Em seguida, adicione as seguintes linhas \u00e0 parte superior do arquivo <strong>index.js<\/strong>, abaixo das importa\u00e7\u00f5es, para inicializar corretamente a conex\u00e3o com o banco de dados:<\/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>A implementa\u00e7\u00e3o dessa opera\u00e7\u00e3o \u00e9 bastante simples:<\/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>O comando mostrado acima reindexa a tabela Users completa. Voc\u00ea pode personalizar o comando de acordo com suas necessidades para reconstruir um \u00edndice espec\u00edfico ou at\u00e9 mesmo reindexar o banco de dados completo.<\/p>\n<h3>4. Arquivamento e depura\u00e7\u00e3o de dados<\/h3>\n<p>Para bancos de dados que aumentam de tamanho com o tempo (e os dados hist\u00f3ricos s\u00e3o acessados raramente), pode fazer sentido configurar rotinas para descarregar dados antigos em um data lake, onde podem ser armazenados e processados de forma mais conveniente.<\/p>\n<p>Arquivos parquet s\u00e3o um padr\u00e3o comum para armazenamento e transfer\u00eancia de dados em muitos data lakes. Usando a biblioteca <a href=\"https:\/\/www.npmjs.com\/package\/parquetjs\" target=\"_blank\" rel=\"noopener noreferrer\">ParquetJS<\/a>, voc\u00ea pode criar arquivos parquet a partir dos dados do Postgres e usar servi\u00e7os como o <a href=\"https:\/\/ahana.io\/answers\/query-parquet-using-amazon-athena\/\" target=\"_blank\" rel=\"noopener noreferrer\">AWS Athena<\/a> para l\u00ea-los diretamente, sem precisar carreg\u00e1-los novamente no banco de dados no futuro.<\/p>\n<p>Instale a biblioteca ParquetJS executando o seguinte comando:<\/p>\n<pre><code class=\"language-bash\">yarn add parquetjs<\/code><\/pre>\n<p>Ao criar arquivos, voc\u00ea precisa consultar um grande n\u00famero de registros em suas tabelas. Armazenar tal quantidade de dados na mem\u00f3ria do aplicativo pode consumir muitos recursos, ser caro e estar sujeito a erros.<\/p>\n<p>Portanto, faz sentido usar <a href=\"https:\/\/node-postgres.com\/apis\/cursor\" target=\"_blank\" rel=\"noopener noreferrer\">cursores<\/a> para carregar peda\u00e7os de dados do banco de dados e process\u00e1-los. Instale o m\u00f3dulo <code>cursors<\/code> do pacote <code>node-postgres<\/code> executando o seguinte comando:<\/p>\n<pre><code class=\"language-bash\">yarn add pg-cursor<\/code><\/pre>\n<p>Em seguida, certifique-se de importar as duas bibliotecas para o seu arquivo <strong>index.js<\/strong>:<\/p>\n<pre><code class=\"language-js\">const Cursor = require('pg-cursor')\nconst parquet = require('parquetjs')<\/code><\/pre>\n<p>Agora use o snippet de c\u00f3digo abaixo para criar arquivos parquet a partir do seu banco de dados:<\/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>Em seguida, adicione o seguinte c\u00f3digo ao in\u00edcio do arquivo <strong>index.js<\/strong> depois que o aplicativo Express for inicializado:<\/p>\n<pre><code class=\"language-js\">app.use('\/archive', express.static('archive'))<\/code><\/pre>\n<p>Isso permite que a pasta <strong>archive<\/strong> seja servida estaticamente, permitindo que voc\u00ea baixe os arquivos parquet gerados do servidor.<\/p>\n<p>N\u00e3o se esque\u00e7a de criar um diret\u00f3rio <strong>archive<\/strong> no diret\u00f3rio do projeto para armazenar os arquivos a ser arquivados.<\/p>\n<p>Voc\u00ea pode personalizar ainda mais esse snippet de c\u00f3digo para carregar automaticamente os arquivos parquet para um <a href=\"https:\/\/sparkbyexamples.com\/spark\/spark-read-write-parquet-file-from-amazon-s3\/\" target=\"_blank\" rel=\"noopener noreferrer\">bucket da AWS S3<\/a> e usar jobs CRON para acionar a opera\u00e7\u00e3o automaticamente em uma rotina.<\/p>\n<h3>5. Limpeza de dados<\/h3>\n<p>Um objetivo comum da execu\u00e7\u00e3o de opera\u00e7\u00f5es de manuten\u00e7\u00e3o de banco de dados \u00e9 limpar os dados que se tornam antigos ou irrelevantes com o tempo. Esta se\u00e7\u00e3o aborda dois casos comuns em que limpezas de dados s\u00e3o feitas como parte da manuten\u00e7\u00e3o.<\/p>\n<p>Na realidade, voc\u00ea pode configurar sua pr\u00f3pria rotina de limpeza de dados, conforme exigido pelos modelos de dados do seu aplicativo. Os exemplos apresentados a seguir s\u00e3o apenas uma refer\u00eancia.<\/p>\n<h4>Excluindo registros por idade (\u00faltima modifica\u00e7\u00e3o ou \u00faltimo acesso)<\/h4>\n<p>A limpeza de registros com base na idade \u00e9 relativamente simples em compara\u00e7\u00e3o com outras opera\u00e7\u00f5es desta lista. Voc\u00ea pode escrever uma consulta de exclus\u00e3o que exclua registros anteriores a uma determinada data.<\/p>\n<p>Aqui est\u00e1 um exemplo de exclus\u00e3o de coment\u00e1rios feitos antes de 9 de outubro de 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>Voc\u00ea pode experiment\u00e1-lo enviando uma solicita\u00e7\u00e3o GET para o caminho <code>\/clean-by-age<\/code>.<\/p>\n<h4>Exclus\u00e3o de registros com base em condi\u00e7\u00f5es personalizadas<\/h4>\n<p>Voc\u00ea tamb\u00e9m pode configurar limpezas com base em outras condi\u00e7\u00f5es, tais como a remo\u00e7\u00e3o de registros que n\u00e3o estejam vinculados a outros registros ativos no sistema (criando uma situa\u00e7\u00e3o de <em>orfandade<\/em>).<\/p>\n<p>Por exemplo, voc\u00ea pode configurar uma opera\u00e7\u00e3o de limpeza que procure coment\u00e1rios vinculados a publica\u00e7\u00f5es exclu\u00eddas e os exclua, pois eles provavelmente nunca mais aparecer\u00e3o no aplicativo:<\/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>Voc\u00ea pode criar suas pr\u00f3prias condi\u00e7\u00f5es espec\u00edficas para o seu caso de uso.<\/p>\n<h3>6. Manipula\u00e7\u00e3o de dados<\/h3>\n<p>As opera\u00e7\u00f5es de manuten\u00e7\u00e3o de banco de dados tamb\u00e9m s\u00e3o usadas para realizar manipula\u00e7\u00e3o e transforma\u00e7\u00e3o de dados, como censura de linguagem obscena ou convers\u00e3o de combina\u00e7\u00f5es de texto em emoji.<\/p>\n<p>Diferentemente da maioria das outras opera\u00e7\u00f5es, essas opera\u00e7\u00f5es s\u00e3o melhor executadas quando ocorrem atualiza\u00e7\u00f5es do banco de dados (em vez de execut\u00e1-las em todas as linhas em um hor\u00e1rio fixo da semana ou do m\u00eas).<\/p>\n<p>Esta se\u00e7\u00e3o lista duas dessas opera\u00e7\u00f5es, mas a implementa\u00e7\u00e3o de qualquer outra opera\u00e7\u00e3o de manipula\u00e7\u00e3o personalizada ser\u00e1 muito similar.<\/p>\n<h4>Converter texto em emoji<\/h4>\n<p>Voc\u00ea pode considerar a convers\u00e3o de combina\u00e7\u00f5es de texto como &#8220;:)&#8221; e &#8220;xD&#8221; em emojis reais para proporcionar uma melhor experi\u00eancia de usu\u00e1rio, al\u00e9m de manter a consist\u00eancia das informa\u00e7\u00f5es. Aqui est\u00e1 um snippet de c\u00f3digo para ajud\u00e1-lo a fazer isso:<\/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>Esse snippet de c\u00f3digo primeiro requer que voc\u00ea defina uma lista de emojis e suas representa\u00e7\u00f5es textuais. Em seguida, consulta o banco de dados para procurar essas combina\u00e7\u00f5es textuais e as substitui por emojis.<\/p>\n<h4>Censurar linguagem obscena<\/h4>\n<p>Uma opera\u00e7\u00e3o bastante comum usada em aplicativos que permitem conte\u00fado gerado pelo usu\u00e1rio \u00e9 a censura de qualquer linguagem indecente. A abordagem aqui \u00e9 semelhante: identificar as inst\u00e2ncias de linguagem obscena e substitu\u00ed-las por asteriscos. Voc\u00ea pode usar o pacote bad-words para verificar e censurar palavr\u00f5es com facilidade.<\/p>\n<p>Instale o pacote executando o seguinte comando:<\/p>\n<pre><code class=\"language-bash\">yarn add bad-words<\/code><\/pre>\n<p>Em seguida, inicialize o pacote em seu arquivo <strong>index.js<\/strong>:<\/p>\n<pre><code class=\"language-js\">const Filter = require('bad-words');\nfilter = new Filter();<\/code><\/pre>\n<p>Agora use o seguinte snippet de c\u00f3digo para censurar o conte\u00fado obsceno em sua tabela de coment\u00e1rios:<\/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>Voc\u00ea pode encontrar o c\u00f3digo completo para este tutorial <a href=\"https:\/\/github.com\/krharsh17\/node-db-maintenance\" target=\"_blank\" rel=\"noopener noreferrer\">neste reposit\u00f3rio do GitHub<\/a>.<\/p>\n<h2>Entendendo a limpeza peri\u00f3dica Vacuum do PostgreSQL e sua finalidade<\/h2>\n<p>Al\u00e9m de configurar rotinas de manuten\u00e7\u00e3o personalizadas como as tratadas acima, voc\u00ea tamb\u00e9m pode usar uma das funcionalidades de manuten\u00e7\u00e3o nativas que o PostgreSQL oferece para garantir a sa\u00fade e o desempenho cont\u00ednuos do seu banco de dados: <a href=\"https:\/\/www.postgresql.org\/docs\/current\/routine-vacuuming.html\" target=\"_blank\" rel=\"noopener noreferrer\">o processo Vacuum<\/a>.<\/p>\n<p>O processo Vacuum ajuda a otimizar o desempenho do banco de dados e a recuperar espa\u00e7o em disco. O PostgreSQL executa opera\u00e7\u00f5es de limpeza peri\u00f3dica agendadas usando seu <em>daemon autovacuum<\/em>, mas voc\u00ea tamb\u00e9m pode acion\u00e1-lo manualmente se necess\u00e1rio. Aqui est\u00e3o algumas maneiras pelas quais a limpeza peri\u00f3dica frequente pode ajud\u00e1-lo:<\/p>\n<ul>\n<li><strong>Recupera\u00e7\u00e3o de espa\u00e7o em disco bloqueado<\/strong>: Um dos principais objetivos do Vacuum \u00e9 recuperar espa\u00e7o em disco bloqueado no banco de dados. \u00c0 propor\u00e7\u00e3o que os dados s\u00e3o constantemente inseridos, atualizados e exclu\u00eddos, o PostgreSQL pode ficar cheio de linhas &#8220;mortas&#8221; ou obsoletas que ainda ocupam espa\u00e7o no disco. O Vacuum identifica e remove essas linhas mortas, tornando o espa\u00e7o dispon\u00edvel para novos dados. Sem o Vacuum, o espa\u00e7o em disco gradualmente se esgotaria, podendo levar \u00e0 degrada\u00e7\u00e3o do desempenho e at\u00e9 mesmo a falhas do sistema.<\/li>\n<li><strong>Atualiza\u00e7\u00e3o das m\u00e9tricas do planejador de consultas<\/strong>: A limpeza peri\u00f3dica tamb\u00e9m ajuda o PostgreSQL a manter estat\u00edsticas e m\u00e9tricas atualizadas usadas pelo seu planejador de consultas, que depende da distribui\u00e7\u00e3o precisa de dados e de informa\u00e7\u00f5es estat\u00edsticas para gerar planos de execu\u00e7\u00e3o eficientes. Ao executar regularmente o Vacuum, o PostgreSQL garante que essas m\u00e9tricas estejam atualizadas, permitindo que ele tome decis\u00f5es melhores sobre como recuperar dados e otimizar consultas.<\/li>\n<li><strong>Atualiza\u00e7\u00e3o do Mapa de Visibilidade<\/strong>: O Mapa de Visibilidade \u00e9 outro aspecto crucial do processo Vacuum do PostgreSQL. Ele ajuda a identificar quais blocos de dados em uma tabela s\u00e3o totalmente vis\u00edveis para todas as transa\u00e7\u00f5es, permitindo que o Vacuum direcione apenas os blocos de dados necess\u00e1rios para a limpeza. Isso aumenta a efici\u00eancia do processo Vacuum, minimizando opera\u00e7\u00f5es de E\/S desnecess\u00e1rias, que seriam caras e demoradas.<\/li>\n<li><strong>Preven\u00e7\u00e3o de falhas de estouro do ID de transa\u00e7\u00e3o (&#8220;wraparound&#8221;)<\/strong>: O Vacuum tamb\u00e9m desempenha um papel crucial na preven\u00e7\u00e3o de falhas de estouro do ID de transa\u00e7\u00e3o. O PostgreSQL utiliza um contador de ID de transa\u00e7\u00e3o de 32 bits, o que pode levar a um estouro quando atinge seu valor m\u00e1ximo. O Vacuum marca transa\u00e7\u00f5es antigas como &#8220;congeladas&#8221;, evitando que o contador de ID d\u00ea a volta e cause corrup\u00e7\u00e3o de dados. Negligenciar este aspecto pode levar a falhas catastr\u00f3ficas do banco de dados.<\/li>\n<\/ul>\n<p>Como mencionado anteriormente, o PostgreSQL oferece duas op\u00e7\u00f5es para a execu\u00e7\u00e3o do Vacuum: <a href=\"https:\/\/www.postgresql.org\/docs\/current\/routine-vacuuming.html#AUTOVACUUM\" target=\"_blank\" rel=\"noopener noreferrer\">Autovacuum<\/a> e <a href=\"https:\/\/www.postgresql.org\/docs\/current\/sql-vacuum.html\" target=\"_blank\" rel=\"noopener noreferrer\">Manual Vacuum<\/a>.<\/p>\n<p>O Autovacuum \u00e9 a escolha recomendada para a maioria dos cen\u00e1rios, pois gerencia automaticamente o processo Vacuum com base em configura\u00e7\u00f5es predefinidas e na atividade do banco de dados. O Manual Vacuum, por outro lado, oferece mais controle, mas requer uma compreens\u00e3o mais detalhada da manuten\u00e7\u00e3o do banco de dados.<\/p>\n<p>A decis\u00e3o entre os dois depende de fatores como o tamanho do banco de dados, a carga de trabalho e os recursos dispon\u00edveis. Os bancos de dados de pequeno e m\u00e9dio porte geralmente podem contar com o Autovacuum, enquanto bancos de dados maiores ou mais complexos podem requerer interven\u00e7\u00e3o manual.<\/p>\n<h2>Resumo<\/h2>\n<p>A manuten\u00e7\u00e3o do banco de dados n\u00e3o \u00e9 apenas uma quest\u00e3o de limpeza de rotina: \u00e9 a base de um aplicativo saud\u00e1vel e de alto desempenho. Ao otimizar, limpar e organizar regularmente os dados, voc\u00ea garante que o seu banco de dados PostgreSQL continue a oferecer desempenho m\u00e1ximo, permane\u00e7a livre de corrup\u00e7\u00e3o e opere de forma eficiente, mesmo quando o seu aplicativo ganha escala.<\/p>\n<p>Neste guia abrangente, exploramos a import\u00e2ncia cr\u00edtica de estabelecer planos de manuten\u00e7\u00e3o de banco de dados bem estruturados para o PostgreSQL ao trabalhar com o Node.js e o Express.<\/p>\n<p><em>Deixamos passar alguma opera\u00e7\u00e3o de rotina de manuten\u00e7\u00e3o de banco de dados que voc\u00ea possa ter implementado no seu banco de dados? Ou conhece uma maneira melhor de implementar algumas das opera\u00e7\u00f5es discutidas acima? Fique \u00e0 vontade para nos informar nos coment\u00e1rios!<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00c0 medida que o desenvolvimento de aplicativos evolui, os bancos de dados permanecem sendo o n\u00facleo da maioria dos aplicativos, armazenando e gerenciando dados cruciais para &#8230;<\/p>\n","protected":false},"author":238,"featured_media":65089,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[1010,992,1000],"class_list":["post-65088","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-dicas-de-tecnologia","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>Configura\u00e7\u00e3o de Planos de Manuten\u00e7\u00e3o de Banco de Dados para PostgreSQL no Node.js<\/title>\n<meta name=\"description\" content=\"Aprenda a fazer a manuten\u00e7\u00e3o perfeita do banco de dados PostgreSQL no Node.js com nosso guia abrangente. Melhore seu jogo no gerenciamento de banco de dados sem esfor\u00e7o!\" \/>\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\/pt\/blog\/plano-manutencao-banco-dados\/\" \/>\n<meta property=\"og:locale\" content=\"pt_PT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Configura\u00e7\u00e3o de Planos de Manuten\u00e7\u00e3o de Banco de Dados para PostgreSQL no Node.js\" \/>\n<meta property=\"og:description\" content=\"Aprenda a fazer a manuten\u00e7\u00e3o perfeita do banco de dados PostgreSQL no Node.js com nosso guia abrangente. Melhore seu jogo no gerenciamento de banco de dados sem esfor\u00e7o!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinqsta.com\/pt\/blog\/plano-manutencao-banco-dados\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstapt\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-11-23T12:29:24+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-11-30T12:47:57+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/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=\"Aprenda a fazer a manuten\u00e7\u00e3o perfeita do banco de dados PostgreSQL no Node.js com nosso guia abrangente. Melhore seu jogo no gerenciamento de banco de dados sem esfor\u00e7o!\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/11\/database-maintenance-plan.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@kinsta_pt\" \/>\n<meta name=\"twitter:site\" content=\"@kinsta_pt\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kumar Harsh\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo estimado de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"19 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinqsta.com\/pt\/blog\/plano-manutencao-banco-dados\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinqsta.com\/pt\/blog\/plano-manutencao-banco-dados\/\"},\"author\":{\"name\":\"Kumar Harsh\",\"@id\":\"https:\/\/kinqsta.com\/pt\/#\/schema\/person\/3a80efffa9cbb0333cc9c22b754415d9\"},\"headline\":\"Configura\u00e7\u00e3o de Planos de Manuten\u00e7\u00e3o de Banco de Dados para PostgreSQL no Node.js\",\"datePublished\":\"2023-11-23T12:29:24+00:00\",\"dateModified\":\"2023-11-30T12:47:57+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinqsta.com\/pt\/blog\/plano-manutencao-banco-dados\/\"},\"wordCount\":3608,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinqsta.com\/pt\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinqsta.com\/pt\/blog\/plano-manutencao-banco-dados\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/11\/database-maintenance-plan.jpg\",\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinqsta.com\/pt\/blog\/plano-manutencao-banco-dados\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinqsta.com\/pt\/blog\/plano-manutencao-banco-dados\/\",\"url\":\"https:\/\/kinqsta.com\/pt\/blog\/plano-manutencao-banco-dados\/\",\"name\":\"Configura\u00e7\u00e3o de Planos de Manuten\u00e7\u00e3o de Banco de Dados para PostgreSQL no Node.js\",\"isPartOf\":{\"@id\":\"https:\/\/kinqsta.com\/pt\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinqsta.com\/pt\/blog\/plano-manutencao-banco-dados\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinqsta.com\/pt\/blog\/plano-manutencao-banco-dados\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/11\/database-maintenance-plan.jpg\",\"datePublished\":\"2023-11-23T12:29:24+00:00\",\"dateModified\":\"2023-11-30T12:47:57+00:00\",\"description\":\"Aprenda a fazer a manuten\u00e7\u00e3o perfeita do banco de dados PostgreSQL no Node.js com nosso guia abrangente. Melhore seu jogo no gerenciamento de banco de dados sem esfor\u00e7o!\",\"breadcrumb\":{\"@id\":\"https:\/\/kinqsta.com\/pt\/blog\/plano-manutencao-banco-dados\/#breadcrumb\"},\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinqsta.com\/pt\/blog\/plano-manutencao-banco-dados\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinqsta.com\/pt\/blog\/plano-manutencao-banco-dados\/#primaryimage\",\"url\":\"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/11\/database-maintenance-plan.jpg\",\"contentUrl\":\"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/11\/database-maintenance-plan.jpg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinqsta.com\/pt\/blog\/plano-manutencao-banco-dados\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinqsta.com\/pt\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PostgreSQL\",\"item\":\"https:\/\/kinqsta.com\/pt\/topicos\/postgresql\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Configura\u00e7\u00e3o de Planos de Manuten\u00e7\u00e3o de Banco de Dados para PostgreSQL no Node.js\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinqsta.com\/pt\/#website\",\"url\":\"https:\/\/kinqsta.com\/pt\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Solu\u00e7\u00f5es de hospedagem Premium, r\u00e1pida e segura\",\"publisher\":{\"@id\":\"https:\/\/kinqsta.com\/pt\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinqsta.com\/pt\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-PT\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinqsta.com\/pt\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinqsta.com\/pt\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinqsta.com\/pt\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinqsta.com\/pt\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstapt\/\",\"https:\/\/x.com\/kinsta_pt\",\"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\/pt\/#\/schema\/person\/3a80efffa9cbb0333cc9c22b754415d9\",\"name\":\"Kumar Harsh\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinqsta.com\/pt\/#\/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\/pt\/blog\/author\/kumarharsh\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Configura\u00e7\u00e3o de Planos de Manuten\u00e7\u00e3o de Banco de Dados para PostgreSQL no Node.js","description":"Aprenda a fazer a manuten\u00e7\u00e3o perfeita do banco de dados PostgreSQL no Node.js com nosso guia abrangente. Melhore seu jogo no gerenciamento de banco de dados sem esfor\u00e7o!","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\/pt\/blog\/plano-manutencao-banco-dados\/","og_locale":"pt_PT","og_type":"article","og_title":"Configura\u00e7\u00e3o de Planos de Manuten\u00e7\u00e3o de Banco de Dados para PostgreSQL no Node.js","og_description":"Aprenda a fazer a manuten\u00e7\u00e3o perfeita do banco de dados PostgreSQL no Node.js com nosso guia abrangente. Melhore seu jogo no gerenciamento de banco de dados sem esfor\u00e7o!","og_url":"https:\/\/kinqsta.com\/pt\/blog\/plano-manutencao-banco-dados\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstapt\/","article_published_time":"2023-11-23T12:29:24+00:00","article_modified_time":"2023-11-30T12:47:57+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/11\/database-maintenance-plan.jpg","type":"image\/jpeg"}],"author":"Kumar Harsh","twitter_card":"summary_large_image","twitter_description":"Aprenda a fazer a manuten\u00e7\u00e3o perfeita do banco de dados PostgreSQL no Node.js com nosso guia abrangente. Melhore seu jogo no gerenciamento de banco de dados sem esfor\u00e7o!","twitter_image":"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/11\/database-maintenance-plan.jpg","twitter_creator":"@kinsta_pt","twitter_site":"@kinsta_pt","twitter_misc":{"Escrito por":"Kumar Harsh","Tempo estimado de leitura":"19 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinqsta.com\/pt\/blog\/plano-manutencao-banco-dados\/#article","isPartOf":{"@id":"https:\/\/kinqsta.com\/pt\/blog\/plano-manutencao-banco-dados\/"},"author":{"name":"Kumar Harsh","@id":"https:\/\/kinqsta.com\/pt\/#\/schema\/person\/3a80efffa9cbb0333cc9c22b754415d9"},"headline":"Configura\u00e7\u00e3o de Planos de Manuten\u00e7\u00e3o de Banco de Dados para PostgreSQL no Node.js","datePublished":"2023-11-23T12:29:24+00:00","dateModified":"2023-11-30T12:47:57+00:00","mainEntityOfPage":{"@id":"https:\/\/kinqsta.com\/pt\/blog\/plano-manutencao-banco-dados\/"},"wordCount":3608,"commentCount":0,"publisher":{"@id":"https:\/\/kinqsta.com\/pt\/#organization"},"image":{"@id":"https:\/\/kinqsta.com\/pt\/blog\/plano-manutencao-banco-dados\/#primaryimage"},"thumbnailUrl":"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/11\/database-maintenance-plan.jpg","inLanguage":"pt-PT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinqsta.com\/pt\/blog\/plano-manutencao-banco-dados\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinqsta.com\/pt\/blog\/plano-manutencao-banco-dados\/","url":"https:\/\/kinqsta.com\/pt\/blog\/plano-manutencao-banco-dados\/","name":"Configura\u00e7\u00e3o de Planos de Manuten\u00e7\u00e3o de Banco de Dados para PostgreSQL no Node.js","isPartOf":{"@id":"https:\/\/kinqsta.com\/pt\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinqsta.com\/pt\/blog\/plano-manutencao-banco-dados\/#primaryimage"},"image":{"@id":"https:\/\/kinqsta.com\/pt\/blog\/plano-manutencao-banco-dados\/#primaryimage"},"thumbnailUrl":"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/11\/database-maintenance-plan.jpg","datePublished":"2023-11-23T12:29:24+00:00","dateModified":"2023-11-30T12:47:57+00:00","description":"Aprenda a fazer a manuten\u00e7\u00e3o perfeita do banco de dados PostgreSQL no Node.js com nosso guia abrangente. Melhore seu jogo no gerenciamento de banco de dados sem esfor\u00e7o!","breadcrumb":{"@id":"https:\/\/kinqsta.com\/pt\/blog\/plano-manutencao-banco-dados\/#breadcrumb"},"inLanguage":"pt-PT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinqsta.com\/pt\/blog\/plano-manutencao-banco-dados\/"]}]},{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinqsta.com\/pt\/blog\/plano-manutencao-banco-dados\/#primaryimage","url":"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/11\/database-maintenance-plan.jpg","contentUrl":"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/11\/database-maintenance-plan.jpg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinqsta.com\/pt\/blog\/plano-manutencao-banco-dados\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinqsta.com\/pt\/"},{"@type":"ListItem","position":2,"name":"PostgreSQL","item":"https:\/\/kinqsta.com\/pt\/topicos\/postgresql\/"},{"@type":"ListItem","position":3,"name":"Configura\u00e7\u00e3o de Planos de Manuten\u00e7\u00e3o de Banco de Dados para PostgreSQL no Node.js"}]},{"@type":"WebSite","@id":"https:\/\/kinqsta.com\/pt\/#website","url":"https:\/\/kinqsta.com\/pt\/","name":"Kinsta\u00ae","description":"Solu\u00e7\u00f5es de hospedagem Premium, r\u00e1pida e segura","publisher":{"@id":"https:\/\/kinqsta.com\/pt\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinqsta.com\/pt\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-PT"},{"@type":"Organization","@id":"https:\/\/kinqsta.com\/pt\/#organization","name":"Kinsta","url":"https:\/\/kinqsta.com\/pt\/","logo":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinqsta.com\/pt\/#\/schema\/logo\/image\/","url":"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinqsta.com\/pt\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstapt\/","https:\/\/x.com\/kinsta_pt","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\/pt\/#\/schema\/person\/3a80efffa9cbb0333cc9c22b754415d9","name":"Kumar Harsh","image":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinqsta.com\/pt\/#\/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\/pt\/blog\/author\/kumarharsh\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinqsta.com\/pt\/wp-json\/wp\/v2\/posts\/65088","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinqsta.com\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinqsta.com\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinqsta.com\/pt\/wp-json\/wp\/v2\/users\/238"}],"replies":[{"embeddable":true,"href":"https:\/\/kinqsta.com\/pt\/wp-json\/wp\/v2\/comments?post=65088"}],"version-history":[{"count":9,"href":"https:\/\/kinqsta.com\/pt\/wp-json\/wp\/v2\/posts\/65088\/revisions"}],"predecessor-version":[{"id":65487,"href":"https:\/\/kinqsta.com\/pt\/wp-json\/wp\/v2\/posts\/65088\/revisions\/65487"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinqsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/65088\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinqsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/65088\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinqsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/65088\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinqsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/65088\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinqsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/65088\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinqsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/65088\/translations\/jp"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinqsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/65088\/translations\/es"},{"href":"https:\/\/kinqsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/65088\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinqsta.com\/pt\/wp-json\/wp\/v2\/media\/65089"}],"wp:attachment":[{"href":"https:\/\/kinqsta.com\/pt\/wp-json\/wp\/v2\/media?parent=65088"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinqsta.com\/pt\/wp-json\/wp\/v2\/tags?post=65088"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinqsta.com\/pt\/wp-json\/wp\/v2\/topic?post=65088"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}