Bir MySQL veritabanını hızlı bir şekilde nasıl yeniden adlandırabilirim (şema adını değiştirebilirim)?


959

MySQL kılavuzu MySQL bu kapsar.

Genellikle veritabanını döküp yeni bir adla yeniden içe aktarırım. Bu, çok büyük veritabanları için bir seçenek değildir. Görünüşe göre RENAME {DATABASE | SCHEMA} db_name TO new_db_name; kötü şeyler yapıyor, sadece birkaç sürümde var ve genel olarak kötü bir fikir .

İle çalışmalarına Bu ihtiyaçlar InnoDb daha çok farklı şeyler saklar, MyISAM .



5
Bu ifade RENAME DATABASE Sözdizimi MySQL 5.1.7'de eklendi, ancak tehlikeli olduğu bulundu ve MySQL 5.1.23'te kaldırıldı.
zloctb

11
Umarım MySQL, RENAME DATABASEşu anda bu görevi yapmanın kolay bir yolu olmadığından, tehlikesi olmayan yeni, çalışan bir ifade uygulayacaktır . Dokümantasyonda tehlikeli olmasının açık bir nedeni yoktur, bu yüzden bir değişiklik yapabilmeleri gerekir. En azından insanlar web sitelerine özellik isteği hataları koydu. Örneğin, bugs.mysql.com/bug.php?id=58593 ve bugs.mysql.com/bug.php?id=1698 .
Edward

bağlantılar şimdi bozuldu ...
oldboy

Yanıtlar:


833

İçin InnoDB , şu işe görünüyor: o zaman yeni veritabanına sırayla her tabloyu yeniden adlandırmak, yeni boş bir veritabanı oluşturun:

RENAME TABLE old_db.table TO new_db.table;

Bundan sonra izinleri ayarlamanız gerekecektir.

Kabukta komut dosyası oluşturmak için aşağıdakilerden birini kullanabilirsiniz:

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

VEYA

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;

Notlar:

  • Seçenek -pile şifre arasında boşluk yoktur . Veritabanınızın şifresi yoksa -u username -ppasswordparçayı kaldırın .
  • Bazı tabloların tetikleyicisi varsa, yukarıdaki yöntem kullanılarak başka bir veritabanına taşınamaz ( Trigger in wrong schemahataya neden olur ). Bu durumda, bir veritabanını klonlamak için geleneksel bir yol kullanın ve ardından eskisini bırakın:

    mysqldump old_db | mysql new_db

  • Saklı yordamlarınız varsa, daha sonra bunları kopyalayabilirsiniz:

    mysqldump -R old_db | mysql new_db


26
Ben sadece file_per_table ayarını kullanarak 30 + tabloları ile bir InnoDB veritabanı ile yaptım ve bazı tablolar 3 milyon milyon satır olmasına rağmen, <1 saniye içinde tamamlandı. Daha karmaşık bir şey yapmak yerine dosyaları depoya taşımak gibi görünüyor ... mümkünse +2 :)
Dave Rix

87
"RENAME DATABASE'in tehlikeli olduğu bulundu ve MySQL 5.1.23 sürümünde
Palani

13
Bunun görünümler için çalışmayacağını lütfen unutmayın. Bir veritabanından diğerine atlamak için görünümleri yeniden adlandıramazsınız. Kullanın DROP VIEWve CREATE VIEWbunun yerine. Beceriksiz, evet. Önce mysqldumptüm tabloları taşıdıktan sonra, görünümleri taşımak için a yapmak isteyebilirsiniz . Ayrıca SHOW TABLEStabloları ve görünümleri gösterecektir, bu yüzden dikkat edin.
tuomassalo

9
Ayrıca bu, tetikleyici içeren herhangi bir tablo için çalışmaz. Tabloyu taşımadan önce tetikleyicileri bulmanız, boşaltmanız ve bırakmanız, ardından damperli tetikleyicileri hedef db'ye aktarmanız gerekir.
Olfan

5
Neden RENAME DATABASEkaldırıldığını belgeleyen güncelleme (yani çalışıyor) bağlantısı : dev.mysql.com/worklog/task/?id=4030
alexis

443

Bu birkaç basit komutu kullanın:

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

Veya G / Ç'yi azaltmak için @Pablo Marin-Garcia tarafından önerildiği gibi aşağıdakileri kullanın:

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

86
OP'nin dediği gibi, "çok büyük veritabanları için bir seçenek değil."
pilc

3
Orijinal veritabanını DROP yapmayı unutmayın
Pavel Radzivilovsky

