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

Instrukcja MySQL w MySQL obejmuje to.

Zazwyczaj po prostu wysyłam bazę danych i ponownie zaimportowałem ją z nową nazwą. Nie jest to opcja dla bardzo dużych baz danych. Najwyraźniej RENAME {DATABASE | SCHEMA} db_name TO new_db_name; czy złe rzeczy, istnieje tylko w kilku wersjach, i jest zły pomysł ogólnie.

To musi działać z InnoDB , który przechowuje rzeczy bardzo inaczej niż MyISAM .

Author: speeday125, 2008-09-16

30 answers

Dla InnoDB wygląda na to, że działa: Utwórz nową pustą bazę danych, a następnie zmień nazwę każdej tabeli w nową bazę danych:

RENAME TABLE old_db.table TO new_db.table;

Będziesz musiał dostosować uprawnienia po tym.

Do tworzenia 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: nie ma spacji między opcją -p A hasłem. Jeśli twoja baza danych nie ma hasła, usuń część -u username -ppassword.

Ponadto, jeśli masz procedury przechowywane, możesz skopiuj je później:

mysqldump -R old_db | mysql new_db
 703
Author: Benoit Duffez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-25 14:57:12

Użyj tych 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 aby zmniejszyć I / O, Użyj następujących wskazówek, jak zasugerował @ Pablo Marin-Garcia:

mysqladmin -u username -p create newdatabase
mysqldump -u username -v olddatabase -p | mysql -u username -p -D newdatabase
 397
Author: hendrasaputra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-09 11:48:04

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

Z phpMyAdmin wybierz bazę danych, którą chcesz wybrać. W zakładkach znajduje się jeden o nazwie operacje, przejdź do sekcji Zmień nazwę. To wszystko.

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

Tutaj wpisz opis obrazka

 190
Author: raphie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-09 12:07:24

Możesz użyć SQL do wygenerowania skryptu 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ź, aby użyć GROUP_CONCAT. Wybieraj, 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 i $2 są źródłem i celem odpowiednio)

Spowoduje to wygenerowanie polecenia SQL, które będziesz musiał następnie uruchomić.

Zauważ, że GROUP_CONCAT ma domyślny limit długości, który może zostać przekroczony dla baz danych z dużą liczbą tabel. Możesz zmienić ten limit, uruchamiając SET SESSION group_concat_max_len = 100000000; (lub inną dużą liczbę).

 93
Author: ErichBSchulz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-24 03:19:46

Trzy opcje:

  1. Utwórz nową bazę danych, obniż serwer, Przenieś pliki z jednego folderu bazy danych do drugiego i uruchom ponownie serwer. Zauważ, że będzie to działać tylko wtedy, gdy wszystkie Twoje tabele są MyISAM.

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

  3. Użyj mysqldump i przeładuj ten plik.

 24
Author: longneck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-09 11:45:32

The simple way

Zmiana katalogu bazy danych:

cd /var/lib/mysql/

Wyłącz MySQL... To ważne!

/etc/init.d/mysql stop

Ok, ten sposób nie działa dla InnoDB lub BDB-baz danych.

Zmień nazwę bazy danych:

mv old-name new-name

...albo stół...

cd database/

mv old-name.frm new-name.frm

mv old-name.MYD new-name.MYD

mv old-name.MYI new-name.MYI

Restart MySQL

/etc/init.d/mysql start
Zrobione...

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

 23
Author: DeeCee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-09 11:47:18

Emulowanie brakującej komendy RENAME DATABASE 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 Wyjście

  4. Usuń starą bazę danych

Został wzięty z emulowanie brakującej Komendy Zmień nazwę bazy danych w MySQL.

 21
Author: Marciano,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-09 12:12:35

Dopiero niedawno natknąłem się na bardzo fajny sposób, działa 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.

 20
Author: Amr Mostafa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-07 13:15:27

Tego 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;
 16
Author: eaykin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-28 15:01:12

MySQL nie obsługuje obecnie zmiany nazwy bazy danych za pomocą interfejsu 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 jest to zwykle w katalogu Data w katalogu, w którym MySQL został zainstalowany. Znajdź nazwę bazy danych, którą chcesz zmienić w katalogu danych i zmień jej nazwę. Zmiana nazwy katalogu może jednak spowodować pewne problemy z uprawnieniami. Be świadomy.

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

