Jak szybko zmienić nazwę bazy danych MySQL (zmienić nazwę schematu)?

959

Podręcznik MySQL w MySQL obejmuje to.

Zwykle po prostu zrzucam bazę danych i ponownie importuję ją pod nową nazwą. To nie jest opcja w przypadku bardzo dużych baz danych. Najwyraźniej RENAME {DATABASE | SCHEMA} db_name TO new_db_name; robi złe rzeczy, istnieje tylko w kilku wersjach i ogólnie jest złym pomysłem .

To musi współpracować z InnoDB , który przechowuje rzeczy zupełnie inaczej niż MyISAM .

Csaba
źródło
3
Również na serverfault: serverfault.com/questions/195221/how-to-rename-a-mysql-database
Yves Martin
5
To oświadczenie RENAME DATABASE Składnia została dodana w MySQL 5.1.7, ale została uznana za niebezpieczną i została usunięta w MySQL 5.1.23.
zloctb
11
Mam nadzieję, że MySQL wdroży nową, działającą RENAME DATABASEinstrukcję, która nie ma żadnych zagrożeń, ponieważ obecnie nie ma łatwego sposobu na wykonanie tego zadania. Nie ma oczywistego powodu, dla którego było to niebezpieczne w dokumentacji, więc powinni być w stanie dokonać wymiany. Przynajmniej ludzie umieścili błędy w żądaniach funkcji na swojej stronie. Na przykład bugs.mysql.com/bug.php?id=58593 i bugs.mysql.com/bug.php?id=1698 .
Edward
linki są teraz zepsute ...
oldboy

Odpowiedzi:

833

W przypadku InnoDB wydaje się, że działają: utwórz nową pustą bazę danych, a następnie zmień nazwę każdej tabeli kolejno na nową bazę danych:

RENAME TABLE old_db.table TO new_db.table;

Następnie musisz dostosować uprawnienia.

Do pisania skryptów w powłoce możesz użyć jednej z następujących opcji:

mysql -u username -ppassword old_db -sNe 'show tables' | while read table; \ 
    do mysql -u username -ppassword -sNe "rename table old_db.$table to new_db.$table"; done

LUB

for table in `mysql -u root -ppassword -s -N -e "use old_db;show tables from old_db;"`; do mysql -u root -ppassword -s -N -e "use old_db;rename table old_db.$table to new_db.$table;"; done;

Uwagi:

  • Pomiędzy opcją -pa hasłem nie ma spacji . Jeśli baza danych nie ma hasła, usuń -u username -ppasswordczęść.
  • Jeśli jakaś tabela ma wyzwalacz, nie można go przenieść do innej bazy danych przy użyciu powyższej metody (spowoduje Trigger in wrong schemabłąd). W takim przypadku użyj tradycyjnego sposobu sklonowania bazy danych, a następnie upuść starą:

    mysqldump old_db | mysql new_db

  • Jeśli masz procedury składowane, możesz je później skopiować:

    mysqldump -R old_db | mysql new_db

Benoit Duffez
źródło
26
Właśnie to zrobiłem z bazą danych InnoDB z ponad 30 tabelami, używając ustawienia file_per_table, i chociaż niektóre tabele miały ponad 3 miliony wierszy, zakończyło się to w <1 sekundę. Wydaje się, że po prostu przenosi pliki do magazynu, zamiast robić coś bardziej skomplikowanego ... +2, jeśli to możliwe :)
Dave Rix,
87
„Zmieniono nazwę bazy danych jako niebezpieczną i usunięto ją z MySQL 5.1.23” - z dev.mysql.com/doc/refman/5.1/en/rename-database.html
Palani
13
Pamiętaj, że to nie zadziała w przypadku widoków. Nie można zmieniać nazw widoków, aby przeskakiwać z bazy danych do innej. Użyj DROP VIEWi CREATE VIEWzamiast. Niezdarny tak. Możesz chcieć zrobić a, mysqldumpaby przenieść widoki, po uprzednim przeniesieniu wszystkich tabel. Pamiętaj też, że SHOW TABLESpokażą tabele ORAZ widoki, więc uważaj.
tuomassalo
9
To również nie zadziała dla żadnych tabel z wyzwalaczami. Musisz znaleźć, zrzucić i upuścić wyzwalacze przed przeniesieniem tabeli, a następnie zaimportować zrzucone wyzwalacze do docelowej bazy danych.
Olfan
5
Zaktualizowany (tzn. Działający) link dokumentujący, dlaczego RENAME DATABASEzostał usunięty: dev.mysql.com/worklog/task/?id=4030
Alexis
443

Użyj kilku prostych poleceń:

mysqldump -u username -p -v olddatabase > olddbdump.sql
mysqladmin -u username -p create newdatabase
mysql -u username -p newdatabase < olddbdump.sql

Lub w celu zmniejszenia liczby operacji we / wy skorzystaj z poniższych wskazówek sugerowanych przez @Pablo Marin-Garcia:

mysqladmin -u username -p create newdatabase
mysqldump -u username -v olddatabase -p | mysql -u username -p -D newdatabase
hendrasaputra
źródło
86
Jak powiedział PO, „nie jest to opcja dla bardzo dużych baz danych”.
pilcrow
3
Nie zapomnij DROP oryginalnej bazy danych
Pavel Radzivilovsky
3
Genialna odpowiedź! Kilka sugestii do dalszej poprawy, ponieważ prawdopodobnie są one wyszukiwane przez wszystkie umiejętności: (1) Przenieś fragment kodu Pablo Marin-Garcii na górę, ponieważ wydaje się to najlepszą odpowiedzią (2) Umieść -p<password>zamiast -pwszędzie, aby instrukcje były wyświetlane bez monitu .
Steve Chambers
9
Korzystając z wersji potokowej, otrzymuję dwa monity „Wprowadź hasło:” w ten sposób: Enter password: Enter password: Wydaje się, że wymaga jednego hasła, ale nie obu. Czy brakuje mi jakiegoś szczegółu?
Ryan
33
Dziwię się, że nikt o tym nie wspominał, ale naprawdę powinieneś również dodać --routinesflagę do poleceń mysqldump, aby mieć pewność, że procedury przechowywane są kopiowane.
Carlos P
205

Myślę, że rozwiązanie jest prostsze i zostało zasugerowane przez niektórych programistów. phpMyAdmin ma do tego operację.

