Pregunta GIT como herramienta de respaldo


En un servidor, instale git

cd /
git init
git add .
git commit -a -m "Yes, this is server"

Entonces consigue /.git/ para apuntar a una unidad de red (SAN, NFS, Samba o cualquier otro disco). Utilice un trabajo cron cada hora / día, etc. para actualizar los cambios. El directorio .git contendría una copia versionada de todos los archivos del servidor (excluyendo los inútiles / complicados como / proc, / dev, etc.)

Para un servidor de desarrollo no importante donde no quiero la molestia / costo de configurarlo en un sistema de respaldo adecuado, y donde los respaldos serían solo por conveniencia (I.E. no lo hacemos). necesitar para hacer una copia de seguridad de este servidor, pero ahorraría algo de tiempo si las cosas salieran mal), ¿podría ser esta una solución de copia de seguridad válida o se caería en una gran cantidad de caca?


88
2017-12-15 12:10


origen


no brilla con una idea similar? - B14D3
@ B14D3 Creo que Sparkleshare es más una especie de cosa de tipo Dropbox, pero lo veré - Smudge
tienes razón, pero usar git para hacer algún tipo de cosa de buckup (copiar a varias PC y controlar versiones de archivos);) - B14D3
El gran problema con esto es que no hay un control central: necesita tener acceso directo (ssh) a la máquina para realizar cualquier forma de mantenimiento o validación de respaldo. Siempre encuentro la instalación de una aplicación en las casillas de las que se hace una copia de seguridad y luego administrarlas desde una ubicación central es una ganancia mucho mayor. - hafichuk
@hafichuk Con herramientas como Puppet / Chef no es un gran problema, pero veo su punto. - Smudge


Respuestas:


No eres una persona tonta. Utilizando git como mecanismo de respaldo puede ser atractivo, y a pesar de lo que otras personas han dicho, git Funciona bien con archivos binarios. Leer esta página del libro de Git para más información sobre este tema. Básicamente, desde git no está utilizando un mecanismo de almacenamiento delta, realmente no le importa qué sus archivos parecen (pero la utilidad de git diff es bastante bajo para archivos binarios con una configuración de valores).

El mayor problema con el uso git para copia de seguridad es que no conserva la mayoría de los metadatos del sistema de archivos. Específicamente, git no graba:

  • grupos de archivos
  • propietarios de archivos
  • permisos de archivo (aparte de "es este ejecutable")
  • atributos extendidos

Puede resolver esto escribiendo herramientas para registrar esta información explícitamente en su repositorio, pero puede ser difícil hacerlo bien.

Una búsqueda en Google para metadatos de copia de seguridad de git arroja una serie de resultados que parecen valer la pena leer (incluidas algunas herramientas que ya intentan compensar los problemas que he mencionado aquí).

etc controlador fue desarrollado para hacer copias de seguridad /etc y resuelve muchos de estos problemas.


78
2017-12-15 17:25



+1 por mencionar ACLs / permisos - Larry Silverman
Git tampoco almacena directorios vacíos. - Flimm
y también apesta para el seguimiento de archivos en movimiento / cambio de nombre, a través del historial. - cregox
Ya que git no trata muy bien con archivos binarios, es posible que también desee analizar anexo git, lo que ayuda a hacerlo mejor. Sin embargo, sí cambia la idea de qué es git. - Wouter Verhelst
Mi opinión es que puedes usar git para hacer copias de seguridad de los datos pero no para servidores completos. - EKanadily


No lo he usado, pero podrías mirar bup que es una herramienta de copia de seguridad basada en git.


20
2017-12-15 13:27



Nunca visto bup antes, parece interesante - Smudge
Comencé a usar bup recientemente, solo unos pocos días antes de que mi disco duro fallara;) ¡La restauración salió bien, así que se recomienda! - André Paramés
@ AndréParamés, entonces lo que dices es justo después de instalar bup, tu disco duro se estrelló ... mmmmhh ... :) es broma - hofnarwillie


