Дек 03
Недавно возникла небольшая проблема с бэкапом базы 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