Резервное копирование mysql баз данных, имеет важное значение, для жизни и будущего развития сайта, так как от утери данных и поломок серверов никто не застрахован. Если делать копирование бд ночью, то можно сойти с ума. А что же делать если проект высоко посещаемый и копирование БД необходимо делать каждый час? Да, на сервер напряжно, а что поделаешь.
Первоначально, я делал резервное копирование с помощью: mysqldump dbname > weekdayHour.dbname.sql каждый час. За каждую неделю мы обновляли старые копии бд, автоматически меняя их на новые. В конце концов, мы добавили количество хранимых процедур с триггерами для смешивания и все это превратилось в свалку. Так что мы начали использовать параметр mysqldump –R, который по словам mysqldump справочника делает следующее:
Создает дамп хранимых процедур и функций из баз данных.
Недавно, с увеличением трафика, мы начали замечать, что наш сервер находится под большой нагрузкой. Мы быстро обнаружили, что при работе mysqldump каждый час, наш сервер очень сильно тормозил. Я полез в справочник mysqldump снова, что-бы найти решение. И спасибо команде разработчиков программы mysqldump, я нашел решение своей проблемы, что-бы сделать дамп баз данных более быстрым. На данный момент я использую это: mysqldump -R -q –single-transaction > weekdayHour.dbname.sql. Кажется все нормализовалось, снизилась нагрузка на сервер и нет ошибки подключения к mysql. Важное замечание, если вы хотите использовать mysqldump в качестве реализации резервного копирования баз данных, прочтите сначала справочник. (ссылку подавал выше). И если вы еще не знаете что такое mysqldump и для чего его используют, то читаем статью о mysqldump.
Еще одно! После нашего резервного копирования, нам необходимо скопировать файлы бэкапа в случае падения сервера. Для этого я использовал ncftp пакет, который включает в себя ncftpput утилиты, для работы с командной строкой. Вот примерный сценарий , комментарии можете удалить:
#!/bin/bash # DATE=`date '+%u%H'` # this sets up weekly rotation of backup files BACKUP_DIR="/admin/backups/domain.com/" # this dir will be created if it doesn't exist HOST=`hostname` #you may want to hard code this if you hostname returns wrong information mkdir ${BACKUP_DIR}mysql/ -p /usr/local/mysql/bin/mysqldump -R -q --single-transaction --databases dbname1 dbname2 -ppassword > ${BACKUP_DIR}mysql/$HOST$DATE.sql rm ${BACKUP_DIR}mysql/$HOST$DATE.sql.gz > /dev/null 2>&1 gzip -9 ${BACKUP_DIR}mysql/$HOST$DATE.sql > /dev/null 2>&1 /usr/bin/ncftpput -R -f ${BACKUP_DIR}hostinfo / ${BACKUP_DIR}mysql/$HOST$DATE.sql.gz
Файл hostinfo при этом должен содержать:
host 123.123.123.123 user loginname pass loginpassword