it-swarm-id.com

Bagaimana cara cepat mengganti nama database MySQL (ubah nama skema)?

Manual MySQL di MySQL membahas hal ini.

Biasanya saya hanya membuang database dan menggantinya dengan nama baru. Ini bukan pilihan untuk basis data yang sangat besar. Rupanya RENAME {DATABASE | SCHEMA} db_name TO new_db_name;melakukan hal-hal buruk, hanya ada di beberapa versi, dan merupakan ide buruk secara keseluruhan .

Ini perlu bekerja dengan InnoDB , yang menyimpan hal-hal yang sangat berbeda dari MyISAM .

866
deadprogrammer

Untuk InnoDB, yang berikut ini tampaknya berfungsi: buat database kosong baru, lalu ubah nama setiap tabel pada gilirannya menjadi database baru:

RENAME TABLE old_db.table TO new_db.table;

Anda harus menyesuaikan izin setelah itu.

Untuk skrip di Shell, Anda dapat menggunakan salah satu dari berikut ini:

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

Atau

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;

Catatan:

  • Tidak ada ruang antara opsi -p dan kata sandi. Jika basis data Anda tidak memiliki kata sandi, hapus bagian -u username -ppassword.
  • Jika beberapa tabel memiliki pemicu, itu tidak dapat dipindahkan ke database lain menggunakan metode di atas (akan menghasilkan kesalahan Trigger in wrong schema). Jika demikian, gunakan cara tradisional untuk mengkloning database dan kemudian lepaskan yang lama:

    mysqldump old_db | mysql new_db

  • Jika Anda memiliki prosedur tersimpan, Anda dapat menyalinnya setelah:

    mysqldump -R old_db | mysql new_db

756
Thorsten

Gunakan beberapa perintah sederhana ini:

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

Atau untuk mengurangi I/O gunakan yang berikut seperti yang disarankan oleh @Pablo Marin-Garcia:

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

Saya pikir solusinya lebih sederhana dan disarankan oleh beberapa pengembang. phpMyAdmin memiliki operasi untuk ini.

Dari phpMyAdmin, pilih basis data yang ingin Anda pilih. Di tab ada satu yang disebut Operasi, buka bagian ganti nama. Itu saja.

Itu, seperti yang banyak disarankan, membuat database baru dengan nama baru, membuang semua tabel dari database lama ke dalam database baru dan drop database lama.

Enter image description here

195
raphie

Anda bisa menggunakan SQL untuk menghasilkan skrip SQL untuk mentransfer setiap tabel di basis data sumber Anda ke basis data tujuan.

Anda harus membuat database tujuan sebelum menjalankan skrip yang dihasilkan dari perintah.

Anda dapat menggunakan salah satu dari dua skrip ini (saya awalnya menyarankan yang pertama dan seseorang "meningkatkan" jawaban saya untuk menggunakan GROUP_CONCAT. Silakan pilih, tapi saya lebih suka yang asli):

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

atau

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

($ 1 dan $ 2 masing-masing adalah sumber dan target)

Ini akan menghasilkan perintah SQL yang kemudian harus Anda jalankan.

Perhatikan bahwa GROUP_CONCAT memiliki batas panjang default yang dapat dilampaui untuk database dengan sejumlah besar tabel. Anda dapat mengubah batas itu dengan menjalankan SET SESSION group_concat_max_len = 100000000; (atau sejumlah besar lainnya).

97
ErichBSchulz

Meniru perintah RENAME DATABASE yang hilang di MySQL:

  1. Buat database baru
  2. Buat ganti nama kueri dengan:

    SELECT CONCAT('RENAME TABLE ',table_schema,'.',table_name,
        ' TO ','new_schema.',table_name,';')
    FROM information_schema.TABLES
    WHERE table_schema LIKE 'old_schema';
    
  3. Jalankan output itu

  4. Hapus basis data lama

Itu diambil dariMeniru Perintah DATABASE RENAME yang Hilang di MySQL.

33
Marciano

Tiga opsi:

  1. Buat database baru, turunkan server, pindahkan file dari satu folder database ke yang lain, dan restart server. Perhatikan bahwa ini hanya akan berfungsi jika SEMUA tabel Anda adalah MyISAM.

  2. Buat database baru, gunakan CREATE TABLE ... LIKE pernyataan, dan kemudian gunakan INSERT ... SELECT * FROM pernyataan.

  3. Gunakan mysqldump dan muat ulang dengan file itu.

