{"id":2518,"date":"2017-12-02T05:24:10","date_gmt":"2017-12-02T05:24:10","guid":{"rendered":"https:\/\/esferas.org\/msqlu\/?p=2518"},"modified":"2017-12-02T05:24:10","modified_gmt":"2017-12-02T05:24:10","slug":"copias-de-seguridad-de-una-aplicacion-odoo","status":"publish","type":"post","link":"https:\/\/esferas.org\/msqlu\/2017\/12\/02\/copias-de-seguridad-de-una-aplicacion-odoo\/","title":{"rendered":"Copias de seguridad de una aplicaci\u00f3n odoo &#8230;"},"content":{"rendered":"<div class='__iawmlf-post-loop-links' style='display:none;' data-iawmlf-post-links='[{&quot;id&quot;:680,&quot;href&quot;:&quot;https:\\\/\\\/www.postgresql.org\\\/docs\\\/9.2\\\/static\\\/continuous-archiving.html&quot;,&quot;archived_href&quot;:&quot;&quot;,&quot;redirect_href&quot;:&quot;https:\\\/\\\/www.postgresql.org\\\/docs\\\/9.2\\\/continuous-archiving.html&quot;,&quot;checks&quot;:[],&quot;broken&quot;:false,&quot;last_checked&quot;:null,&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:681,&quot;href&quot;:&quot;http:\\\/\\\/doc.bareos.org&quot;,&quot;archived_href&quot;:&quot;&quot;,&quot;redirect_href&quot;:&quot;https:\\\/\\\/docs.bareos.org\\\/&quot;,&quot;checks&quot;:[],&quot;broken&quot;:false,&quot;last_checked&quot;:null,&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:682,&quot;href&quot;:&quot;https:\\\/\\\/github.com\\\/bareos\\\/contrib-pgsql-plugin\\\/wiki&quot;,&quot;archived_href&quot;:&quot;https:\\\/\\\/web-wp.archive.org\\\/web\\\/20201106055233\\\/https:\\\/\\\/github.com\\\/bareos\\\/contrib-pgsql-plugin\\\/wiki&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-04-15 14:49:26&quot;,&quot;http_code&quot;:206}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-15 14:49:26&quot;,&quot;http_code&quot;:206},&quot;process&quot;:&quot;done&quot;}]'><\/div>\n<p>&#8230; lo que tengo y lo que pretendo.<\/p>\n<p><!--more--><\/p>\n<p>En mi lugar de trabajo tenemos dos instalaciones casi independientes funcionando bajo odoo. Seg\u00fan la hemos ido utilizando me he dado cuenta de que se est\u00e1 desbordando la capacidad del servidor de copias de seguridad y que las copias incrementales han llegado a un punto que no se distinguen de las completas.<\/p>\n<p>Tanto es as\u00ed que si la instalaci\u00f3n ocupa, en bruto, 43Gb, estamos salvando a diario cerca de 300Gb y no tiene sentido.<\/p>\n<p>Revisando la configuraci\u00f3n del servidor me doy cuenta varios errores que tanto yo como la consultora que mantiene la instalaci\u00f3n estamos cometiendo. A saber:<\/p>\n<ul>\n<li>Todas las noches a las 3am se lanza un script que crea lo siguiente:\n<ul>\n<li>Volcado completo de las bases de datos empleando <em>pg_dumpall<\/em>.<\/li>\n<li>Empaquetado (con <em>tar<\/em> y comprimido) de todo el \u00e1rbol de la aplicaci\u00f3n bajo <code>\/opt\/odoo<\/code> donde reside el software principal y varios repositorios <em>git<\/em> con su trabajo.<\/li>\n<li>Estos empaquetados se guardan bajo la fecha del d\u00eda y se conservan nada menos que 30 de ellos.<\/li>\n<\/ul>\n<\/li>\n<li>Todas las noches a las 23pm (el d\u00eda antes del anterior en realidad) se lanzan las copias planificadas con <em>bareos<\/em> y se salva aquello que se ha modificado desde el anterior.<\/li>\n<\/ul>\n<div id=\"attachment_2519\" style=\"width: 1034px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-2519\" class=\"wp-image-2519 size-large\" src=\"https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2017\/11\/Captura-de-pantalla-de-2017-11-28-12-16-26-1024x345.png\" alt=\"\" width=\"1024\" height=\"345\" srcset=\"https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2017\/11\/Captura-de-pantalla-de-2017-11-28-12-16-26-1024x345.png 1024w, https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2017\/11\/Captura-de-pantalla-de-2017-11-28-12-16-26-300x101.png 300w, https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2017\/11\/Captura-de-pantalla-de-2017-11-28-12-16-26-768x259.png 768w, https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2017\/11\/Captura-de-pantalla-de-2017-11-28-12-16-26.png 1324w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><p id=\"caption-attachment-2519\" class=\"wp-caption-text\">Vista desde el cliente web de bareos<\/p><\/div>\n<p>As\u00ed que tenemos una situaci\u00f3n en la que los datos que deben salvarse se preparan despu\u00e9s de hacer la copia. Y tenemos siempre tres juegos de copias que en realidad corresponden a un d\u00eda de trabajo. Vale. As\u00ed no.<\/p>\n<h3>Las copias ahora mismo<\/h3>\n<p>Mirando el script de instalaci\u00f3n de la gente que mantiene el sistema, el que se lanza a las 3am, su trabajo consiste en lo siguiente:<\/p>\n<ol>\n<li>Obtiene un volcado de todas las bases de datos del servidor empleando <em>pg_dumpall<\/em> y comprime v\u00eda <em>gzip<\/em> el resultado. Un archivo con todo a diario.<\/li>\n<li>Crea un paquete (tambi\u00e9n comprimido) de directorios v\u00eda <em>tar<\/em> en los que se incluye:\n<ol>\n<li><em>\/opt\/odoo<\/em><\/li>\n<li><em>\/etc\/odoo\/*<\/em><\/li>\n<li><em>\/etc\/init.d\/odoo*<\/em><\/li>\n<li><em>\/var\/log\/odoo\/*<\/em><\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p>Conserva, eso s\u00ed, los 30 \u00faltimos empaquetados de este tipo por lo que restaurar desde a una fecha dada es sencillo.<\/p>\n<p>\u00bf Qu\u00e9 ocurre entonces cuando integras este sistema de copias en otro como <em>bareos<\/em> ? Pues que los niveles de copia patinan un poco; las copias incrementales o diferenciales llegan a ser t\u00e9cnicamente copias completas. Y as\u00ed, pues tampoco.<\/p>\n<h3>Y sin embargo<\/h3>\n<p>Tenemos que mantener parte de este esquema, al menos en local, debido a que la consultora externa que mantiene el sistema necesita que siga as\u00ed. Estoy seguro de que podr\u00edan adaptarse a lo que les pida si es razonable pero no quiero complicar m\u00e1s la situaci\u00f3n.<\/p>\n<p>Ellos deben saber que, ya que instalaron el mecanismo de copias, \u00e9ste sigue en el mismo sitio y pueden restaurar el sistema de la misma manera.<\/p>\n<p>El \u00fanico gran cambio que voy a realizar desde su punto de vista es que su programa de volcado estar\u00e1 integrado entre los propios de <em>bareos<\/em> y que funcionar\u00e1n a la par.<\/p>\n<p>Para el programa odoo en s\u00ed he escrito este peque\u00f1o script que me asegura una copia limpia para salvar:<\/p>\n<pre class=\"lang:sh decode:true \">#!\/usr\/bin\/env bash\r\n\r\n# Par\u00e1metros\r\nVERSION=0.1\r\nBACKUP=\/var\/backups\/odoo-latest\r\nRSYNC=\"$(which rsync) -avlm --delete \" \r\n\r\n# Preparamos \u00e1rbol de archivos para copias con bareos\r\n[ ! -d $BACKUP ] &amp;&amp; install -d -o root -g root -m 0700 $BACKUP\r\n\r\n# Sincronizamos configuraci\u00f3n, registros y programa \r\n$RSYNC \/opt\/odoo $BACKUP\/code\r\n$RSYNC --include=\"*\/\" --include=\"*odoo*\" --exclude=\"*\" \/etc \/var\/backups\/odoo-latest\/\r\n$RSYNC \/var\/log\/odoo $BACKUP\/log \r\n<\/pre>\n<p>Y el directorio me queda de esta forma:<\/p>\n<pre class=\"lang:default decode:true \">tree -L 1 \/var\/backups\/odoo-latest\/\r\n\/var\/backups\/odoo-latest\/\r\n\u251c\u2500\u2500 code\r\n\u251c\u2500\u2500 etc\r\n\u2514\u2500\u2500 log\r\n<\/pre>\n<h3>Ahora los datos<\/h3>\n<p>Existen dos formas de salvar bases de datos en PostgreSQL: la primera es emplear el famoso volcado en texto como instrucciones SQL. Es un todo o nada (aunque hay cosas que pueden excluirse, claro) y me sigue pareciendo una medida algo burda.<\/p>\n<p>Actualmente el volcado principal ocupa cerca de 43Gb de texto plano. Si se sigue un m\u00ednimo orden s\u00f3lo se ver\u00e1n modificaciones en las \u00faltimas l\u00edneas, pero por lo que he podido ver en la documentaci\u00f3n ni <code>pg_dumpall<\/code> ni <code>pg_dump<\/code> mencionan nada al respecto. Asumo que ser\u00e1 as\u00ed, por lo que mi estrategia consiste en dividir en fragmentos el archivo SQL empleando la herramienta <em>split<\/em> (sin comprimir) y as\u00ed dejar que sea el programa de copias el que decida qu\u00e9 se ha modificado y qu\u00e9 no.<\/p>\n<pre class=\"lang:sh decode:true \">$ sudo -u postgres nice pg_dumpall &gt; \/tmp\/postgresql.sql\r\n$ cd \/var\/backups\/odoo-bareos\r\n$ cat \/tmp\/postgresql.sql | split --suffix-length=4 --bytes 100M -d - odoo-pg-\r\n$ ls -ltra | tail \r\n-rw-r--r-- 1 root root 104857600 nov 30 07:29 odoo-pg-0222\r\n-rw-r--r-- 1 root root 104857600 nov 30 07:29 odoo-pg-0223\r\n-rw-r--r-- 1 root root 104857600 nov 30 07:29 odoo-pg-0224\r\n-rw-r--r-- 1 root root 104857600 nov 30 07:30 odoo-pg-0225\r\n-rw-r--r-- 1 root root 104857600 nov 30 07:30 odoo-pg-0226\r\n-rw-r--r-- 1 root root 104857600 nov 30 07:30 odoo-pg-0227\r\n-rw-r--r-- 1 root root 104857600 nov 30 07:30 odoo-pg-0228\r\n-rw-r--r-- 1 root root 104857600 nov 30 07:30 odoo-pg-0229\r\n-rw-r--r-- 1 root root 104857600 nov 30 07:30 odoo-pg-0230\r\n-rw-r--r-- 1 root root  61694889 nov 30 07:30 odoo-pg-0231\r\n$<\/pre>\n<p>La segunda forma es m\u00e1s compleja y necesita una mayor comprensi\u00f3n por mi parte. Hablar\u00e9 de ella en otro art\u00edculo si consigo ponerla en marcha, pero se trata de algo llamado <a href=\"https:\/\/www.postgresql.org\/docs\/9.2\/static\/continuous-archiving.html\">Continuous Archiving and Point-in-Time Recovery (PITR)<\/a>.<\/p>\n<h3>Enlaces y referencias<\/h3>\n<ul>\n<li><a href=\"http:\/\/doc.bareos.org\/\">Manual de referencia de Bareos<\/a><\/li>\n<li>Complementos \u00fatiles:\n<ul>\n<li><a href=\"https:\/\/github.com\/bareos\/contrib-pgsql-plugin\/wiki\">Bacula PostgreSQL Plugin<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>&#8230; lo que tengo y lo que pretendo.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","webmentions_disabled_pings":false,"webmentions_disabled":false,"footnotes":""},"categories":[2],"tags":[18,34,694,52,594,746],"class_list":["post-2518","post","type-post","status-publish","format-standard","hentry","category-software","tag-administracion-de-sistemas","tag-backups","tag-bareos","tag-mi-lugar-de-trabajo","tag-odoo","tag-posgresql"],"_links":{"self":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/2518","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/comments?post=2518"}],"version-history":[{"count":0,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/2518\/revisions"}],"wp:attachment":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/media?parent=2518"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/categories?post=2518"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/tags?post=2518"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}