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:
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:
+-----------------+
| 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:
+------------+
| table_name |
+------------+
| tabela1 |
| tabela2 |
+------------+
2 rows in set (0,00 sec)
a następnie wykonać pętlę typu:
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
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”.
Komentarze