Puede ser una solución de copia de seguridad válida, etc. El controlador se basa en esta idea. Pero vigila la .git permisos de directorio de lo contrario empujando /etc/shadow puede ser legible en el .git directorio.


12
2017-12-15 12:18





Si bien técnicamente se podía hacer esto, me gustaría ponerle dos advertencias:

1, está utilizando un sistema de control de versión de origen para datos binarios. Por lo tanto, lo estás utilizando para algo para lo que no fue diseñado.

2, me preocupa su proceso de desarrollo si no tiene un proceso (documentación o automatizado) para construir una nueva máquina. ¿Qué pasaría si te golpeaban comprando un autobús, quién sabría qué hacer y qué era importante?

La recuperación de desastres es importante, sin embargo, es mejor automatizar (programar) la configuración de una nueva caja de desarrollo que solo hacer una copia de seguridad de todo. Claro, use git para su script / documentación pero no para todos los archivos en una computadora.


11
2017-12-15 13:45



Todos los cuadros de desarrollo provienen de archivos KickStart, y en realidad el cuadro promedio dura aproximadamente 2 o 3 meses antes de que se reconstruya. Pero la gente cambia las configuraciones y hace cosas, nosotros reconstruimos las cajas y la gente dice "hey, sé que no lo puse en control de la fuente, pero tuve algo de mierda en esa caja" y me río de ellos por ser estúpido. A su alrededor, buenos tiempos. Los datos binarios serían una perra, es algo que pasé por alto totalmente mientras estaba en la ducha. - Smudge
Aplaudo su actitud hacia aquellos que no siguen los principios básicos. Personalmente, tengo una situación similar a la tuya, sin embargo tengo un repositorio git que enlaza todos los archivos de configuración que pueden ser importantes en lugar de atraparlos todos. Además de un documento de texto con los pasos de configuración. - Phil Hannent
Creo que git funciona bastante bien para archivos binarios, la parte masiva del repositorio de Google Android son repositorios git de ejecutables precompilados. - user377178


Utilizo git como respaldo para mi sistema Windows, y ha sido increíblemente útil. En la parte inferior de la publicación, muestro los scripts que uso para configurar en un sistema Windows. Usar git como respaldo para cualquier sistema proporciona 2 grandes ventajas:

  1. A diferencia de las soluciones comerciales que a menudo usan su propio formato propietario, su copia de seguridad está en un formato de código abierto que es ampliamente compatible y está muy bien documentado. Esto le da control total de sus datos. Es muy fácil ver qué archivos han cambiado y cuándo. Si quieres truncar tu historial, puedes hacerlo también. ¿Quieres borrar algo de tu historia? No hay problema. Recuperar una versión de su archivo es tan simple como cualquier comando git.
  2. Tantas o menos réplicas que desee, y todas pueden tener tiempos de respaldo personalizados. Obtendrá su espejo local, que está cargado de tráfico lento de Internet y, por lo tanto, le brinda (1) la capacidad de realizar copias de seguridad más frecuentes a lo largo del día y (2) un tiempo de restauración rápido. (Las copias de seguridad frecuentes son una gran ventaja, porque me parece que la mayoría del tiempo que pierdo un documento es por error del usuario. Por ejemplo, su hijo sobrescribe accidentalmente un documento en el que ha estado trabajando durante las últimas 5 horas). duplicación remota, que ofrece la ventaja de la protección de datos en caso de un desastre local o robo. ¿Y suponga que desea que su espejo remoto se respalde en un tiempo personalizado para guardar su ancho de banda de Internet? No hay problema.

En pocas palabras: una copia de seguridad de git le da una cantidad increíble de poder para controlar cómo se realizan las copias de seguridad.

Configuré esto en mi sistema de Windows. El primer paso es crear el repositorio git local en el que comprometerás todos tus datos locales. Recomiendo usar un segundo disco duro local, pero usar el mismo disco duro funcionará (pero se espera que lo empuje en algún lugar remoto, o de lo contrario se atornille si el disco duro muere).

