102 | | |
| 102 | * Si el backup origen de datos tiene muchas instrucciones de replicación (de la tabla replicacion.rep_instrucciones) es posible que demore mucho la restauración de los datos y es posible también que dé errores, etc.[[BR]]Relacionado a lo anterior, para restaurar una base de datos, digamos para una sucursal nueva, no son necesarios los registros de replicacion.rep_instrucciones excepto por el último del idu_db de casa central.[[BR]]Se presentas a continuación los pasos para restaurar la base de datos tal como se explicó en los pasos anteriores pero teniendo en cuenta además que no se va a restaurar el contenido de replicacion.rep_instrucciones.[[BR]]Este procedimiento está agendado en el marco de la instalación de Postgres en Windows pero aplica también a la instalación de Postgres en Linux:[[BR]]'''Solución para restaurar un backup con muchas instrucciones en replicación:'''[[BR]](caso ejemplo con archivo de backup regente1.dmp y base de datos llamada demo2) |
| 103 | * 1) Restaurar solo el esquema |
| 104 | {{{ /usr/lib/postgresql/8.3/bin/pg_restore -h localhost -p 5432 -U sistemas -d demo2 -O -s -v regente1.dmp 2> errores.txt }}} |
| 105 | * 2) Borrar el schema replicación |
| 106 | {{{ DROP SCHEMA replicacion CASCADE; }}} |
| 107 | * 3) Quitar checks que pueden causar problemas con datos viejos: (esto no es específico del problema en cuestión acá que es evitar los datos de replicación en la restauración) |
| 108 | {{{ |
| 109 | --(tb. habria que quitar los checks: chk_existencia_especificar_lote en remitos_detalles y chk_numero_en_chequera en tabla valores). |
| 110 | ALTER TABLE remitos_detalles DROP CONSTRAINT chk_existencia_especificar_lote; |
| 111 | ALTER TABLE remitos_detalles DROP CONSTRAINT chk_existencia_especificar_lote_unitario; |
| 112 | ALTER TABLE valores DROP CONSTRAINT chk_numero_en_chequera; |
| 113 | }}} |
| 114 | * 4) Restaurar solo los datos |
| 115 | {{{ /usr/lib/postgresql/8.3/bin/pg_restore -h localhost -p 5432 -U sistemas -d demo2 -a --disable-triggers -v regente1.dmp 2> errores.txt }}} |
| 116 | * 5) Volver a poner checks quitados: |
| 117 | {{{ |
| 118 | --Volver a poner checks quitados, quiza ajustando algo en los datos: |
| 119 | delete from remitos_detalles where id_lote IS NULL AND existencia_con_lote(id_articulo) |
| 120 | ALTER TABLE remitos_detalles ADD CONSTRAINT chk_existencia_especificar_lote CHECK (NOT (id_lote IS NULL AND existencia_con_lote(id_articulo))); |
| 121 | ALTER TABLE remitos_detalles ADD CONSTRAINT chk_existencia_especificar_lote_unitario CHECK (NOT (COALESCE(cant, 0::double precision) <> 1::double precision AND existencia_con_lote_unitario(id_articulo))); |
| 122 | delete from valores where not valor_cheque_en_chequera(id_cuenta, nro, id_tipo_pago) |
| 123 | ALTER TABLE valores ADD CONSTRAINT chk_numero_en_chequera CHECK (valor_cheque_en_chequera(id_cuenta, nro, id_tipo_pago)); |
| 124 | }}} |
| 125 | * 6) Hacer un backup de todo el schema replicacion de la base de datos de origen y restaurarla. |
| 126 | * 7) Obtener el ultimo idu_rep_instruccion del server central (se asume idu_db = 1) e insertarlo para que comience a replicar a partir de ahí: |
| 127 | * 7.1) Extraer las instrucciones de replicacion del archivo de backup: |
| 128 | {{{ pg_restore -a -t rep_instrucciones regente1.dmp > /home/sistemas/backup/rep_instrucciones.txt }}} |
| 129 | * 7.2) Quedarse sólo con las instrucciones del día en que se hizo el backup y ordenarlas: |
| 130 | {{{ |
| 131 | cat /home/sistemas/backup/rep_instrucciones.txt | grep "2011-10-25 " > rep_instrucciones_20111025.txt |
| 132 | sort rep_instrucciones_20111025.txt > rep_instrucciones_20111025_sorted.txt |
| 133 | }}} |
| 134 | * 7.3) tomar la ultima instruccion que comience en 1 e insertar esa idu_rep_instruccion en replicacion.rep_instrucciones del nuevo server: |
| 135 | {{{ |
| 136 | mc -e rep_instrucciones_20111025_sorted.txt |
| 137 | En este ejemplo: |
| 138 | 1: 4613012 |
| 139 | insert into replicacion.rep_instrucciones values (1,4613012,'restaurado hasta aca','2011-10-27',null,'sql'); |
| 140 | }}} |