W phpMyAdmin wybierz bazę danych, którą chcesz wybrać. Na kartach jest jedna o nazwie Operacje, przejdź do sekcji zmiany nazwy. To wszystko.

Jak wielu sugeruje, tworzy nową bazę danych o nowej nazwie, zrzuca wszystkie tabele starej bazy danych do nowej bazy danych i upuszcza starą bazę danych.

Wpisz opis zdjęcia tutaj

raphie
źródło
76
Zakładając, że masz nawet php w swoim środowisku lub użyj phpmyadmin.
Chris
26
Całkiem niebezpieczne, nawet jeśli masz phpMyAdmin - zaplecze może zawieść w połowie procesu, pozostawiając dwa dbs w nieznanym stanie lub może to zająć bardzo dużo czasu, prowadząc do zawieszenia się frontonu lub przekroczenia limitu czasu PHP.
mozboz
20
To prawda @mozboz, ale robiłem to od 10 lat i nigdy nie miałem tego problemu. To samo, jeśli uruchamiasz polecenie przez powłokę i komputer ulega awarii. Istnieje możliwość, ale co? 1 do 1 biliarda?
raphie
24
Skrypt za pośrednictwem konsoli jest również interfejsem, który może zawiesić się z tymi samymi problemami.
Greg
11
Jednak operacje konsoli są znacznie bardziej niezawodne niż PhpMyAdmin, szczególnie tam, gdzie są zaangażowane duże bazy danych, co jest przypadkiem PO. Osobiście zdecydowanie zaleciłbym dowolną metodę konsoli zamiast PMA, jeśli masz dość dużą bazę danych. Nie trzeba dodawać, że w małych bazach danych PMA jest równie dobry.
Teodor Sandu,
107

Za pomocą SQL można wygenerować skrypt SQL, aby przenieść każdą tabelę w źródłowej bazie danych do docelowej bazy danych.

Musisz utworzyć docelową bazę danych przed uruchomieniem skryptu wygenerowanego z polecenia.

Możesz użyć jednego z tych dwóch skryptów (pierwotnie zasugerowałem ten pierwszy i ktoś „poprawił” moją odpowiedź GROUP_CONCAT. Wybierz, ale wolę oryginał):

SELECT CONCAT('RENAME TABLE $1.', table_name, ' TO $2.', table_name, '; ')
FROM information_schema.TABLES 
WHERE table_schema='$1';

lub

SELECT GROUP_CONCAT('RENAME TABLE $1.', table_name, ' TO $2.', table_name SEPARATOR '; ')
FROM information_schema.TABLES 
WHERE table_schema='$1';

(1 USD i 2 USD to odpowiednio źródło i cel)

To wygeneruje polecenie SQL, które będziesz musiał następnie uruchomić.

Należy pamiętać, że GROUP_CONCATma domyślny limit długości, który może zostać przekroczony w przypadku baz danych z dużą liczbą tabel. Możesz zmienić ten limit, uruchamiając SET SESSION group_concat_max_len = 100000000;(lub inną dużą liczbę).

ErichBSchulz
źródło
@BlakeFrederick Nie używa RENAME DATABASE, więc w czym problem?
tuxayo,
Czy to działa, jeśli tabela ma ograniczenia referencyjne? Nie oczekuję.
dolmen
42

Emulowanie brakującego RENAME DATABASEpolecenia w MySQL:

  1. Utwórz nową bazę danych
  2. Utwórz zapytania o zmianę nazwy za pomocą:

    SELECT CONCAT('RENAME TABLE ',table_schema,'.',table_name,
        ' TO ','new_schema.',table_name,';')
    FROM information_schema.TABLES
    WHERE table_schema LIKE 'old_schema';
  3. Uruchom to wyjście

  4. Usuń starą bazę danych

Został zaczerpnięty z Emulowanie brakującej komendy RENAME DATABASE w MySQL .

Marciano
źródło
1
Doskonały! Testowałem to z tabelami InnoDB i MyISAM. Najszybsze rozwiązanie, które przetestowałem (zmiana nazwy tabeli jest prawie natychmiastowa, bez opóźnienia)!
Philipp
Świetny! Pamiętaj tylko, aby później naprawić uprawnienia.
Adam Faryna
ps. Lepiej zrób to przed uruchomieniem zapytań o zmianę nazwy, jeśli pracujesz na bazie danych na żywo.
Adam Faryna
Czy to działa, jeśli tabela ma ograniczenia referencyjne? Nie oczekuję.
dolmen
24

Trzy opcje:

  1. Utwórz nową bazę danych, wyłącz serwer, przenieś pliki z jednego folderu bazy danych do drugiego i zrestartuj serwer. Pamiętaj, że zadziała to tylko wtedy, gdy WSZYSTKIE stoły to MyISAM.

  2. Utwórz nową bazę danych, użyj instrukcji CREATE TABLE ... LIKE, a następnie użyj instrukcji INSERT ... SELECT * FROM.

  3. Użyj mysqldump i przeładuj z tym plikiem.

długiej szyi
źródło
+ dla odniesienia do myisam. Nie mogłem zrozumieć, dlaczego to nie zadziałało.
Christian Payne
5
Pytanie mówi, że to musi działać dla InnoDB, a nie MyISAM
D-Rock
@ D-Rock powiedz to Google, który sprowadza ludzi na podstawie tytułu.
jiggunjer
24

Prosty sposób

Przejdź do katalogu bazy danych:

cd /var/lib/mysql/

Zamknij MySQL ... To ważne!

/etc/init.d/mysql stop

Okej, ten sposób nie działa dla baz danych InnoDB ani BDB.

Zmień nazwę bazy danych:

mv old-name new-name

... lub stół ...

cd database/

mv old-name.frm new-name.frm

mv old-name.MYD new-name.MYD

mv old-name.MYI new-name.MYI

Uruchom ponownie MySQL

/etc/init.d/mysql start

Gotowy...

OK, ten sposób nie działa z bazami danych InnoDB lub BDB. W takim przypadku musisz zrzucić bazę danych i ponownie ją zaimportować.