Primero deberás instalar cygwin (con rsync), y también instalar git para Windows: http://git-scm.com/download/win

A continuación, crea tu repositorio git local (solo ejecuta una vez):

init-repo.bat:

@echo off
REM SCRIPT PURPOSE: CREATE YOUR LOCAL GIT-REPO (RUN ONLY ONCE)

REM Set where the git repository will be stored
SET GBKUP_LOCAL_MIRROR_HOME=E:\backup\mirror


REM Create the backup git repo. 
SET GIT_PARAMS=--git-dir=%GBKUP_LOCAL_MIRROR_HOME%\.git --work-tree=%GBKUP_LOCAL_MIRROR_HOME% 
mkdir %GBKUP_LOCAL_MIRROR_HOME%
git %GIT_PARAMS% init
git %GIT_PARAMS% config core.autocrlf false
git %GIT_PARAMS% config core.ignorecase false 
git %GIT_PARAMS% config core.fileMode false
git %GIT_PARAMS% config user.email backup@yourComputerName
git %GIT_PARAMS% config user.name backup

REM add a remote to the git repo.  Make sure you have set myRemoteServer in ~/.ssh/config   
REM The path on the remote server will vary.  Our remote server is a Windows machine running cygwin+ssh.  
REM For better security, you could install gitolite on the remote server, and forbid any non-fast-forward merges, and thus stop a malicious user from overwriting your backups.
git %GIT_PARAMS% remote add origin myRemoteServer:/cygdrive/c/backup/yourComputerName.git

REM treat all files as binary; so you don't have to worry about autocrlf changing your line endings
SET ATTRIBUTES_FILE=%GBKUP_LOCAL_MIRROR_HOME%\.git\info\attributes
echo.>> %ATTRIBUTES_FILE% 
echo *.gbkuptest text>> %ATTRIBUTES_FILE% 
echo * binary>> %ATTRIBUTES_FILE% 
REM compression is often a waste of time with binary files
echo * -delta>> %ATTRIBUTES_FILE% 
REM You may need to get rid of windows new lines. We use cygwin's tool
C:\cygwin64\bin\dos2unix %ATTRIBUTES_FILE%

A continuación, tenemos nuestro contenedor de script de copia de seguridad, que será llamado regularmente por el Programador de Windows:

gbackup.vbs:

' A simple vbs wrapper to run your bat file in the background
Set oShell = CreateObject ("Wscript.Shell") 
Dim strArgs
strArgs = "cmd /c C:\opt\gbackup\gbackup.bat"
oShell.Run strArgs, 0, false

A continuación, tenemos el script de copia de seguridad que el contenedor llama:

gbackup.bat:

    @echo off

REM Set where the git repository will be stored
SET GBKUP_LOCAL_MIRROR_HOME=E:\backup\mirror
REM the user which runs the scheduler
SET GBKUP_RUN_AS_USER=yourWindowsUserName
REM exclude file
SET GBKUP_EXCLUDE_FILE=/cygdrive/c/opt/gbackup/exclude-from.txt

SET GBKUP_TMP_GIT_DIR_NAME=git-renamed
for /f "delims=" %%i in ('C:\cygwin64\bin\cygpath %GBKUP_LOCAL_MIRROR_HOME%') do set GBKUP_LOCAL_MIRROR_CYGWIN=%%i

REM rename any .git directories as they were (see below command)
for /r %GBKUP_LOCAL_MIRROR_HOME% %%i in (%GBKUP_TMP_GIT_DIR_NAME%) do ren "%%i" ".git" 2> nul

SET RSYNC_CMD_BASE=C:\cygwin64\bin\rsync -ahv --progress --delete --exclude-from %GBKUP_EXCLUDE_FILE%

REM rsync all needed directories to local mirror
%RSYNC_CMD_BASE% /cygdrive/c/dev %GBKUP_LOCAL_MIRROR_CYGWIN%
%RSYNC_CMD_BASE% /cygdrive/c/Users/asmith %GBKUP_LOCAL_MIRROR_CYGWIN%
%RSYNC_CMD_BASE% /cygdrive/c/Users/bsmith %GBKUP_LOCAL_MIRROR_CYGWIN%

