Cum pot redenumi rapid o bază de date MySQL (schimba numele schemei)? (Programare, Mysql, Bază De Date, Innodb, Redenumiți)

Manualul MySQL de la MySQL acoperă acest aspect.

De obicei, doar arunc baza de date și o reimport cu un nou nume. Aceasta nu este o opțiune pentru bazele de date foarte mari. Se pare că RENAME {DATABASE | SCHEMA} db_name TO new_db_name; face lucruri rele, există doar într-o mână de versiuni și este o idee proastă în general.

Acest lucru trebuie să funcționeze cu InnoDB, care stochează lucrurile foarte diferit de MyISAM.

Comentarii

  • De asemenea, pe serverfault: serverfault.com/questions/195221/how-to-rename-a-mysql-database –  > Por Yves Martin.
  • Această instrucțiune RENAME DATABASE Syntax a fost adăugată în MySQL 5.1.7, dar s-a constatat că este periculoasă și a fost eliminată în MySQL 5.1.23. –  > Por zloctb.
  • Să sperăm că MySQL va implementa o nouă și funcțională RENAME DATABASE care să nu prezinte niciun pericol, deoarece nu există o modalitate ușoară de a face această sarcină în prezent. Nu există niciun motiv evident pentru care a fost periculoasă în versiunea documentația așa că ar trebui să fie capabili să facă un înlocuitor. Cel puțin oamenii au pus bug-uri de cerere de caracteristici pe site-ul lor. De exemplu, bugs.mysql.com/bug.php?id=58593 și bugs.mysql.com/bug.php?id=1698. –  > Por Edward.
  • linkurile sunt acum rupte… –  > Por oldboy.
49 răspunsuri

Pentru InnoDB, pare să funcționeze următoarele: creați noua bază de date goală, apoi redenumiți fiecare tabel în parte în noua bază de date:

RENAME TABLE old_db.table TO new_db.table;

Va trebui să ajustați permisiunile după aceea.

Pentru scripting într-un shell, puteți folosi oricare dintre următoarele:

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

SAU

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;

Note:

  • Nu există niciun spațiu între opțiunea -p și parola. În cazul în care baza de date nu are o parolă, eliminați -u username -ppassword partea.
  • Dacă o anumită tabelă are un declanșator, aceasta nu poate fi mutată în altă bază de date utilizând metoda de mai sus (va rezulta Trigger in wrong schema eroare). În acest caz, utilizați o metodă tradițională de clonare a unei baze de date și apoi renunțați la cea veche:

    mysqldump old_db | mysql new_db

  • Dacă aveți proceduri stocate, le puteți copia după aceea:

    mysqldump -R old_db | mysql new_db

Comentarii

  • Aceasta este o opțiune bună și calea de urmat dacă baza de date este mare, dar nu aveți atât de multe tabele (sau dacă sunteți dispus să scrieți un script pentru a face o buclă cu toate tabelele). În plus, în innodb este vorba doar de o redenumire logică, iar în MyISAM, în funcție de sistemul de fișiere, ar fi o redenumire logică sau o copie reală a datelor pe disc. –  > Por Pablo Marin-Garcia.
  • 33

  • Tocmai am făcut acest lucru cu o bază de date InnoDB cu peste 30 de tabele, folosind setarea file_per_table, și chiar dacă unele tabele aveau 3+ milioane de rânduri, s-a finalizat în < 1 secundă. Se pare că doar mută fișierele pe stocare, în loc să facă ceva mai complicat… +2 dacă este posibil 🙂 –  > Por Dave Rix.
  • 16

  • Vă rugăm să rețineți că acest lucru nu va funcționa pentru vizualizări. Nu puteți redenumi vizualizările pentru a le face să sară de la o bază de date la alta. Utilizați DROP VIEW și CREATE VIEW în schimb. Da, este stângaci. S-ar putea să doriți să faceți un mysqldump pentru a muta vizualizările, după ce ați mutat mai întâi toate tabelele. De asemenea, rețineți că SHOW TABLES va afișa tabelele ȘI vizualizările, așa că aveți grijă. –  > Por tuomassalo.
  • De asemenea, acest lucru nu va funcționa pentru niciun tabel cu declanșatori. Trebuie să găsiți, să descărcați și să renunțați la declanșatori înainte de a muta tabelul, apoi să importați declanșatorii descărcați în baza de date țintă. –  > Por Olfan.
  • Link actualizat (adică funcțional) care documentează de ce RENAME DATABASE a fost eliminat: dev.mysql.com/worklog/task/?id=4030 –  > Por alexis.

Utilizați aceste câteva comenzi simple:

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

Sau pentru a reduce I/O folosiți următoarele, așa cum a sugerat @Pablo Marin-Garcia:

mysqladmin -u username -p create newdatabase
mysqldump -u username -v olddatabase -p | mysql -u username -p -D newdatabase

Comentarii

    94

  • După cum a spus OP, „[t]this is not an option for very big databases”. –  > Por pilcrow.
  • Nu uitați să eliminați baza de date originală –  > Por Pavel Radzivilovsky.
  • Un răspuns genial! Câteva sugestii pentru a îmbunătăți în continuare, deoarece acest lucru este probabil că este căutat pe Google de toate abilitățile: (1) Mutați fragmentul de cod al lui Pablo Marin-Garcia în partea de sus, deoarece pare a fi cel mai bun răspuns (2) Puneți -p<password> în loc de -p peste tot pentru ca declarațiile să ruleze fără să apară un prompt. –  > Por Steve Chambers.
  • Utilizând versiunea cu pipe, primesc două solicitări „Introduceți parola:”, astfel: Enter password: Enter password: Se pare că acceptă o parolă, dar nu ambele. Îmi scapă vreun detaliu? –  > Por Ryan.
  • 36

  • Sunt surprins că nimeni nu a menționat acest lucru, dar chiar ar trebui să adăugați --routines la comenzile mysqldump, pentru a vă asigura că procedurile stocate sunt copiate. –  > Por Carlos P.