Zalecałbym utworzenie nowej bazy danych (używając żądanej nazwy) i eksportowanie/importowanie potrzebnych danych ze starego do nowego. Całkiem proste.

 14
Author: bryanpearson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 21:26:07

Najprostszy sposób na zrobienie kompletnej zmiany nazwy (w tym upuszczenie starej bazy danych na końcu, więc jest to zmiana nazwy, a nie Kopia):

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

Kroki:

  1. skopiuj wiersze do Notatnika.
  2. Zastąp wszystkie odwołania do "olddbname", "newdbname", " mypassword "(+opcjonalnie" root") swoimi odpowiednikami.
  3. wykonaj jeden po drugim w wierszu poleceń(wpisując "y" Po wyświetleniu monitu).
 14
Author: Steve Chambers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-16 09:38:22

Po zmianie nazwy bazy danych w PHPMyAdmin tworzy zrzut, a następnie upuszcza i odtwarza bazę danych z nową nazwą.

 13
Author: UnkwnTech,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 21:24:15

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"

Działa:

$ sh rename_database.sh oldname newname
 13
Author: Grijesh Chauhan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-09 15:59:54

Dla tych, którzy są użytkownikami komputerów Mac, Sequel Pro ma opcję Zmień nazwę bazy danych w menu Baza Danych. http://www.sequelpro.com/

 12
Author: Duke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-30 01:06:26

Cóż są 2 metody:

Metoda 1: znana metoda zmiany nazwy schematu bazy danych polega na zrzuceniu schematu za pomocą Mysqldump i przywróceniu go w innym schemacie, a następnie zrzuceniu starego schematu (w razie potrzeby).

From 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, jest czasochłonna i czasochłonna. Co jeśli schemat jest większy niż 100GB? istnieją metody, w których można połączyć powyższe polecenia, aby zaoszczędzić miejsce, jednak nie zaoszczędzi czasu.

Aby zaradzić takim sytuacjom, istnieje inna szybka metoda zmiany nazw schematów, jednak należy zachować pewną ostrożność podczas robienia tego.

Metoda 2: MySQL ma bardzo dobrą funkcję do zmiany nazw tabel, która działa nawet na różnych schematach. Ta operacja zmiany nazwy jest atomic i nikt inny nie może uzyskać dostępu do tabeli podczas jej zmiany. Proces ten trwa krótko, ponieważ zmiana nazwy tabeli lub jej schematu jest tylko 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 polecenia MySQL "RENAME TABLE". Upuść stary schemat bazy danych. If there are views, triggers, functions, stored procedures in the schema, those will need to be recreated too. "Zmień nazwę tabeli" MySQL nie powiedzie się, jeśli istnieją wyzwalacze na tabelach. Aby temu zaradzić, możemy zrobić następujące rzeczy:

1) Dump the triggers, events and stored routines in a separate file. odbywa się to za pomocą opcji-E, -R (oprócz opcji-t-D, która zrzeka wyzwalacze) do polecenia mysqldump. Raz wyzwalacze są zrzucane, będziemy musieli wyrzucić je ze schematu, aby zmienić nazwę tabeli poleceń do pracy.

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

2) generuje listę tylko tabel "bazowych". Można je znaleźć za pomocą zapytania w tabeli information_schema.TABLES.

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

3) zrzut widoki w pliku out. Widoki można znaleźć za pomocą zapytania w tej samej tabeli information_schema.TABLES.

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ższy zrzut pliki po zmianie nazwy wszystkich tabel" bazowych " 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 grantów dla użytkowników tak, aby pasowały one do prawidłowej nazwy schematu. Można je naprawić za pomocą prostej aktualizacji na mysql.columns_priv, mysql.procs_priv, mysql.tables_priv, mysql.tabele db aktualizują nazwę old_schema do new_schema i wywołują "flush privileges;". Chociaż "metoda 2" wydaje się nieco bardziej skomplikowana niż "metoda 1", jest to całkowicie skryptowalne. A prosty skrypt bash do przeprowadzenia powyższych kroków w odpowiedniej kolejności, może pomóc zaoszczędzić miejsce i czas podczas zmiany nazw schematów bazy danych następnym razem.

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żyto przykładowego schematu "emp", stworzono wyzwalacze testowe, zapisano procedury na tym schemacie. Spróbuje zmienić nazwę schematu bazy danych za pomocą skryptu, który zajmuje kilka sekund, aby zakończyć jako 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ę. Wreszcie, jest to skrypt z Percona, który jest używany 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
 11