cacls %GBKUP_LOCAL_MIRROR_HOME% /t /e /p  %GBKUP_RUN_AS_USER%:f

REM rename any .git directories as git will ignore the entire directory, except the main one
for /r %GBKUP_LOCAL_MIRROR_HOME% %%i in (.git) do ren "%%i" "%GBKUP_TMP_GIT_DIR_NAME%" 2> nul
ren %GBKUP_LOCAL_MIRROR_HOME%\%GBKUP_TMP_GIT_DIR_NAME% .git

REM finally commit to git
SET GIT_PARAMS=--git-dir=%GBKUP_LOCAL_MIRROR_HOME%\.git --work-tree=%GBKUP_LOCAL_MIRROR_HOME% 
SET BKUP_LOG_FILE=%TMP%\git-backup.log
SET TO_LOG=1^>^> %BKUP_LOG_FILE% 2^>^&1
echo ===========================BACKUP START=========================== %TO_LOG%
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b)
For /f "tokens=1-2 delims=/:" %%a in ('time /t') do (set mytime=%%a%%b)
echo %mydate%_%mytime% %TO_LOG%
echo updating git index, committing, and then pushing to remote %TO_LOG%
REM Caution: The --ignore-errors directive tells git to continue even if it can't access a file.
git %GIT_PARAMS% add -Av --ignore-errors %TO_LOG%
git %GIT_PARAMS% commit -m "backup" %TO_LOG%
git %GIT_PARAMS% push -vv --progress origin master %TO_LOG%
echo ===========================BACKUP END=========================== %TO_LOG%

Tenemos el archivo exclude-from.txt, donde ponemos todos los archivos a ignorar:

exclude-from.txt:

target/
logs/
AppData/
Downloads/
trash/
temp/
.idea/
.m2/
.IntelliJIdea14/
OLD/
Searches/
Videos/
NTUSER.DAT*
ntuser.dat*

Tendrá que ir a cualquier repositorio remoto y hacer un 'git init --bare' en ellos. Puede probar el script ejecutando el script de copia de seguridad. Suponiendo que todo funcione, vaya al Programador de Windows y apunte una copia de seguridad por hora hacia el archivo vbs. Después de eso, tendrás un historial de git de tu computadora por cada hora. Es extremadamente conveniente: ¿todos borran accidentalmente una sección de texto y se la pierden? Solo revisa tu repositorio git.


6
2018-03-21 17:10



Solo curiosidad: ¿funcionará también para unidades de red lentas o no estándar, como las emuladas por NetDrive o Expandrive? Encuentro que la mayoría del software de respaldo falla con estas unidades de red. Además, las cosas se vuelven muy lentas y tienden a agotarse, si quiero enumerar todos los archivos en la copia de seguridad y extraer archivos individuales. ¿Git es capaz de resolver estos problemas? - JustAMartin
@JustAMartin Nunca lo he probado en unidades de red, así que no puedo decirlo. Una vez que obtiene los archivos en un repositorio de git, git es muy eficiente. - user64141


Bueno, no es una mala idea, pero creo que hay dos banderas rojas que deben levantarse:

  • Si falla el disco duro, perderá todo si no está empujando su confirmación a otro servidor / unidad. (Evento si tienes un plan para ello, prefiero mencionarlo).

... pero aún así, puede ser una buena copia de seguridad para cosas relacionadas con la corrupción. O como dijiste, si la carpeta .git / está en otro lugar.

  • Esta copia de seguridad siempre aumentará de tamaño. No hay poda ni rotación ni nada por defecto.

... Por lo tanto, es posible que tenga que decirle a su cronjob que agregue etiquetas, y luego asegurarse de que se limpien las confirmaciones que no están etiquetadas.


4
2017-12-15 13:40



