it-swarm-tr.com

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

MySQL adresindeki MySQL kılavuzu bunu kapsar.

Genellikle veritabanını atar ve 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 yapar, yalnızca birkaç sürümde bulunur ve genel olarak kötü bir fikirdir .

Bunun, InnoDB ile çalışması gerekir. Bu, MyISAM öğesinden çok farklı şeyler depolar.

866
deadprogrammer

InnoDB için aşağıdakiler işe yarıyor gibi görünüyor: yeni boş veritabanını oluşturun, ardından her bir tabloyu yeni veritabanına dönüştürün:

RENAME TABLE old_db.table TO new_db.table;

Bundan sonra izinleri ayarlamanız gerekecektir.

Bir Kabuk içinde komut dosyası yazmak 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:

  • -p seçeneği ile şifre arasında boşluk yoktur. Veritabanınızın şifresi yoksa, -u username -ppassword bölümünü kaldırın.
  • Bazı tabloların bir tetikleyicisi varsa, yukarıdaki yöntemi kullanarak başka bir veritabanına taşınamaz (Trigger in wrong schema hatası verir). Bu durumda, bir veritabanını klonlamak için geleneksel bir yöntem kullanın ve ardından eskisini bırakın:

    mysqldump old_db | mysql new_db

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

    mysqldump -R old_db | mysql new_db

756
Thorsten

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 önerilenleri kullanın:

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

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

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

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

Enter image description here

195
raphie

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

Komuttan oluşturulan betiği çalıştırmadan önce hedef veritabanını oluşturmalısınız.

Bu iki betiğin herhangi birini kullanabilirsiniz (önce eskisine ve birisine GROUP_CONCAT kullanmak için cevabımı "geliştirdim" demiştim. Seçiminizi yapın ama orijinali tercih ediyorum):

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 hedef)

Bu daha sonra çalıştırmanız gereken bir SQL komutu üretecektir.

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

97
ErichBSchulz

MySQL'de eksik RENAME DATABASE komutunu taklit etmek:

  1. Yeni bir veritabanı oluştur
  2. Yeniden adlandırma sorgularını şununla 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. O çıkışı çalıştır

  4. Eski veritabanını sil

MySQL'de Eksik RENAME DATABASE Komutunu Taklit Etmeöğesinden alınmıştır.

33
Marciano

Üç 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ın MyISAM olması durumunda işe yarayacağını unutmayın.

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

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

24
longneck

Basit bir yol

Veritabanı dizini değiştirin:

cd /var/lib/mysql/

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

/etc/init.d/mysql stop

Tamam, bu yol InnoDB veya BDB-Databases için çalışmıyor.

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 yol InnoDB veya BDB veritabanlarıyla çalışmıyor. Bu durumda veritabanını atmanız ve yeniden içe aktarmanız gerekir.

23
DeeCee

Sadece 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 bana değil başkasına gidiyor.

19
Amr Mostafa

Bu Shell betiğini kullanabilirsiniz:

Referans: Bir 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
18
Grijesh Chauhan

Kullandığım şey bu:

$ mysqldump -u root -p olddb >~/olddb.sql
$ mysql -u root -p
mysql> create database newdb;
mysql> use newdb
mysql> source ~/olddb.sql
mysql> drop database olddb;
16
eaykin

complete rename işlemini yapmanın en basit kurşunu ve kandırmasız yolu _/(eski veritabanını en sonda bırakmak da dahil, bu nedenle kopyadan ziyade bir addır):

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") referanslarını eşdeğerlerinizle değiştirin.
  3. Komut satırında birer birer yürütün (istendiğinde "y" girerek).
15
Steve Chambers

MySQL şu anda komut arabirimi üzerinden bir veritabanının yeniden adlandırılmasını desteklememektedir, ancak MySQL'in veritabanlarını sakladığı 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 Data dizinindedir. Veri dizini altında yeniden adlandırmak istediğiniz veritabanının adını bulun ve yeniden adlandırın. Dizini yeniden adlandırmak yine de bazı izin sorunlarına neden olabilir. Farkında olmak.