24
longneck

Cara sederhana

Ubah ke direktori basis data:

cd /var/lib/mysql/

Matikan MySQL ... Ini penting!

/etc/init.d/mysql stop

Oke, cara ini tidak berfungsi untuk InnoDB atau BDB-Databases.

Ganti nama basis data:

mv old-name new-name

... atau meja ...

cd database/

mv old-name.frm new-name.frm

mv old-name.MYD new-name.MYD

mv old-name.MYI new-name.MYI

Mulai ulang MySQL

/etc/init.d/mysql start

Selesai ...

Oke, cara ini tidak berfungsi dengan database InnoDB atau BDB. Dalam hal ini Anda harus membuang database dan mengimpornya kembali.

23
DeeCee

Saya baru-baru ini menemukan cara yang sangat bagus untuk melakukannya, bekerja dengan MyISAM dan InnoDB dan sangat cepat:

RENAME TABLE old_db.table TO new_db.table;

Saya tidak ingat di mana saya membacanya tetapi kredit jatuh kepada orang lain, bukan saya.

19
Amr Mostafa

Anda dapat menggunakan skrip Shell ini:

Referensi: Bagaimana cara mengganti nama database 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"

Bekerja:

$ sh rename_database.sh oldname newname
18
Grijesh Chauhan

Inilah yang saya gunakan:

$ 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

Cara termudah untuk membuktikan selesai ganti nama (termasuk menjatuhkan basis data lama di bagian akhir sehingga menjadi ganti nama daripada salinan):

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

Langkah:

  1. Salin garis ke Notepad.
  2. Ganti semua referensi ke "olddbname", "newdbname", "mypassword" (+ opsional "root") dengan padanan Anda.
  3. Jalankan satu per satu di baris perintah (memasukkan "y" saat diminta).
15
Steve Chambers

MySQL tidak mendukung penggantian nama database melalui antarmuka perintahnya saat ini, tetapi Anda dapat mengubah nama database jika Anda memiliki akses ke direktori tempat MySQL menyimpan databasenya. Untuk instalasi MySQL default ini biasanya di direktori Data di bawah direktori tempat MySQL diinstal. Temukan nama database yang ingin Anda ganti namanya di bawah direktori Data dan ganti namanya. Mengganti nama direktori dapat menyebabkan beberapa masalah izin. Waspadalah.

Catatan: Anda harus menghentikan MySQL sebelum Anda dapat mengganti nama database

Saya akan merekomendasikan membuat database baru (menggunakan nama yang Anda inginkan) dan mengekspor/mengimpor data yang Anda butuhkan dari yang lama ke yang baru. Cukup mudah.

14
bryanpearson

Ketika Anda mengganti nama database di PHPMyAdmin itu membuat dump, lalu turun dan buat ulang database dengan nama baru.

13
UnkwnTech

Nah ada 2 metode:

Metode 1: Metode yang terkenal untuk mengganti nama skema database adalah dengan membuang skema menggunakan Mysqldump dan mengembalikannya ke skema lain, dan kemudian menjatuhkan skema lama (jika diperlukan).

Dari Shell

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

Meskipun metode di atas mudah, itu memakan waktu dan ruang. Bagaimana jika skema lebih dari 100GB? Ada metode di mana Anda dapat menyatukan perintah di atas untuk menghemat ruang, namun itu tidak akan menghemat waktu.

Untuk memperbaiki situasi seperti itu, ada metode cepat lain untuk mengubah nama skema, namun, beberapa kehati-hatian harus diambil saat melakukannya.

Metode 2: MySQL memiliki fitur yang sangat bagus untuk mengganti nama tabel yang bahkan berfungsi di berbagai skema. Operasi penggantian nama ini bersifat atomik dan tidak ada orang lain yang dapat mengakses tabel sementara namanya diubah. Ini membutuhkan waktu singkat untuk diselesaikan karena mengubah nama tabel atau skemanya hanyalah perubahan metadata. Berikut ini adalah pendekatan prosedural dalam melakukan penggantian nama:

Buat skema database baru dengan nama yang diinginkan. Ganti nama tabel dari skema lama ke skema baru, menggunakan perintah "RENAME TABLE" MySQL. Jatuhkan skema database lama. If there are views, triggers, functions, stored procedures in the schema, those will need to be recreated too. “RENAME TABLE” MySQL gagal jika ada pemicu pada tabel. Untuk memperbaiki ini kita dapat melakukan hal-hal berikut:

