Восстановление базы данных

Восстановление базы данных MySQL, с stored procedure / view / function

Довольно давно работаю с базами данных MySQL, делаю бэкапы, восстанавливаю или просто переношу данные с сервера на сервер. Не ожидал, что в таком привычном и простом процессе можно наступить на грабли, но оказывается можно, и эти грабли — восстановление stored procedure, view или function, о чем пойдет речь далее.

Лирическое отступление

Четыре месяца не писал в блог, не было времени, желания, потребности, не о чем, было лень .. в разное время — выбрал разные причины. Зато Vasya_F добавил несколько заметок, за что ему спасибо.

Ближе к теме

В последние дни, кроме работы, активно програмлю давно обещанный финансовый проект для одной фирмы, которая оформляет подарки для женщин через интернет. Поскольку в системы управления версиями я никак не приду, проект перемещается между рабочим и домашним компом на флешке, в виде архива php файлов и дампа базы.

Сегодня меня окончательно достало вручную распаковывать архивы, заменять старые файлы, прописывать права и восстанавливать БД. Немного размышлений, и за несколько минут родился новый велосипед — скрипт на python, что автоматизирует весь процесс бэкапа. База дампится с помощью mysqldump, файлы — просто сжимаются в архив, все добро кладется в каталог на флешке, с именем в формате % Y.% m.% D_% H-% M-% S.

Как ни странно, проблемы начались, когда решил сделанную копию восстановить =). С MySQL у нас состоялся такой диалог:

/ Usr / bin / mysql — host = db_host — user = db_user — password = db_pass db_name </ tmp / dump.sql

ERROR 1227 (42000) at line 256: Access denied; you need the SUPER privilege for this operation

Немного был ошарашен от того, что мне нужны супер привилегии, чтобы просто восстановить базу, пошел искать, где зарыта собака.

Конечно она зарыта в 256 строке, где в частности есть такое: / *! 50020 DEFINER = `db_user` @ `localhost` * /, это информация о пользователе, который создал stored procedure, view или function. В данном случае, только он может восстановить (создать) данную процедуру, что мне совершенно не подходит.

Поскольку нет возможности заставить mysqldump забыть о DEFINER, нашел самое для себя решение — вырезать все упоминания с дампа базы.

Выглядит это так (ОС linux):

/ Usr / bin / mysqldump options | sed-e ‘s / DEFINER = [^ *] * \ * / \ * /’> dump.sql

Так, как на работе у меня windows, которой нет sed (точнее sed можно поставить, но это немного извращение), то там делается обычный дамп, а уже при импорте (под linux) все лишнее вырезается.

Казалось бы, такое примитивное действие, а заняло не плохое количество времени на допрос гугла и поиск решения.

 Strange V