Cred că soluția este mai simplă și a fost sugerată de unii dezvoltatori. phpMyAdmin are o operațiune pentru acest lucru.

Din phpMyAdmin, selectați baza de date pe care doriți să o selectați. În filele există una numită Operațiuni, mergeți la secțiunea de redenumire. Asta este tot.

Aceasta face, așa cum mulți au sugerat, creează o nouă bază de date cu noul nume, descarcă toate tabelele din vechea bază de date în noua bază de date și renunță la vechea bază de date.

Comentarii

    82

  • Presupunând că aveți chiar și php în mediul dumneavoastră sau că folosiți phpmyadmin. –  > Por Chris.
  • 28

  • Destul de periculos chiar dacă aveți phpMyAdmin – back-end-ul ar putea eșua în mijlocul procesului, lăsând cele două baze de date într-o stare necunoscută, sau ar putea dura foarte mult timp, ceea ce ar putea duce la blocarea front-end-ului sau la oprirea PHP. –  > Por mozboz.
  • 21

  • Este adevărat @mozboz, dar eu fac asta de 10 ani și nu am avut niciodată această problemă. Este la fel dacă executați comanda printr-un shell și calculatorul se blochează. Există o posibilitate, dar cât? 1 la 1 cvadrilion? –  > Por raphie.
  • 27

  • Un script prin consolă este de asemenea un front-end care se poate bloca cu aceleași probleme. –  > Por Greg.
  • Cu toate acestea, operațiunile prin consolă sunt mult mai fiabile decât PhpMyAdmin, mai ales atunci când sunt implicate baze de date mari, ceea ce este cazul OP-ului. Personal, aș sugera cu tărie orice metodă prin consolă mai degrabă decât PMA dacă aveți o bază de date rezonabil de mare. Inutil să mai spun că, în cazul bazelor de date mici, PMA este la fel de bună. –  > Por Teodor Sandu.

Puteți utiliza SQL pentru a genera un script SQL pentru a transfera fiecare tabel din baza de date sursă în baza de date de destinație.

Trebuie să creați baza de date de destinație înainte de a rula scriptul generat din comandă.

Puteți folosi oricare dintre aceste două scripturi (inițial l-am sugerat pe primul și cineva mi-a „îmbunătățit” răspunsul pentru a folosi GROUP_CONCAT. Alegeți, dar eu îl prefer pe cel original):

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

sau

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

($1 și $2 sunt sursa și, respectiv, destinația)

Aceasta va genera o comandă SQL pe care va trebui să o executați apoi.

Rețineți că GROUP_CONCAT are o limită de lungime implicită care poate fi depășită în cazul bazelor de date cu un număr mare de tabele. Puteți modifica această limită executând SET SESSION group_concat_max_len = 100000000; (sau un alt număr mare).

Comentarii

  • @BlakeFrederick Nu folosește RENAME DATABASE, deci care este problema? –  > Por tuxayo.
  • Funcționează dacă tabelul are constrângeri referențiale? Mă aștept să nu. –  > Por dolmen.

Emularea celor care lipsesc RENAME DATABASE în MySQL:

  1. Creați o nouă bază de date
  2. Creați interogările de redenumire cu:

    SELECT CONCAT('RENAME TABLE ',table_schema,'.',table_name,
        ' TO ','new_schema.',table_name,';')
    FROM information_schema.TABLES
    WHERE table_schema LIKE 'old_schema';
    
  3. Rulați această ieșire

  4. Ștergeți vechea bază de date

Acesta a fost preluat din Emularea comenzii RENAME DATABASE care lipsește în MySQL.

Comentarii

  • Perfect! Am testat acest lucru cu tabele InnoDB și MyISAM. Cea mai rapidă soluție pe care am testat-o (redenumirea tabelului este aproape instantanee, fără întârziere)! –  > Por Philipp.
  • Minunat! Amintiți-vă doar să reparați privilegiile după aceea. –  > Por farynaio.
  • ps. Mai bine faceți acest lucru înainte de a rula interogările de redenumire dacă lucrați pe o BD live. –  > Por farynaio.
  • Acest lucru funcționează dacă tabelul are constrângeri referențiale? Mă aștept să nu. –  > Por dolmen.

Puteți folosi acest script shell:

Referință: Cum să redenumiți o bază de date 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"

Funcționează:

$ sh rename_database.sh oldname newname

Comentarii

  • Aveți grijă cu asta. Dacă nu vă autentificați cu utilizatorul root, este posibil să aveți permisiuni limitate. Cauzând eșecul redenumirii, dar reușita renumirii, ceea ce duce la o bază de date abandonată. Altfel, un script frumos. –  > Por Lex.
  • Am adăugat set -e la începutul scriptului, ceea ce va face ca execuția să se încheie în caz de eșec și ar trebui să atenueze această problemă. –  > Por Mikkel.

Trei opțiuni:

  1. Crearea noii baze de date, oprirea serverului, mutarea fișierelor dintr-un dosar al bazei de date în celălalt și repornirea serverului. Rețineți că acest lucru va funcționa numai dacă TOATE tabelele dvs. sunt MyISAM.

  2. Creați noua bază de date, utilizați CREATE TABLE … LIKE, apoi utilizați instrucțiunile INSERT … SELECT * FROM.

  3. Folosiți mysqldump și reîncărcați cu fișierul respectiv.

Comentarii

  • + pentru referința myisam. Nu mi-am putut da seama de ce nu a funcționat pentru mine. –  > Por Christian Payne.
  • Întrebarea afirmă că acest lucru trebuie să funcționeze pentru InnoDB, nu pentru MyISAM –  > Por D-Rock.
  • @D-Rock spuneți-i asta lui Google, care aduce oamenii aici pe baza titlului. –  > Por jiggunjer.

Calea simplă

Schimbați în directorul bazei de date:

cd /var/lib/mysql/

Închideți MySQL… Acest lucru este important!

/etc/init.d/mysql stop

Bine, acest mod nu funcționează pentru bazele de date InnoDB sau BDB-Databases.