3
Mükemmel cevap! Önerilerin Çift ayrıca bu muhtemelen tüm yeteneklerini tarafından googled ediliyor olarak geliştirmek için: (1) en iyi cevap (2) göründüğü gibi koy üstüne Pablo Marin-Garcia'nın kod parçası Taşı -p<password>yerine -pböylece ifadeleri görünen bir istem olmadan çalıştırmak her yerde .
Steve Chambers

9
Borulu sürümü kullanarak iki "Parola girin:" istemi Enter password: Enter password: alıyorum: Bir parola alıyor gibi görünüyor, ama her ikisini birden değil. Bir ayrıntıyı kaçırıyor muyum?
Ryan

33
Kimsenin bundan bahsetmediğine şaşırdım, ancak --routinessaklı yordamların kopyalandığından emin olmak için bayrağı mysqldump komutlarına da eklemelisiniz .
Carlos P

205

Çözümün daha basit olduğunu ve bazı geliştiriciler tarafından önerildiğini düşünüyorum. phpMyAdmin bunun için bir işlem gerçekleştirir.

PhpMyAdmin'den, seçmek istediğiniz veritabanını seçin. Sekmelerde, İşlemler adlı bir tane var, yeniden adlandırma bölümüne gidin. Bu kadar.

Birçoklarının önerdiği gibi, yeni adla yeni bir veritabanı oluşturur, eski veritabanının tüm tablolarını yeni veritabanına dökür ve eski veritabanını bırakır.

Resim açıklamasını buraya girin


76
Hatta ortamınızda php var varsayalım veya phpmyadmin kullanın.
Chris

26
PhpMyAdmin'iniz olsa bile oldukça tehlikeli - arka uç, iki dbs'yi bilinmeyen bir durumda bırakarak orta işlemde başarısız olabilir veya çok uzun zaman alabilir ve ön uç asılı veya PHP zaman aşımına yol açabilir.
mozboz

20
Bu @mozboz için doğru, ama bunu 10 yıldır yaptım ve bu problemi hiç yaşamadım. Komutu bir kabuk aracılığıyla çalıştırıyorsanız ve bilgisayarınız çökerse de aynıdır. Bir olasılık var ama ne? 1 ila 1 katrilyon?
raphie

24
Konsol üzerinden bir komut dosyası da aynı sorunlara sahip bir ön uçtur.
Greg

11
Ancak konsol işlemleri, özellikle OP'nin durumu olan büyük veritabanlarının yer aldığı PhpMyAdmin'den çok daha güvenilirdir. Oldukça büyük bir veritabanı varsa Şahsen ben PMA yerine herhangi bir konsol yöntemi öneririm. Söylemeye gerek yok, küçük veritabanlarında PMA da aynı derecede iyidir.
Teodor Sandu

107

Kaynak veritabanınızdaki her tabloyu hedef veritabanına aktarmak üzere bir SQL komut dosyası oluşturmak için SQL'i kullanabilirsiniz.

Komuttan oluşturulan komut dosyasını çalıştırmadan önce hedef veritabanını oluşturmanız gerekir.

Bu iki komut dosyasından birini kullanabilirsiniz GROUP_CONCAT.

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

veya

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

($ 1 ve $ 2 sırasıyla kaynak ve hedeftir)

Bu, daha sonra çalıştırmanız gereken bir SQL komutu oluşturur.

GROUP_CONCATÇok sayıda tablo içeren veritabanları için aşılabilecek varsayılan uzunluk sınırına sahip olduğunu unutmayın . Bu sınırı çalıştırarak SET SESSION group_concat_max_len = 100000000;(veya başka bir büyük sayıyla) değiştirebilirsiniz.


@BlakeFrederick RENAME DATABASE kullanmıyor, sorun ne?
tuxayo

Tablonun referans kısıtlamaları varsa bu işe yarar mı? Beklemiyorum.
dolmen

42

MySQL'de eksik RENAME DATABASEkomutu taklit etmek :

  1. Yeni bir veritabanı oluşturun
  2. Şununla yeniden adlandırma sorguları oluşturun:

    SELECT CONCAT('RENAME TABLE ',table_schema,'.',table_name,
        ' TO ','new_schema.',table_name,';')
    FROM information_schema.TABLES
    WHERE table_schema LIKE 'old_schema';
  3. Bu çıktıyı çalıştır

  4. Eski veritabanını sil

MySQL'de Eksik RENAME DATABASE Komutunun Öykünmesi'nden alınmıştır .


