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 tar
el paquete, el esquema de diseño es el siguiente:
"Programa de copia de seguridad de datos de usuario"
1. Con bash shell
el desarrollo de un script de copia de seguridad de datos
2. Directorio de copia de seguridad de datos en el nuevo dcp/backup
caso
3. Todos los archivos deben tener una copia de seguridad del paquete es tar
el 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:00
copia de seguridad diaria de los nuevos datos generados ayer -
Clase semanal: los lunes
00:00
toda la cantidad total de copias de seguridad de datos
5. Eliminar regla:
-
Un día
00:00
antes de eliminar la copia de seguridad de datos a nivel de día de siete días -
Los lunes
00:00
elimine los datos de respaldo del nivel de la semana pasada
6. Ejecución cronometrada:
- Úselo
crontab
para 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: date
Comando
Dado que uso Mac para el desarrollo, encontré algunos errores al procesar el tiempo. date
El 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: tar
ruta 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 P
parámetros, recuerde poner f
antes los parámetros
tar cvzPf 2020_04-08_all.tar.gz /data/dcp/www/files/
Pit 3: tar
especifique 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 -C
pará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: find
y tar
con 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 find
el 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
find
Y tar
con 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 -exec
comando
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 f
parámetros como
find /data/dcp/www/files -type f -mtime 0 | xargs tar cvzf 2020_04-08.tar.gz
Cuelgue cinco: find
y tar
después de la descompresión del directorio especificado
Use find
el 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 find
y tar
desempaquetar 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, crontab
agregue 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