Redenumiți baza de date:

mv old-name new-name

…sau tabelul…

cd database/

mv old-name.frm new-name.frm

mv old-name.MYD new-name.MYD

mv old-name.MYI new-name.MYI

Reporniți MySQL

/etc/init.d/mysql start

Gata…

OK, acest mod nu funcționează cu bazele de date InnoDB sau BDB. În acest caz, trebuie să aruncați baza de date și să o reimportați.

Comentarii

    19

  • Redenumirea folderelor strică jucăriile. –  > Por ViniciusPires.
  • @Rahly, chiar dacă este setat un fișier pe tabel, tot este periculos, tabelele create înainte de a fi setat un fișier pe tabel vor avea probleme, cu excepția cazului în care știi sigur că baza de date este creată după ce a fost setat acest indicator. –  > Por Qian Chen.
  • Totuși, în general, majoritatea oamenilor își vor avea sistemele fie într-un fel, fie în altul, oamenii nu se vor întoarce la întâmplare pentru a decide dacă să aibă sau nu un tabel pe fișier. În plus, chiar și în scenariul tău, dacă tabelele au fost create înainte de steag, ele nu ar exista ca fișiere separate, deci mutarea nu ar funcționa și ar fi în continuare în siguranță, fără niciun pericol. Nu uitați că baza de date NU este în funcțiune atunci când are loc mutarea. –  > Por Rahly.
  • Echivalentul pentru mysql instalat cu homebrew pe 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 –  > Por coberlin.

Abia recent am dat peste o modalitate foarte bună de a face acest lucru, funcționează cu MyISAM și InnoDB și este foarte rapidă:

RENAME TABLE old_db.table TO new_db.table;

Nu-mi amintesc unde am citit-o, dar creditul îi aparține altcuiva, nu mie.

Comentarii

  • @ArkadijKuzhel nu cred că este așa. Cred că te referi la RENAME DATABASE. –  > Por Rob Grant.
  • Acest lucru a ajutat cu adevărat, am creat o nouă bază de date goală și apoi am folosit codul, toate tabelele au fost importate cu numele dorite. –  > Por JulyOrdinary.
  • Acest lucru suferă de aceeași problemă ca și răspunsul acceptat – „RENAME DATABASE s-a dovedit a fi periculos și a fost eliminat în MySQL 5.1.23” – from dev.mysql.com/doc/refman/5.1/en/rename-database.html – –  > Por Blake Frederick.

Cel mai simplu mod de a face un bullet-and-fool-proof de a face un completă redenumire (inclusiv renunțarea la vechea bază de date la sfârșit, astfel încât să fie mai degrabă o redenumire decât o copiere):

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

Pași:

  1. Copiați liniile în Notepad.
  2. Înlocuiți toate referințele la „olddbname”, „newdbname”, „mypassword” (+ opțional „root”) cu echivalentele dvs.
  3. Executați-le rând pe rând în linia de comandă (introducând „y” când vi se cere).

Comentarii

  • Evitați să adăugați parola dvs. în consolă, deoarece nu este sigură. Dacă ați făcut deja acest lucru, utilizați history -cw pentru a o elimina. În schimb, lăsați parola goală și introduceți-o după prompt. –  > Por Tommie C..
  • Durează anormal de mult, mai mult de 20 de minute fără să se termine. Se poate anula? –  > Por Sigu Magwa.

Iată ce folosesc eu:

$ 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;

Comentarii

  • Nu se poate face pentru baze de date uriașe. –  > Por mikesl.

Ei bine, există 2 metode:

Metoda 1: O metodă binecunoscută pentru redenumirea schemei bazei de date este prin descărcarea schemei folosind Mysqldump și restaurarea acesteia într-o altă schemă, iar apoi renunțarea la vechea schemă (dacă este necesar).

Din Shell

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

Deși metoda de mai sus este ușoară, este consumatoare de timp și spațiu. Ce se întâmplă dacă schema este mai mult de un 100GB? Există metode prin care puteți combina comenzile de mai sus pentru a economisi spațiu, însă nu veți economisi timp.

Pentru a remedia astfel de situații, există o altă metodă rapidă de redenumire a schemelor, însă trebuie să aveți grijă când o faceți.

Metoda 2: MySQL are o funcție foarte bună pentru redenumirea tabelelor, care funcționează chiar și între scheme diferite. Această operațiune de redenumire este atomică și nimeni altcineva nu poate accesa tabelul în timp ce acesta este redenumit. Această operațiune durează puțin timp, deoarece schimbarea numelui unui tabel sau a schemei sale este doar o modificare a metadatelor. Iată o abordare procedurală a redenumirii:

Creați noua schemă a bazei de date cu numele dorit.Redenumiți tabelele din vechea schemă în noua schemă, utilizând comanda „RENAME TABLE” a MySQL.Renumiți vechea schemă a bazei de date.If there are views, triggers, functions, stored procedures in the schema, those will need to be recreated too. Comanda „RENAME TABLE” a MySQL eșuează dacă există declanșatori pe tabele. Pentru a remedia acest lucru putem face următoarele lucruri :

1) Dump the triggers, events and stored routines in a separate file. Acest lucru se face folosind stegulețele -E, -R (în plus față de -t -d care descarcă declanșatoarele) la comanda mysqldump. Odată ce declanșatoarele sunt descărcate, va trebui să le eliminăm din schemă, pentru ca comanda RENAME TABLE să funcționeze.

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

2) Generați o listă numai cu tabelele „BASE”. Acestea pot fi găsite utilizând o interogare pe information_schema.TABLES table.

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

3) Aruncați vizualizările într-un fișier de ieșire. Vizualizările pot fi găsite folosind o interogare pe aceeași tabelă. information_schema.TABLES tabel.

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) Aruncați declanșatoarele pe tabelele curente din old_schema.

mysql> DROP TRIGGER <trigger_name>;
...

5) Restaurați fișierele de vidare de mai sus după ce toate tabelele „Base” găsite la pasul 2 sunt redenumite.

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