1
Mükemmel! Bunu InnoDB ve MyISAM tablolarıyla test ettim. Test ettiğim en hızlı çözüm (tabloyu yeniden adlandırmak neredeyse anında, gecikme yok)!
Philipp

Harika! Daha sonra ayrıcalıkları düzeltmeyi unutmayın.
Adam Faryna

ps. Canlı DB üzerinde çalışıyorsanız, yeniden adlandırma sorgularını çalıştırmadan önce bunu daha iyi yapın.
Adam Faryna

Tablonun referans kısıtlamaları varsa bu işe yarar mı? Beklemiyorum.
dolmen

24

Üç seçenek:

  1. Yeni veritabanını oluşturun, sunucuyu indirin, dosyaları bir veritabanı klasöründen diğerine taşıyın ve sunucuyu yeniden başlatın. Bunun yalnızca TÜM tablolarınız MyISAM ise işe yarayacağını unutmayın.

  2. Yeni bir veritabanı oluşturun, CREATE TABLE ... LIKE deyimlerini kullanın ve sonra INSERT ... SELECT * FROM deyimlerini kullanın.

  3. Mysqldump kullanın ve bu dosya ile yeniden yükleyin.


+ myisam referansı için. Bunun neden benim için işe yaramadığını anlayamadım.
Christian Payne

5
Soru, bunun MyISAM için değil, InnoDB için çalışması gerektiğini belirtiyor
D-Rock

@ D-Rock, başlığa göre insanları buraya getiren Google'a söylüyor.
jiggunjer

24

Basit yol

Veritabanı dizinine geçin:

cd /var/lib/mysql/

MySQL'i kapatın ... Bu önemlidir!

/etc/init.d/mysql stop

Tamam, bu yol InnoDB veya BDB-Veritabanları için çalışmaz.

Veritabanını yeniden adlandır:

mv old-name new-name

... ya da masa ...

cd database/

mv old-name.frm new-name.frm

mv old-name.MYD new-name.MYD

mv old-name.MYI new-name.MYI

MySQL'i yeniden başlat

/etc/init.d/mysql start

Bitti ...

Tamam, bu şekilde InnoDB veya BDB veritabanlarıyla çalışmaz. Bu durumda veritabanını dökmeniz ve yeniden içe aktarmanız gerekir.


16
Klasörleri yeniden adlandırmak oyuncakları kırar.
ViniciusPires

1
@Rahly, tablo başına bir dosya ayarlanmış olsa bile, yine de tehlikeli, tablo başına bir dosya ayarlanmadan önce oluşturulan tablolar sorun yaratacaktır, çünkü bu bayrak ayarlandıktan sonra veritabanının oluşturulduğundan emin değilseniz.
Qian Chen

Genel olarak konuşursak, çoğu insan sistemlerine bir şekilde ya da diğerine sahip olacak, insanlar dosya başına bir tablo olup olmayacağına rastgele çevirmeyecekler. Ayrıca, senaryonuzda bile, tablolar bayraktan önce oluşturulmuş olsaydı, ilk etapta ayrı dosyalar olarak mevcut olmazlardı, bu yüzden hareket işe yaramazdı ve hala güvenli, tehlike yok. Unutmayın, taşıma işlemi sırasında veritabanı çalışmaz.
Rahly

OS X üzerinde homebrew ile kurulan mysql eşdeğeri:launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist cd /usr/local/var/mysql mv old-name new-name launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
coberlin

22

Bu kabuk komut dosyasını kullanabilirsiniz:

Başvuru: MySQL veritabanını nasıl yeniden adlandırabilirim?

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

İşe yarıyor:

$ sh rename_database.sh oldname newname

6
Buna dikkat et. Kök kullanıcıyla oturum açmıyorsanız, sınırlı izniniz olabilir. Yeniden adlandırma işleminin başarısız olmasına neden olmak, ancak başarılı olmak için bırakma işlemi veritabanının düşmesine neden olur. Aksi takdirde güzel bir senaryo.
Lex

3
set -eKomut dosyasının başlangıcına ekledim , bu da yürütmenin başarısızlıkla sonuçlanmasına neden olur ve bu sorunu hafifletir.
Mikkel

19

Son zamanlarda bunu yapmak için çok güzel bir yolla karşılaştım, MyISAM ve InnoDB ile çalışıyor ve çok hızlı:

RENAME TABLE old_db.table TO new_db.table;

Nerede okuduğumu hatırlamıyorum ama kredi ben değil başka birine gidiyor.