Author: Sathish D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-29 11:14:37

Istnieje możliwość zmiany nazw wszystkich tabel w bazie danych na znajdujące się w innej bazie danych bez konieczności wykonywania pełnego zrzutu i przywracania.

DROP PROCEDURE IF EXISTS mysql.rename_db;
DELIMITER ||
CREATE PROCEDURE mysql.rename_db(IN old_db VARCHAR(100), IN new_db VARCHAR(100))
BEGIN
SELECT CONCAT('CREATE DATABASE ', new_db, ';') `# create new database`;
SELECT CONCAT('RENAME TABLE `', old_db, '`.`', table_name, '` TO `', new_db, '`.`', table_name, '`;') `# alter table` FROM information_schema.tables WHERE table_schema = old_db;
SELECT CONCAT('DROP DATABASE `', old_db, '`;') `# drop old database`;
END||
DELIMITER ;

$ time mysql -uroot -e "call mysql.rename_db('db1', 'db2');" | mysql -uroot

Jednak wszelkie wyzwalacze w docelowym db nie będą szczęśliwe. Najpierw musisz je upuścić, a następnie odtworzyć po zmianie nazwy.

mysql -uroot -e "call mysql.rename_db('test', 'blah2');" | mysql -uroot
ERROR 1435 (HY000) at line 4: Trigger in wrong schema
 9
Author: TodoInTX,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-19 17:16:59

Większość odpowiedzi tutaj są błędne z jednego z dwóch powodów:

  1. nie można po prostu użyć Zmień nazwę tabeli, ponieważ mogą istnieć widoki i wyzwalacze. Jeśli istnieją wyzwalacze, zmiana nazwy tabeli nie powiedzie się
  2. nie możesz użyć mysqldump, jeśli chcesz "szybko" (zgodnie z pytaniem) zmienić nazwę dużej bazy danych

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

I skrypt zamieszczony (made?) by Simon R Jones that does what is suggested in that post. Naprawiłem błąd, który znalazłem 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 do pliku o nazwie rename_db i Utwórz skrypt wykonywalny za pomocą chmod +x rename_db, a następnie użyj go jak ./rename_db localhost old_db new_db

 8
Author: ryantm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-16 23:06:52

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

Składnia to baza danych rename_mysqldb newdatabase-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=
 7
Author: Johnny,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-12 10:27:41

Procedura składowana TodoInTX nie do końca mi odpowiadała. Oto moje zadanie:

-- stored procedure rename_db: Rename a database my means of table copying.
-- Caveats: 
-- Will clobber any existing database with the same name as the 'new' database name.
-- ONLY copies tables; stored procedures and other database objects are not copied.
-- Tomer Altman ([email protected])

delimiter //
DROP PROCEDURE IF EXISTS rename_db;
CREATE PROCEDURE rename_db(IN old_db VARCHAR(100), IN new_db VARCHAR(100))
BEGIN
    DECLARE current_table VARCHAR(100);
    DECLARE done INT DEFAULT 0;
    DECLARE old_tables CURSOR FOR select table_name from information_schema.tables where table_schema = old_db;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

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

    SET @output = CONCAT('CREATE SCHEMA IF NOT EXISTS ', new_db, ';');
    PREPARE stmt FROM @output;
    EXECUTE stmt;

    OPEN old_tables;
    REPEAT
        FETCH old_tables INTO current_table;
        IF NOT done THEN
        SET @output = CONCAT('alter table ', old_db, '.', current_table, ' rename ', new_db, '.', current_table, ';');
        PREPARE stmt FROM @output;
        EXECUTE stmt;

        END IF;
    UNTIL done END REPEAT;

    CLOSE old_tables;

END//
delimiter ;
 7
Author: user757945,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-17 18:24:19

I zadałem pytanie o błąd serwera próbując obejść przestoje podczas przywracania bardzo dużych baz danych za pomocą serwera proxy MySQL. Nie miałem żadnego sukcesu, ale zdałem sobie sprawę, że w końcu chciałem zmienić nazwę funkcjonalności bazy danych, ponieważ dump / import nie był opcją ze względu na rozmiar naszej bazy danych.

Istnieje funkcja zmiany nazwy tabeli wbudowana w MySQL, więc skończyło się na pisaniu prostego skryptu Pythona, aby wykonać zadanie za mnie. I ' ve posted it on GitHub in case it could być użytecznym dla innych.

 6
Author: cclark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-13 12:13:47