DeeCee
źródło
16
Zmiana nazw folderów powoduje uszkodzenie zabawek.
ViniciusPires
1
@Rahly, nawet jeśli ustawiony jest jeden plik na tabelę, nadal jest niebezpieczny, tabele utworzone przed ustawieniem jednego pliku na tabelę będą miały kłopoty, chyba że wiadomo na pewno, że baza danych została utworzona po ustawieniu tej flagi.
Qian Chen,
Ogólnie rzecz biorąc, większość ludzi będzie miała swoje systemy tak czy inaczej, ludzie nie będą losowo przerzucać, czy mają jedną tabelę na plik. Poza tym, nawet w twoim scenariuszu, gdyby tabele zostały utworzone przed flagą, nie byłyby one przede wszystkim jako osobne pliki, więc ruch nie działałby, a jego bezpieczeństwo jest nadal bezpieczne, bez niebezpieczeństwa. Pamiętaj, że baza danych NIE działa podczas przenoszenia.
Rahly,
Odpowiednik mysql zainstalowanego z homebrew na OS X:launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist cd /usr/local/var/mysql mv old-name new-name launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
coberlin,
22

Możesz użyć tego skryptu powłoki:

Odniesienie: Jak zmienić nazwę bazy danych MySQL?

#!/bin/bash
set -e # terminate execution on command failure

mysqlconn="mysql -u root -proot"
olddb=$1
newdb=$2
$mysqlconn -e "CREATE DATABASE $newdb"
params=$($mysqlconn -N -e "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES \
                           WHERE table_schema='$olddb'")
for name in $params; do
      $mysqlconn -e "RENAME TABLE $olddb.$name to $newdb.$name";
done;
$mysqlconn -e "DROP DATABASE $olddb"

To działa:

$ sh rename_database.sh oldname newname
Grijesh Chauhan
źródło
6
Ostrożnie z tym. Jeśli nie logujesz się z użytkownikiem root, możesz mieć ograniczone uprawnienia. Powodowanie niepowodzenia zmiany nazwy, ale upuszczenie zakończyło się powodzeniem, co spowodowało usunięcie bazy danych. W przeciwnym razie fajny skrypt.
Lex,
3
Dodałem set -ena początku skryptu, co spowoduje zakończenie wykonywania po awarii i powinno złagodzić ten problem.
Mikkel,
19

Dopiero niedawno natknąłem się na bardzo fajny sposób, współpracuje z MyISAM i InnoDB i jest bardzo szybki:

RENAME TABLE old_db.table TO new_db.table;

Nie pamiętam, gdzie to przeczytałem, ale uznanie należy się komuś innemu, nie mnie.

Amr Mostafa
źródło
@ArkadijKuzhel nie sądzę. Myślę, że mówisz o RENAME DATABASE.
Rob Grant,
To naprawdę pomogło, utworzyłem nową pustą bazę danych, a następnie użyłem kodu, wszystkie tabele zostały zaimportowane z pożądanymi nazwami.
Zwyczajny
3
Występuje ten sam problem, co w przypadku zaakceptowanej odpowiedzi - „ZNAJDŹ BAZY DANYCH uznano za niebezpieczną i została usunięta w MySQL 5.1.23” - z dev.mysql.com/doc/refman/5.1/en/rename-database.html
Blake Frederick,
16

Najprostszy wypunktowany i głupi sposób na wykonanie pełnej zmiany nazwy (w tym usunięcie starej bazy danych na końcu, aby była to zmiana nazwy zamiast kopii) :

mysqladmin -uroot -pmypassword create newdbname
mysqldump -uroot -pmypassword --routines olddbname | mysql -uroot -pmypassword newdbname
mysqladmin -uroot -pmypassword drop olddbname

Kroki:

  1. Skopiuj linie do Notatnika.
  2. Zamień wszystkie odniesienia do „olddbname”, „newdbname”, „mypassword” (+ opcjonalnie „root”) na ich odpowiedniki.
  3. Wykonaj jeden po drugim w wierszu poleceń (po wyświetleniu monitu wpisz „y”).
Steve Chambers
źródło
Unikaj dodawania hasła do konsoli, ponieważ nie jest bezpieczne. Jeśli już to zrobiłeś, użyj historii -cw, aby usunąć. Zamiast tego pozostaw hasło puste i wprowadź je po monicie.
Tommie C.,
Zajmuje to niezwykle długo, ponad 20 minut, nie kończąc. Czy można anulować?
Sigu Magwa,
15

Oto, czego używam:

$ mysqldump -u root -p olddb >~/olddb.sql
$ mysql -u root -p
mysql> create database newdb;
mysql> use newdb
mysql> source ~/olddb.sql
mysql> drop database olddb;
eaykin
źródło
14
Niewykonalne w przypadku dużych baz danych.
mikesl,
14

MySQL nie obsługuje obecnie zmiany nazwy bazy danych poprzez interfejs poleceń, ale możesz zmienić nazwę bazy danych, jeśli masz dostęp do katalogu, w którym MySQL przechowuje swoje bazy danych. W przypadku domyślnych instalacji MySQL zwykle znajduje się w katalogu Data w katalogu, w którym został zainstalowany MySQL. Znajdź nazwę bazy danych, której nazwę chcesz zmienić, w katalogu Data i zmień nazwę. Zmiana nazwy katalogu może jednak powodować pewne problemy z uprawnieniami. Być świadomym.

Uwaga: musisz zatrzymać MySQL, zanim będziesz mógł zmienić nazwę bazy danych

Poleciłbym utworzyć nową bazę danych (używając żądanej nazwy) i wyeksportować / zaimportować potrzebne dane ze starej do nowej. Dość proste.

bryanpearson
źródło
13

Gdy zmienisz nazwę bazy danych w PHPMyAdmin, tworzy zrzut, a następnie upuszcza i ponownie tworzy bazę danych o nowej nazwie.

UnkwnTech
źródło
4
Pamiętaj, że ta funkcja jest nieco ukryta w zakładce „Operacje” po kliknięciu bazy danych.
Maris B.
13

Cóż, są 2 metody:

Metoda 1: Dobrze znaną metodą zmiany nazwy schematu bazy danych jest zrzucenie schematu za pomocą Mysqldump i przywrócenie go w innym schemacie, a następnie usunięcie starego schematu (w razie potrzeby).

Od Shell

 mysqldump emp > emp.out
 mysql -e "CREATE DATABASE employees;"
 mysql employees < emp.out 
 mysql -e "DROP DATABASE emp;"

