Respaldo y recuperación completo de GitLab con Postgresql

1 minute read

GitLab and Posgresql


GitLab tiene como la posibilidad de usar Postgresql como su motor de base de datos (a parte de MySQL) y todo viene ya listo para incluso hacer respaldos de su base de datos y sus repositorios Git haciendo uso de un script Ruby (un rake).  Esta es la forma recomendada ya que permite recuperar todo garantizando que no hay transacciones pendientes a nivel de base de datos ni de repositorios Git.

El  problema

En la documentación explican el detalle de cómo hacer un respaldo y restauración  manual, pero al momento de hacer la restauración esta falla porque al intentar insertar registros existentes estos generan conflictos como este:

ALTER SEQUENCE
psql:/home/git/gitlab/tmp/backups/db/database.sql:812: ERROR: relation "users" already exists

La solución

Se debe forzar el respaldo de pogresql para que primero borre las tablas para luego crearlas e insertar los registros en la restauración. Esto se consigue con la opción –clean o -c  de la orden pg_dump. Esta opción se debe editar en script ruby que realiza el respaldo, que por omisión es /home/git/gitlab/lib/backup/database.rb. En este archivo se debe ubicar esta porción del código y sustituir la línea en negrilla mostrada a continuación:

require 'yaml'

 module Backup
 class Database
 attr_reader :config, :db_dir
def initialize
 @config = YAML.load_file(File.join(Rails.root,'config','database.yml'))[Rails.env]
 @db_dir = File.join(Gitlab.config.backup.path, 'db')
 FileUtils.mkdir_p(@db_dir) unless Dir.exists?(@db_dir)
 end
def dump
 success = case config["adapter"]
 when /^mysql/ then
 print "Dumping MySQL database #{config['database']} ... "
 system('mysqldump', *mysql_args, config['database'], out: db_file_name)
 when "postgresql" then
 print "Dumping PostgreSQL database #{config['database']} ... "
 pg_env
 <strong>system('pg_dump', config['database'], out: db_file_name)</strong>
 end
 report_success(success)
 end

Esta línea debe sustituirse por esta otra:

<strong>system('pg_dump', config['database'], '-c', out: db_file_name)</strong>

Aquí puede verse que la opción -c es pasada como argumento a la orden pg_dump. Esto hará que se incluyan todos los DROPS necesarios en el archivo .sql generado para el respaldo de GitLab.

Leave a Comment