Probablemente montaríamos el directorio .git en un servidor remoto, aunque el clásico rm -Rf / Nos causaría algunos problemas. Nuestro sistema de copia de seguridad actual mantiene las cosas durante 2 años o 50 versiones (lo que ocurra primero), por lo que nuestra copia de seguridad aumenta constantemente de todos modos. Pero me gusta la idea de agregar etiquetas, podríamos tener etiquetas "diarias", "semanales", etc. - Smudge
+1 para requisitos de espacio cada vez mayores - hafichuk
@sam git está creciendo. Usted no puede podar la historia más antigua que N años. Supongo que tu sistema actual lo hace. - rds
Con respecto al aumento de tamaño, haga 'git gc' regularmente o antes de enviar a otro servidor (central). Sin esto, el repositorio de git puede crecer (mucho) más de lo que debería. Una vez tuve un repositorio de git de 346 MB que puede reducirse a 16 MB. - Hendy Irawan


No lo he probado con un sistema completo, pero lo uso para mis copias de seguridad de MySQL (con la opción --skip-extended-insert) y realmente me ha funcionado bien.

Se encontrará con un problema con los archivos de datos binarios (su contenido completo podría cambiar y lo hará) y es posible que tenga problemas con la .git carpeta realmente grande Yo recomendaría establecer una .gitignore y solo realice copias de seguridad de los archivos de texto que realmente sepa que necesita.


3
2017-12-15 13:23



También lo estoy usando para las copias de seguridad de MySQL, con --extended-insert = false. Asegúrese de "git gc" regularmente o inmediatamente después de confirmar. - Hendy Irawan
Ver ¿Es una buena idea hacer una copia de seguridad de una base de datos MySQL en Git? - Michael Hampton♦


Una vez desarrollé una solución de respaldo basada en subversión. Si bien funcionó bastante bien (y git debería funcionar aún mejor), creo que hay mejores soluciones aquí.

Yo considero rsnapshot ser uno de los mejores - si no la mejor. Con un buen uso del enlace duro, tengo un servidor de archivos de 300 GB (con medio millón de archivos) con copias de seguridad diarias, semanales y mensuales que se remontan hasta un año. El espacio total en disco utilizado es solo una copia completa + la parte incremental de cada copia de seguridad, pero gracias a los enlaces duros tengo una completar Estructura de directorios "en vivo" en cada una de las copias de seguridad. En otras palabras, los archivos son directamente accesibles no solo en daily.0 (la copia de seguridad más reciente), sino también en daily.1 (yestarday) o en weekly.2 (hace dos semanas), y así sucesivamente.

Al compartir la carpeta de copia de seguridad con Samba, mis usuarios pueden extraer el archivo de las copias de seguridad simplemente apuntando su PC al servidor de copia de seguridad.

Otra muy buena opción es rdiff-backup, pero como me gusta tener archivos siempre accesibles simplemente con el nombre de Explorer a \\ servername, rsnapshot fue la mejor solución para mí.


3
2018-03-21 20:01



La última versión de rdiff-backup es de 2009. ¿Está extremadamente bien diseñada y no requiere ninguna actualización o es simplemente un proyecto abandonado? - Mateusz Konieczny
No sé si se ha mantenido, pero está básicamente "hecho". - shodanshok
De mirar savannah.nongnu.org/bugs/… Parece que hubo alguna actividad hasta 2015, pero se ignoran muchos informes de errores. Creo que lo clasificaré como un abandonado. - Mateusz Konieczny


Tuve la misma idea de hacer copias de seguridad con git, básicamente porque permite copias de seguridad versionadas. Y luego vi rdiff-backup, que proporciona esa funcionalidad (y mucho más). Tiene una interfaz de usuario muy agradable (mire las opciones de CLI). Estoy muy contento con eso. los --remove-older-than 2W es muy bueno Le permite simplemente eliminar versiones anteriores a 2 semanas. rdiff-backup Solo almacena diferentes archivos.


2
2017-12-15 18:07