@ArkadijKuzhel öyle düşünmüyor. Sanırım RENAME DATABASE'den bahsediyorsunuz.
Rob Grant

Bu gerçekten yardımcı oldu, yeni bir boş veritabanı oluşturduk ve daha sonra kodu kullandım, tüm tablolar istenen adlarla içe aktarıldı.
06

3
Bu, kabul edilen cevapla aynı sorundan muzdarip - "RENAME DATABASE'in tehlikeli olduğu ve MySQL 5.1.23'te kaldırıldığı" - dev.mysql.com/doc/refman/5.1/en/rename-database.html adresinden
Blake Frederick

16

Tam bir yeniden adlandırma yapmanın en basit kurşun ve aptal geçirmez yolu ( sonunda eski veritabanını bir kopyadan ziyade bir yeniden adlandırma bırakmak dahil) :

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

Adımlar:

  1. Satırları Not Defteri'ne kopyalayın.
  2. "Olddbname", "newdbname", "mypassword" (+ isteğe bağlı olarak "root") ile ilgili tüm referansları eşdeğerlerinizle değiştirin.
  3. Komut satırında tek tek yürütün (istendiğinde "y" girerek).

Güvenli olmadığı için şifrenizi konsola eklemekten kaçının. Bunu yaptıysanız, kaldırmak için geçmiş -cw geçmişini kullanın. Bunun yerine şifreyi boş bırakın ve komut isteminden sonra şifreyi girin.
Tommie C.Eyl

Bitirmeden anormal derecede uzun, 20 dakikadan fazla sürüyor. İptal etmek uygun mudur?
Sigu Magwa

15

Ne kullanıyorum:

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

14
Büyük veritabanları için yapılamaz.
mikesl

14

MySQL, şu anda komut arabirimi aracılığıyla bir veritabanının yeniden adlandırılmasını desteklemez, ancak MySQL'in veritabanlarını depoladığı dizine erişiminiz varsa veritabanını yeniden adlandırabilirsiniz. Varsayılan MySQL kurulumları için bu genellikle MySQL'in kurulu olduğu dizinin altındaki Veri dizinindedir. Veri dizini altında yeniden adlandırmak istediğiniz veritabanının adını bulun ve yeniden adlandırın. Dizinin yeniden adlandırılması bazı izin sorunlarına neden olabilir. Farkında olmak.

Not: Veritabanını yeniden adlandırabilmeniz için MySQL'i durdurmanız gerekir

Yeni bir veritabanı oluşturmanızı (istediğiniz adı kullanarak) ve ihtiyacınız olan verileri eskisinden yenisine aktarmanızı / içe aktarmanızı öneririm. Gayet basit.


13

PHPMyAdmin'de bir veritabanını yeniden adlandırdığınızda, bir döküm oluşturur, ardından veritabanını yeni adla bırakır ve yeniden oluşturur.


4
Veritabanını tıkladığınızda bu özelliğin "İşlemler" sekmesi altında biraz gizlendiğini unutmayın.
Maris B.

13

Peki 2 yöntem vardır:

Yöntem 1: Veritabanı şemasını yeniden adlandırmak için iyi bilinen bir yöntem şemayı Mysqldump kullanarak boşaltıp başka bir şemaya geri yüklemek ve sonra eski şemayı (gerekirse) bırakmaktır.

Shell isimli ev sahibinden

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

Yukarıdaki yöntem kolay olsa da, zaman ve alan tüketir. Şema 100 GB'den fazlaysa ne olur ? Yerden tasarruf etmek için yukarıdaki komutları birbirine bağlayabileceğiniz yöntemler vardır, ancak zaman kazanmaz.

Bu gibi durumları gidermek için, şemaları yeniden adlandırmak için başka bir hızlı yöntem vardır, ancak bunu yaparken biraz dikkat edilmelidir.

Yöntem 2: MySQL, farklı şemalarda bile çalışan tabloları yeniden adlandırmak için çok iyi bir özelliğe sahiptir. Bu yeniden adlandırma işlemi atomiktir ve başka hiç kimse yeniden adlandırılırken tabloya erişemez. Tablonun adını veya şemasını değiştirmek yalnızca bir meta veri değişikliği olduğundan bu işlemin tamamlanması kısa bir zaman alır. İşte yeniden adlandırmada prosedürel yaklaşım:

