Volver al manual de instalación de Regente en Windows

Manual de instalación de Postgres 9.1.3-1

(nota: la idea es realizar la instalación típica tomando actual versión estable de Postgre, se puede descargar de http://www.bircherasociados.com.ar/soft/postgresql-9.1.3-1-windows.exe o del sitio oficial respetando la versión 9.1.3-1 http://www.postgresql.org).
Postresql 9.3.2-1
Postresql 9.5.0-1
Postresql 12.15-2

General: instalación de PostgreSQL

  • Después de descargar, ejecutar el instalador postgresql-9.1.3-1-windows.exe. Aparece esta pantalla y hacer click en Siguiente.

  • En esta próxima pantalla nos muestra el directorio donde se instala, dejamos el que propone por defecto.

  • En la próxima pantalla nos pide el directorio donde se instalarán los datos, dejamos el que propone por defecto.

  • En la próxima pantalla nos pide la password que va a tener en usuario que inicia el servicio de postgres y esta misma le asigna al super usuario de la base de datos. Tener en cuenta que si la pc ya tiene el usuario postgres creado, la password debe ser la misma.
    En definitiva: esta es una misma password para dos usuarios que se van a crear: ambos usuarios se llaman "postgres": uno es un usuario de windows (es un usuario sin privilegios que se va a crear y con cuyas credenciales va a correr el servicio postgres) y el otro es un usuario dentro del motor de base de datos (un rol de login): este otro usuario también es postgres y es superusuario dentro del motor de base de datos. Agendarse la clave que se establece acá para ambos usuarios, predeterminadamente cargar como clave el mismo nombre de usuario: "postgres".

  • En la próxima pantalla nos pide el puerto para el postgre, dejar el que propone por defecto, "5432".

  • En esta próxima pantalla nos pide la localización y seleccionamos "Spanish, Argentina".

  • En esta próxima pantalla iniciamos la instalación.

  • En esta pantalla muestra que finalizó la instalación. Destildamos el check de "Stack Builder" y hacemos click en "Terminar".

  • Editar el archivo: notepad "C:\Archivos de programa\PostgreSQL\9.1\data\pg_hba.conf" y agregar la siguiente linea:
    (para que la base de datos pueda ser accedida directamente desde el pgAdmin de un administrador ubicado en otro equipo -esto es para tareas de administración exclusivamente-)
    host    all         all         192.168.0.0/16          md5
    
  • Editar el archivo: notepad "C:\Archivos de programa\PostgreSQL\9.1\data\postgresql.conf" y modificar los siguientes puntos:
    listen_addresses = '*'
    datestyle = 'iso, dmy'
    log_destination = 'stderr'
    logging_collector = on
    statement_timeout=240000
    enable_seqscan=off 
    standard_conforming_strings = off
    escape_string_warning = off
    

Luego de estos cambios reiniciar el servicio para que PostgreSQL.

  • OPCIONAL: Por defecto no trae incluido el idioma español. Para esto descargar esta carpeta comprimida attachment:es_ES.rar y colocarla en "C:\Archivos de programa\PostgreSQL\9.1\pgAdmin III\i18n"
  • Cuando finalizo la instalación, desde el menú inicio ejecutamos el pgAmin III, nos va a salir una pantalla como la de abajo y hacemos doble click sobre el servidor que tenemos creado. Esto nos pide la password que ingresamos arriba.

  • Cambio de idioma de la interfaz: Para que pgadmin esté en español, Ir al menú File - Options y en la solapa general cambiar el idioma a "es_ES Spanish". (Los cambios se harán efectivos luego de salir y volver a entrar a PGAdmin III).

Específico: instalación de la base de datos de Regente

  • Crear roles de login adicionales: inicialmente el motor de base de datos se ha instalado con un rol de login (en adelante "usuario") llamado "postgres".
    Regente en su configuración predeterminada utiliza dos usuarios de la base de datos: "sistemas" (con clave sistemas) y "replicacion" (con clave replicacion) (el primero como superusuario, el segundo como un usuario común).
    Por ejemplo para el usuario "sistemas", hacer clic con el botón derecho del mouse en "roles de login" y elegir del menú contextual "nuevo rol de login". Completar la pantalla como en la figura y OK.

    De manera similar con el usuario replicacion (sólo que notar que hay menos cosas tildadas porque es un usuario común):

  • Restaurar una base de datos inicial de Regente. Hacer el backup en un momento que no se esté utilizando el sistema en la sucursal donde se está tomando el backup. Normalemte se toma el backup de la última sucursal instalada para que tenga la menor cantidad de instrucciones de replicación. Al recibir una copia en backup de la base de datos de regente, esta es la manera de instalarla:
    • Utilizando el pgAdminIII, conectarse a la base de datos local, clic con el botón derecho en "Bases de Datos" y elegir "Nueva Base de Datos...".

    • Crear la base de datos con los siguientes valores: nombre "regente" (puede ser cualquier nombre, pero la versión predeterminada trae configurado ese nombre para acceder), propietario "sistemas", codificado "SQL_ASCII", plantilla "template0".

  • Restaurar una base de datos inicial de Regente. Se debe disponer de archivo de backup de base de datos. La restauración se realiza en dos pasos, ambos pasos utilizando el mismo archivo de backup. En el primer paso se restaura la estructura y en el segundo se restauran los datos propiamente.

    • Restaurar base de datos Paso 1 de 2: Estructura. Clic con botón derecho en la base de datos "regente" y elegir "Restaurar...". En la primer solapa "Opciones de Archivo" en "Nombre del archivo" buscar el archivo de backup, por ejemplo "c:\soft\regente.backup". En la segunda solapa "Restaurar Opciones Nº1" tildar además las opciones "Sólo estructura" y "Propietario" y en la tercer solapa "Restaurar Opciones Nº2" dejar tildada la opción "Mensajes Explícitos". Finalmente "Restaurar". Si la estructura fue restaurada correctamente, se va a mostrar una leyenda informando que "El proceso retornó el código de salida 0".

    • Restaurar base de datos Paso 2 de 2: Datos. Clic con botón derecho en la base de datos "regente" y elegir Restaurar.... En la primer solapa "Opciones de Archivo" en "Nombre del archivo" buscar el archivo de backup, por ejemplo "c:\soft\regente.backup". En la segunda solapa "Restaurar Opciones Nº1". Tildar las opciones "Solo datos", "Propietario" y en la tercer solapa "Restaurar Opciones Nº2" tildar "Disparador" y dejar tildada la opción Mensajes Explícitos. Finalmente "Restaurar". Si los datos fueron restaurados correctamente, se va a mostrar una leyenda informando que "El proceso retornó el código de salida 0".

    • ALTER DATABASE nombre_basedatos SET statement_timeout=480000;
    • ALTER DATABASE nombre_basedatos SET enable_seqscan='off';
    • Comandos (en ventana cmd.exe) para restaurar una BD.
      • Solo Estructura, Sin Propietario y Mensajes:

      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"

      • Sólo Datos, Sin Propietario y Deshabilitar Disparador:

      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"

      • Sólo Datos, Sin Propietario, Deshabilitar Disparador y los schemas public, afip,cn,ensamble,service. Sería todos lo schemas menos replicación:
        • pg_restore.exe --host localhost --port 5432 --username sistemas --dbname regente --data-only --disable-triggers --verbose -n public -n afip -n ensamble -n netfe -n public -n service "archivo.dmp" 2> "C:\logs\restore_data.log"
  • 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.
    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.
    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.
    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:
    Solución para restaurar un backup con muchas instrucciones en replicación:
    (caso ejemplo con archivo de backup regente1.dmp y base de datos llamada demo2)
    • 1) Restaurar solo el esquema /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
    • 2) Borrar el schema replicación DROP SCHEMA replicacion CASCADE;
    • 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)
      --(tb. habria que quitar los checks: chk_existencia_especificar_lote en remitos_detalles y chk_numero_en_chequera en tabla valores).
      ALTER TABLE remitos_detalles DROP CONSTRAINT chk_existencia_especificar_lote;
      ALTER TABLE remitos_detalles DROP CONSTRAINT chk_existencia_especificar_lote_unitario;
      ALTER TABLE remitos_detalles DROP CONSTRAINT chk_lote_articulo_correcto;
      ALTER TABLE valores DROP CONSTRAINT chk_numero_en_chequera;
      --WMS
      ALTER TABLE wms.pallets_remitos DROP CONSTRAINT fk_pallets;
      ALTER TABLE wms.pallets_remitos DROP CONSTRAINT fk_remitos_detalles;
      ALTER TABLE wms.pallets_remitos DROP CONSTRAINT chk_cant_pallet_menor_cant_remito;
      
      --cuando da este error "pg_restore: [archiver] versión no soportada (1.13) en el encabezado del archivo"
      ALTER TABLE public.articulos_codbarras_adic DROP CONSTRAINT chk_articulos_cod_barra_adic_no_existe_en_articulos;
      ALTER TABLE public.articulos DROP CONSTRAINT chk_articulos_cod_barra_no_existe_en_codbarras_adic;
      ALTER TABLE public.articulos DROP CONSTRAINT chk_art_tiene_codbarras_adic;
      ALTER TABLE public.cd_rd DROP CONSTRAINT chk_relacionar_mismo_art;
      ALTER TABLE public.comp_cuotas DROP CONSTRAINT chk_pago_menor_total;
      ALTER TABLE public.comp_pagos DROP CONSTRAINT chk_pago_menor_total;
      ALTER TABLE public.ordenes_compra DROP CONSTRAINT chk_sujeto_relacionado_en_rem;
      ALTER TABLE public.ordenes_compra_det DROP CONSTRAINT chk_art_relacionado_en_rem;
      ALTER TABLE public.ordenes_compra_det DROP CONSTRAINT chk_cant_relacionada_coherente_ocd;
      ALTER TABLE public.remitos DROP CONSTRAINT chk_sujeto_relacionado_en_oc;
      ALTER TABLE public.remitos_detalles DROP CONSTRAINT chk_art_relacionado_en_oc;
      ALTER TABLE public.remitos_detalles DROP CONSTRAINT chk_cant_no_puede_ser_cero;
      ALTER TABLE public.remitos_detalles DROP CONSTRAINT chk_no_coincide_descr;
      ALTER TABLE public.remitos_recepciones DROP CONSTRAINT area_o_salida;
      ALTER TABLE public.remitos_recepciones DROP CONSTRAINT "chk_RECEPCION_CAMBIAR_FECHA";
      ALTER TABLE public.articulos_codbarras_adic DROP CONSTRAINT chk_art_tiene_codbarras;
      ALTER TABLE public.ocd_rd DROP CONSTRAINT chk_cant_relacionada_coherente;
      ALTER TABLE public.ocd_rd DROP CONSTRAINT chk_relacionar_mismo_art;
      ALTER TABLE public.ocd_rd DROP CONSTRAINT chk_relacionar_mismo_proveedor;
      
      
    • 4) Restaurar solo los datos
      /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
      ALTER DATABASE nombre_basedatos SET statement_timeout=480000;
      
    • 5) Volver a poner checks quitados:
      delete from remitos_detalles where id_lote IS NULL AND existencia_con_lote(id_articulo);
      ALTER TABLE remitos_detalles ADD CONSTRAINT chk_existencia_especificar_lote CHECK (NOT (id_lote IS NULL AND existencia_con_lote(id_articulo)));
      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)));
      ALTER TABLE remitos_detalles ADD CONSTRAINT chk_lote_articulo_correcto CHECK (id_lote IS NULL OR lote_articulo_correcto(id_lote, id_articulo));
      delete from valores where not valor_cheque_en_chequera(id_cuenta, nro, id_tipo_pago);
      ALTER TABLE valores ADD CONSTRAINT chk_numero_en_chequera CHECK (valor_cheque_en_chequera(id_cuenta, nro, id_tipo_pago));
      --WMS
      ALTER TABLE wms.pallets_remitos ADD CONSTRAINT fk_pallets FOREIGN KEY (id_pallet) REFERENCES wms.pallets (id_pallet) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE CASCADE;
      ALTER TABLE wms.pallets_remitos ADD CONSTRAINT fk_remitos_detalles FOREIGN KEY (id_remito, id_remito_det) REFERENCES public.remitos_detalles (id_remito, id_det) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION;
      ALTER TABLE wms.pallets_remitos ADD CONSTRAINT chk_cant_pallet_menor_cant_remito CHECK (wms.cant_pallet_menor_cant_remito(id_remito, id_remito_det) OR id_pallet <= 15291); -- ticket:3174. El criterio de id_pallet > 15291 es para evitar, en instalacion de agostini, el check de pallets anteriores ya que no respetan esta restriccion: en la version general de la base de datos no debe estar este criterio de pallet
      
      --chk agregados por este error "pg_restore: [archiver] versión no soportada (1.13) en el encabezado del archivo"
      
      ALTER TABLE public.articulos_codbarras_adic ADD CONSTRAINT chk_articulos_cod_barra_adic_no_existe_en_articulos CHECK (art_codbarras_no_existe_en_articulos(cod_barras));
      
      ALTER TABLE public.articulos ADD CONSTRAINT chk_art_tiene_codbarras_adic CHECK (NOT (cod_barras IS NULL AND art_tiene_codbarras_adic(id_articulo))) not valid;
      ALTER TABLE public.articulos ADD CONSTRAINT chk_articulos_cod_barra_no_existe_en_codbarras_adic CHECK (art_codbarras_no_existe_en_articulos_codbarras_adic(cod_barras)) not valid;
      ALTER TABLE public.cd_rd ADD CONSTRAINT chk_relacionar_mismo_art CHECK (art_en_remito(id_rem, id_rem_det) = art_en_comp(id_comp, id_comp_det)) not valid;
      ALTER TABLE public.comp_cuotas ADD CONSTRAINT chk_pago_menor_total CHECK (pago_menor_total(pago, total_cuota * comp_mon_cotiz_base(id_comp))) not valid;
      ALTER TABLE public.comp_pagos ADD CONSTRAINT chk_pago_menor_total CHECK (pago_menor_total(pago, monto * comp_mon_cotiz_base(id_comp))) not valid;
      ALTER TABLE public.ordenes_compra ADD CONSTRAINT chk_sujeto_relacionado_en_rem CHECK (COALESCE(prov_oc_en_rd(id_oc), 0) = 0 OR COALESCE(prov_oc_en_rd(id_oc), 0) = id_sujeto) not valid;
      ALTER TABLE public.ordenes_compra_det ADD CONSTRAINT chk_art_relacionado_en_rem CHECK (COALESCE(art_oc_en_rd(id_oc, id_det), 0) = 0 OR COALESCE(art_oc_en_rd(id_oc, id_det), 0) = id_articulo) not valid;
      ALTER TABLE public.ordenes_compra_det ADD CONSTRAINT chk_cant_relacionada_coherente_ocd CHECK (cant_ocd_rd_por_oc(id_oc, id_det) <= cant_ocd(id_oc, id_det)) not valid;
      ALTER TABLE public.remitos ADD CONSTRAINT chk_sujeto_relacionado_en_oc CHECK (COALESCE(prov_rd_en_oc(id_remito), 0) = 0 OR COALESCE(prov_rd_en_oc(id_remito), 0) = id_sujeto) not valid;
      ALTER TABLE public.remitos_detalles ADD CONSTRAINT chk_art_relacionado_en_oc CHECK (COALESCE(art_rd_en_oc(id_remito, id_det), 0) = 0 OR COALESCE(art_rd_en_oc(id_remito, id_det), 0) = id_articulo) not valid;
      ALTER TABLE public.remitos_detalles ADD CONSTRAINT chk_cant_no_puede_ser_cero CHECK (COALESCE(cant, 0::double precision) <> 0::double precision) not valid;
      COMMENT ON CONSTRAINT chk_cant_no_puede_ser_cero ON public.remitos_detalles IS 'Unicamente para esta instalacion en particular. Es que actualmente no hay nada que impida que haya una cant. cero en una linea de remito. De hecho se reserva esta posibilidad por si alguna vez se gestionan recetas por ejemplo y en una linea de remitos_detalles debe registrarse un art. padre con cant. cero';
      ALTER TABLE public.remitos_detalles ADD CONSTRAINT chk_no_coincide_descr CHECK (id_lote IS NULL OR coincidedescr(id_lote, lote)) not valid;
      ALTER TABLE public.remitos_recepciones ADD CONSTRAINT area_o_salida CHECK ((id_area_destino IS NULL OR id_salida IS NULL) AND NOT (id_area_destino IS NULL AND id_salida IS NULL)) not valid;
      ALTER TABLE public.remitos_recepciones ADD CONSTRAINT "chk_RECEPCION_CAMBIAR_FECHA" CHECK (rem_rec_cant(id_remito, id_recepcion, fecha) = 0) not valid;
      ALTER TABLE public.articulos_codbarras_adic ADD CONSTRAINT chk_art_tiene_codbarras CHECK (art_tiene_codbarras(id_articulo)) not valid;
      ALTER TABLE public.ocd_rd ADD CONSTRAINT chk_cant_relacionada_coherente CHECK (cant_ocd_rd_por_oc(id_oc, id_oc_det) <= cant_ocd(id_oc, id_oc_det) AND cant_ocd_rd_por_rd(id_rem, id_rem_det) <= cant_rd(id_rem, id_rem_det)) not valid;
      ALTER TABLE public.ocd_rd ADD CONSTRAINT chk_relacionar_mismo_art CHECK (art_en_remito(id_rem, id_rem_det) = art_en_oc(id_oc, id_oc_det)) not valid;
      ALTER TABLE public.ocd_rd ADD CONSTRAINT chk_relacionar_mismo_proveedor CHECK (prov_remito(id_rem) = prov_oc(id_oc)) not valid;
      
      
    • 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.

/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

  • 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í:
    • 7.1) Extraer las instrucciones de replicacion del archivo de backup: pg_restore -a -t rep_instrucciones regente1.dmp > /home/sistemas/backup/rep_instrucciones.txt
    • 7.2) Quedarse sólo con las instrucciones del día en que se hizo el backup y ordenarlas:
      cat /home/sistemas/backup/rep_instrucciones.txt | grep "2013-10-25 " > rep_instrucciones_20131025.txt
      sort rep_instrucciones_20131025.txt > rep_instrucciones_20131025_sorted.txt
      
    • 7.3) tomar la ultima instruccion que comience en 1 e insertar esa idu_rep_instruccion en replicacion.rep_instrucciones del nuevo server:
      mc -e rep_instrucciones_20131025_sorted.txt
      En este ejemplo:
      1: 4613012
      insert into replicacion.rep_instrucciones values (1,4613012,'restaurado hasta aca','2013-10-27',null,'sql');
      


Volver al manual de instalación de Regente en Windows

Attachments