Chociaż powyższa metoda jest łatwa, zajmuje dużo czasu i miejsca. Co jeśli schemat jest większy niż 100 GB?Istnieją metody, w których można połączyć powyższe polecenia razem, aby zaoszczędzić miejsce, jednak nie pozwoli to zaoszczędzić czasu.

Aby zaradzić takim sytuacjom, istnieje inna szybka metoda zmiany nazw schematów, jednak należy przy tym zachować ostrożność.

Metoda 2: MySQL ma bardzo dobrą funkcję do zmiany nazw tabel, która działa nawet w różnych schematach. Ta operacja zmiany nazwy ma charakter atomowy i nikt inny nie może uzyskać dostępu do tabeli podczas jej zmiany nazwy. Zajmuje to krótki czas, ponieważ zmiana nazwy tabeli lub jej schematu jest jedynie zmianą metadanych. Oto podejście proceduralne przy zmianie nazwy:

Utwórz nowy schemat bazy danych o żądanej nazwie. Zmień nazwy tabel ze starego schematu na nowy, używając komendy MySQL „RENAME TABLE”. Usuń stary schemat bazy danych. If there are views, triggers, functions, stored procedures in the schema, those will need to be recreated too. MySQL „RENAME TABLE” kończy się niepowodzeniem, jeśli w tabelach istnieją wyzwalacze. Aby temu zaradzić, możemy wykonać następujące czynności:

1) Dump the triggers, events and stored routines in a separate file. Dokonano tego przy użyciu flag -E, -R (oprócz -t -d, który zrzuca wyzwalacze) do komendy mysqldump. Po zrzuceniu wyzwalaczy będziemy musieli usunąć je ze schematu, aby polecenie RENAME TABLE działało.

 $ mysqldump <old_schema_name> -d -t -R -E > stored_routines_triggers_events.out

2) Wygeneruj listę tylko tabel „BASE”. Można je znaleźć za pomocą zapytania w information_schema.TABLEStabeli.

 mysql> select TABLE_NAME from information_schema.tables where 
    table_schema='<old_schema_name>' and TABLE_TYPE='BASE TABLE';

3) Zrzuć widoki do pliku wyjściowego. Widoki można znaleźć za pomocą zapytania w tej samej information_schema.TABLEStabeli.

mysql> select TABLE_NAME from information_schema.tables where 
   table_schema='<old_schema_name>' and TABLE_TYPE='VIEW';
 $ mysqldump <database> <view1> <view2>  > views.out

4) Upuść wyzwalacze na bieżących tabelach w old_schema.

mysql> DROP TRIGGER <trigger_name>;
...

5) Przywróć powyższe pliki zrzutu po zmianie nazwy wszystkich tabel „Podstawowych” znalezionych w kroku # 2.

mysql> RENAME TABLE <old_schema>.table_name TO <new_schema>.table_name;
...
$ mysql <new_schema> < views.out
$ mysql <new_schema> < stored_routines_triggers_events.out

Zawiłości z powyższymi metodami: może być konieczne zaktualizowanie GRANTS dla użytkowników, aby pasowali do poprawnej nazwy schematu. Można to naprawić prostą AKTUALIZACJĄ w tabelach mysql.columns_priv, mysql.procs_priv, mysql.tables_priv, mysql.db aktualizując nazwę old_schema do new_schema i wywołując „uprawnienia Flush;”. Chociaż „metoda 2” wydaje się nieco bardziej skomplikowana niż „metoda 1”, jest to całkowicie skryptowalne. Prosty skrypt bash do wykonania powyższych kroków we właściwej kolejności może pomóc zaoszczędzić miejsce i czas podczas następnej zmiany nazw schematów bazy danych.

Zespół Percona Remote DBA napisał skrypt o nazwie „rename_db”, który działa w następujący sposób:

[root@dba~]# /tmp/rename_db
rename_db <server> <database> <new_database>

Aby zademonstrować użycie tego skryptu, użyłem przykładowego schematu „emp”, utworzyłem wyzwalacze testowe, zapisałem procedury na tym schemacie. Spróbuje zmienić nazwę schematu bazy danych za pomocą skryptu, którego wypełnienie zajmuje kilka sekund, w przeciwieństwie do czasochłonnej metody zrzutu / przywracania.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| emp                |
| mysql              |
| performance_schema |
| test               |
+--------------------+


[root@dba ~]# time /tmp/rename_db localhost emp emp_test
create database emp_test DEFAULT CHARACTER SET latin1
drop trigger salary_trigger
rename table emp.__emp_new to emp_test.__emp_new
rename table emp._emp_new to emp_test._emp_new
rename table emp.departments to emp_test.departments
rename table emp.dept to emp_test.dept
rename table emp.dept_emp to emp_test.dept_emp
rename table emp.dept_manager to emp_test.dept_manager
rename table emp.emp to emp_test.emp
rename table emp.employees to emp_test.employees
rename table emp.salaries_temp to emp_test.salaries_temp
rename table emp.titles to emp_test.titles
loading views
loading triggers, routines and events
Dropping database emp

real    0m0.643s
user    0m0.053s
sys     0m0.131s


mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| emp_test           |
| mysql              |
| performance_schema |
| test               |
+--------------------+

Jak widać na powyższym wyjściu, schemat bazy danych „emp” został przemianowany na „emp_test” w mniej niż sekundę. Na koniec jest to skrypt z Percony, który został użyty powyżej dla „metody 2”.

#!/bin/bash
# Copyright 2013 Percona LLC and/or its affiliates
set -e
if [ -z "$3" ]; then
    echo "rename_db <server> <database> <new_database>"
    exit 1
fi
db_exists=`mysql -h $1 -e "show databases like '$3'" -sss`
if [ -n "$db_exists" ]; then
    echo "ERROR: New database already exists $3"
    exit 1
fi
TIMESTAMP=`date +%s`
character_set=`mysql -h $1 -e "show create database $2\G" -sss | grep ^Create | awk -F'CHARACTER SET ' '{print $2}' | awk '{print $1}'`
TABLES=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='BASE TABLE'" -sss`
STATUS=$?
if [ "$STATUS" != 0 ] || [ -z "$TABLES" ]; then
    echo "Error retrieving tables from $2"
    exit 1
fi
echo "create database $3 DEFAULT CHARACTER SET $character_set"
mysql -h $1 -e "create database $3 DEFAULT CHARACTER SET $character_set"
TRIGGERS=`mysql -h $1 $2 -e "show triggers\G" | grep Trigger: | awk '{print $2}'`
VIEWS=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='VIEW'" -sss`
if [ -n "$VIEWS" ]; then
    mysqldump -h $1 $2 $VIEWS > /tmp/${2}_views${TIMESTAMP}.dump