İstediğiniz adla yeni veritabanı şemasını oluşturun. MySQL'in “RENAME TABLE” komutunu kullanarak tabloları eski şemadan yeni şemaya yeniden adlandırın. Eski veritabanı şemasını bırakın. If there are views, triggers, functions, stored procedures in the schema, those will need to be recreated too. Tablolarda tetikleyiciler varsa MySQL'in “RENAME TABLE” başarısız oluyor. Bunu düzeltmek için aşağıdakileri yapabiliriz:

1) Dump the triggers, events and stored routines in a separate file. Bu, mysqldump komutuna -E, -R bayrakları (tetikleyicileri döken -t -d'ye ek olarak) kullanılarak yapılır. Tetikleyiciler boşaltıldıktan sonra, RENAME TABLE komutunun çalışması için bunları şemadan bırakmamız gerekir.

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

2) Yalnızca “BASE” tablolarının bir listesini oluşturun. Bunlar information_schema.TABLEStablodaki bir sorgu kullanılarak bulunabilir .

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

3) Görünümleri bir çıkış dosyasına dökün. Görünümler, aynı information_schema.TABLEStablodaki bir sorgu kullanılarak bulunabilir .

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) Tetikleyicileri old_schema içindeki geçerli tablolara bırakın.

mysql> DROP TRIGGER <trigger_name>;
...

5) 2. adımda bulunan tüm “Base” tabloları yeniden adlandırıldıktan sonra yukarıdaki döküm dosyalarını geri yükleyin.

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

Yukarıdaki yöntemlerle ilgili karışıklıklar: Kullanıcılar için GRANTS'ı doğru şema_adı ile eşleşecek şekilde güncellememiz gerekebilir. Bunlar mysql.columns_priv, mysql.procs_priv, mysql.tables_priv, old_schema adını new_schema olarak güncelleyen ve “Flush ayrıcalıkları” olarak adlandırılan basit bir UPDATE ile düzeltilebilir. “Yöntem 2”, “yöntem 1” den biraz daha karmaşık görünse de, bu tamamen yazılabilir niteliktedir. Yukarıdaki adımları uygun sırayla gerçekleştirmek için basit bir bash betiği, bir dahaki sefere veritabanı şemalarını yeniden adlandırırken yerden ve zamandan tasarruf etmenize yardımcı olabilir.

Percona Remote DBA ekibi, aşağıdaki şekilde çalışan “rename_db” adlı bir komut dosyası yazdı:

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

Bu komut dosyasının kullanımını göstermek için, örnek bir “emp” şeması kullandı, test tetikleyicileri oluşturdu, o şemada rutinleri sakladı. Zaman alan döküm / geri yükleme yönteminin aksine tamamlanması birkaç saniye süren komut dosyasını kullanarak veritabanı şemasını yeniden adlandırmaya çalışacaktır.

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

Yukarıdaki çıktıda da görebileceğiniz gibi “emp” veritabanı şeması bir saniyeden daha kısa sürede “emp_test” olarak yeniden adlandırıldı. Son olarak, Percona'nın yukarıda “yöntem 2” için kullanılan betiğidir.

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

Referans kısıtlamaları ne olacak?
dolmen

13

Adımlar:

  1. Hit http: // localhost / phpmyadmin /
  2. DB'nizi seçin
  3. İşlemler Sekmesini tıklayın
  4. "Veritabanını yeniden adlandır" şeklinde bir sekme olacaktır. Yeni ad ekleyin ve Ayrıcalıkları ayarla'yı işaretleyin.
  5. Git'i tıklayın.

resim açıklamasını buraya girin


1
Bir phpMyAdmin çözümü, bazı ortamlar kısıtlı ortama sahip olduğundan genellikle zayıf bir çözümdür.
Daniel Antunes Pinto

"İyi" bir çözüm değil ama aradığım şey olduğu için teşekkür ederiz.
jamie

1
Lütfen sizin için çalışıyorsa oy verin .. yardımcı olacaktır .. teşekkürler
Shubham Jain

1
Bu benim için çalışır, phpMyAdmin ortamında, +1
William

12

Mac kullanıcıları olanlar için Sequel Pro'nun Veritabanı menüsünde Veritabanını Yeniden Adlandır seçeneği vardır. http://www.sequelpro.com/


5
Veritabanınızda görünümler veya tetikleyiciler varsa bu seçeneğe dikkat edin. Bu menü seçeneğinin arkasında, yeni bir veritabanı oluşturacak ve tüm tabloları hareket ettirecek bir betik bulunmaktadır. Bu, görünümler veya tetikleyiciler için çalışmaz, bu nedenle eski veritabanınızda geride kalırlar. Sonuç, sabitlenmesi gereken iki bozuk veritabanıdır.
Olfan

