| 101 | * Comandos (en ventana cmd.exe) para restaurar una BD. |
| 102 | {{{ |
| 103 | #!div style="border: 0pt solid; text-align: left" |
| 104 | * Solo estructura,sin propietario y mensajes : |
| 105 | C:\Archivos de programa\PostgreSQL\9.1\bin>pg_restore.exe --host localhost --port 5432 --username sistemas --dbname regente --no-owner --schema-only --verbose "C:\soft\regente.backup" 2>> "C:\logs\restore_struct.log" |
| 106 | * Sólo datos,sin propietario y deshabilitar disparador: |
| 107 | C:\Archivos de programa\PostgreSQL\9.1\bin>pg_restore.exe --host localhost --port 5432 --username sistemas --dbname regente --data-only --disable-triggers --verbose "C:\soft\regente.backup" 2>> "C:\logs\restore_data.log" |
| 108 | }}} |
| 109 | * 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 presentan 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) |
| 110 | * 1) Restaurar solo el esquema |
| 111 | {{{ /usr/lib/postgresql/9.1/bin/pg_restore -h localhost -p 5432 -U sistemas -d demo2 -O -s -v regente1.dmp 2> errores_estruct.txt }}} |
| 112 | * 2) Borrar el schema replicación |
| 113 | {{{ DROP SCHEMA replicacion CASCADE; }}} |
| 114 | * 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) |
| 115 | {{{ |
| 116 | --(tb. habria que quitar los checks: chk_existencia_especificar_lote en remitos_detalles y chk_numero_en_chequera en tabla valores). |
| 117 | ALTER TABLE remitos_detalles DROP CONSTRAINT chk_existencia_especificar_lote; |
| 118 | ALTER TABLE remitos_detalles DROP CONSTRAINT chk_existencia_especificar_lote_unitario; |
| 119 | ALTER TABLE remitos_detalles DROP CONSTRAINT chk_lote_articulo_correcto; |
| 120 | ALTER TABLE valores DROP CONSTRAINT chk_numero_en_chequera; |
| 122 | }}} |
| 123 | * 4) Restaurar solo los datos |
| 124 | {{{ |
| 125 | /usr/lib/postgresql/9.1/bin/pg_restore -h localhost -p 5432 -U sistemas -d demo2 -a --disable-triggers -v regente1.dmp 2> errores_datos.txt |
| 126 | ALTER DATABASE nombre_basedatos SET statement_timeout=480000; |
| 127 | }}} |
| 128 | * 5) Volver a poner checks quitados: |
| 129 | {{{ |
| 130 | --Volver a poner checks quitados, quiza ajustando algo en los datos: |
| 131 | delete from remitos_detalles where id_lote IS NULL AND existencia_con_lote(id_articulo) |
| 132 | ALTER TABLE remitos_detalles ADD CONSTRAINT chk_existencia_especificar_lote CHECK (NOT (id_lote IS NULL AND existencia_con_lote(id_articulo))); |
| 133 | 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))); |
| 134 | ALTER TABLE remitos_detalles ADD CONSTRAINT chk_lote_articulo_correcto CHECK (id_lote IS NULL OR lote_articulo_correcto(id_lote, id_articulo)); |
| 135 | delete from valores where not valor_cheque_en_chequera(id_cuenta, nro, id_tipo_pago) |
| 136 | ALTER TABLE valores ADD CONSTRAINT chk_numero_en_chequera CHECK (valor_cheque_en_chequera(id_cuenta, nro, id_tipo_pago)); |
| 137 | }}} |
| 138 | * 6) Hacer un backup de todo el schema replicacion de la base de datos de origen y restaurarla. Restaurar el contenido de tabla replicacion.tolerancia_fallo_firmas de manera manual también. |
| 139 | {{{ /usr/lib/postgresql/9.1/bin/pg_dump --host localhost --port 5432 --username "sistemas" --verbose --file "/usr/src/soft/Replicacion.backup" --schema "replicacion" "regente" 2> erroresReplicacion.txt }}} |
| 140 | * 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í: |
| 141 | * 7.1) Extraer las instrucciones de replicacion del archivo de backup: |
| 142 | {{{ pg_restore -a -t rep_instrucciones regente1.dmp > /home/sistemas/backup/rep_instrucciones.txt }}} |
| 143 | * 7.2) Quedarse sólo con las instrucciones del día en que se hizo el backup y ordenarlas: |
| 144 | {{{ |
| 145 | cat /home/sistemas/backup/rep_instrucciones.txt | grep "2013-10-25 " > rep_instrucciones_20131025.txt |
| 146 | sort rep_instrucciones_20131025.txt > rep_instrucciones_20131025_sorted.txt |
| 147 | }}} |
| 148 | * 7.3) tomar la ultima instruccion que comience en 1 e insertar esa idu_rep_instruccion en replicacion.rep_instrucciones del nuevo server: |
| 149 | {{{ |
| 150 | mc -e rep_instrucciones_20131025_sorted.txt |
| 151 | En este ejemplo: |
| 152 | 1: 4613012 |
| 153 | insert into replicacion.rep_instrucciones values (1,4613012,'restaurado hasta aca','2013-10-27',null,'sql'); |
| 154 | }}} |
| 155 | |
| 156 | ==== Nota para nueva versión de Postgres 9.x (por ejemplo 9.1) al instalar Regente ==== |
| 157 | Por cuestiones de compatibilidad cambiar en postgresql.conf o ejecutar: |
| 158 | * standard_conforming_strings = off |
| 159 | * escape_string_warning = off |
| 160 | * (para ejecutar en "caliente" y eventualmente replicar y sin tener que reiniciar nada: por ejemplo en una base de datos que se llama regente "alter database regente set standard_conforming_strings to off;) |
| 161 | |
| 162 | [[BR]] |
| 163 | [[BR]] |
| 164 | [wiki:manual_regente_windows Volver al manual de instalación de Regente en Windows] |