fi
mysqldump -h $1 $2 -d -t -R -E > /tmp/${2}_triggers${TIMESTAMP}.dump
for TRIGGER in $TRIGGERS; do
    echo "drop trigger $TRIGGER"
    mysql -h $1 $2 -e "drop trigger $TRIGGER"
done
for TABLE in $TABLES; do
    echo "rename table $2.$TABLE to $3.$TABLE"
    mysql -h $1 $2 -e "SET FOREIGN_KEY_CHECKS=0; rename table $2.$TABLE to $3.$TABLE"
done
if [ -n "$VIEWS" ]; then
    echo "loading views"
    mysql -h $1 $3 < /tmp/${2}_views${TIMESTAMP}.dump
fi
echo "loading triggers, routines and events"
mysql -h $1 $3 < /tmp/${2}_triggers${TIMESTAMP}.dump
TABLES=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='BASE TABLE'" -sss`
if [ -z "$TABLES" ]; then
    echo "Dropping database $2"
    mysql -h $1 $2 -e "drop database $2"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.columns_priv where db='$2'" -sss` -gt 0 ]; then
    COLUMNS_PRIV="    UPDATE mysql.columns_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.procs_priv where db='$2'" -sss` -gt 0 ]; then
    PROCS_PRIV="    UPDATE mysql.procs_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.tables_priv where db='$2'" -sss` -gt 0 ]; then
    TABLES_PRIV="    UPDATE mysql.tables_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.db where db='$2'" -sss` -gt 0 ]; then
    DB_PRIV="    UPDATE mysql.db set db='$3' WHERE db='$2';"
fi
if [ -n "$COLUMNS_PRIV" ] || [ -n "$PROCS_PRIV" ] || [ -n "$TABLES_PRIV" ] || [ -n "$DB_PRIV" ]; then
    echo "IF YOU WANT TO RENAME the GRANTS YOU NEED TO RUN ALL OUTPUT BELOW:"
    if [ -n "$COLUMNS_PRIV" ]; then echo "$COLUMNS_PRIV"; fi
    if [ -n "$PROCS_PRIV" ]; then echo "$PROCS_PRIV"; fi
    if [ -n "$TABLES_PRIV" ]; then echo "$TABLES_PRIV"; fi
    if [ -n "$DB_PRIV" ]; then echo "$DB_PRIV"; fi
    echo "    flush privileges;"
fi
Sathish D.
źródło
Co z ograniczeniami referencyjnymi?
dolmen
13

Kroki :

  1. Hit http: // localhost / phpmyadmin /
  2. Wybierz swoją bazę danych
  3. Kliknij kartę Operacje
  4. Pojawi się zakładka „Zmień nazwę bazy danych na”. Dodaj nową nazwę i zaznacz Dostosuj uprawnienia.
  5. Kliknij Go.

wprowadź opis zdjęcia tutaj

Shubham Jain
źródło
1
Rozwiązanie phpMyAdmin jest zwykle złym rozwiązaniem, ponieważ niektóre środowiska mają ograniczone środowisko.
Daniel Antunes Pinto
Nie jest to „dobre” rozwiązanie, ale mimo wszystko dziękuję, ponieważ tego właśnie szukałem.
jamie
1
Uprzejmie zagłosuj, jeśli to działa dla ciebie .. pomoże ... dzięki
Shubham Jain
1
Działa to dla mnie w środowisku phpMyAdmin +1
William
12

Dla użytkowników komputerów Mac Sequel Pro ma opcję Zmień nazwę bazy danych w menu Baza danych. http://www.sequelpro.com/

Książę
źródło
5
Uważaj na tę opcję, jeśli masz jakieś widoki lub wyzwalacze w bazie danych. Za tą opcją menu znajduje się skrypt, który utworzy nową bazę danych i przeniesie wszystkie tabele. To nie zadziała dla widoków lub wyzwalaczy, więc zostaną pozostawione w starej bazie danych. Rezultatem są dwie uszkodzone bazy danych wymagające naprawy.
Olfan
10

Większość odpowiedzi tutaj jest błędnych z jednego z dwóch powodów:

  1. Nie możesz po prostu użyć RENAME TABLE, ponieważ mogą istnieć widoki i wyzwalacze. Jeśli są wyzwalacze, RENAME TABLE kończy się niepowodzeniem
  2. Nie możesz użyć mysqldump, jeśli chcesz „szybko” (zgodnie z pytaniem w pytaniu) zmienić nazwę dużej bazy danych

Percona ma post na blogu o tym, jak zrobić to dobrze: https://www.percona.com/blog/2013/12/24/renaming-database-schema-mysql/

oraz skrypt opublikowany (wykonany?) przez Simona R Jonesa, który robi to, co sugeruje ten post. Naprawiłem błąd znaleziony w skrypcie. Możesz to zobaczyć tutaj:

https://gist.github.com/ryantm/76944318b0473ff25993ef2a7186213d

Oto jego kopia:

#!/bin/bash
# Copyright 2013 Percona LLC and/or its affiliates
# @see https://www.percona.com/blog/2013/12/24/renaming-database-schema-mysql/
set -e
if [ -z "$3" ]; then
    echo "rename_db <server> <database> <new_database>"
    exit 1
fi
db_exists=`mysql -h $1 -e "show databases like '$3'" -sss`
if [ -n "$db_exists" ]; then
    echo "ERROR: New database already exists $3"
    exit 1
fi
TIMESTAMP=`date +%s`
character_set=`mysql -h $1 -e "SELECT default_character_set_name FROM information_schema.SCHEMATA WHERE schema_name = '$2'" -sss`
TABLES=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='BASE TABLE'" -sss`
STATUS=$?
if [ "$STATUS" != 0 ] || [ -z "$TABLES" ]; then
    echo "Error retrieving tables from $2"
    exit 1
fi
echo "create database $3 DEFAULT CHARACTER SET $character_set"
mysql -h $1 -e "create database $3 DEFAULT CHARACTER SET $character_set"
TRIGGERS=`mysql -h $1 $2 -e "show triggers\G" | grep Trigger: | awk '{print $2}'`
VIEWS=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='VIEW'" -sss`
if [ -n "$VIEWS" ]; then
    mysqldump -h $1 $2 $VIEWS > /tmp/${2}_views${TIMESTAMP}.dump