Not: Veritabanını yeniden adlandırmadan önce MySQL'i durdurmalısınız.

Yeni bir veritabanı oluşturmanızı (istediğiniz adı kullanarak) ve ihtiyaç duyduğunuz verileri eskiden yeniye aktarmanızı/almanızı öneririm. Gayet basit.

14
bryanpearson

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

13
UnkwnTech

Peki 2 yöntem var:

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 ardından eski şemayı (gerekirse) bırakmaktır.

Kabuktan

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

Yukarıdaki yöntem kolay olmasına rağmen, zaman ve alan tüketmektedir. Ya şema bir 100GB'tan fazlaysa? Yerden kazanmak için yukarıdaki komutları bir araya getirebileceğiniz yöntemler vardır, ancak zaman kazanmaz.

Bu gibi durumları düzeltmek için, şemaları yeniden adlandırmak için başka bir hızlı yöntem vardır, ancak bunu yaparken bazı özen gösterilmesi gerekir.

Yöntem 2: MySQL, farklı şemalarda bile çalışan tabloları yeniden adlandırmada çok iyi bir özelliğe sahiptir. Bu yeniden adlandırma işlemi atomiktir ve yeniden adlandırılırken başka hiç kimse masaya erişemez. Bir 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 sürer. İşte yeniden adlandırma yaparken prosedürel yaklaşım:

İstediğiniz adla yeni veritabanı şeması 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. Masalarda tetikleyiciler varsa, MySQL’in “RENAME TABLE” başarısız olur. 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) kullanarak yapılır. Tetikleyiciler atıldıktan sonra, RENAME TABLE komutunun çalışması için onları şemada 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.TABLES tablosundaki bir sorguyu kullanarak 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 çıktı dosyasına at. Görünümler, aynı information_schema.TABLES tablosundaki bir sorguyu kullanarak 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) Geçerli tablodaki tetikleyicileri old_schema'da bırakın.

mysql> DROP TRIGGER <trigger_name>;
...

5) 2. adımda bulunan tüm “Base” tabloları yeniden adlandırıldığında 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 olan karmaşıklıklar: GRANTS'ı kullanıcılar için doğru şema_adıyla eşleşecek şekilde güncellememiz gerekebilir. Bunlar, mysql.columns_priv, mysql.procs_priv, mysql.tables_priv, mysql.db tablolarında old_schema adını new_schema'ya güncelleyen ve “Flush yetkileri;” diyerek basit bir UPDATE ile düzeltilebilir. Her ne kadar "yöntem 2", "yöntem 1" den biraz daha karmaşık görünse de, bu tamamen yazılabilir. Yukarıdaki adımları uygun sırayla gerçekleştirmek için kullanılan basit bir bash betiği, bir dahaki sefere veritabanı şemalarını yeniden adlandırırken yer ve zamandan tasarruf etmenize yardımcı olabilir.

Percona Remote DBA ekibi şu şekilde çalışan “rename_db” adında bir komut dosyası yazdı:

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

Bu betiğin kullanımını göstermek için “emp” adlı örnek bir şema kullandı, test tetikleyicileri yarattı, şema üzerinde 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               |
+--------------------+


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

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

#!/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
12
Sathish D

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

12
Duke

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

 DROP PROSEDÜR VARSA mysql.rename_db; 
 DELIMITER || 
 PROSEDÜR OLUŞTURMA mysql.rename_db (IN old_db VARCHAR (100), new_db VARCHAR (100)) 
 BEGIN 
 CONCAT SELECT ('DATABASE OLUŞTURUN', new_db, ';') `# # yeni veritabanı yaratın; table_name, '' TO `', new_db,'` .` ', table_name,' `; ')` # değiştiren tablodan bilgi_schema.tables WHERE table_schema = old_db; , old_db, '`;')` # eski veritabanını bırakın`; .rename_db ('db1', 'db2'); " | mysql -uroot 

Ancak, hedef db'deki herhangi bir tetikleyici mutlu olmayacaktır. Önce onları bırakıp, ardından yeniden adlandırmanız gerekecek.

 mysql -uroot -e "mysql.rename_db çağrısı ('test', 'blah2');" | mysql -uroot 
 4. satırdaki HATA 1435 (HY000): Yanlış şemada tetikleyin 