10

Buradaki cevapların çoğu iki nedenden biriyle yanlıştır:

  1. Görünümler ve tetikleyiciler olabileceğinden RENAME TABLE'ı kullanamazsınız. Tetikleyiciler varsa, RENAME TABLE başarısız oluyor
  2. "Hızlı bir şekilde" (soruda istendiği gibi) büyük bir veritabanını yeniden adlandırmak istiyorsanız mysqldump'ı kullanamazsınız

Percona'nın bunu nasıl yapacağınızla ilgili bir blog yazısı var: https://www.percona.com/blog/2013/12/24/renaming-database-schema-mysql/

ve Simon R Jones tarafından yayınlanmış (yapılmış?) komut dosyası, bu yayında önerilenleri yapar. Senaryoda bulduğum bir hatayı düzelttim. Burada görebilirsiniz:

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

İşte bir kopyası:

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

Bunun kaydet bir dosyaya denir rename_dbve dosyasına çalıştırma yapmak chmod +x rename_dbo gibi kullanırız./rename_db localhost old_db new_db


Bu senaryoyu seviyorum, neredeyse evrensel. Ancak, tanımlayıcının kök olmadığı birkaç zincirli GÖRÜNÜM olduğunda bir vakayı işleyemedi.
ENargit

9

Bir veritabanındaki tüm tabloları, tam bir döküm yapmak ve geri yüklemek zorunda kalmadan başka bir veritabanı altında olacak şekilde yeniden adlandırmak mümkündür.

