Вход на сайт
Простой автобекап базы mysql
329
24.06.09 14:58
В общем, решил настроить регулярный бекап по расписанию удаленной бд средствами mysql, так как заметил, что сторонние программы очень ненадежны - то там то тут ошибки...
Задача такая:
Находясь в линукс - или freebsd - локальной машине, необходимо подключиться по ssh, соединиться с хостом удаленной базы - бд и сайт на разных хостах - после чего выполнить mysqldump и затем полученный дамп скопировать себе в папку. Нужно, чтобы все это дело последовательно обрабатывалось простым скриптом и было записано в крон - в принципе, все основное таким именно простейшим в одну строчку скриптом сделал, вышло где то так:
Ну вот, в принципе, прописал в кроне и все работает. Имена специально хочу делать с датой и временем, и вот почему.
Единственное, что не могу понять. Надо, чтобы этих дампов не собиралось там очень уж много.Ну скажем, я делаю бекап регулярно, каждый час. Нафига мне там 24 штуки в сутки чтобы хранились и копились? Надо добавить, чтобы скрипт выполнял проверку на число файлов в директории, и если их там больше скажем 3-х, все старые удалял, оставляя только 3 последних, по времени создания или по именам файлов,в которых как раз продублировано время создания.
если кто подскажет, буду признателен.
Задача такая:
Находясь в линукс - или 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}
#!/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 последних, по времени создания или по именам файлов,в которых как раз продублировано время создания.
если кто подскажет, буду признателен.
NEW 24.06.09 21:18
вот щас подумал, получается такая штука.
каждый новый дамп будет не больше и не меньше, а только и всегда червертым, если я хочу оставлять скажем три файла, то мне надо удалять всегда один - старейший, ну, или, по логике, имеющий наименьший размер.
т.е. если таким образом по циклу проходить, то rm первый либо последний..либо проверку на размер файла..что то мне кажется, можно и еще проще...
каждый новый дамп будет не больше и не меньше, а только и всегда червертым, если я хочу оставлять скажем три файла, то мне надо удалять всегда один - старейший, ну, или, по логике, имеющий наименьший размер.
т.е. если таким образом по циклу проходить, то rm первый либо последний..либо проверку на размер файла..что то мне кажется, можно и еще проще...
NEW 25.06.09 13:55
#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
за безошибочность не ручаюсь
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
за безошибочность не ручаюсь
Фашизм будет разбит
Человека карают только те боги, в которых он верит
NEW 25.06.09 18:51
в ответ gendy 25.06.09 13:55
спасибо, на основе твоего кода и с помощью еще одного линуксоида пришел к вот такой строчке:
Правда, заметил и тут один момент:в моем конкретном случае это не важно, но в плане универсальности, на всякий случай, не удаляются файлы, если в имени есть пробелы.
ну там возможны варианты..вот еще человек предложил - еще проще, через опции find -
тут просто все, что старше стольки то минут удаляется..Тоже можно, но если машина по каким то причинам будет выключена какое то время, то при следующем включении и запуске скрипта, который будет автоматом, будут удалены все файлы, так как все они будут старше стольки то часов. A какой то резерв на всякий случай нужен.
Ну в любом случае, все гут.
В ответ на:
a=$(ls -ltr /home/user/dumps|wc -l);rm `ls -rt1 /home/user/dumps|head -$(($a-4))`
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
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 какой то резерв на всякий случай нужен.
Ну в любом случае, все гут.
NEW 26.06.09 10:42
как же я про head забыл.
т.е. имя файла загоняешь в кавычки, чтобы rm видел его целиком, а не отрезал после пробела опять же за правильность строки не ручаюсь,
я бы сначала в первой строке сформировал строку с именем в кавычках, а во второй скормил её команде
зачем лезть через форточку, удаляешь самые старые файлы и всё
в ответ alexnaum 25.06.09 18:51
В ответ на:
a=$(ls -ltr /home/user/dumps|wc -l);rm `ls -rt1 /home/user/dumps|head -$(($a-4))`
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 какой то резерв на всякий случай нужен.
Ну в любом случае, все гут.
тут просто все, что старше стольки то минут удаляется..Тоже можно, но если машина по каким то причинам будет выключена какое то время, то при следующем включении и запуске скрипта, который будет автоматом, будут удалены все файлы, так как все они будут старше стольки то часов. A какой то резерв на всякий случай нужен.
Ну в любом случае, все гут.
зачем лезть через форточку, удаляешь самые старые файлы и всё
Фашизм будет разбит
Человека карают только те боги, в которых он верит