1) Dump the triggers, events and stored routines in a separate file. Ini dilakukan menggunakan flag -E, -R (selain -t -d yang membuang trigger) ke perintah mysqldump. Setelah pemicu dibuang, kita harus membuangnya dari skema, agar perintah RENAME TABLE berfungsi.

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

2) Menghasilkan daftar hanya "BASE" tabel. Ini dapat ditemukan menggunakan kueri di information_schema.TABLES tabel.

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

3) Buang tampilan dalam file keluar. Tampilan dapat ditemukan menggunakan kueri pada tabel information_schema.TABLES yang sama.

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) Jatuhkan pemicu pada tabel saat ini di old_schema.

mysql> DROP TRIGGER <trigger_name>;
...

5) Kembalikan file dump di atas setelah semua tabel "Base" yang ditemukan di langkah # 2 diganti namanya.

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

Seluk-beluk dengan metode di atas: Kami mungkin perlu memperbarui GRAN untuk pengguna sehingga mereka cocok dengan schema_name yang benar. Ini bisa diperbaiki dengan PEMBARUAN sederhana di mysql.columns_priv, mysql.procs_priv, mysql.tables_priv, tabel mysql.db memperbarui nama old_schema ke new_schema dan memanggil "Flush privilege;". Walaupun “metode 2 ″ tampaknya sedikit lebih rumit daripada“ metode 1 ″, ini sepenuhnya bisa skrip. Skrip bash sederhana untuk melakukan langkah-langkah di atas dalam urutan yang tepat, dapat membantu Anda menghemat ruang dan waktu saat mengganti nama skema basis data di waktu berikutnya.

Tim Percona Remote DBA telah menulis skrip yang disebut "rename_db" yang bekerja dengan cara berikut:

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

Untuk mendemonstrasikan penggunaan skrip ini, gunakan skema sampel "emp", tes pemicu yang dibuat, rutin yang tersimpan di skema itu. Akan mencoba mengubah nama skema basis data menggunakan skrip, yang membutuhkan beberapa detik untuk menyelesaikannya dibandingkan dengan metode dump/restore yang memakan waktu.

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

Seperti yang Anda lihat dalam output di atas skema database "emp" diubah namanya menjadi "emp_test" dalam waktu kurang dari satu detik. Terakhir, Ini adalah skrip dari Percona yang digunakan di atas untuk "metode 2".

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

Bagi mereka yang pengguna Mac, Sequel Pro memiliki opsi Rename Database di menu Database. http://www. berikutnyaelpro.com/

12
Duke

Dimungkinkan untuk mengganti nama semua tabel di dalam basis data agar berada di bawah basis data lain tanpa harus melakukan dump dan restore penuh.

 PROSEDUR DROP JIKA ADA mysql.rename_db; 
 DELIMITER || 
 BUAT PROSEDUR mysql.rename_db (DALAM old_db VARCHAR (100), IN new_db VARCHAR (100)) [. ] BEGIN 
 SELECT CONCAT ('CREATE DATABASE', new_db, ';') `# buat database baru`; 
 SELECT CONCAT ('RENAME TABLE`', old_db, '`.`', table_name, '`TO`', new_db, '`.`', table_name, '`;') `# alter table` DARI information_schema.tables WHERE table_schema = old_db; 
 SELECT CONCAT ('DROP DATABASE`' , old_db, '`;')` # drop database lama`; 
 END || 
 DELIMITER; 
 
 $ time mysql -uroot -e "panggil mysql .rename_db ('db1', 'db2'); " | mysql -uroot 

Namun pemicu dalam target db tidak akan bahagia. Anda harus menjatuhkannya terlebih dahulu kemudian membuatnya kembali setelah mengganti nama.

 mysql -uroot -e "panggil mysql.rename_db ('test', 'blah2');" | mysql -uroot 
 ERROR 1435 (HY000) pada baris 4: Pemicu dalam skema yang salah 
9
TodoInTX

Sebagian besar jawaban di sini salah karena satu dari dua alasan:

  1. Anda tidak bisa hanya menggunakan RENAME TABLE, karena mungkin ada tampilan dan pemicu. Jika ada pemicu, RENAME TABLE gagal
  2. Anda tidak dapat menggunakan mysqldump jika Anda ingin "cepat" (seperti yang diminta dalam pertanyaan) mengganti nama database besar

