{"id":1318,"date":"2026-03-27T04:46:11","date_gmt":"2026-03-27T07:46:11","guid":{"rendered":"https:\/\/maurobernal.com.ar\/blog\/postgresql-alter-table-lock-production-outage\/"},"modified":"2026-03-27T04:46:11","modified_gmt":"2026-03-27T07:46:11","slug":"postgresql-alter-table-lock-production-outage","status":"publish","type":"post","link":"https:\/\/maurobernal.com.ar\/blog\/postgresql-alter-table-lock-production-outage\/","title":{"rendered":"C\u00f3mo un ALTER TABLE tir\u00f3 producci\u00f3n por 19 minutos en PostgreSQL"},"content":{"rendered":"\n<p><strong>Nota:<\/strong> Este caso no me ocurri\u00f3 a m\u00ed, pero lo comparto porque es un ejemplo muy valioso para cualquier DBA o desarrollador que trabaje con PostgreSQL en producci\u00f3n. El RCA original fue publicado por <a href=\"https:\/\/haiderzdbre.substack.com\/p\/postgresql-alter-table-lock-production-outage-rca\" target=\"_blank\" rel=\"noopener\">Haider (The Sev-1 Database newsletter)<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">El escenario<\/h2>\n\n\n\n<p>PostgreSQL 14. Tabla principal con aproximadamente <strong>180 millones de filas y 320 GB<\/strong>. La tabla llevaba cuatro a\u00f1os sin cambios de esquema.<\/p>\n\n\n\n<p>El requerimiento era agregar una columna con constraint <code>NOT NULL<\/code> y un valor por defecto. El plan parec\u00eda simple:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Deploy del c\u00f3digo de aplicaci\u00f3n (backward compatible)<\/li>\n<li>Correr la migraci\u00f3n: <code>ALTER TABLE orders ADD COLUMN status_v2 TEXT NOT NULL DEFAULT 'pending'<\/code><\/li>\n<li>Deploy de la segunda versi\u00f3n usando la nueva columna<\/li>\n<\/ol>\n\n\n\n<p>El paso 2 fue el problema.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00bfQu\u00e9 pas\u00f3 a las 9:07 AM?<\/h2>\n\n\n\n<p>La migraci\u00f3n se ejecut\u00f3 en producci\u00f3n. En minutos:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>La API comenz\u00f3 a devolver <strong>503s<\/strong><\/li>\n<li>Timeouts de conexi\u00f3n en todos los servicios<\/li>\n<li>CPU del servidor de base de datos al <strong>100%<\/strong><\/li>\n<li>El connection pool se agot\u00f3 por completo<\/li>\n<\/ul>\n\n\n\n<p>La migraci\u00f3n en apariencia \u00absegu\u00eda corriendo\u00bb, pero cada otra query estaba en cola esperando un lock. El servicio estuvo completamente ca\u00eddo en menos de 2 minutos. La migraci\u00f3n tard\u00f3 <strong>47 minutos<\/strong> en completarse. Impacto total: ~19 minutos de downtime para el cliente final, m\u00e1s horas de demora en el deploy.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">La causa ra\u00edz: ACCESS EXCLUSIVE Lock<\/h2>\n\n\n\n<p><code>ALTER TABLE<\/code> adquiere un <strong>ACCESS EXCLUSIVE lock<\/strong> \u2014 el lock m\u00e1s restrictivo de PostgreSQL. Bloquea absolutamente toda otra operaci\u00f3n sobre la tabla mientras est\u00e9 activo.<\/p>\n\n\n\n<p>En PostgreSQL 11+, agregar una columna con un default no-vol\u00e1til ya no reescribe la tabla completa. Parec\u00eda seguro. Pero hay dos condiciones que rompen esa optimizaci\u00f3n:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>El default es una funci\u00f3n vol\u00e1til (<code>now()<\/code>, <code>random()<\/code>)<\/li>\n<li>La combinaci\u00f3n de <code>NOT NULL<\/code> + <code>DEFAULT<\/code> fuerza un full table scan para validar las filas existentes<\/li>\n<\/ol>\n\n\n\n<p>La condici\u00f3n 2 aplica aqu\u00ed. PostgreSQL necesitaba verificar que los 180 millones de filas cumplieran el <code>NOT NULL<\/code>, lo que requiri\u00f3 un full scan manteniendo el ACCESS EXCLUSIVE durante todo ese tiempo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">La cascada de locks<\/h2>\n<!-- \/w:heading -->\n\n\n<p>La tabla recib\u00eda una cantidad alta de queries por segundo en horario pico. Cuando se adquiri\u00f3 el ACCESS EXCLUSIVE a las 9:07 AM, cada query posterior se puso en cola \u2014 cada una manteniendo una conexi\u00f3n abierta del pool.<\/p>\n\n\n\n<p>En 90 segundos el connection pool se agot\u00f3. Las nuevas requests no pod\u00edan adquirir conexi\u00f3n. Empezaron los 503.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">El patr\u00f3n correcto para tablas grandes<\/h2>\n\n\n\n<p>Esta es la forma segura de agregar una columna <code>NOT NULL<\/code> con default a una tabla con millones de filas:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Paso 1: Agregar la columna como nullable primero<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>-- R\u00e1pido \u2014 no hace full table rewrite ni validation scan\n-- Igual toma ACCESS EXCLUSIVE, as\u00ed que us\u00e1 lock_timeout como precauci\u00f3n\nSET lock_timeout = '2s';\nALTER TABLE orders ADD COLUMN status_v2 TEXT DEFAULT 'pending';<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Paso 2: Backfill de filas existentes en batches<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>-- \u00cdndice parcial para acelerar el scan\nCREATE INDEX CONCURRENTLY IF NOT EXISTS idx_orders_status_v2_null\nON orders (id) WHERE status_v2 IS NULL;\n\nDO $$\nDECLARE\n  rows_updated INT;\nBEGIN\n  LOOP\n    WITH batch AS (\n      SELECT id FROM orders\n      WHERE status_v2 IS NULL\n      LIMIT 5000\n      FOR UPDATE SKIP LOCKED\n    )\n    UPDATE orders SET status_v2 = 'pending'\n    FROM batch WHERE orders.id = batch.id;\n\n    GET DIAGNOSTICS rows_updated = ROW_COUNT;\n    EXIT WHEN rows_updated = 0;\n\n    COMMIT; -- Libera locks y permite que VACUUM limpie el bloat\n    PERFORM pg_sleep(0.1);\n  END LOOP;\nEND $$;\n\n-- Despu\u00e9s del backfill, eliminar el \u00edndice parcial:\n-- DROP INDEX CONCURRENTLY idx_orders_status_v2_null;<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Paso 3: Agregar el constraint NOT NULL con NOT VALID, luego validar por separado<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Fase 1: agregar sin validar filas existentes (r\u00e1pido, lock breve)\nALTER TABLE orders ADD CONSTRAINT orders_status_v2_nn\n  CHECK (status_v2 IS NOT NULL) NOT VALID;\n\n-- Fase 2: validar (usa ShareUpdateExclusiveLock \u2014 no bloquea reads\/writes)\nALTER TABLE orders VALIDATE CONSTRAINT orders_status_v2_nn;<\/code><\/pre>\n\n\n\n<p>Siempre correr un <code>VACUUM ANALYZE orders;<\/code> despu\u00e9s de un backfill masivo para que el query planner tenga estad\u00edsticas frescas.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Qu\u00e9 cambi\u00f3 despu\u00e9s del incidente<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Todas las migraciones sobre tablas con m\u00e1s de 10M de filas ahora requieren revisi\u00f3n de DBA<\/li>\n<li>Se cre\u00f3 un checklist pre-migraci\u00f3n que expl\u00edcitamente pregunta: <em>\u00bfEsto adquiere ACCESS EXCLUSIVE? \u00bfPor cu\u00e1nto tiempo?<\/em><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">La lecci\u00f3n<\/h2>\n\n\n\n<p>Un <code>ALTER TABLE<\/code> inocente en una tabla grande puede tumbar toda tu aplicaci\u00f3n en menos de 2 minutos. En PostgreSQL, el tipo de lock que se adquiere y cu\u00e1nto tiempo se mantiene importa tanto como la migraci\u00f3n en s\u00ed. Conocer los mecanismos de locking no es un conocimiento \u00abavanzado de DBA\u00bb \u2014 es una habilidad b\u00e1sica para cualquier backend que toque bases de datos en producci\u00f3n.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Un ALTER TABLE inocente sobre una tabla de 180 millones de filas caus\u00f3 19 minutos de downtime total. RCA de un incidente real publicado por Haider (The Sev-1 Database): c\u00f3mo el ACCESS EXCLUSIVE lock de PostgreSQL puede cascade y tumbar toda tu aplicaci\u00f3n, y el patr\u00f3n correcto para evitarlo.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[229],"tags":[413,412,414,55,417,415,65,232,416],"class_list":["post-1318","post","type-post","status-publish","format-standard","hentry","category-postgres","tag-alter-table","tag-backend","tag-database-migration","tag-dba","tag-incident","tag-lock","tag-performance","tag-postgresql","tag-production"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>C\u00f3mo un ALTER TABLE tir\u00f3 producci\u00f3n por 19 minutos en PostgreSQL &#183; devops Mauro Bernal<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/maurobernal.com.ar\/blog\/postgresql-alter-table-lock-production-outage\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"C\u00f3mo un ALTER TABLE tir\u00f3 producci\u00f3n por 19 minutos en PostgreSQL &#183; devops Mauro Bernal\" \/>\n<meta property=\"og:description\" content=\"Un ALTER TABLE inocente sobre una tabla de 180 millones de filas caus\u00f3 19 minutos de downtime total. RCA de un incidente real publicado por Haider (The Sev-1 Database): c\u00f3mo el ACCESS EXCLUSIVE lock de PostgreSQL puede cascade y tumbar toda tu aplicaci\u00f3n, y el patr\u00f3n correcto para evitarlo.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/maurobernal.com.ar\/blog\/postgresql-alter-table-lock-production-outage\/\" \/>\n<meta property=\"og:site_name\" content=\"devops Mauro Bernal\" \/>\n<meta property=\"article:published_time\" content=\"2026-03-27T07:46:11+00:00\" \/>\n<meta name=\"author\" content=\"Mauro Bernal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@_maurobernal\" \/>\n<meta name=\"twitter:site\" content=\"@_maurobernal\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Mauro Bernal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/postgresql-alter-table-lock-production-outage\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/postgresql-alter-table-lock-production-outage\\\/\"},\"author\":{\"name\":\"Mauro Bernal\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"headline\":\"C\u00f3mo un ALTER TABLE tir\u00f3 producci\u00f3n por 19 minutos en PostgreSQL\",\"datePublished\":\"2026-03-27T07:46:11+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/postgresql-alter-table-lock-production-outage\\\/\"},\"wordCount\":569,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"keywords\":[\"ALTER TABLE\",\"Backend\",\"Database Migration\",\"dba\",\"Incident\",\"Lock\",\"performance\",\"postgresql\",\"Production\"],\"articleSection\":[\"POSTGRES\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/postgresql-alter-table-lock-production-outage\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/postgresql-alter-table-lock-production-outage\\\/\",\"url\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/postgresql-alter-table-lock-production-outage\\\/\",\"name\":\"C\u00f3mo un ALTER TABLE tir\u00f3 producci\u00f3n por 19 minutos en PostgreSQL &#183; devops Mauro Bernal\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#website\"},\"datePublished\":\"2026-03-27T07:46:11+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/postgresql-alter-table-lock-production-outage\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/postgresql-alter-table-lock-production-outage\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/postgresql-alter-table-lock-production-outage\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"C\u00f3mo un ALTER TABLE tir\u00f3 producci\u00f3n por 19 minutos en PostgreSQL\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/\",\"name\":\"devops Mauro Bernal\",\"description\":\"Cuando tu trabajo es hacer que las cosas funcionen bien...\",\"publisher\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\",\"name\":\"Mauro Bernal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\",\"width\":1740,\"height\":1740,\"caption\":\"Mauro Bernal\"},\"logo\":{\"@id\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\"},\"description\":\"Desarrollo de Sistemas en .Net, IT Callcenters, DBA de SQL Server, Mikrotik, Pentest y T\u00e9cnico consultor de Sistemas Bejerman\",\"sameAs\":[\"https:\\\/\\\/maurobernal.com.ar\",\"https:\\\/\\\/x.com\\\/_maurobernal\",\"https:\\\/\\\/youtube.com\\\/maurobernal\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"C\u00f3mo un ALTER TABLE tir\u00f3 producci\u00f3n por 19 minutos en PostgreSQL &#183; devops Mauro Bernal","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:\/\/maurobernal.com.ar\/blog\/postgresql-alter-table-lock-production-outage\/","og_locale":"es_ES","og_type":"article","og_title":"C\u00f3mo un ALTER TABLE tir\u00f3 producci\u00f3n por 19 minutos en PostgreSQL &#183; devops Mauro Bernal","og_description":"Un ALTER TABLE inocente sobre una tabla de 180 millones de filas caus\u00f3 19 minutos de downtime total. RCA de un incidente real publicado por Haider (The Sev-1 Database): c\u00f3mo el ACCESS EXCLUSIVE lock de PostgreSQL puede cascade y tumbar toda tu aplicaci\u00f3n, y el patr\u00f3n correcto para evitarlo.","og_url":"https:\/\/maurobernal.com.ar\/blog\/postgresql-alter-table-lock-production-outage\/","og_site_name":"devops Mauro Bernal","article_published_time":"2026-03-27T07:46:11+00:00","author":"Mauro Bernal","twitter_card":"summary_large_image","twitter_creator":"@_maurobernal","twitter_site":"@_maurobernal","twitter_misc":{"Escrito por":"Mauro Bernal","Tiempo de lectura":"4 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/maurobernal.com.ar\/blog\/postgresql-alter-table-lock-production-outage\/#article","isPartOf":{"@id":"https:\/\/maurobernal.com.ar\/blog\/postgresql-alter-table-lock-production-outage\/"},"author":{"name":"Mauro Bernal","@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"headline":"C\u00f3mo un ALTER TABLE tir\u00f3 producci\u00f3n por 19 minutos en PostgreSQL","datePublished":"2026-03-27T07:46:11+00:00","mainEntityOfPage":{"@id":"https:\/\/maurobernal.com.ar\/blog\/postgresql-alter-table-lock-production-outage\/"},"wordCount":569,"commentCount":0,"publisher":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"keywords":["ALTER TABLE","Backend","Database Migration","dba","Incident","Lock","performance","postgresql","Production"],"articleSection":["POSTGRES"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/maurobernal.com.ar\/blog\/postgresql-alter-table-lock-production-outage\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/maurobernal.com.ar\/blog\/postgresql-alter-table-lock-production-outage\/","url":"https:\/\/maurobernal.com.ar\/blog\/postgresql-alter-table-lock-production-outage\/","name":"C\u00f3mo un ALTER TABLE tir\u00f3 producci\u00f3n por 19 minutos en PostgreSQL &#183; devops Mauro Bernal","isPartOf":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#website"},"datePublished":"2026-03-27T07:46:11+00:00","breadcrumb":{"@id":"https:\/\/maurobernal.com.ar\/blog\/postgresql-alter-table-lock-production-outage\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/maurobernal.com.ar\/blog\/postgresql-alter-table-lock-production-outage\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/maurobernal.com.ar\/blog\/postgresql-alter-table-lock-production-outage\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/maurobernal.com.ar\/blog\/"},{"@type":"ListItem","position":2,"name":"C\u00f3mo un ALTER TABLE tir\u00f3 producci\u00f3n por 19 minutos en PostgreSQL"}]},{"@type":"WebSite","@id":"https:\/\/maurobernal.com.ar\/blog\/#website","url":"https:\/\/maurobernal.com.ar\/blog\/","name":"devops Mauro Bernal","description":"Cuando tu trabajo es hacer que las cosas funcionen bien...","publisher":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/maurobernal.com.ar\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":["Person","Organization"],"@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283","name":"Mauro Bernal","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1","url":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1","contentUrl":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1","width":1740,"height":1740,"caption":"Mauro Bernal"},"logo":{"@id":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1"},"description":"Desarrollo de Sistemas en .Net, IT Callcenters, DBA de SQL Server, Mikrotik, Pentest y T\u00e9cnico consultor de Sistemas Bejerman","sameAs":["https:\/\/maurobernal.com.ar","https:\/\/x.com\/_maurobernal","https:\/\/youtube.com\/maurobernal"]}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts\/1318","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/comments?post=1318"}],"version-history":[{"count":0,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts\/1318\/revisions"}],"wp:attachment":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/media?parent=1318"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/categories?post=1318"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/tags?post=1318"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}