Переименование базы данных

3rd Декабрь 2012 | Категории: MySQL, Сервер | Метки: ,

В декабре 2011 года я перевел все свои сайты с shared-хостинга на свой VPS сервер. В процессе настройки всей системы я сделал большую ошибку. В названия баз данных MySQL я добавил точки, чтобы название домена совпадало с именем БД. То есть для домена tarlyun.com база называлась tarlyun.com.

Проблемы начались, когда я захотел переделать резервное копирование на использование mysqlhotcopy. Утилита просто не находила базу данных, хотя я перепробовал разные форматы команд.

mysqlhotcopy tarlyun.com -uuser -ppass
mysqlhotcopy 'tarlyun.com' -uuser -ppass
mysqlhotcopy tarlyun@002ecom -uuser -ppass

Немного теории. MySQL при создании базы данных создает каталог с именем базы (в документации не рекомендуется использовать спец символы, но кто её читает?). После выполнения запроса

CREATE DATABASE 'tarlyun.com';

MySQL создаст каталог /var/lib/mysql/tarlyun@002ecom.

Скорее всего, из-за несовпадения имен базы и каталога прекращалась работа mysqlhotcopy. Я не стал ждать момента, когда мне аукнется моя оплошность, просто решил переименовать базу данных.

На самом деле я ожидал простого запроса ALTER DATABASE или чего-то в этом духе. Но реальность, как всегда, оказалась жестокой.

Оказывается, можно было использовать конструкцию:

RENAME DATABASE db_name TO new_db_name;

Но она иногда убивала таблицы. Поэтому в MySQL 5.1.23 эту функцию просто удалили. И всё. Других средств для переименования не обнаружено.

Вспомнил, что в phpMyAdmin был интерфейс для переименования БД. Проверил его на тестовой базе:

DROP DATABASE db_name;
CREATE DATABASE new_db_name;

Поясню. PhpMyAdmin просто удалил базу данных и все таблицы. А потом создал пустую с новым именем. Вот такое вот переименование.

Так как у меня используются только MyISAM таблицы, то доступно простое решение. Можно просто переименовать каталог базы данных.
Внимание! Не забываем про бэкапы!

service mysqld stop
cd /var/lib/mysql/
mv tarlyun\@002ecom/ tarlyuncom
service mysqld start

На все операции ушло менее одной минуты.

Стоит отметить, что если вы используете InnoDB таблицы то для вас есть только одно решение:
— Останавливаем MySQL
— Делаем дамп с помощью mysqldump
— Создаем новую базу данных
— Загружаем в новую базу данные из дампа
— Запускаем MySQL

PS. Не забываем про привилегии пользователей. Если вы задали права похожим образом:

GRANT ALL PRIVILEGES ON `tarlyun.com`.* TO `tarlyun.com`@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;

То после переименования пользователь `tarlyun.com` потеряет доступ к таблицам из новой базы.

Subscribe without commenting


  1. 4th Январь 2013 в 18:27

    ну вообще использовать точки в имени базы данных это мего глупая идея :).