Czasami, w trakcie prac administracyjnych, pojawia się taka konieczność zmiany nazwy tabeli czy bazy danych. W jaki sposób można to zrobić w przypadku MySQL?
Jeśli chodzi o zmianę nazwy tabeli sprawa jest łatwa:

RENAME TABLE tabela1 TO tabela2;

Czy można zmienić w podobny sposób nazwę bazy danych?

Do pewnego stopnia, tak. Jest na to kilka sposobów.

Jeśli wszystkie tabele w danej bazie są tabelami działającymi na silniku MyISAM, można wyłączyć serwer (o ile oczywiście jest to wykonalne – trudno wyłączać krytyczną, produkcyjną bazę danych) i po prostu zmienić nazwę katalogu danej bazy na inny. Po ponownym uruchomieniu MySQL zobaczy nową bazę danych. W przypadku InnoDB oczywiście taka operacja w grę nie wchodzi, jako że InnoDB trzyma własne dane o tym jakie tabele w jakich bazach danych się znajdują. Dane te są przechowywane we współdzielonym tablespace i nie da się ich ot tak wyedytować.

Drugą opcją jest po prostu zdumpowanie starej bazy danych, utworzenie nowej i wgranie tam zawartości zrzutu.

Trzecie rozwiązanie to wykorzystanie polecenia RENAME TABLE aby przenieść tabele pomiędzy bazami danych. W praktyce wyglądałoby to na przykład w ten sposób:

mysql> SHOW TABLES FROM baza1;
+-----------------+
| Tables_in_baza1 |
+-----------------+
| tabela1         |
| tabela2         |
+-----------------+
2 rows in set (0,00 sec)

mysql> CREATE DATABASE baza2;
Query OK, 1 row affected (0,00 sec)

mysql> RENAME TABLE baza1.tabela1 TO baza2.tabela1, baza1.tabela2 TO baza2.tabela2;
Query OK, 0 rows affected (0,00 sec)

mysql> SHOW TABLES FROM baza1;
Empty set (0,00 sec)

mysql> SHOW TABLES FROM baza2;
+-----------------+
| Tables_in_baza2 |
+-----------------+
| tabela1         |
| tabela2         |
+-----------------+
2 rows in set (0,00 sec)

mysql> DROP DATABASE baza1;
Query OK, 0 rows affected (0,00 sec)

Oczywiście, powyższe to przeniesienie tylko dwóch tabeli. Gdyby było ich więcej, trzeba by rozbudować polecenie RENAME TABLE o kolejne pozycje. Nie jest to wygodne, ale można to rozwiązać na inne sposoby. W szczególności można opakować tego typu polecenie w skrypt shellowy i np. wyciągnąć z information_schema nazwy wszystkich tabel, które znajdują się w źródłowej bazie danych:

mysql> SELECT table_name FROM information_schema.tables WHERE table_schema='baza1';
+------------+
| table_name |
+------------+
| tabela1    |
| tabela2    |
+------------+
2 rows in set (0,00 sec)

a następnie wykonać pętlę typu:

FOR tabela IN lista_wszystkich ; DO rename table ...

Na szczęście, raz że tego typu operacje nie zdarzają się na co dzień, dwa że tego typu skrypt nie jest jakimś poważnym problemem i wyzwaniem do napisania. Nie zmienia to faktu, że do wygody postgresowego

ALTER DATABASE baza1 RENAME TO baza2;

trochę brakuje.

Tak w ramach ciekawostki, w MySQL w wersjach 5.1.7 – 5.1.23 znajdowało się polecenie RENAME DATABASE, ale w praktyce okazało się, że zdarza mu się skutkować utratą danych i z tego względu ta opcja została usunięta z MySQL. Gdyby któryś z czytelników posiadał taką starą wersję MySQL, to jeśli tylko szanuje swoje dane, lepiej żeby nie korzystał z tego „udogodnienia”.