Dla Twojej wygody, poniżej znajduje się mały shellscript, który musi być wykonany z dwoma parametrami: db-name I new db-name.

Może być konieczne dodanie parametrów logowania do linii mysql, jeśli nie używasz pliku .my.cnf w katalogu domowym. Proszę wykonać kopię zapasową przed wykonaniem 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"
 6
Author: gerrit damen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-09 12:08:42

Najprostszą metodą jest użycie oprogramowania HeidiSQL. Jest darmowy i open source. Działa w systemie Windows i na dowolnym Linuksie z Wine (Uruchom aplikacje Windows na Linuksie, 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, kliknij prawym przyciskiem myszy na nazwę bazy danych i wybierz "Edytuj". Następnie wprowadź nową nazwę i naciśnij OK.

To takie proste.

 5
Author: Fathah Rehman P,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-09 12:58:02

Oto szybki sposób wygenerowania 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' ;
 4
Author: yantaq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-11 19:00:59

Kroki:

  1. Hit http://localhost/phpmyadmin/
  2. Wybierz swój DB
  3. Kliknij na zakładkę operacje
  4. pojawi się zakładka "Zmień nazwę bazy danych na". Dodaj nową nazwę i sprawdź Dostosuj uprawnienia.
  5. Kliknij Go.

Tutaj wpisz opis obrazka

 4
Author: Shubham Jain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-19 08:27:42

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

  1. w sekcji katalogi utwórz nowy schemat bazy danych.
  2. Przejdź do kopii zapasowej i utwórz kopię zapasową stary schemat.
  3. wykonać kopię zapasową.
  4. Przejdź do Przywróć i otwórz plik utworzony w kroku 3.
  5. Wybierz 'inny schemat' w polu Target Schemat i wybierz nową bazę danych schemat.
  6. Rozpocznij Przywracanie.
  7. zweryfikować nowy schemat i, jeśli wygląda dobrze, usuń starą.
 3
Author: Tom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-03 04:17:56

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

Poproś o opuszczenie starej tabeli i przeładowanie danych tabeli kliknij OK w obu

Twoja baza danych zmienia nazwę

 3
Author: murtaza.webdev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-21 06:17:20

Jeśli używasz phpMyAdmin możesz przejść do zakładki "operacje" po wybraniu bazy danych, którą chcesz zmienić nazwę. Następnie przejdź do ostatniej sekcji "Kopiuj bazę danych do" (lub coś w tym stylu), podaj nazwę i wybierz poniższe opcje. W takim przypadku musisz wybrać pola wyboru " struktura i dane "i" utwórz bazę danych przed kopiowaniem", a na koniec naciśnij przycisk" Idź " w tej sekcji.

Przy okazji, używam phpMyAdmin w języku hiszpańskim, więc nie jestem pewien, jakie nazwy sekcje są w języku angielskim.

 3
Author: Peter Mortensen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-09 12:03:22

Oto jednolinijkowy fragment Bash umożliwiający przeniesienie wszystkich tabel z jednego schematu do drugiego:

history -d $((HISTCMD-1)) && mysql -udb_user -p'db_password' -Dold_schema -ABNnqre'SHOW TABLES;' | sed -e's/.*/RENAME TABLE old_schema.`&` TO new_schema.`&`;/' | mysql -udb_user -p'db_password' -Dnew_schema

Polecenie history na początku zapewnia, że polecenia MySQL zawierające hasła nie są zapisywane w historii powłoki.

Upewnij się, że {[1] } ma uprawnienia do odczytu/zapisu/upuszczania na Starym schemacie oraz uprawnienia do odczytu/zapisu / tworzenia na nowym schemacie.

 3
Author: coffeefiend,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-09 12:11:19

ALTER DATABASE jest proponowany sposób obejścia tego przez MySQL i RENAME DATABASE jest odrzucany.

Od 13.1.32 Zmień nazwę składni bazy danych:

RENAME {DATABASE | SCHEMA} db_name TO new_db_name;

To stwierdzenie 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.

 3
Author: fancyPants,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-09 12:16:45

I did it this way: Wykonaj kopię zapasową istniejącej bazy danych. To da ci db.zip.tmp, a następnie w wierszu polecenia napisz

"C:\Program Files(x86)\MySQL\MySQL Server 5.6\bin \ mysql.exe " - h localhost - u root-p [hasło] [nowa nazwa db]

 3
Author: Samra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-26 01:03:31