Intrigi cu metodele de mai sus : S-ar putea să fie nevoie să actualizăm GRANTS pentru utilizatori astfel încât să corespundă cu schema_name corectă. Acestea ar putea fi rezolvate cu un simplu UPDATE pe tabelele mysql.columns_priv, mysql.procs_priv, mysql.tables_priv, mysql.db, actualizând numele old_schema în new_schema și apelând „Flush privileges;”. Deși „metoda 2″ pare un pic mai complicată decât „metoda 1″, aceasta este complet scriptabilă. Un simplu script bash pentru a efectua pașii de mai sus în succesiunea corectă, vă poate ajuta să economisiți spațiu și timp la redenumirea schemelor bazei de date data viitoare.

Echipa Percona Remote DBA a scris un script numit „rename_db” care funcționează în felul următor :

[[email protected]~]# /tmp/rename_db
rename_db <server> <database> <new_database>

Pentru a demonstra utilizarea acestui script, am folosit o schemă de probă „emp”, am creat declanșatoare de test, rutine stocate pe această schemă. Se va încerca redenumirea schemei bazei de date cu ajutorul scriptului, care durează câteva secunde, spre deosebire de metoda de descărcare/restaurare care necesită mult timp.

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


[[email protected] ~]# 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               |
+--------------------+

După cum puteți vedea în rezultatul de mai sus, schema de bază de date „emp” a fost redenumită în „emp_test” în mai puțin de o secundă. În cele din urmă, Acesta este scriptul de la Percona care este utilizat mai sus pentru „metoda 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 $2G" -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 triggersG" | 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

Comentarii

  • Cum rămâne cu constrângerile referențiale? –  > Por dolmen.

MySQL nu suportă momentan redenumirea unei baze de date prin interfața de comandă, dar puteți redenumi baza de date dacă aveți acces la directorul în care MySQL își stochează bazele de date. În cazul instalațiilor MySQL implicite, acesta se află de obicei în directorul Data, sub directorul în care a fost instalat MySQL. Localizați numele bazei de date pe care doriți să o redenumiți în directorul Data și redenumiți-o. Redenumirea directorului ar putea cauza, totuși, unele probleme legate de permisiuni. Fiți atenți.

Notă: Trebuie să opriți MySQL înainte de a putea redenumi baza de date

V-aș recomanda să creați o nouă bază de date (folosind numele dorit) și să exportați/importați datele de care aveți nevoie din cea veche în cea nouă. Destul de simplu.

Pași :

  1. Apăsați http://localhost/phpmyadmin/
  2. Selectați BD-ul dvs.
  3. Faceți clic pe fila Operațiuni
  4. Va apărea o filă „Redenumiți baza de date în”. Adăugați un nou nume și verificați Adjust privileges.
  5. Faceți clic pe Go.

Comentarii

  • O soluție phpMyAdmin este, de obicei, o soluție slabă, deoarece unele medii au un mediu restricționat. –  > Por Daniel Antunes Pinto.
  • Nu este o soluție „bună”, dar mulțumesc totuși, deoarece era ceea ce căutam. –  > Por jamie.
  • Vă rugăm să votați în sus dacă este de lucru pentru tine … va ajuta .. mulțumesc – –  > Por Shubham Jain.
  • Acest lucru funcționează pentru mine, în mediul phpMyAdmin, +1 –  > Por William.

Atunci când redenumiți o bază de date în PHPMyAdmin, aceasta creează un dump, apoi renunță și recreează baza de date cu noul nume.

Comentarii

  • Rețineți că această funcție este puțin ascunsă în fila „Operațiuni”, când faceți clic pe baza de date. –  > Por Maris B..

Pentru cei care sunt utilizatori de Mac, Sequel Pro are o opțiune Rename Database în meniul Database.http://www.sequelpro.com/

Comentarii

  • Aveți grijă la această opțiune dacă aveți vizualizări sau declanșatoare în baza de date. În spatele acestei opțiuni de meniu se află un script care va crea o nouă bază de date și va muta toate tabelele. Acest lucru nu va funcționa pentru vizualizări sau declanșatoare, astfel încât acestea vor rămâne în vechea bază de date. Rezultatul este două baze de date stricate care trebuie reparate. –  > Por Olfan.

Cele mai multe dintre răspunsurile de aici sunt greșite din unul din două motive:

  1. Nu puteți folosi doar RENAME TABLE, deoarece ar putea exista vizualizări și declanșatori. Dacă există declanșatoare, RENAME TABLE eșuează.
  2. Nu poți folosi mysqldump dacă vrei să redenumești „rapid” (așa cum se cere în întrebare) o bază de date mare

Percona are o postare pe blog despre cum să faceți bine acest lucru:https://www.percona.com/blog/2013/12/24/renaming-database-schema-mysql/

și un script postat (realizat?) de Simon R Jones care face ceea ce este sugerat în acea postare. Am corectat o eroare pe care am găsit-o în script. Îl puteți vedea aici:

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

Iată o copie a acestuia:

#!/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 triggersG" | 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

Salvați-l într-un fișier numit rename_db și faceți scriptul executabil cu chmod +x rename_db apoi utilizați-l ca ./rename_db localhost old_db new_db

Comentarii

  • Îmi place acest script, este aproape universal. Cu toate acestea, nu a reușit să proceseze un caz în care există mai multe VIEW-uri înlănțuite în care definer nu este root. –  > Por ENargit.

Este posibil să redenumiți toate tabelele dintr-o bază de date pentru a fi sub o altă bază de date, fără a fi nevoie să faceți un dump și o restaurare completă.

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

Cu toate acestea, toate declanșatoarele din baza de date țintă nu vor fi mulțumite. Va trebui să le eliminați mai întâi și apoi să le recreați după redenumire.

mysql -uroot -e "call mysql.rename_db('test', 'blah2');" | mysql -uroot
ERROR 1435 (HY000) at line 4: Trigger in wrong schema

