Адміністрування → Відновлення бази даних MySQL, з stored procedure/view/function

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

Ліричний відступ

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

Ближче до теми

Протягом останніх днів, окрім роботи, активно програмлю давно обіцяний фінансовий проект для Клубу «Velo-Stalker» (по завершенні, напишу про це невелику замітку). Оскільки до системи управління версіями я ніяк не прийду, проект переміщується між робочим та домашнім компом на флешці, у вигляді архіву 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) все зайве вирізається.

Здавалося б, така примітивна дія, а зайняла не погану кількість часу на допит гугла та пошук рішення. Якщо комусь відоме альтернативне вирішення проблеми, й воно є адекватнішим — буду радий прочитати в коментарях.

18.03.2011 22:14 Автор: Strange_V Хіти: 719

Коментарів 2
  • Vasya_F

    Фінансовий проект для Клубу «Velo-Stalker» дуже потрібна річ, як і сам сайт цього клубу, за який велика подяка Strange_V.
    В програмуванні не дуже розбираюся, але справді буває, що робиш складні речі навіть не задумуючись, а попадеться щось просте і тратиш на нього купу часу, проте такі штуки стимулюють розвиток майстерності і професіоналізму.

  • Strange_V

    Спасибі =))
    Фінансовий проект уже фактично завершений, сьогодні – завтра викладу й зроблю доступ.

Напишіть відгук