Percona memiliki posting blog tentang cara melakukannya dengan baik: https://www.percona.com/blog/2013/12/24/renaming-database-schema-mysql/

dan skrip diposting (dibuat?) oleh Simon R Jones yang melakukan apa yang disarankan dalam posting itu. Saya memperbaiki bug yang saya temukan di skrip. Anda bisa melihatnya di sini:

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

Ini salinannya:

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

Simpan ke file bernama rename_db dan buat skrip dieksekusi dengan chmod +x rename_db kemudian gunakan seperti ./rename_db localhost old_db new_db

8
ryantm

Ini adalah file batch yang saya tulis untuk mengotomatiskannya dari baris perintah, tetapi untuk Windows/MS-DOS.

Sintaksnya adalah rename_mysqldb database newdatabase -u [pengguna] -p [kata sandi]

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

Prosedur yang disimpan TodoInTX tidak berhasil bagi saya. Inilah tikaman saya padanya:

 - prosedur tersimpan rename_db: Ganti nama database dengan cara saya menyalin tabel. 
 - Peringatan: 
 - Akan menghancurkan setiap database yang ada dengan nama yang sama dengan 'baru' nama basis data. 
 - HANYA menyalin tabel; prosedur tersimpan dan objek basis data lainnya tidak disalin. 
 - Tomer Altman ([email protected]) 
 
 pembatas //[.____.Lihat PROSEDUR GLOP JIKA ADA rename_db; 
 BUAT PROSEDUR rename_db (DALAM old_db VARCHAR (100), DALAM new_db VARCHAR (100)) 
 BEGIN 
 DEKLARKAN current_table VARCHAR (100); 
 DECLARE selesai dilakukan INT DEFAULT 0; 
 DECLARE old_tables CURSOR FOR pilih table_name dari information_schema.tables di mana table_schema = old_db; 
 DECLARE CONTINUE HANDLER FOR NOT FOUND SET SET dilakukan = 1; 
 
 SET @output = CONCAT ('DROP SCHEMA IF EXISTS', new_db, ';'); 
 SIAPKAN stmt DARI @output; 
 EXECUTE stmt; 
 SET .output = CONCAT ('BUAT SKEMA JIKA TIDAK ADA', new_db, ';'); 
 SIAPKAN stmt DARI @output; 
 EXECUTE stmt; 
 [BUKA old_tables; 
 REPEAT 
 FETCH old_tables KE current_table; 
 JIKA TIDAK dilakukan MAKA 
 SET @output = CONCAT ('alter table', old_db, '.', Current_table, 'rename', new_db, '.', Current_table, ';'); 
 SIAPKAN stmt DARI @output; 
 EXECUTE stmt; 
 SELESAI IF; 
 SAMPAI BERLAKU lakukan RESPE END, 
 
 TUTUP old_tables; 
 
 END //
 Pembatas; 
7
user757945

Untuk kenyamanan Anda, di bawah ini adalah shellscript kecil yang harus dijalankan dengan dua parameter: db-name dan new db-name.

Anda mungkin perlu menambahkan parameter login ke mysql-lines jika Anda tidak menggunakan file .my.cnf di direktori home Anda. Harap buat cadangan sebelum menjalankan skrip ini.


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

Saya mengajukan pertanyaan tentang Kesalahan Server mencoba menyiasati waktu henti saat memulihkan basis data yang sangat besar dengan menggunakan MySQL Proxy. Saya tidak berhasil, tetapi saya menyadari pada akhirnya apa yang saya inginkan adalah fungsi RENAME DATABASE karena dump/impor bukan pilihan karena ukuran basis data kami.

Ada fungsi RENAME TABLE yang terpasang di MySQL, jadi saya akhirnya menulis skrip Python sederhana untuk melakukan pekerjaan itu untuk saya. Saya sudah mempostingnya di GitHub kalau-kalau bisa bermanfaat bagi orang lain.

6
cclark

Langkah-langkah:

  1. Tekan http: // localhost/phpmyadmin/
  2. Pilih DB Anda
  3. Klik pada Tab Operasi
  4. Akan ada tab sebagai "Ubah nama database menjadi". Tambahkan nama baru dan centang Sesuaikan hak istimewa.
  5. Klik Go.

 enter image description here

6
Shubham Jain

Metode paling sederhana adalah dengan menggunakan perangkat lunak HeidiSQL. Ini gratis dan open source. Ini berjalan di Windows dan di Linux apa pun dengan Wine (menjalankan aplikasi Windows di Linux, BSD, Solaris dan Mac OS X).

Untuk mengunduh HeidiSQL, goto http://www.heidisql.com/download.php .

Untuk mengunduh Wine, goto http://www.winehq.org/ .

Untuk mengganti nama database di HeidiSQL, cukup klik kanan pada nama database dan pilih 'Edit'. Kemudian masukkan nama baru dan tekan 'OK'.

Ini sangat sederhana.

5
Fathah Rehman P

Berikut adalah cara cepat untuk membuat nama skrip sql, jika Anda memiliki banyak tabel untuk dipindahkan.

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

Tampaknya tidak ada yang menyebutkan ini, tetapi di sini ada cara lain:

create database NewDatabaseName like OldDatabaseName;

maka untuk setiap tabel lakukan:

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

maka, jika Anda ingin,

drop database OldDatabaseName;

Pendekatan ini akan memiliki keuntungan melakukan seluruh transfer pada server dengan lalu lintas jaringan mendekati nol, sehingga akan jauh lebih cepat daripada dump/restore.

Jika Anda memiliki prosedur/tampilan/etc yang tersimpan, Anda mungkin ingin mentransfernya juga.

4

Untuk pengguna mac, Anda dapat menggunakan Sequel Pro (gratis), yang hanya menyediakan opsi untuk mengganti nama Database. Meskipun itu tidak menghapus DB yang lama.

setelah membuka DB yang relevan cukup klik: Database -> Rename database...

4
Roee Gavirel

Di MySQL Administrator, lakukan hal berikut:

  1. Di bawah Katalog, buat skema database baru.
  2. Pergi ke Cadangan dan buat cadangan dari skema lama.
  3. Jalankan cadangan.
  4. Pergi ke Kembalikan dan buka file yang dibuat pada langkah 3.
  5. Pilih 'Skema Lain' di bawah Skema Target dan pilih skema database baru.
  6. Mulai Kembalikan.
  7. Verifikasi skema baru dan, jika terlihat bagus, hapus yang lama.
3
Tom

di phpmyadmin Anda dapat dengan mudah mengganti nama basis data

select database 

  goto operations tab

  in that rename Database to :

  type your new database name and click go

minta untuk menjatuhkan tabel lama dan memuat kembali data tabel klik OK di keduanya

Basis data Anda diganti namanya

3
murtaza.webdev

Jika Anda menggunakan phpMyAdmin Anda dapat membuka tab "operasi" setelah memilih basis data yang ingin Anda ganti namanya. Lalu pergi ke bagian terakhir "salin database ke" (atau sesuatu seperti itu), beri nama, dan pilih opsi di bawah ini. Dalam hal ini, saya kira Anda harus memilih "struktur dan data" dan "buat database sebelum menyalin" kotak centang dan, akhirnya, tekan tombol "pergi" di bagian itu.

Ngomong-ngomong, saya menggunakan phpMyAdmin dalam bahasa Spanyol jadi saya tidak yakin apa nama-nama bagian dalam bahasa Inggris.

3
ecruz

Berikut ini cuplikan Bash satu baris untuk memindahkan semua tabel dari satu skema ke yang lain:

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

Perintah sejarah di awal hanya memastikan bahwa perintah MySQL yang berisi kata sandi tidak disimpan ke riwayat Shell.

Pastikan db_user memiliki izin baca/tulis/jatuhkan pada skema lama, dan baca/tulis/buat izin pada skema baru.

3
coffeefiend

Saya melakukannya dengan cara ini: Ambil cadangan dari database Anda yang ada. Ini akan memberi Anda db.Zip.tmp dan kemudian di command Prompt tulis berikut

"C:\Program Files (x86)\MySQL\MySQL Server 5.6\bin\mysql.exe" -h localhost -u root -p [kata sandi] [nama db baru] <"C:\Cadangkan\db.Zip.tmp "

3
Samra

Anda dapat melakukannya dengan dua cara.

  1. RENAME TABLE old_db.table_name TO new_db.table_name;
  2. Operasi goto-> di sana Anda dapat melihat tab Opsi tabel. Anda dapat mengedit nama tabel di sana.
2
jeeva

Ini adalah skrip kumpulan yang saya tulis untuk mengganti nama basis data di 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%"
2
Nadav Benedek

ALTER DATABASE adalah cara yang diusulkan untuk hal ini oleh MySQL dan RENAME DATABASE dijatuhkan.

Dari13.1.32 RENAME DATABASE Sintaks:

RENAME {DATABASE | SCHEMA} db_name TO new_db_name;

Pernyataan ini ditambahkan di MySQL 5.1.7, tetapi ternyata berbahaya dan dihapus di MySQL 5.1.23.

2
xelber

Ini berfungsi untuk semua database dan berfungsi dengan mengganti nama setiap tabel dengan maatkit mysql toolkit

Gunakan mk-find untuk mencetak dan mengganti nama setiap tabel. Halaman manual memiliki lebih banyak opsi dan contoh

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

Jika Anda telah menginstal maatkit ( yang sangat mudah ), maka ini adalah cara paling sederhana untuk melakukannya.

2

Jika Anda mulai dari file dump dengan beberapa database, Anda bisa melakukan sed pada dump:

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

Kemudian impor dump Anda. Pastikan saja tidak ada konflik nama.

1
RotS

Baik solusi TodoInTx maupun solusi adaptasi user757945 bekerja untuk saya di MySQL 5.5.16, jadi di sini adalah versi adaptasi saya:

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 ;

Semoga ini bisa membantu seseorang yang ada dalam situasi saya! Catatan: @sql_string akan berlama-lama di sesi setelahnya. Saya tidak dapat menulis fungsi ini tanpa menggunakannya.

1
Milosz

Saya menggunakan metode berikut untuk mengubah nama database

  1. mengambil cadangan file menggunakan mysqldump atau alat DB misalnya heidiSQL, administrator mysql dll

  2. Buka file cadangan (mis. Backupfile.sql) di beberapa editor teks.

  3. Cari dan ganti nama database dan simpan file.

4. Kembalikan file sql yang diedit

1
Adarsha

Jika Anda menggunakan tampilan hierarkis (tampilan menarik data dari tampilan lain), impor output mentah dari mysqldump mungkin tidak berfungsi karena mysqldump tidak peduli dengan urutan tampilan yang benar. Karena itu, saya menulis skrip yang memesan ulang tampilan untuk memperbaiki urutan dengan cepat.

Ini terlihat seperti ini:

#!/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);
            }
        }
    }
}

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