Comentarii

  • o mică modificare care face ca acest lucru să funcționeze cu mysql 5.x mysql --batch-uroot -e "call mysql.rename_db('test', 'blah2');" | mysql -uroot Observați că trebuie să folosiți –batch pentru a schimba formatarea în formatare brută, care produce rezultatele cu formatare zero. –  > Por mikesl.

Iată un fișier batch pe care l-am scris pentru a-l automatiza din linia de comandă, dar pentru Windows/MS-DOS.

Sintaxa este rename_mysqldb database newdatabase -u [user] -p[password].

:: ***************************************************************************
:: 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 MySQLbin 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=

Procedura stocată a lui TodoInTX nu prea a funcționat pentru mine. Iată ce am încercat eu să fac:

-- 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 ;

Comentarii

  • Aceasta va funcționa numai pentru tabele și numai dacă aceste tabele nu au niciun declanșator. Vizualizările și declanșatoarele nu vor fi mutate de aceasta. –  > Por Olfan.

Cea mai simplă metodă este să folosiți software-ul HeidiSQL. Este gratuit și open source. Rulează pe Windows și pe orice Linux cu Wine (rulează aplicații Windows pe Linux, BSD, Solaris și Mac OS X).

Pentru a descărca HeidiSQL, accesați http://www.heidisql.com/download.php.

Pentru a descărca Wine, accesați http://www.winehq.org/.

Pentru a redenumi o bază de date în HeidiSQL, faceți clic dreapta pe numele bazei de date și selectați „Edit” (Editare). Apoi introduceți un nou nume și apăsați „OK”.

Este atât de simplu.

Comentarii

  • Dacă are proceduri stocate, nu poate fi redenumită. –  > Por abksharma.
  • @abksharma De fapt, veți primi un mesaj Database "database_name" contains stored routine(s) which cannot be moved. Declanșatoarele (cel puțin pentru baza de date MariDB) sunt socotite ca fiind proceduri stocate. Eu nu aveam proceduri stocate, dar nu am putut redenumi baza de date până când nu am renunțat la toate triggerele. –  > Por izogfif.

Se pare că nimeni nu a menționat acest lucru, dar iată o altă modalitate:

create database NewDatabaseName like OldDatabaseName;

atunci pentru fiecare tabel, faceți:

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

apoi, dacă doriți să,

drop database OldDatabaseName;

Această abordare ar avea avantajul de a face întregul transfer pe server cu un trafic de rețea aproape zero, deci va merge mult mai repede decât un dump/restore.

Dacă aveți proceduri stocate/vizualizări/etc., poate doriți să le transferați și pe acestea.

Comentarii

  • Din câte știu eu, versiunea 5.x nu acceptă cuvântul cheie „like” în create database declarație? De unde ați luat asta? –  > Por Dragas.
  • Aici este linkul pentru create table like sintaxă: dev.mysql.com/doc/refman/5.7/en/create-table-like.html . În ceea ce privește create database like, se pare că MySQL a renunțat la această clauză de când. –  > Por Tuncay Göncüoğlu.

Am pus o întrebare pe Server Fault încercând să evit timpul de nefuncționare la restaurarea bazelor de date foarte mari prin utilizarea MySQL Proxy. Nu am avut niciun succes, dar mi-am dat seama că, în cele din urmă, ceea ce doream era funcționalitatea RENAME DATABASE, deoarece dump/import nu era o opțiune din cauza dimensiunii bazei noastre de date.

Există o funcționalitate RENAME TABLE încorporată în MySQL, așa că am ajuns să scriu un script Python simplu care să facă treaba pentru mine. Am postat pe GitHub în cazul în care ar putea fi de folos și altora.

Comentarii

Pentru confortul dumneavoastră, mai jos este un mic shellscript care trebuie executat cu doi parametri: db-name și new db-name.

S-ar putea să fie nevoie să adăugați parametrii de conectare la liniile mysql dacă nu folosiți fișierul .my.cnf din directorul dvs. personal. Vă rugăm să faceți o copie de rezervă înainte de a executa acest script.


#!/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"

Comentarii

  • De asemenea, acesta nu va funcționa pentru tabelele cu triggere atașate sau pentru vizualizările care nu pot fi redenumite în alte baze de date. –  > Por Olfan.

Pentru utilizatorii de mac, puteți folosi Sequel Pro (gratuit), care oferă doar opțiunea de redenumire a bazelor de date. Deși nu șterge vechea bază de date.

o dată ce deschideți BD relevantă, faceți clic: Database –> Rename database...

Comentarii

  • Uneori lasă în viață vechea BD, dar este goală. Cu toate acestea, dacă face o copie, puteți face o copie și o puteți șterge pe cea veche, sunt încă 2 pași simpli. –  > Por Roee Gavirel.
  • My stored procedures și views nu au fost copiate odată cu redenumirea –  > Por Wayne.

Iată o modalitate rapidă de a genera un script sql de redenumire, dacă aveți multe tabele de mutat.

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' ;

Comentarii

  • Arată bine, dar acest lucru nu mută procedurile stocate sau vizualizările. –  > Por davidpricedev.
  • probabil că ar trebui să adăugați semne de hash pentru a înfășura numele tabelului și numele schemei –  > Por Funkodebat.

ALTER DATABASE este modalitatea propusă de MySQL și RENAME DATABASE este abandonată.

De la 13.1.32 Sintaxa RENAME DATABASE:

RENAME {DATABASE | SCHEMA} db_name TO new_db_name;

Această instrucțiune a fost adăugată în MySQL 5.1.7, dar s-a constatat că este periculoasă și a fost eliminată în MySQL 5.1.23.

