Переименование базы данных
В декабре 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` потеряет доступ к таблицам из новой базы.
ну вообще использовать точки в имени базы данных это мего глупая идея :).