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-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 MySQL "RENAME TABLE". 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) Hasilkan daftar hanya "BASE" tabel. Ini dapat ditemukan menggunakan kueri di atas information_schema.TABLES
meja.
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 di information_schema.TABLES
tabel 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 dapat 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;". Meskipun “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:
[root@dba~]# /tmp/rename_db
rename_db <server> <database> <new_database>
Untuk mendemonstrasikan penggunaan skrip ini, gunakan skema sampel "emp", pencetus tes yang dibuat, rutin yang tersimpan pada skema tersebut. Akan mencoba mengubah nama skema database 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 |
+--------------------+
[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 |
+--------------------+
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