9
TodoInTX

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

  1. Görünüm ve tetikleyiciler olabileceğinden, yalnızca RENAME TABLE öğesini kullanamazsınız. Tetikleyiciler varsa, RENAME TABLE başarısız olur
  2. Büyük bir veritabanını yeniden adlandırmak için (hızlıca sormak istediğinizde) (hızlıca sormak istediğinizde) mysqldump kullanamazsınız

Percona'nın bunun nasıl yapılacağı hakkında bir blog yazısı var: https://www.percona.com/blog/2013/12/24/renaming-database-schema-mysql/

ve senaryo bu yazı için önerilenleri yapan Simon R Jones tarafından yayınlandı (?). 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

rename_db adlı bir dosyaya kaydedin ve betiği chmod +x rename_db ile çalıştırılabilir hale getirin, ardından ./rename_db localhost old_db new_db gibi kullanın

8
ryantm

İş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
Johnny

TodoInTX'in saklı işlemi benim için pek işe yaramadı. İşte benim bıçağım.

 - saklı yordam rename_db: Bir veritabanını tablo kopyalama yöntemim olarak yeniden adlandırın. 
 - Uyarılar: 
 - Mevcut veritabanını 'yeni' ile aynı isimde saklar veritabanı adı. 
 - SADECE tabloları kopyalar; saklı yordamlar ve diğer veri tabanı nesneleri kopyalanmaz. 
 - Tomer Altman ([email protected]) 
 
 sınırlayıcı //[L.____. rename_db; 
 CREATE PROCEDURE rename_db (IN old_db VARCHAR (100), IN new_db VARCHAR (100)) 
 BEGIN 
 DECLARE current_table VARCHAR (100); 
 INT DEFAULT 0; 
 BİLDİRİM old_tables CURSOR FOR for information_schema.tables 'dan table_adı seçiniz, burada table_schema = old_db; 
 BİLİNMEYE DEVAM EDİN, KURULMADIĞI YAPILDI = 1; 
 
 SET @output = CONCAT ('VARSA DAMLA ŞEMASI', new_db, ';'); 
 @Output FROM'UN HAZIRLANMASI; 
 EXECUTE stmt; 
 
 SET @output = CONCAT ('OLMADIĞIN ŞEMASI OLUŞTURUN' '; 
 ÇIKIŞLARIN ÇIKIŞI @ @putt; 
 EXECUTE stmt; 
 
 AÇIK old_tables; 
 REPEAT 
 FETCH old_tables; ____.] YAPILMADAN YAPILMASI durumunda 
 SET @output = CONCAT ('tabloyu değiştir', old_db, '.', Current_table, 'rename', new_db, '.', Current_table, ';'); 
 HAZIRLIĞIN ÇIKARISINDAN HAZIRLANIN; 
 EXECUTE stmt; 
 
 SON SONDA; 
 UNTIL YAPILDI SONRAKİ SONUÇ; KAPAT old_tables; 
 
 END //CL.____.] Sınırlayıcı; 
7
user757945

Size kolaylık sağlamak için, aşağıda iki parametreyle yürütülmesi gereken küçük bir kabuk yazısı bulunmaktadır: db-name ve new db-name.

Giriş dizininizdeki .my.cnf dosyasını kullanmazsanız, mysql-line'lara login-parametreleri eklemeniz gerekebilir. Lütfen bu betiği çalıştırmadan önce bir yedekleme yapın.


#!/usr/bin/env bash

mysql -e "CREATE DATABASE $2 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;"
for i in $(mysql -Ns $1 -e "show tables");do
    echo "$1.$i -> $2.$i"
    mysql -e "rename TABLE $1.$i to $2.$i"
done
mysql -e "DROP DATABASE $1"
6
gerrit damen