Comentarii

  • Aveți vreun exemplu de sintaxă? Nu cunosc nicio modalitate de a utiliza alter database pentru a redenumi baza de date în sine, iar documentația la care ați făcut legătura nu sugerează că este posibil să o faceți. –  > Por Jordan.
  • @Jordan Aș fi și eu interesat. Am încercat și am încercat și am aflat, că funcționează doar cu versiunea > 5.1, dar nu pot actualiza acum. –  > Por fancyPants.
  • -1: Pentru că ai scris despre căile propuse, apoi ai dat un exemplu de cale nepropusă, în timp ce lipsește cu desăvârșire să arăți măcar un exemplu. –  > Por hakre.
  • Acest lucru este greșit. Documentația bazei de date de redenumire MySQL spune că rename_database a fost destinat unei sarcini foarte specifice de redenumire (nu cazului general de redenumire a bazei de date), care este acum gestionată cu alter database: ‘Pentru a efectua sarcina de actualizare a numelor bazelor de date cu noua codificare, utilizați în schimb ALTER DATABASE db_name UPGRADE DATA DIRECTORY NAME’ Nu puteți utiliza acest lucru pentru a redenumi baza de date așa cum doriți, nu există nici măcar un loc pentru noul nume db în această comandă! –  > Por Kanat Bolazar.

În MySQL Administrator faceți următoarele:

  1. Sub Catalogs (Cataloage), creați o nouă schemă de bază de date.
  2. Mergeți la Backup și creați o copie de siguranță a vechii scheme.
  3. Executați copia de rezervă.
  4. Mergeți la Restore și deschideți fișierul creat la pasul 3.
  5. Selectați „Another Schema” (Altă schemă) la TargetSchema (Schemă țintă) și selectați noua schemă de baze de date.
  6. Începeți restaurarea.
  7. Verificați noua schemă și, dacă arată bine, ștergeți-o pe cea veche.

Comentarii

  • Administratorul MySQL nu poate gestiona baze de date mari și nu există nimic rapid în acest sens –  > Por deadprogrammer.

în phpmyadmin puteți redenumi cu ușurință baza de date

select database 

  goto operations tab

  in that rename Database to :

  type your new database name and click go

cereți să renunțați la vechea tabelă și să reîncărcați datele din tabel, faceți clic pe OK în ambele cazuri

Baza de date este redenumită

Dacă utilizați phpMyAdmin puteți merge la fila „operations” (operațiuni) după ce ați selectat baza de date pe care doriți să o redenumiți. Apoi mergeți la ultima secțiune „copy database to” (sau ceva de genul acesta), dați un nume și selectați opțiunile de mai jos. În acest caz, bănuiesc că trebuie să bifați căsuțele „structure and data” și „create database before copying” și, în final, apăsați butonul „go” din secțiunea respectivă.

Apropo, eu folosesc phpMyAdmin în limba spaniolă, așa că nu sunt sigur care sunt denumirile secțiunilor în engleză.

Iată un fragment Bash de o singură linie pentru a muta toate tabelele dintr-o schemă în alta:

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

Comanda history de la început se asigură pur și simplu că comenzile MySQL care conțin parole nu sunt salvate în istoricul shell-ului.

Asigurați-vă că db_user are permisiuni de citire/scriere/scoatere pe vechea schemă și permisiuni de citire/scriere/creare pe noua schemă.

Eu am procedat în felul următor: Faceți o copie de rezervă a bazei de date existente. Aceasta vă va oferi un fișier db.zip.tmp și apoi, în promptul de comandă, scrieți următoarele

„C:Program Files (x86)MySQLMySQL Server 5.6binmysql.exe” -h localhost -u root -p[parola] [noul nume al bazei de date] < „C:Backupsdb.zip.tmp”

Există un motiv pentru care nu puteți face acest lucru. (în ciuda tuturor încercărilor de răspuns)

  • Răspunsurile de bază vor funcționa în multe cazuri, iar în altele vor cauza corupții de date.
  • Trebuie aleasă o strategie bazată pe o analiză euristică a bazei de date.
  • Acesta este motivul pentru care această caracteristică a fost implementată și apoi eliminată. [doc]

Va trebui să aruncați toate tipurile de obiecte din acea bază de date, creați o bază de date nou numită și apoi importați descărcarea. Dacă este vorba de un sistem live, va trebui să îl dezactivați. Dacă nu puteți, atunci va trebui să configurați replicarea de la această bază de date la cea nouă.

Dacă doriți să vedeți comenzile care ar putea face acest lucru, @satishD are detalii, care transmit unele dintre provocările în jurul cărora va trebui să construiți o strategie care să se potrivească cu baza de date țintă.

Acest lucru funcționează pentru toate bazele de date și funcționează prin redenumirea fiecărei tabele cu maatkit mysql toolkit

Folosiți mk-find pentru a imprima și redenumi fiecare tabel. Site-ul pagina de manual are multe alte opțiuni și exemple

mk-find --dblike OLD_DATABASE --print --exec "RENAME TABLE %D.%N TO NEW_DATABASE.%N"

Dacă aveți instalat maatkit (ceea ce este foarte ușor), atunci acesta este cel mai simplu mod de a face acest lucru.

Puteți face acest lucru în două moduri.

  1. RENAME TABLE old_db.table_name TO new_db.table_name;
  2. Goto operations-> acolo puteți vedea fila Table options. puteți edita numele tabelului acolo.

Acesta este scriptul batch pe care l-am scris pentru redenumirea unei baze de date pe Windows:

@echo off
set olddb=olddbname
set newdb=newdbname
SET count=1
SET act=mysql -uroot -e "select table_name from information_schema.tables where table_schema='%olddb%'"
mysql -uroot -e "create database %newdb%"
echo %act%
 FOR /f "tokens=*" %%G IN ('%act%') DO (
  REM echo %count%:%%G
  echo mysql -uroot -e "RENAME TABLE %olddb%.%%G to %newdb%.%%G"
  mysql -uroot -e "RENAME TABLE %olddb%.%%G to %newdb%.%%G"
  set /a count+=1
 )
mysql -uroot -e "drop database %olddb%"

Nici soluția lui TodoInTx, nici soluția adaptată de user757945 nu au funcționat pentru mine pe MySQL 5.5.16, așa că iată versiunea mea adaptată:

