Deutsch
Germany.ruФорумы → Архив Досок→ Linux & Co

Простой автобекап базы mysql

329  
alexnaum местный житель24.06.09 14:58
alexnaum
24.06.09 14:58 
В общем, решил настроить регулярный бекап по расписанию удаленной бд средствами mysql, так как заметил, что сторонние программы очень ненадежны - то там то тут ошибки...
Задача такая:
Находясь в линукс - или freebsd - локальной машине, необходимо подключиться по ssh, соединиться с хостом удаленной базы - бд и сайт на разных хостах - после чего выполнить mysqldump и затем полученный дамп скопировать себе в папку. Нужно, чтобы все это дело последовательно обрабатывалось простым скриптом и было записано в крон - в принципе, все основное таким именно простейшим в одну строчку скриптом сделал, вышло где то так:
В ответ на:
#!/bin/sh
BACKUPFILE=.home/user/dumps/db_`date +%H:%M_%d%m%y`.sql.gz
ssh user@mysite.com 'mysqldump -u dbuser -ppassword db_mydb -h dbhost | gzip' > ${BACKUPFILE}

Ну вот, в принципе, прописал в кроне и все работает. Имена специально хочу делать с датой и временем, и вот почему.
Единственное, что не могу понять. Надо, чтобы этих дампов не собиралось там очень уж много.Ну скажем, я делаю бекап регулярно, каждый час. Нафига мне там 24 штуки в сутки чтобы хранились и копились? Надо добавить, чтобы скрипт выполнял проверку на число файлов в директории, и если их там больше скажем 3-х, все старые удалял, оставляя только 3 последних, по времени создания или по именам файлов,в которых как раз продублировано время создания.
если кто подскажет, буду признателен.
http://alexander-naumov.com
#1 
gendy Dinosaur24.06.09 16:44
gendy
NEW 24.06.09 16:44 
в ответ alexnaum 24.06.09 14:58
ls -t -1 или ls -t -1 -r если получится в обратном порядке. результат проходишь foreach , оставляя в "живых" первых трёх

Человека карают только те боги, в которых он верит

#2 
alexnaum местный житель24.06.09 21:18
alexnaum
NEW 24.06.09 21:18 
в ответ gendy 24.06.09 16:44, Последний раз изменено 24.06.09 21:37 (alexnaum)
вот щас подумал, получается такая штука.
каждый новый дамп будет не больше и не меньше, а только и всегда червертым, если я хочу оставлять скажем три файла, то мне надо удалять всегда один - старейший, ну, или, по логике, имеющий наименьший размер.
т.е. если таким образом по циклу проходить, то rm первый либо последний..либо проверку на размер файла..что то мне кажется, можно и еще проще...
http://alexander-naumov.com
#3 
gendy Dinosaur25.06.09 13:55
gendy
NEW 25.06.09 13:55 
в ответ alexnaum 24.06.09 21:18, Последний раз изменено 25.06.09 13:56 (gendy)
#bin/sh
ls -t -1 > /temp/fl
i=0
while read fn ; do
i=$(($i + 1))
if (i -gt 2) ;then
rm -f fn
fi
done < fl
rm -f fl
за безошибочность не ручаюсь

Человека карают только те боги, в которых он верит

#4 
alexnaum местный житель25.06.09 18:51
alexnaum
NEW 25.06.09 18:51 
в ответ gendy 25.06.09 13:55
спасибо, на основе твоего кода и с помощью еще одного линуксоида пришел к вот такой строчке:
В ответ на:
a=$(ls -ltr /home/user/dumps|wc -l);rm `ls -rt1 /home/user/dumps|head -$(($a-4))`

Правда, заметил и тут один момент:в моем конкретном случае это не важно, но в плане универсальности, на всякий случай, не удаляются файлы, если в имени есть пробелы.
ну там возможны варианты..вот еще человек предложил - еще проще, через опции find -
В ответ на:
date +%y%m%d_%H%M>>/home/user/dumps/remove.log
find /home/user/dumps/ -type f -mmin +300 -delete 2>>/home/user/dumps/remove.log

тут просто все, что старше стольки то минут удаляется..Тоже можно, но если машина по каким то причинам будет выключена какое то время, то при следующем включении и запуске скрипта, который будет автоматом, будут удалены все файлы, так как все они будут старше стольки то часов. A какой то резерв на всякий случай нужен.
Ну в любом случае, все гут.
http://alexander-naumov.com
#5 
gendy Dinosaur26.06.09 10:42
gendy
NEW 26.06.09 10:42 
в ответ alexnaum 25.06.09 18:51
В ответ на:
a=$(ls -ltr /home/user/dumps|wc -l);rm `ls -rt1 /home/user/dumps|head -$(($a-4))`

как же я про head забыл.
В ответ на:
на всякий случай, не удаляются файлы, если в имени есть пробелы.
лечится это так rm -f "\"ls -rt1 /home/user/dumps|head -$(($a-4))\""
т.е. имя файла загоняешь в кавычки, чтобы rm видел его целиком, а не отрезал после пробела опять же за правильность строки не ручаюсь,
я бы сначала в первой строке сформировал строку с именем в кавычках, а во второй скормил её команде
В ответ на:
тут просто все, что старше стольки то минут удаляется..Тоже можно, но если машина по каким то причинам будет выключена какое то время, то при следующем включении и запуске скрипта, который будет автоматом, будут удалены все файлы, так как все они будут старше стольки то часов. A какой то резерв на всякий случай нужен.
Ну в любом случае, все гут.

зачем лезть через форточку, удаляешь самые старые файлы и всё

Человека карают только те боги, в которых он верит

#6