I Sunucu Hatası üzerine bir soru sordu MySQL Proxy kullanarak çok büyük veritabanlarını geri yüklerken aksama süresini aşmaya çalışıyor. Başarısız oldum ama sonunda istediğim şeyin RENAME DATABASE işlevselliği olduğunu fark ettim, çünkü damping/import veritabanımızın boyutundan dolayı bir seçenek değildi.

MySQL'de yerleşik bir RENAME TABLE işlevi var, bu yüzden benim için işi yapmak için basit bir Python betiği yazdım. Ben GitHub’a gönderdim başkalarına yararı olabilir.

6
cclark

Adımlar:

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

 enter image description here

6
Shubham Jain

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

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

Wine'ı indirmek için, goto http://www.winehq.org/ .

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

Bu çok basit.

5
Fathah Rehman P

Taşınacak çok tablonuz varsa, yeniden adlandırılan sql betiğini oluşturmanın hızlı bir yoludur.

SELECT DISTINCT CONCAT('RENAME TABLE ', t.table_schema,'.', t.table_name, ' TO ',     
t.table_schema, "_archive", '.', t.table_name, ';' ) as Rename_SQL 
FROM information_schema.tables t
WHERE table_schema='your_db_name' ;
4
yantaq

Kimsenin bundan bahsetmediği görülüyor ama işte başka bir yol:

create database NewDatabaseName like OldDatabaseName;

sonra her tablo için yapın:

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

o zaman istersen,

drop database OldDatabaseName;

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

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

4

Mac kullanıcıları için, sadece Veritabanlarını yeniden adlandırma seçeneğini sunan Sequel Pro (free) komutunu kullanabilirsiniz. Eski DB'yi silmese de.

ilgili DB'yi açtıktan sonra sadece tıklayın: Database -> Rename database...

4
Roee Gavirel

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ükleme'ye gidin ve 3. adımda oluşturulan dosyayı açın.
  5. Hedef Şema'nın altındaki '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.
3
Tom

phpmyadmin ile 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ırakmak ve tablo verilerini yeniden yüklemek isteyin

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

3
murtaza.webdev

Eğer phpMyAdmin kullanıyorsanız, yeniden adlandırmak istediğiniz veritabanını seçtikten sonra "işlemler" sekmesine gidebilirsiniz. Ardından son bölüme "veri tabanını kopyala" (ya da buna benzer bir şey) gidin, bir isim verin ve aşağıdaki seçenekleri seçin. Bu durumda, sanırım "yapı ve veri" yi ve "kopyalamadan önce veritabanı oluştur" onay kutularını seçmeli ve son olarak o bölümdeki "git" düğmesine basmalısınız.

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

3
ecruz

Tüm tabloları bir şemadan diğerine taşımak için tek satırlık bir Bash pasajı:

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

Başlangıçtaki history komutu, yalnızca parola içeren MySQL komutlarının Shell geçmişine kaydedilmemesini sağlar.

db_user uygulamasının eski şema üzerinde okuma/yazma/bırakma izinleri olduğundan ve yeni şemada okuma/yazma/oluşturma izinleri olduğundan emin olun.

3
coffeefiend

Bu şekilde yaptım: Mevcut veritabanınızı yedekleyin. Size bir db.Zip.tmp verir ve ardından Komut istemine aşağıdaki komutu yazın.

"C:\Program Dosyaları (x86)\MySQL\MySQL Sunucusu 5.6\bin\mysql.exe" -h localhost -u root -p [parola] [yeni db adı] <"C:\Yedekler\db.Zip.tmp "

3
Samra

Bunu iki şekilde yapabilirsiniz.

  1. RENAME TABLE old_db.table_name TO new_db.table_name;
  2. İşlemlere gitme-> orada Tablo seçenekleri sekmesini görebilirsiniz. orada masa adını düzenleyebilirsiniz.
2
jeeva

Windows'ta bir veritabanını yeniden adlandırmak için yazdığım toplu komut dosyası:

@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%"
2
Nadav Benedek

ALTER DATABASE , MySQL tarafından önerilen bu yoldur ve RENAME DATABASE bırakılır.

Kimden13.1.32 RENAME DATABASE Sözdizimi:

RENAME {DATABASE | SCHEMA} db_name TO new_db_name;

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