1
gadelat

Kalian akan menembak saya untuk ini, dan kemungkinan besar ini tidak akan berhasil setiap waktu, dan tentu saja, itu bertentangan dengan semua logika bla bla ... Tapi yang saya coba adalah ... BERHENTI mesin MySQL, masuk sebagai root dan cukup mengubah nama DB pada tingkat sistem file ....

Saya menggunakan OSX, dan hanya mengubah case, dari bedbf ke BEDBF. Yang mengejutkan saya itu berhasil ...

Saya tidak akan merekomendasikan itu pada DB produksi. Saya baru saja mencoba ini sebagai percobaan ...

Semoga beruntung :-)

0
Lawrence

Saya memposting ini Bagaimana cara mengubah nama database menggunakan MySQL? hari ini setelah berhari-hari menggaruk-garuk kepala dan menarik rambut. Solusinya adalah cukup sederhana mengekspor skema ke file .sql dan membuka file dan mengubah database/nama skema di bagian sql CREAT TABLE di bagian atas. Ada tiga contoh atau lebih dan mungkin tidak di bagian atas halaman jika skema multible disimpan ke file. Dimungkinkan untuk mengedit seluruh database dengan cara ini tetapi saya berharap bahwa dalam database besar bisa sangat menyebalkan mengikuti semua contoh properti tabel atau indeks.

0
E.R.Rider

I). Tidak ada cara langsung dimana Anda dapat mengubah nama DB yang ada. Tetapi Anda dapat mencapai target Anda dengan mengikuti langkah-langkah di bawah ini: Buat newdb. 2). Gunakan newdb. 3). buat table_name tabel (pilih * dari olddb.table_name);

Dengan melakukan di atas, Anda menyalin data dari tabel olddb dan memasukkannya ke dalam tabel newdb. Beri nama tabel yang sama.

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

0
rajesh