MEVCUT OLURSA PROSEDÜR mysql.rename_db;
SÜREKLİ ||
CREATE PROCEDURE Instagram Hesabındaki Resim ve Videoları mysql.rename_db (IN old_db VARCHAR (100), IN new_db VARCHAR (100))
BAŞLA
CONCAT SEÇ ('CREATE DATABASE', new_db, ';') `# yeni veritabanı oluştur`;
CONCAT ('RENAME TABLE `', old_db, '` .``, table_name,' 'TO ``, new_db,' '.``, table_name,' ';') `# değiştir tablo` table_schema = old_db;
CONCAT SEÇİN ('DROP DATABASE' ', old_db,' `; ')` # drop old database`;
SON ||
DELIMITER;

$ time mysql -uroot -e "çağrı mysql.rename_db ('db1', 'db2');" | mysql -kök

Ancak hedef db'deki herhangi bir tetikleyici mutlu olmayacaktır. Önce onları bırakmanız ve ardından yeniden adlandırdıktan sonra yeniden oluşturmanız gerekir.

mysql -uroot -e "mysql.rename_db ('test', 'blah2') çağırın;" | mysql -kök
Satır 4'teki ERROR 1435 (HY000): Yanlış şemada tetikleme

mysql 5.x w / bu çalışma yapar küçük tweak mysql --batch-uroot -e "call mysql.rename_db('test', 'blah2');" | mysql -uroot Dikkat, sıfır biçimlendirme w / sonuçları çıktı ham biçimlendirme için biçimlendirme --batch kullanmanız gerekir.
mikesl

8

İşte komut satırından otomatikleştirmek için yazdığım bir toplu iş dosyası, ancak Windows / MS-DOS için.

Sözdizimi rename_mysqldb veritabanı newdatabase -u [kullanıcı] -p [şifre]

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

TodoInTX'in saklı prosedürü benim için pek işe yaramadı. İşte benim bıçak:

- saklı yordam rename_db: Tablo kopyalama araçlarıma veritabanını yeniden adlandır.
- Uyarılar: 
- 'Yeni' veritabanı adıyla aynı ada sahip herhangi bir veritabanını hızlandıracaktır.
- SADECE tabloları kopyalar; saklı yordamlar ve diğer veritabanı nesneleri kopyalanmaz.
- Tomer Altman (taltman@ai.sri.com)

ayırıcı //
MEVCUT OLURSA PROSEDÜR rename_db;
CREATE PROCEDURE rename_db (IN eski_db VARCHAR (100), IN yeni_db VARCHAR (100))
BAŞLA
    DECLARE current_table VARCHAR (100);
    VARSAYILAN INT VARSAYILAN 0;
    DECLARE old_tables CURSOR FOR bilgi_schema.tables dan tablo_adı seçin burada table_schema = old_db;
    BULUNAMADIĞI AYARLA DEVAM ET İŞLETİCİ SET = 1;

    SET @output = CONCAT ('VARSA ŞEMA DAMLA', new_db, ';'); 
    @ Çıkıştan stmt HAZIRLAYIN;
    YÜRÜTME stmt;

    SET @output = CONCAT ('VARSA, ŞEMA OLUŞTUR', new_db, ';');
    @ Çıkıştan stmt HAZIRLAYIN;
    YÜRÜTME stmt;

    OPEN eski_tablosları;
    TEKRAR ET
        FETCH old_tables INTO current_table;
        SONRA YAPILMAZSA
        SET @output = CONCAT ('tabloyu değiştir', old_db, '.', Current_table, 'rename', new_db, '.', Current_table, ';');
        @ Çıkıştan stmt HAZIRLAYIN;
        YÜRÜTME stmt;

        END IF;
    SONRASI TEKRAR yapılıncaya kadar;

    CLOSE eski_tablosları;

SON//
sınırlayıcı;

Bu yalnızca tablolar için ve yalnızca bu tablolarda tetikleyici yoksa çalışır. Görünümler ve tetikleyiciler bundan etkilenmez.
Olfan

7

En basit yöntem HeidiSQL yazılımını kullanmaktır. Ücretsiz ve açık kaynak. Windows ve Wine ile herhangi bir Linux üzerinde çalışır (Linux, BSD, Solaris ve Mac OS X üzerinde Windows uygulamalarını çalıştırın).

HeidiSQL'i indirmek için http://www.heidisql.com/download.php adresine gidin .

Şarap indirmek için http://www.winehq.org/ adresine gidin .

Bir veritabanını HeidiSQL'de yeniden adlandırmak için veritabanı adına sağ tıklayın ve 'Düzenle'yi seçin. Ardından yeni bir ad girin ve 'Tamam'a basın.

Çok basit.


1
Saklı yordamlar varsa, yeniden adlandırılamaz.
abksharma

@abksharma Aslında mesaj alırsınız Database "database_name" contains stored routine(s) which cannot be moved.Tetikleyiciler (en azından MariDB veritabanı için) depolanan rutinler olarak sayılır. Herhangi bir saklı yordam yoktu, ama tüm tetikleyiciler bırakılana kadar veritabanını yeniden adlandıramadı.
izogfif

7

Mac kullanıcıları için, Sequel ProVeritabanlarını yeniden adlandırma seçeneği sunan (ücretsiz) kullanabilirsiniz . Yine de eski DB silmez.

bir kez ilgili DB açın sadece tıklayın: Database->Rename database...


Bazen eski DB'yi canlı bırakır, ancak boştur. Yine de, bir kopya çıkarırsa, kopyayı yapabilir ve eskisini silebilirsiniz, yine de 2 basit adımdır.
Roee Gavirel

6

Ben Sunucu Fayı üzerinde bir soru yöneltilen MySQL Proxy kullanarak çok büyük veritabanlarını geri yüklerken kesinti etrafında almaya çalışırken. Herhangi bir başarı elde etmedim, ama sonunda istediğim şeyin RENAME DATABASE işlevselliği olduğunu fark ettim çünkü döküm / içe aktarma veritabanımızın boyutu nedeniyle bir seçenek değildi.

MySQL'de yerleşik bir RENAME TABLE işlevi var, bu yüzden işi benim için yapmak için basit bir Python betiği yazdım. Ben ettik GitHub'dan üzerinde yayınlanan başkalarına kullanım olabilir durumunda.



2
RENAME DATABASE sözdiziminden çıkarıldı, RENAME TABLE değil.
Duke

6

Size kolaylık sağlamak için, iki parametre ile yürütülmesi gereken küçük bir kabuk betiği aşağıdadır: db-name ve new db-name.

Ana dizininizdeki .my.cnf dosyasını kullanmıyorsanız, mysql satırlarına login parametreleri eklemeniz gerekebilir. Lütfen bu betiği çalıştırmadan önce yedekleyin.


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

1
Bu da, tetikleyicileri eklenmiş tablolar veya diğer veritabanlarına yeniden adlandırılamayan görünümler için çalışmaz.
Olfan

6

Kimse bundan bahsetmedi ama işte başka bir yol:

create database NewDatabaseName like OldDatabaseName;

sonra her tablo için:

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

o zaman, eğer istersen,

drop database OldDatabaseName;

Bu yaklaşım, tüm aktarımı sıfıra yakın ağ trafiğine sahip sunucuda yapma avantajına sahip olacaktır, bu nedenle bir dökümü / geri yüklemeden çok daha hızlı gidecektir.

Saklı yordamlarınız / görünümleriniz / vb. Varsa bunları da aktarmak isteyebilirsiniz.


2
Bildiğim kadarıyla 5.x create databasedeyiminde "like" anahtar kelimesini desteklemiyor mu? Bunu nereden aldın?
Dragas

create table likeSözdizimi için link : dev.mysql.com/doc/refman/5.7/en/create-table-like.html . Gibi veritabanı oluşturmak gelince, MySQL beri bu madde düştü görünüyor.
Tuncay Göncüoğlu

4

Taşınacak birçok tablonuz varsa, sql betiğini yeniden adlandırmanın hızlı bir yolu.

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

İyi görünüyor, ancak bu saklı yordamları veya görünümleri taşımaz.
davidpricedev

büyük olasılıkla tablo adı ve şema adı çevresinde sarmak için karma işaretleri eklemeniz gerekir
Funkodebat

4

ALTER DATABASEMySQL tarafından önerilen çözümdür ve RENAME DATABASEbırakılır.

itibaren 13.1.32 RENAME VERİTABANI Dizim :

RENAME {DATABASE | SCHEMA} db_name TO new_db_name;

Bu ifade MySQL 5.1.7'de eklendi, ancak tehlikeli olduğu bulundu ve MySQL 5.1.23'te kaldırıldı.


7
Örnek söz diziminiz var mı? alter databaseVeritabanının kendisini yeniden adlandırmak için kullanmanın bir yolunu bilmiyorum ve bağlandığınız belgeler bunun mümkün olduğunu göstermiyor.
Ürdün

@Jordan ben de ilgilenirim. Denedim ve denedim ve öğrendim, sadece 5.1 sürümü ile çalıştığını, ancak şu anda güncelleyemediğimi öğrendim.
Fancypants

5
-1: Önerilen yollar hakkında yazmak için, daha sonra örnek göstermek için tamamen eksikken, önerilmeyen yolun bir örneğini vermek.
hakre

3
Bu yanlış. MySQL yeniden adlandırma veritabanı belgeleri , şimdi değiştir veritabanı ile işlenen rename_database'in çok özel bir yeniden adlandırma görevi (DB yeniden adlandırmanın genel durumu değil) için tasarlandığını söylüyor: 'Veritabanı adlarını yeni kodlamayla yükseltme görevini gerçekleştirmek için ALTER DATABASE db_name UPGRADE kullanın DATA DIRECTORY NAME yerine 'Veritabanını istediğiniz gibi yeniden adlandırmak için kullanamazsınız, bu komutta yeni db adı için herhangi bir yer bile yok!
Kanat Bolazar

3

MySQL Yöneticisi'nde aşağıdakileri yapın:

  1. Kataloglar altında yeni bir veritabanı şeması oluşturun.
  2. Yedekleme'ye gidin ve eski şemanın bir yedeğini oluşturun.
  3. Yedeklemeyi yürütün.
  4. Geri Yükle'ye gidin ve 3. adımda oluşturulan dosyayı açın.
  5. Hedef Şema altında 'Başka Şema'yı seçin ve yeni veritabanı şemasını seçin.
  6. Geri Yükle'yi başlatın.
  7. Yeni şemayı doğrulayın ve iyi görünüyorsa eskisini silin.

MySQL Yöneticisi büyük veritabanlarını işleyemez ve bu konuda hızlı bir şey yoktur
deadprogrammer

3

phpmyadmin içinde veritabanını kolayca yeniden adlandırabilirsiniz

select database 

  goto operations tab

  in that rename Database to :

  type your new database name and click go

eski tabloyu bırakmayı ve tablo verilerini yeniden yüklemeyi sor

Veritabanınız yeniden adlandırıldı


3

PhpMyAdmin kullanıyorsanız , yeniden adlandırmak istediğiniz veritabanını seçtikten sonra "işlemler" sekmesine gidebilirsiniz. Ardından, "veritabanını şuraya kopyala" nın son bölümüne (veya bunun gibi bir şeye) gidin, bir ad verin ve aşağıdaki seçenekleri belirleyin. Bu durumda, "yapı ve veri" ve "kopyalamadan önce veritabanı oluştur" onay kutularını seçmeniz ve son olarak, o bölümdeki "git" düğmesine basmanız gerekir.

Bu arada, İspanyolca phpMyAdmin kullanıyorum, bu yüzden bölümlerin adlarının İngilizce olduğundan emin değilim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.