2
xelber

Bu, tüm veritabanları için çalışır ve her tabloyu maatkit mysql toolkit ile yeniden adlandırarak çalışır.

Her tabloyu yazdırmak ve yeniden adlandırmak için mk-find komutunu kullanın. man sayfası çok daha fazla seçenek ve örneğe sahip

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

Eğer maatkit kurulu ise ( ki bu çok kolay ), o zaman bunu yapmanın en basit yolu budur.

2

Birkaç veritabanına sahip bir döküm dosyasından başlamanız durumunda, dökümü için bir sed gerçekleştirebilirsiniz:

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

Ardından çöplüğünüzü içe aktarın. Sadece isim çatışması olmayacağından emin ol.

1
RotS

Ne TodoInTx'in çözümü ne de user757945'in uyarlanmış çözümü MySQL 5.5.16'da benim için çalıştı, bu yüzden benim uyarlanmış versiyonum:

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 ;

Umarım benim durumumda olan birine yardım eder! Not: @sql_string daha sonra oturumda oyalanacaktır. Bu işlevi kullanmadan yazamadım.

1
Milosz

Veritabanını yeniden adlandırmak için aşağıdaki yöntemi kullandım

  1. mysqldump veya herhangi bir DB aracı kullanarak dosyanın yedeğini alın; örneğin, heidiSQL, mysql yönetici vb.

  2. Yedekleme (örneğin backupfile.sql) dosyasını bir metin düzenleyicide açın.

  3. Veritabanı adını arayın ve değiştirin ve dosyayı kaydedin.

4. Düzenlenen sql dosyasını geri yükleyin

1
Adarsha

Hiyerarşik görünümler kullanıyorsanız (diğer görünümlerden veri çeken görünümler), mysqldump'tan ham çıktının içe aktarılması işe yaramayabilir; Bu nedenle, ben senaryoyu yazdım anında görüntüleri düzeltmek için görünümleri yeniden sıraladım.

Bu gibi görünüyor:

#!/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.+?\n\-\-\n\n.+?\n\n)/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);
            }
        }
    }
}

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

1
gadelat

Sizler bunun için beni vuracaksınız ve büyük olasılıkla bu her zaman işe yaramayacak ve elbette, tüm mantık filanına aykırı ... Ama şimdi denedim ... MySQL motorunu durdurun Kök ve basitçe dosya sistemi düzeyinde DB yeniden adlandırıldı ....

OSX'deyim ve sadece davayı bedbf'den BEDBF'ye değiştirdim. Sürprizime göre işe yaradı ...

Bir üretim DB üzerinde tavsiye etmem. Bunu bir deney olarak denedim ...

Her iki şekilde de iyi şanslar :-)

0
Lawrence

Bunu gönderdim MySQL kullanarak veritabanı adını nasıl değiştiririm? bugün gün tırmalama ve saç çekme işleminden sonra. Çözüm bir şemayı bir .sql dosyasına dışa aktarın ve dosyayı açın ve üstteki sql CREAT TABLE bölümündeki veritabanı/şema adını değiştirin. Üç örnek veya daha fazla örnek var ve eğer dosyaya multible şemalar kaydedilmişse sayfanın üstünde olmayabilir. Veritabanının tamamını bu şekilde düzenlemek mümkündür ancak büyük veritabanlarında, tablo özelliklerinin veya endekslerin tüm örneklerini izleyenlerin oldukça acı verici olacağını düşünüyorum.

0
E.R.Rider

I). Mevcut bir DB'nin adını değiştirebileceğiniz doğrudan bir yöntem yoktur, ancak aşağıdaki adımları izleyerek hedefinize ulaşabilirsiniz: Newdb oluşturun. 2). Newdb kullanın. 3). tablo table_name oluşturun (olddb.table_name'den * seçin);

Yukarıdakileri yaparak, verileri olddb tablosundan kopyalayıp, bunları newdb tablosuna ekleyerek yapabilirsiniz. Masanın adını aynı şekilde verin.

II). RENAME TABLE old_db.table_name TO new_db.table_name;

0
rajesh