fi
mysqldump -h $1 $2 -d -t -R -E > /tmp/${2}_triggers${TIMESTAMP}.dump
for TRIGGER in $TRIGGERS; do
    echo "drop trigger $TRIGGER"
    mysql -h $1 $2 -e "drop trigger $TRIGGER"
done
for TABLE in $TABLES; do
    echo "rename table $2.$TABLE to $3.$TABLE"
    mysql -h $1 $2 -e "SET FOREIGN_KEY_CHECKS=0; rename table $2.$TABLE to $3.$TABLE"
done
if [ -n "$VIEWS" ]; then
    echo "loading views"
    mysql -h $1 $3 < /tmp/${2}_views${TIMESTAMP}.dump
fi
echo "loading triggers, routines and events"
mysql -h $1 $3 < /tmp/${2}_triggers${TIMESTAMP}.dump
TABLES=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='BASE TABLE'" -sss`
if [ -z "$TABLES" ]; then
    echo "Dropping database $2"
    mysql -h $1 $2 -e "drop database $2"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.columns_priv where db='$2'" -sss` -gt 0 ]; then
    COLUMNS_PRIV="    UPDATE mysql.columns_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.procs_priv where db='$2'" -sss` -gt 0 ]; then
    PROCS_PRIV="    UPDATE mysql.procs_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.tables_priv where db='$2'" -sss` -gt 0 ]; then
    TABLES_PRIV="    UPDATE mysql.tables_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.db where db='$2'" -sss` -gt 0 ]; then
    DB_PRIV="    UPDATE mysql.db set db='$3' WHERE db='$2';"
fi
if [ -n "$COLUMNS_PRIV" ] || [ -n "$PROCS_PRIV" ] || [ -n "$TABLES_PRIV" ] || [ -n "$DB_PRIV" ]; then
    echo "IF YOU WANT TO RENAME the GRANTS YOU NEED TO RUN ALL OUTPUT BELOW:"
    if [ -n "$COLUMNS_PRIV" ]; then echo "$COLUMNS_PRIV"; fi
    if [ -n "$PROCS_PRIV" ]; then echo "$PROCS_PRIV"; fi
    if [ -n "$TABLES_PRIV" ]; then echo "$TABLES_PRIV"; fi
    if [ -n "$DB_PRIV" ]; then echo "$DB_PRIV"; fi
    echo "    flush privileges;"
fi

Zapisz go w pliku o nazwie rename_dbi uczyń skrypt wykonalnym, a chmod +x rename_dbnastępnie użyj go jak./rename_db localhost old_db new_db

ryantm
źródło
Podoba mi się ten skrypt, jest prawie uniwersalny. Jednak nie udało się przetworzyć sprawy, gdy istnieje kilka połączonych WIDOKÓW, w których definiujący nie jest rootem.
ENargit
9

Można zmienić nazwę wszystkich tabel w bazie danych, aby znajdowały się w innej bazie danych bez konieczności pełnego zrzutu i przywracania.

PROCEDURA UPADKU, JEŚLI ISTNIEJE mysql.rename_db;
DELIMITER ||
UTWÓRZ PROCEDURĘ mysql.rename_db (IN VARCHAR old_db (100), IN VARCHAR new_db (100))
ZACZYNAĆ
SELECT CONCAT ('CREATE DATABASE', new_db, ';') `# create new database`;
WYBIERZ CONCAT ('RENAME TABLE' ', old_db,' '.' ', Nazwa_tabeli, `` TO' ', new_db,' '.``, nazwa_tabeli, ``;' ') `# alter table` FROM schemat_informacji table_schema = old_db;
SELECT CONCAT ('DROP DATABASE' ', old_db,' ';') `# drop old database`;
KONIEC ||
DELIMITER;

$ time mysql -uroot -e "wywołaj mysql.rename_db ('db1', 'db2');” | mysql -uroot

Jednak wszelkie wyzwalacze w docelowej bazie danych nie będą zadowolone. Najpierw musisz je upuścić, a następnie odtworzyć po zmianie nazwy.

mysql -uroot -e "wywołaj mysql.rename_db ('test', 'blah2');" | mysql -uroot
BŁĄD 1435 (HY000) w wierszu 4: Wyzwolić niewłaściwy schemat
TodoInTX
źródło
małe ulepszenie, które sprawia, że ​​działa to w / mysql 5.x mysql --batch-uroot -e "call mysql.rename_db('test', 'blah2');" | mysql -uroot Uwaga, musisz użyć opcji --batch, aby zmienić formatowanie na formatowanie surowe, które wyświetla wyniki bez formatowania.
mikesl
8

Oto plik wsadowy, który napisałem, aby zautomatyzować go z wiersza poleceń, ale dla Windows / MS-DOS.

Składnia to nazwa_mysqldb bazy danych nowa baza danych -u [użytkownik] -p [hasło]

:: ***************************************************************************
:: FILE: RENAME_MYSQLDB.BAT
:: ***************************************************************************
:: DESCRIPTION
:: This is a Windows /MS-DOS batch file that automates renaming a MySQL database 
:: by using MySQLDump, MySQLAdmin, and MySQL to perform the required tasks.
:: The MySQL\bin folder needs to be in your environment path or the working directory.
::
:: WARNING: The script will delete the original database, but only if it successfully
:: created the new copy. However, read the disclaimer below before using.
::
:: DISCLAIMER
:: This script is provided without any express or implied warranties whatsoever.
:: The user must assume the risk of using the script.
::
:: You are free to use, modify, and distribute this script without exception.
:: ***************************************************************************

:INITIALIZE
@ECHO OFF
IF [%2]==[] GOTO HELP
IF [%3]==[] (SET RDB_ARGS=--user=root) ELSE (SET RDB_ARGS=%3 %4 %5 %6 %7 %8 %9)
SET RDB_OLDDB=%1
SET RDB_NEWDB=%2
SET RDB_DUMPFILE=%RDB_OLDDB%_dump.sql
GOTO START

:START
SET RDB_STEP=1
ECHO Dumping "%RDB_OLDDB%"...
mysqldump %RDB_ARGS% %RDB_OLDDB% > %RDB_DUMPFILE%
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
SET RDB_STEP=2
ECHO Creating database "%RDB_NEWDB%"...
mysqladmin %RDB_ARGS% create %RDB_NEWDB%
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
SET RDB_STEP=3
ECHO Loading dump into "%RDB_NEWDB%"...
mysql %RDB_ARGS% %RDB_NEWDB% < %RDB_DUMPFILE%
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
SET RDB_STEP=4
ECHO Dropping database "%RDB_OLDDB%"...
mysqladmin %RDB_ARGS% drop %RDB_OLDDB% --force
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
SET RDB_STEP=5
ECHO Deleting dump...
DEL %RDB_DUMPFILE%
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
ECHO Renamed database "%RDB_OLDDB%" to "%RDB_NEWDB%".
GOTO END

:ERROR_ABORT
IF %RDB_STEP% GEQ 3 mysqladmin %RDB_ARGS% drop %NEWDB% --force
IF %RDB_STEP% GEQ 1 IF EXIST %RDB_DUMPFILE% DEL %RDB_DUMPFILE%
ECHO Unable to rename database "%RDB_OLDDB%" to "%RDB_NEWDB%".
GOTO END

:HELP
ECHO Renames a MySQL database.
ECHO Usage: %0 database new_database [OPTIONS]
ECHO Options: Any valid options shared by MySQL, MySQLAdmin and MySQLDump.
ECHO          --user=root is used if no options are specified.
GOTO END    

:END
SET RDB_OLDDB=
SET RDB_NEWDB=
SET RDB_ARGS=
SET RDB_DUMP=
SET RDB_STEP=
Jasio
źródło
7

Procedura przechowywana TodoInTX nie do końca działała dla mnie. Oto moje pchnięcie nożem:

- procedura składowana rename_db: Zmień nazwę bazy danych na mój sposób kopiowania tabeli.
- Ostrzeżenia: 
- Spowoduje zamknięcie dowolnej istniejącej bazy danych o tej samej nazwie co „nowa” nazwa bazy danych.
- TYLKO kopiuje tabele; procedury składowane i inne obiekty bazy danych nie są kopiowane.
- Tomer Altman ([email protected])

ogranicznik //
PROCEDURA UPADKU, JEŚLI ISTNIEJE rename_db;
UTWÓRZ PROCEDURĘ rename_db (W old_db VARCHAR (100), IN new_db VARCHAR (100))
ZACZYNAĆ
    ZADEKLARUJ bieżącą tabelę VARCHAR (100);
    ZADEKLAROWAĆ dokonano INT DEFAULT 0;
    DEKLARUJ old_tables KURSOR DLA wybierz nazwę_tabeli z informacji_schema.tables gdzie tabela_schema = old_db;
    ZADEKLARUJ KONTYNUUJ HANDLER NIE ZNALEZIONO ZESTAWU done = 1;

    SET @output = CONCAT ('DROP SCHEMA IF EXISTS', new_db, ';'); 
    PREPARE stmt FROM @output;
    WYKONAJ stmt;

    SET @output = CONCAT („UTWÓRZ SCHEMAT, JEŚLI NIE ISTNIEJE”, new_db, ';');
    PREPARE stmt FROM @output;
    WYKONAJ stmt;

    OPEN old_tables;
    POWTARZAĆ
        FETCH old_tables INTO current_table;
        JEŚLI NIE zrobiono TO
        SET @output = CONCAT ('alter table', old_db, '.', Current_table, 'rename', new_db, '.', Current_table, ';');
        PREPARE stmt FROM @output;
        WYKONAJ stmt;

        KONIEC JEŻELI;
    DO WYKONANIA POWTÓRZENIA KOŃCOWEGO;

    ZAMKNIJ stare tabele;

KONIEC//
ogranicznik;
użytkownik757945
źródło
Będzie to działać tylko w przypadku tabel i tylko wtedy, gdy te tabele nie mają żadnych wyzwalaczy. Widoki i wyzwalacze nie zostaną przez to przeniesione.
Olfan
7

Najprostszą metodą jest użycie oprogramowania HeidiSQL. Jest darmowy i open source. Działa w systemie Windows i dowolnym systemie Linux z Wine (uruchamiaj aplikacje Windows w systemach Linux, BSD, Solaris i Mac OS X).

Aby pobrać HeidiSQL, goto http://www.heidisql.com/download.php .

Aby pobrać Wine, goto http://www.winehq.org/ .

Aby zmienić nazwę bazy danych w HeidiSQL, wystarczy kliknąć prawym przyciskiem myszy nazwę bazy danych i wybrać „Edytuj”. Następnie wprowadź nową nazwę i naciśnij „OK”.

To takie proste.

Fathah Rehman P.
źródło
1
Jeśli ma zapisane procedury, nie można zmienić nazwy.
abksharma
@abksharma Właściwie dostaniesz komunikat Database "database_name" contains stored routine(s) which cannot be moved.Wyzwalacze (przynajmniej dla bazy danych MariDB) są liczone jako przechowywane procedury. Nie miałem żadnych procedur składowanych, ale nie mogłem zmienić nazwy bazy danych, dopóki nie usunąłem wszystkich wyzwalaczy.
izogfif
7

Dla użytkowników komputerów Mac możesz użyć Sequel Pro(darmowy), który po prostu zapewnia opcję zmiany nazw baz danych. Chociaż nie usuwa starej bazy danych.

po otwarciu odpowiedniego DB wystarczy kliknąć: Database->Rename database...

Roee Gavirel
źródło
Czasami pozostawia przy sobie starą DB, ale jest pusta. Jeśli jednak zrobi kopię, możesz zrobić kopię i usunąć starą, to nadal 2 proste kroki.
Roee Gavirel
6

I postawił pytanie na serwerze Fault próbują obejść przestoje podczas przywracania bardzo dużych baz danych MySQL za pomocą serwera proxy. Nie odniosłem żadnego sukcesu, ale w końcu zdałem sobie sprawę, że chciałem, aby funkcja ZMIEŃ NAZWĘ BAZY DANYCH, ponieważ zrzut / import nie był opcją ze względu na rozmiar naszej bazy danych.

W MySQL jest wbudowana funkcja RENAME TABLE, więc skończyło się na napisaniu prostego skryptu Python, który wykonałby za mnie zadanie. Ja napisałem go na GitHub w przypadku może to być przydatne dla innych.

cclark
źródło
2
RENAME DATABASE została usunięta ze składni, a nie RENAME TABLE.
Duke
6

Dla Twojej wygody poniżej znajduje się mały skrypt powłoki, który należy wykonać z dwoma parametrami: nazwa-db i nowa nazwa-db.

Może być konieczne dodanie parametrów logowania do linii mysql, jeśli nie używasz pliku .my.cnf w katalogu domowym. Wykonaj kopię zapasową przed uruchomieniem tego skryptu.


#!/usr/bin/env bash

mysql -e "CREATE DATABASE $2 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;"
for i in $(mysql -Ns $1 -e "show tables");do
    echo "$1.$i -> $2.$i"
    mysql -e "rename TABLE $1.$i to $2.$i"
done
mysql -e "DROP DATABASE $1"
gerrit damen
źródło
1
To również nie będzie działać w przypadku tabel z dołączonymi wyzwalaczami lub widoków, których nie można zmienić nazwy na inne bazy danych.
Olfan
6

Wydaje się, że nikt o tym nie wspominał, ale oto inny sposób:

create database NewDatabaseName like OldDatabaseName;

następnie dla każdej tabeli wykonaj:

create NewDatabaseName.tablename like OldDatabaseName.tablename;
insert into NewDataBaseName.tablename select * from OldDatabaseName.tablename;

to jeśli chcesz

drop database OldDatabaseName;

Takie podejście miałoby tę zaletę, że wykonuje cały transfer na serwerze przy prawie zerowym ruchu sieciowym, więc pójdzie dużo szybciej niż zrzut / przywracanie.

Jeśli masz procedury składowane / widoki / itp., Możesz również chcieć je przenieść.

Tuncay Göncüoğlu
źródło
2
O ile wiem 5.x nie obsługuje słowa kluczowego „like” w create databasezestawieniu? Skąd to masz?
Dragas
Oto link do create table likeskładni: dev.mysql.com/doc/refman/5.7/en/create-table-like.html . Jeśli chodzi o tworzenie baz danych, wydaje się, że MySQL porzucił tę klauzulę.
Tuncay Göncüoğlu
4

Oto szybki sposób na wygenerowanie skryptu zmiany nazwy SQL, jeśli masz wiele tabel do przeniesienia.

SELECT DISTINCT CONCAT('RENAME TABLE ', t.table_schema,'.', t.table_name, ' TO ',     
t.table_schema, "_archive", '.', t.table_name, ';' ) as Rename_SQL 
FROM information_schema.tables t
WHERE table_schema='your_db_name' ;
Yantaq
źródło
Wygląda dobrze, ale nie przenosi przechowywanych procedur ani widoków.
davidpricedev
powinieneś prawdopodobnie dodać znaki skrótu, aby zawinąć nazwę tabeli i nazwę schematu
Funkodebat
4

ALTER DATABASEjest proponowanym rozwiązaniem MySQL i RENAME DATABASEjest porzucane.

Od 13.1.32 RENAME DATABASE Składnia :

RENAME {DATABASE | SCHEMA} db_name TO new_db_name;

To oświadczenie zostało dodane w MySQL 5.1.7, ale okazało się, że jest niebezpieczne i zostało usunięte w MySQL 5.1.23.

fancyPants
źródło
7
Czy masz jakąś przykładową składnię? Nie znam żadnego sposobu alter databasezmiany nazwy samej bazy danych, a dokumentacja, z którą się łączysz, nie sugeruje, że jest to możliwe.
Jordan,
@Jordan Też byłbym zainteresowany. Próbowałem, próbowałem i dowiedziałem się, że działa tylko z wersją> 5.1, ale nie mogę teraz zaktualizować.
fancyPants
5
-1: Pisząc o proponowanych sposobach, a następnie podając przykład nie zaproponowanego sposobu, a zupełnie go brakuje, aby nawet pokazać przykład.
hakre
3
To jest źle. Dokumentacja bazy danych zmiany nazwy MySQL mówi, że zmienna nazwa_bazy danych była przeznaczona do bardzo specyficznego zadania zmiany nazwy (nie ogólny przypadek zmiany nazwy bazy danych), który jest teraz obsługiwany przez zmianę bazy danych: „Aby wykonać zadanie aktualizacji nazw bazy danych za pomocą nowego kodowania, użyj ZMIEŃ BAZĘ DANYCH NAZWA_DB ULEPSZENIE Zamiast tego NAZWA KATALOGU DANYCH „Nie możesz użyć tego do zmiany nazwy bazy danych, jak chcesz, nie ma nawet miejsca na nową nazwę db w tej komendzie!
Kanat Bolazar
3

W MySQL Administrator wykonaj następujące czynności:

  1. W obszarze Katalogi utwórz nowy schemat bazy danych.
  2. Przejdź do Kopia zapasowa i utwórz kopię zapasową starego schematu.
  3. Wykonaj kopię zapasową.
  4. Przejdź do Przywróć i otwórz plik utworzony w kroku 3.
  5. Wybierz „Inny schemat” w obszarze Schemat docelowy i wybierz nowy schemat bazy danych.
  6. Rozpocznij przywracanie.
  7. Sprawdź nowy schemat i, jeśli wygląda dobrze, usuń stary.
Tomek
źródło
Administrator MySQL nie może obsługiwać dużych baz danych i nie ma w tym nic szybkiego
deadprogrammer
3

w phpmyadmin możesz łatwo zmienić nazwę bazy danych

select database 

  goto operations tab

  in that rename Database to :

  type your new database name and click go

poprosić o usunięcie starej tabeli i ponowne załadowanie danych tabeli kliknij OK w obu

Twoja baza danych zostanie zmieniona

murtaza.webdev
źródło
3

Jeśli używasz phpMyAdmin , możesz przejść do zakładki „operacje” po wybraniu bazy danych, której nazwę chcesz zmienić. Następnie przejdź do ostatniej sekcji „skopiuj bazę danych do” (lub coś w tym rodzaju), podaj nazwę i wybierz opcje poniżej. W tym przypadku myślę, że musisz zaznaczyć pola wyboru „struktura i dane” i „utwórz bazę danych przed skopiowaniem”, a na koniec naciśnij przycisk „idź” w tej sekcji.

Nawiasem mówiąc, używam phpMyAdmin w języku hiszpańskim, więc nie jestem pewien, jakie są nazwy sekcji w języku angielskim.

Peter Mortensen
źródło