Diseño, desarrollo y rastreo del "plan de copia de seguridad de los datos del usuario"

Recientemente, la empresa tiene que hacer una copia de seguridad de los datos, que son generados por los usuarios, que son básicamente archivos e imágenes. Para hacer una copia de seguridad de los datos empaquetados en tarel paquete, el esquema de diseño es el siguiente:

"Programa de copia de seguridad de datos de usuario"
1. Con bash shellel desarrollo de un script de copia de seguridad de datos
2. Directorio de copia de seguridad de datos en el nuevo dcp/backupcaso
3. Todos los archivos deben tener una copia de seguridad del paquete es tarel nombre del paquete hasta los nombres de fecha, como:2020-04-07.tar.gz 2020-04-07_all.tar.gz
4. Reglas de respaldo:
  • Nivel de día: 00:00copia de seguridad diaria de los nuevos datos generados ayer

  • Clase semanal: los lunes 00:00toda la cantidad total de copias de seguridad de datos

5. Eliminar regla:
  • Un día 00:00antes de eliminar la copia de seguridad de datos a nivel de día de siete días

  • Los lunes 00:00elimine los datos de respaldo del nivel de la semana pasada

6. Ejecución cronometrada:
  • Úselo crontabpara realizar tareas regulares

Una vez diseñado el esquema, se puede desarrollar. Sin embargo, se encontraron muchos hoyos pequeños durante el proceso de desarrollo.

Pozo 1: dateComando

Dado que uso Mac para el desarrollo, encontré algunos errores al procesar el tiempo. dateEl parámetro utilizado al sumar y restar tiempo es -d, pero se informa de un error en Mac. Esto se debe a que el parámetro se convierte en-v

Materiales de referencia:
https://blog.csdn.net/weixin_37696997
https://www.cnblogs.com/alsodzy/p/8403870.html
https://blog.csdn.net/guddqs/article/details/80745464

Para ser compatible con las distribuciones de Mac y Linux, necesitamos determinar cuál es el sistema actual

#!/bin/bash

if [[ `uname -a` =~ "Darwin" ]]
then
    echo "Mac"

elif [[ `uname -a` =~ "centos" ]]
then
    echo "Centos"

elif [[ `uname -a` =~ "ubuntu" ]]
then
    echo "Ubuntu"

else
    echo "Other"
fi

~ Es para juzgar si la expresión regular en el lado derecho coincide, la salida 1 coincidente no coincide con la salida 0

Pozo dos: tarruta absoluta del paquete

El envasado de alquitrán se lleva a cabo bajo una ruta relativa.

tar cvzf 2020_04-08_all.tar.gz files/

Pero escribimos el script para que la ruta sea correcta, use rutas absolutas de uso regular, a veces se quejará si el uso directo, necesita agregar Pparámetros, recuerde poner fantes los parámetros

tar cvzPf 2020_04-08_all.tar.gz /data/dcp/www/files/
Pit 3: tarespecifique el directorio descomprimido

Si las rutas absolutas de uso directo empaquetadas, desempaquetadas dentro del paquete son del directorio raíz del principio, si desea que el directorio principal del archivo especificado deberá agregar -Cparámetros para especificar un directorio, entonces el directorio especificado después de la descompresión esfiles

tar cvzPf 2020_04-08_all.tar.gz -C /data/dcp/www files
Hoyo cuatro: findy tarcon el uso de

En el tiempo de empaque, y a veces no todos los datos deberían ser, esta vez por la necesidad de filtrar la parte de datos del paquete, filtrada para encontrarla con findel comando

Formato de comando de búsqueda y explicación detallada del comando de búsqueda

buscar Buscar archivos por hora de modificación del archivo

findY tarcon el uso de muchos formularios, con especial referencia al siguiente enlace

Cómo encontrar archivos tar en una bola de alquitrán

Aquí usamos el comando de canalización más común

find /data/dcp/www/files -mtime 0 | xargs tar cvzf 2020_04-08.tar.gz

O usa el -execcomando

find /data/dcp/www/files -mtime 0 -exec tar cvzf 2020_04-08.tar.gz {} +
Pit 4: Redundancia de datos

El comando anterior parece no ser un problema, pero se vuelve a empaquetar en datos redundantes cuando se empaqueta.

La razón es que el directorio también es información de tiempo, siempre que el directorio de archivos, si desea ignorarlo, solo necesita agregar -type fparámetros como

find /data/dcp/www/files -type f -mtime 0 | xargs tar cvzf 2020_04-08.tar.gz
Cuelgue cinco: findy tardespués de la descompresión del directorio especificado

Use findel comando, se necesitan empaquetaduras, pero el formato del comando cambiará, para especificar el directorio, tenemos que trabajar, para decirlo de otra manera

cd /data/dcp/www
find files -mtime 0 | xargs tar cvzf 2020_04-08.tar.gz

Para que pueda especificar findy tardesempaquetar el directorio

Finalmente, libere el código fuente de la copia de seguridad de los datos del usuario:

#!/bin/bash

# today
dt=`date +"%Y-%m-%d"`

# src and dest file path
src="/data/dcp/www"
dest="/data/dcp/backup"

day() {
	find ${dest} -type f -name ${last_week}.tar.gz | xargs rm -rf
	cd $src
	find files -type f -mtime 0 | xargs tar cvzf ${dest}/${yesterday}.tar.gz 
}

week() {
	find ${dest} -type f -name ${last_week}_all.tar.gz | xargs rm -rf
	cd $src
	tar cvzf ${dest}/${dt}_all.tar.gz files/
}

# Judge Mac or Linux 
if [[ `uname -a` =~ "Darwin" ]]
then
	yesterday=`date -v -1d +"%Y-%m-%d"`
	last_week=`date -v -1w +"%Y-%m-%d"`
else
	yesterday=`date -d '-1 day' +%Y-%m-%d`
	last_week=`date -d '-1 week' +%Y-%m-%d`
fi

# day or week type
if [ "$1" = "day" ]
then
	day
elif [ "$1" = "week" ]
then
	week
else
	echo "--------- *Please input task type* ----------"
	echo "bash $0 day [OR] bash $0 week"
fi

Finalmente, crontabagregue una tarea programada

0 0 * * * bash /data/dcp/script/dcp_user_data_backup.sh day
0 0 * * 1 bash /data/dcp/script/dcp_user_data_backup.sh week

Supongo que te gusta

Origin blog.csdn.net/yilovexing/article/details/105388262
Recomendado
Clasificación