DELIMITER //
DROP PROCEDURE IF EXISTS `rename_database`;
CREATE PROCEDURE `rename_database` (IN `old_name` VARCHAR(20), IN `new_name` VARCHAR(20))
BEGIN
  DECLARE `current_table_name` VARCHAR(20);
  DECLARE `done` INT DEFAULT 0;
  DECLARE `table_name_cursor` CURSOR FOR SELECT `table_name` FROM `information_schema`.`tables` WHERE (`table_schema` = `old_name`);
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET `done` = 1;

  SET @sql_string = CONCAT('CREATE DATABASE IF NOT EXISTS `', `new_name` , '`;');
  PREPARE `statement` FROM @sql_string;
  EXECUTE `statement`;
  DEALLOCATE PREPARE `statement`;

  OPEN `table_name_cursor`;
  REPEAT
    FETCH `table_name_cursor` INTO `current_table_name`;
    IF NOT `done` THEN

      SET @sql_string = CONCAT('RENAME TABLE `', `old_name`, '`.`', `current_table_name`, '` TO `', `new_name`, '`.`', `current_table_name`, '`;');
      PREPARE `statement` FROM @sql_string;
      EXECUTE `statement`;
      DEALLOCATE PREPARE `statement`;

    END IF;
  UNTIL `done` END REPEAT;
  CLOSE `table_name_cursor`;

  SET @sql_string =  CONCAT('DROP DATABASE `', `old_name`, '`;');
  PREPARE `statement` FROM @sql_string;
  EXECUTE `statement`;
  DEALLOCATE PREPARE `statement`;
END//
DELIMITER ;

Sper să ajute pe cineva care se află în situația mea! Notă: @sql_string va persista în sesiune după aceea. Nu am reușit să scriu această funcție fără să o folosesc.

Am folosit următoarea metodă pentru a redenumi baza de date

  1. faceți o copie de rezervă a fișierului folosind mysqldump sau orice instrument DB, de exemplu heidiSQL,mysql administrator etc.

  2. deschideți fișierul de rezervă (de exemplu, backupfile.sql) în vreun editor de text.

  3. Căutați și înlocuiți numele bazei de date și salvați fișierul.

4.Restaurați fișierul sql editat

Dacă folosiți vizualizări ierarhice (vizualizări care extrag date din alte vizualizări), este posibil ca importul rezultatului brut din mysqldump să nu funcționeze, deoarece mysqldump nu se preocupă de ordinea corectă a vizualizărilor. Din acest motiv, eu am scris un script care reordonează vizualizările în ordinea corectă din mers.

Acesta arată în felul următor:

#!/usr/bin/env perl

use List::MoreUtils 'first_index'; #apt package liblist-moreutils-perl
use strict;
use warnings;


my $views_sql;

while (<>) {
    $views_sql .= $_ if $views_sql or index($_, 'Final view structure') != -1;
    print $_ if !$views_sql;
}

my @views_regex_result = ($views_sql =~ /(-- Final view structure.+?
--

.+?

)/msg);
my @views = (join("", @views_regex_result) =~ /-- Final view structure for view `(.+?)`/g);
my $new_views_section = "";
while (@views) {
    foreach my $view (@views_regex_result) {
        my $view_body = ($view =~ //*.+?VIEW .+ AS (select .+)*/;/g )[0];
        my $found = 0;
        foreach my $view (@views) {
            if ($view_body =~ /(from|join)[ (]+`$view`/) {
                $found = $view;
                last;
            }
        }
        if (!$found) {
            print $view;
            my $name_of_view_which_was_not_found = ($view =~ /-- Final view structure for view `(.+?)`/g)[0];
            my $index = first_index { $_ eq $name_of_view_which_was_not_found } @views;
            if ($index != -1) {
                splice(@views, $index, 1);
                splice(@views_regex_result, $index, 1);
            }
        }
    }
}

Utilizare:
mysqldump -u username -v olddatabase -p | ./mysqldump_view_reorder.pl | mysql -u username -p -D newdatabase

În cazul în care porniți de la un fișier vidat cu mai multe baze de date, puteți efectua un sed pe acest fișier vidat:

sed -i -- "s|old_name_database1|new_name_database1|g" my_dump.sql
sed -i -- "s|old_name_database2|new_name_database2|g" my_dump.sql
...

Apoi importați fișierul de descărcare. Asigurați-vă doar că nu va exista niciun conflict de nume.

Comentarii

  • …și dacă numele vechii baze de date este prezent în orice valoare de tip șir de caractere din date, veți fi distrus și datele. ouch. –  > Por Tuncay Göncüoğlu.

Am postat acest articol Cum schimb numele bazei de date folosind MySQL? astăzi după zile întregi de zgâriat capul și tras de păr. soluția este destul de simplă exportați o schemă într-un fișier .sql și deschideți fișierul și schimbați numele bazei de date/schemei în secțiunea sql CREAT TABLE din partea de sus. Există trei instanțe sau mai multe și este posibil să nu fie în partea de sus a paginii dacă sunt salvate mai multe scheme în fișier.Este posibil să editați întreaga bază de date în acest fel, dar mă aștept ca în bazele de date mari să fie destul de dificil să urmăriți toate instanțele unei proprietăți sau ale unui indice de tabel.

I).Nu există o modalitate directă prin care să puteți schimba numele unei baze de date existente, dar vă puteți atinge obiectivul urmând pașii de mai jos:-1). Creați newdb.2). Folosiți newdb.3). creați tabelul nume_tabel(select * from olddb.nume_tabel);

Făcând cele de mai sus, copiați datele din tabelul din olddb și le introduceți în tabelul newdb. Dați același nume tabelului.

II). RENUMIREA TABELULUI old_db.nume_tabel în new_db.nume_tabel;

O să mă împușcați pentru asta și, cel mai probabil, nu va funcționa de fiecare dată și, sigur, este împotriva oricărei logici, bla bla bla… Dar ceea ce am încercat este… STOP motorul MySQL, m-am logat ca root și pur și simplu am redenumit BD-ul pe sistemul de fișiere level….

