Дек 03

logo_mysql_sun_aНедавно возникла небольшая проблема с бэкапом базы MySQL, с огромными таблицами, которые лочились при mysqldump (это необходимо, дабы сохранить целостность резервной копии)

В голову пришло следующие решение, которое возможно если база размещена на LVM:
следующее происходит без останова БД:
1. Создаётся снэпшот ФС с базами MySQL (чтобы бэкапить неизменяемые данные . Это ключевой момент )
2. Монтируем этот снэпшот
3. Тарим все директории с базами
4. Размонтируем и удаляем снэпшот

Потом забираем архивы любым удобным для вас средством и удаляем

Скрипт ниже

#!/bin/bash
PATH='/usr/sbin:/bin:/usr/bin'
 
VG='/dev/vg0'
MYSQL_FS="${VG}/fs_mysql"
SNAPSHOT_MOUNT_POINT='/mnt/snapshot'
SNAP_SIZE='1024m'
DATE=$(date +%Y-%m-%d)
BKP_DIR="/backup/mysql_backups/$DATE"
SNAP_NAME="mysql_snapshot-${DATE}"
 
if (!(lvcreate -s -n $SNAP_NAME -L $SNAP_SIZE $MYSQL_FS )); then
        exit 1
else
        if(!(mount -o ro,noatime ${VG}/${SNAP_NAME} ${SNAPSHOT_MOUNT_POINT})); then
            exit 1
        fi
        mkdir $BKP_DIR
        ( cd ${SNAPSHOT_MOUNT_POINT};
        for DB in $(find . -type d -user mysql| egrep -v "^\.$|lost\+found"|sed 's/\.\///'); do
                tar czf $BKP_DIR/$DB.tar.gz $DB
                echo "OK: $BKP_DIR/$DB.tar.gz"
        done
        )
        umount $SNAPSHOT_MOUNT_POINT
        lvremove -f ${VG}/${SNAP_NAME}
        chown -R mysql:mysql $BKP_DIR
fi

Оставить комментарий

preload preload preload