Eu sunt pe OSX, și am schimbat doar cazul, din bedbf în BEDBF. Spre surprinderea mea, a funcționat…

Nu aș recomanda acest lucru pe o BD de producție. Am încercat doar ca un experiment…

Mult noroc în orice caz 🙂

Comentarii

  • Multiple motive pentru care acesta este un răspuns teribil, deja discutate pe această pagină. –  > Por gwideman.
UPDATE `db`SET Db = 'new_db_name' where Db = 'old_db_name';

Comentarii

  • Acest lucru nu funcționează. –  > Por FlyingZebra1.

Există deja multe răspunsuri foarte bune aici, dar nu văd o versiune PHP. Acest lucru copiază un DB de 800M în aproximativ o secundă.

$oldDbName = "oldDBName";
$newDbName = "newDBName";
$oldDB     = new mysqli("localhost", "user", "pass", $oldDbName);
if($oldDB->connect_errno){
    echo "Failed to connect to MySQL: (" . $oldDB->connect_errno . ") " . $oldDB->connect_error;
    exit;
}
$newDBQuery = "CREATE DATABASE IF NOT EXISTS {$newDbName}";
$oldDB->query($newDBQuery);
$newDB = new mysqli("localhost", "user", "pass");
if($newDB->connect_errno){
    echo "Failed to connect to MySQL: (" . $newDB->connect_errno . ") " . $newDB->connect_error;
    exit;
}

$tableQuery  = "SHOW TABLES";
$tableResult = $oldDB->query($tableQuery);
$renameQuery = "RENAME TABLE
";
while($table = $tableResult->fetch_array()){
    $tableName = $table["Tables_in_{$oldDbName}"];
    $renameQuery .= "{$oldDbName}.{$tableName} TO {$newDbName}.{$tableName},";
}
$renameQuery = substr($renameQuery, 0, strlen($renameQuery) - 1);
$newDB->query($renameQuery);

Într-adevăr, cel mai simplu răspuns este să exportați vechea bază de date, apoi să o importați în cea nouă pe care ați creat-o pentru a o înlocui pe cea veche. Desigur, ar trebui să folosiți phpMyAdmin sau linia de comandă pentru a face acest lucru.

Redenumirea și modificarea bazei de date este o idee proastă! NU O FACEȚI. (Cu excepția cazului în care nu sunteți „tipul de hacker” care stă în subsolul mamei dvs. în întuneric și mănâncă pizza dormind în timpul zilei).

Vă veți trezi cu mai multe probleme și mai multă muncă decât vă doriți.

Așadar,

  1. Creați o bază de date new_database și denumiți-o în mod corect.
  2. Mergeți la phpMyAdmin și deschideți baza de date pe care doriți să o exportați.
  3. Exportați-o (verificați opțiunile, dar ar trebui să fiți în regulă cu valorile implicite.
  4. Veți obține un fișier asemănător sau similar cu acesta.
  5. Extensia acestui fișier este .sql

    — phpMyAdmin SQL Dump– versiunea 3.2.4

    http://www.phpmyadmin.net

    — Host: localhost– Generation Time: Jun 30, 2010 la 12:17 PM– Versiunea serverului: 5.0.90– Versiunea PHP: 5.2.6

    SET SQL_MODE=”NO_AUTO_VALUE_ON_ZERO”;

    /*!40101 SET @[email protected]@CHARACTER_SET_CLIENT /;/!40101 SET @[email protected]@CHARACTER_SET_RESULTS /;/!40101 SET @[email protected]@COLLATION_CONNECTION /;/!40101 SET NAMES utf8 */;

    — Baza de date: mydatab_online


    — Structura tabelului pentru tabelul user

    CREEAZĂ TABELUL DACĂ NU EXISTĂ user ( timestamp int(15) NOT NULL default ‘0’, ip varchar(40) NOT NULL default ”, file varchar(100) NOT NULL default ”, PRIMARY KEY (timestamp), KEY ip (ip), KEY file (file)) ENGINE=MyISAM DEFAULT CHARSET=latin1;

    — Descărcarea datelor pentru tabel user

    INSERT INTO user (timestamp, ip, file) VALUES(1277911052, ‘999.236.177.116’, ”),(1277911194, ‘999.236.177.116’, ”);

Acesta va fi fișierul dvs. .sql. Cel pe care tocmai l-ați exportat.

Găsiți-l pe hard-disk; de obicei se află în /temp. Selectați baza de date goală care are numele corect (motivul pentru care citiți acest lucru).SAY: Import – GO

Conectați programul dvs. la baza de date corectă, introducând-o în ceea ce de obicei este un fișier configuration.php. Actualizați serverul (atât. De ce? Pentru că sunt un utilizator UNIX oldtimerși am spus-o. Acum, ar trebui să fiți în formă bună. Dacă aveți alte întrebări, vizitați-mă pe web.

Cel mai simplu dintre toate, deschideți MYSQL >> SELECT DB al cărui nume doriți să-l schimbați >> Faceți clic pe „operațiune” apoi puneți Noul nume în câmpul „Rename database to:” (Redenumiți baza de date în:) apoi faceți clic pe „Go” butonul

Simplu!

Comentarii

  • Este evident că vă referiți la un instrument de gestionare GUI. Ar fi de ajutor dacă ați spune despre ce este vorba. –  > Por phils.
  • Cred că este o soluție bună. Deși întrebarea mea este cum să adaug baza de date externă în phpmyadmin. Adică cum să gestionez mai multe instanțe mysql într-un singur site phpmyadmin. –  > Por truease.com.

Dacă utilizați phpMyAdmin atunci trebuie doar să mergeți la mysql din xamp, închideți phpMyAdmin și redenumiți folderul pe care îl vedeți acolo ca fiind numele bazei de date și reporniți phpMyAdmin. Puteți vedea că baza de date a fost redenumită.

Metoda simplă

ALTER DATABASE `oldName` MODIFY NAME = `newName`;

sau puteți folosi generatorul sql online

Comentarii

  • nu există MODIFY NAME în mysql –  > Por Asmir Mustafic.