MySQL にあるMySQLのマニュアルがこれをカバーしています。
通常、データベースをダンプして新しい名前で再インポートします。これは非常に大規模なデータベースのためのオプションではありません。どうやらRENAME {DATABASE | SCHEMA} db_name TO new_db_name;
は悪いことをしていて、ほんの一握りのバージョンにしか存在せず、全体的に悪い考えです 。
InnoDBの場合、次のように動作します。新しい空のデータベースを作成してから、各テーブルの名前を新しいデータベースに変更します。
RENAME TABLE old_db.table TO new_db.table;
その後、権限を調整する必要があります。
シェルでのスクリプト作成には、以下のいずれかを使用できます。
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
または
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;
ノート:
-p
とパスワードの間にスペースはありません。データベースにパスワードが設定されていない場合は、-u username -ppassword
部分を削除します。あるテーブルにトリガがある場合、上記の方法で他のデータベースに移動することはできません(Trigger in wrong schema
エラーが発生します)。その場合は、従来の方法でデータベースを複製してから古いデータベースを削除します。
mysqldump old_db | mysql new_db
ストアドプロシージャがある場合は、後でそれらをコピーできます。
mysqldump -R old_db | mysql new_db
これらのいくつかの簡単なコマンドを使用してください。
mysqldump -u username -p -v olddatabase > olddbdump.sql
mysqladmin -u username -p create newdatabase
mysql -u username -p newdatabase < olddbdump.sql
あるいは、I/Oを減らすために@Pablo Marin-Garciaが提案しているように次のようにします。
mysqladmin -u username -p create newdatabase
mysqldump -u username -v olddatabase -p | mysql -u username -p -D newdatabase
私はその解決策がより単純で、一部の開発者によって提案されたと思います。 phpMyAdminにはこれに対する操作があります。
PhpMyAdminから、選択したいデータベースを選択します。タブにはOperationsと呼ばれるものがあり、名前の変更セクションに行きます。それで全部です。
多くの人が示唆しているように、新しい名前で新しいデータベースを作成し、古いデータベースのすべてのテーブルを新しいデータベースにダンプし、古いデータベースを削除します。
SQLを使用して、ソースデータベースの各テーブルを転送先データベースに転送するためのSQLスクリプトを生成できます。
コマンドから生成されたスクリプトを実行する前に、接続先データベースを作成する必要があります。
あなたはこれら2つのスクリプトのどちらかを使うことができます(私は元々前者と誰かが私の答えをGROUP_CONCAT
を使うように「改善した」と提案しました。
SELECT CONCAT('RENAME TABLE $1.', table_name, ' TO $2.', table_name, '; ')
FROM information_schema.TABLES
WHERE table_schema='$1';
または
SELECT GROUP_CONCAT('RENAME TABLE $1.', table_name, ' TO $2.', table_name SEPARATOR '; ')
FROM information_schema.TABLES
WHERE table_schema='$1';
($ 1と$ 2はそれぞれソースとターゲットです)
これによりSQLコマンドが生成され、実行する必要があります。
GROUP_CONCAT
にはデフォルトの長さ制限があり、これは多数のテーブルを持つデータベースでは超えることがあることに注意してください。 SET SESSION group_concat_max_len = 100000000;
(または他の大きな数)を実行することによってその制限を変更することができます。
MySQLで見つからないRENAME DATABASE
コマンドをエミュレートする:
次のようにして名前変更クエリを作成します。
SELECT CONCAT('RENAME TABLE ',table_schema,'.',table_name,
' TO ','new_schema.',table_name,';')
FROM information_schema.TABLES
WHERE table_schema LIKE 'old_schema';
その出力を実行
3つの選択肢:
新しいデータベースを作成し、サーバーを停止し、ファイルをあるデータベースフォルダーから別のデータベースフォルダーに移動して、サーバーを再起動します。これはすべてのテーブルがMyISAMの場合にのみ機能することに注意してください。
新しいデータベースを作成し、CREATE TABLE ... LIKEステートメントを使用してから、INSERT ... SELECT * FROMステートメントを使用します。
Mysqldumpを使用してそのファイルをリロードします。
データベースディレクトリに移動します。
cd /var/lib/mysql/
MySQLをシャットダウンします...これは重要です。
/etc/init.d/mysql stop
さて、この方法はInnoDBやBDBデータベースには使えません。
データベース名を変更します。
mv old-name new-name
...またはテーブル...
cd database/
mv old-name.frm new-name.frm
mv old-name.MYD new-name.MYD
mv old-name.MYI new-name.MYI
MySQLを再起動します
/etc/init.d/mysql start
完了しました...
はい、この方法はInnoDBまたはBDBデータベースでは機能しません。この場合、データベースをダンプして再インポートする必要があります。
私はつい最近になってMyISAMとInnoDBで動作するとても素敵な方法に遭遇しました。とても速いです:
RENAME TABLE old_db.table TO new_db.table;
どこで読んだか覚えていませんが、信用は私以外の誰かにかかっています。
あなたはこのシェルスクリプトを使うことができます:
参照: 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"
それは働いています:
$ sh rename_database.sh oldname newname
これは私が使っているものです:
$ 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;
complete rename を実行するための最も簡単な箇条書きのない方法(最後の古いデータベースを削除してコピーではなく名前の変更を含む) :
mysqladmin -uroot -pmypassword create newdbname
mysqldump -uroot -pmypassword --routines olddbname | mysql -uroot -pmypassword newdbname
mysqladmin -uroot -pmypassword drop olddbname
ステップ:
MySQLは現時点ではコマンドインターフェースによるデータベースの名前変更をサポートしていませんが、MySQLがデータベースを格納しているディレクトリにアクセスできる場合はデータベースの名前を変更できます。デフォルトのMySQLインストールの場合、これは通常MySQLがインストールされたディレクトリの下のDataディレクトリにあります。 Dataディレクトリーの下で名前を変更したいデータベースの名前を見つけて、名前を変更します。ディレクトリの名前を変更してもいくつかの権限の問題が発生する可能性があります。気をつけて。
注: /データベース名を変更する前にMySQLを停止しなければなりません
新しいデータベースを作成し(必要な名前を使用して)、必要なデータを古いものから新しいものにエクスポート/インポートすることをお勧めします。ものすごく単純。
PHPMyAdminでデータベースの名前を変更すると、ダンプが作成されてから、新しい名前でデータベースが削除されて再作成されます。
2つの方法があります。
方法1: データベーススキーマの名前を変更するためのよく知られた方法は、Mysqldumpを使用してスキーマをダンプし、それを別のスキーマに復元してから、必要に応じて古いスキーマを削除することです。
シェルから
mysqldump emp > emp.out
mysql -e "CREATE DATABASE employees;"
mysql employees < emp.out
mysql -e "DROP DATABASE emp;"
上記の方法は簡単ですが、時間とスペースがかかります。スキーマが 100GB以上の場合はどうなりますか? スペースを節約するために上記のコマンドを一緒にパイプ処理できる方法がありますが、時間を節約することはできません。
このような状況を解決するには、スキーマの名前を変更するための別の簡単な方法がありますが、それを実行する際には注意が必要です。
方法2: MySQLはテーブルの名前を変更するための非常に優れた機能を持っています。この名前変更操作はアトミックであり、名前が変更されている間、他のユーザーはそのテーブルにアクセスできません。テーブルの名前またはそのスキーマの変更はメタデータの変更にすぎないため、これには短時間で完了します。これは、名前を変更する際の手続き型のアプローチです。
目的の名前で新しいデータベーススキーマを作成します。 MySQLの「RENAME TABLE」コマンドを使用して、古いスキーマから新しいスキーマにテーブルの名前を変更します。古いデータベーススキーマを削除します。 If there are views, triggers, functions, stored procedures in the schema, those will need to be recreated too
。テーブルにトリガーが存在する場合、MySQLの「RENAME TABLE」は失敗します。これを直すために私達は次のことをすることができる:
1) Dump the triggers, events and stored routines in a separate file.
これは(トリガをダンプする-t -dに加えて)-E、-Rフラグを使ってmysqldumpコマンドに実行されます。トリガーがダンプされたら、RENAME TABLEコマンドが機能するように、それらをスキーマから削除する必要があります。
$ mysqldump <old_schema_name> -d -t -R -E > stored_routines_triggers_events.out
2) “ BASE”テーブルのみのリストを生成します。これらはinformation_schema.TABLES
テーブルに対するクエリを使用して見つけることができます。
mysql> select TABLE_NAME from information_schema.tables where
table_schema='<old_schema_name>' and TABLE_TYPE='BASE TABLE';
3) outファイルにビューをダンプします。ビューは、同じinformation_schema.TABLES
テーブルに対するクエリを使用して見つけることができます。
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) old_schema内の現在のテーブルのトリガを削除します。
mysql> DROP TRIGGER <trigger_name>;
...
5) ステップ#2で見つかったすべての "Base"テーブルの名前が変更されたら、上記のダンプファイルを復元します。
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
上記の方法の複雑さ:ユーザーが正しいschema_nameと一致するようにGRANTSを更新する必要があるかもしれません。これらは、mysql.columns_priv、mysql.procs_priv、mysql.tables_priv、mysql.dbテーブルの単純なUPDATEでold_schemaの名前をnew_schemaに更新し、「Flush privilege;」を呼び出すことで修正できます。 「方法2」は「方法1」よりも少し複雑に見えますが、これは完全にスクリプト可能です。上記の手順を適切な順序で実行するための単純なbashスクリプトを使用すると、次回データベーススキーマの名前を変更しながらスペースと時間を節約できます。
Percona Remote DBAチームは、次のように機能する「rename_db」というスクリプトを作成しました。
[root@dba~]# /tmp/rename_db
rename_db <server> <database> <new_database>
このスクリプトの使用方法を示すために、サンプルスキーマ“ emp”を使用し、テストトリガを作成し、そのスキーマにストアドルーチンを作成しました。スクリプトを使用してデータベーススキーマの名前を変更しようとします。時間がかかるダンプ/復元方法とは対照的に、完了までに数秒かかります。
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 |
+--------------------+
上記の出力からわかるように、データベーススキーマ「emp」は1秒以内に「emp_test」に名前が変更されました。最後に、これは上記の「方法2」で使用されたPerconaのスクリプトです。
#!/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
Macユーザーの方のために、Sequel Proのデータベースメニューにはデータベース名の変更オプションがあります。 http://www.sequelpro.com/
データベース内のすべてのテーブルの名前を別のデータベースの下になるように変更しても、フルダンプや復元を行う必要はありません。
存在する場合はDROP PROCEDURE mysql.rename_db; DELIMITER || CREATE PROCEDURE mysql.rename_db(IN old_db VARCHAR(100)、IN new_db VARCHAR(100)) ] BEGIN SELECT CONCAT( 'データベースの作成'、new_db、 ';') `#新しいデータベースの作成 '; SELECT CONCAT(' RENAME TABLE '、old_db、'` .` '、 table_name、 '' TO ''、new_db、 '`.`'、table_name、 '`;') `#alter table` FROM information_schema.tablesからWHERE table_schema = old_db; SELECT CONCAT( 'DROP DATABASE`' 、old_db、 ''; ') `#古いデータベースを削除する; END || DELIMITER; $ time mysql -uroot -e" call mysql .rename_db( 'db1'、 'db2'); " | mysql -uroot
ただし、ターゲットdb内のトリガーはどれも幸せではありません。最初にそれらを削除し、名前の変更後にそれらを再作成する必要があります。
mysql -uroot -e "mysql.rename_db( 'test'、 'blah2');を呼び出します。" | mysql -uroot 4行目のエラー1435(HY000):誤ったスキーマでトリガします
ここでの答えのほとんどは、2つの理由のうちの1つの理由で間違っています。
Perconaはこれをうまくやる方法についてのブログ記事を持っています: https://www.percona.com/blog/2013/12/24/renaming-database-schema-mysql/
そしてSimon R Jonesによってスクリプト投稿(作られましたか?)され、その投稿で提案されていることを行います。スクリプトで見つかったバグを修正しました。あなたはそれをここで見ることができます:
https://Gist.github.com/ryantm/76944318b0473ff25993ef2a7186213d
これがそのコピーです。
#!/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
という名前のファイルに保存し、chmod +x rename_db
でスクリプトを実行可能にしてから、./rename_db localhost old_db new_db
のように使用します。
これはコマンドラインから自動化するために書いたバッチファイルですが、Windows/MS-DOS用です。
構文はrename_mysqldbです。database newdatabase -u [ユーザー] -p [パスワード]
:: ***************************************************************************
:: 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=
TodoInTXのストアドプロシージャは私にとってはあまりうまくいきませんでした。これが私の突き刺しです。
- ストアドプロシージャrename_db:テーブルコピーの手段としてデータベースの名前を変更する - 警告: - 'new'と同じ名前の既存のデータベースを削除します。データベース名 - テーブルをコピーするだけです。ストアドプロシージャおよび他のデータベースオブジェクトはコピーされません。 - Tomer Altman([email protected]) 区切り文字// DROP PROCEDURE IF EXISTS rename_db; CREATE PROCEDURE rename_db(IN old_db VARCHAR(100)、IN new_db VARCHAR(100)) BEGIN DECLARE現在のテーブルVARCHAR(100); DECLARE done INT DEFAULT 0; DECLARE old_tables CURSOR FOR information_schema.tablesからtable_nameを選択しますtable_schema = old_db; DECLARE CONTINUEハンドラが見つからない場合の設定done = 1; SET @output = CONCAT( 'DROP SCHEMA IF EXISTS'、new_db、 ';'); PREPARE stmt from @output; EXECUTE stmt; SET @output = CONCAT( 'CREATE SCHEMA IF NOT EXISTS'、new_db、 ';'); PREPARE stmt from @output; EXECUTE stmt; OPEN old_tables; REPEAT FETCH old_tables INTO current_table; 実行しない場合 SET @output = CONCAT( 'テーブルの変更'、old_db、 '。'、current_table、 '名前の変更'、new_db、 '。'、current_table、 ';'); @出力からの文の準備; EXECUTE文; END IF; 終了するまでEND REPEAT; 閉じるold_tables; END // 区切り文字;
あなたの便宜のために、以下はdb-nameとnew db-nameの2つのパラメータで実行されなければならない小さなシェルスクリプトです。
ホームディレクトリで.my.cnfファイルを使用しない場合は、mysql-linesにlogin-parametersを追加する必要があります。このスクリプトを実行する前にバックアップを作成してください。
#!/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"
I Server Faultで質問がありました MySQLプロキシを使用して非常に大きなデータベースを復元するときにダウンタイムを回避しようとしました。私は何の成功もしませんでしたが、データベースのサイズが大きいためにダンプ/インポートが選択肢にならなかったため、最終的にはRENAME DATABASE機能が欲しいと思いました。
MySQLにはRENAME TABLE機能が組み込まれているので、仕事をするための簡単なPythonスクリプトを書くことにしました。私は GitHubに投稿しました 他の人に役立つ可能性がある場合に備えて。
ステップ:
最も簡単な方法は、HeidiSQLソフトウェアを使用することです。無料でオープンソースです。 Wine (Windows、Linux、BSD、Solaris、Mac OS XでWindowsアプリケーションを実行します)を使用して、WindowsおよびすべてのLinuxで動作します。
HeidiSQLをダウンロードするには、goto http://www.heidisql.com/download.php にアクセスしてください。
Wineをダウンロードするには、goto http://www.winehq.org/ にアクセスしてください。
HeidiSQLでデータベースの名前を変更するには、データベース名を右クリックして[編集]を選択します。次に新しい名前を入力して[OK]を押します。
とても簡単です。
移動するテーブルが多数ある場合は、ここでSQLスクリプトの名前変更を簡単に生成できます。
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' ;
誰もこれについて言及していないようですが、これは別の方法です:
create database NewDatabaseName like OldDatabaseName;
その後、各テーブルに対して以下を行います。
create NewDatabaseName.tablename like OldDatabaseName.tablename;
insert into NewDataBaseName.tablename select * from OldDatabaseName.tablename;
したい場合は、
drop database OldDatabaseName;
このアプローチには、ネットワークトラフィックがほぼゼロの状態でサーバー上で転送全体を実行するという利点があるため、ダンプ/復元よりもはるかに高速です。
あなたがストアドプロシージャ/ビュー/ etcを持っているなら、あなたもそれらを転送したいかもしれません。
Macユーザーの場合は、データベースの名前を変更するオプションを提供するだけのSequel Pro
(free)を使用できます。古いDBは削除されませんが。
関連するDBを開いたら、クリックしてください:Database
- > Rename database...
MySQL Administratorで以下を行います。
phpmyadmin でデータベースの名前を簡単に変更できます
select database
goto operations tab
in that rename Database to :
type your new database name and click go
古いテーブルを削除してテーブルデータをリロードするように要求する
データベースの名前が変更されました
phpMyAdmin を使用している場合は、名前を変更したいデータベースを選択したら、「操作」タブに移動できます。それから最後のセクション「データベースのコピー先」(またはそのようなもの)に行き、名前を付けて、下のオプションを選択してください。この場合、「構造とデータ」と「コピー前にデータベースを作成する」のチェックボックスを選択し、最後にそのセクションの「実行」ボタンを押す必要があります。
ところで、私はスペイン語でphpMyAdminを使っているので、セクションの名前が英語で何なのかわからない。
これは、あるスキーマから別のスキーマにすべてのテーブルを移動するための1行のBashスニペットです。
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
最初のhistoryコマンドは単純にパスワードを含むMySQLコマンドがシェルの履歴に保存されないようにします。
db_user
に、古いスキーマに対する読み取り/書き込み/削除権限、および新しいスキーマに対する読み取り/書き込み/作成権限があることを確認してください。
私はこうやった:あなたの既存のデータベースのバックアップを取る。それはあなたにdb.Zip.tmpを与えそしてそれからコマンドプロンプトで以下を書く
"C:¥Program Files(x86)¥MySQL¥MySQL Server 5.6¥bin¥mysql.exe" -h localhost -u root -p [パスワード] [新しいdb名] <"C:\ Backups\db.Zip.tmp 「
それには2つの方法があります。
これは、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%"
ALTER DATABASE
はMySQLによってこれを回避する方法として提案されており、RENAME DATABASE
は削除されています。
RENAME {DATABASE | SCHEMA} db_name TO new_db_name;
この文はMySQL 5.1.7で追加されましたが、危険であることが判明し、MySQL 5.1.23で削除されました。
これはすべてのデータベースで機能し、 maatkit mysql toolkit で各テーブルの名前を変更することで機能します。
各テーブルを印刷して名前を変更するには、mk-findを使用します。 manページ にはもっとたくさんのオプションと例があります
mk-find --dblike OLD_DATABASE --print --exec "RENAME TABLE %D.%N TO NEW_DATABASE.%N"
もしあなたがmaatkitをインストールしているなら( これはとても簡単です )、これがそれをする最も簡単な方法です。
複数のデータベースを含むダンプファイルから始める場合は、ダンプに対してsedを実行できます。
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
...
次にダンプをインポートします。名前が競合しないようにしてください。
TodoInTxのソリューションもuser757945の適応ソリューションもMySQL 5.5.16では動作しませんでしたので、ここでは私の適応バージョンを紹介します。
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 ;
それが私の状況にある誰かに役立つことを願っています!注:@sql_string
はその後のセッションでも残ります。私はそれを使わないでこの関数を書くことができませんでした。
以下の方法でデータベースの名前を変更しました
mysqldumpまたは任意のDBツール(heidiSQL、mysql管理者など)を使用してファイルのバックアップを取ります
何らかのテキストエディタでバックアップ(例えばbackupfile.sql)ファイルを開きます。
データベース名を検索して置き換え、ファイルを保存します。
4.編集したSQLファイルを復元する
階層ビュー(他のビューからデータを取得するビュー)を使用する場合、mysqldumpはビューの正しい順序を気にしないため、mysqldumpからの生の出力のインポートは機能しない可能性があります。このため、I スクリプトを書いて その場で正しい順序にビューを並べ替えます。
それはこんな感じです:
#!/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);
}
}
}
}
使用法:mysqldump -u username -v olddatabase -p | ./mysqldump_view_reorder.pl | mysql -u username -p -D newdatabase
皆さん、これを狙って私を撃つつもりです、そしてたぶん、これは毎回うまくいくわけではありません、そして、確かに、それはすべての論理blah blahに反しています... rootとして、単にファイルシステムレベルでDBの名前を変更します。
私はOSXを使用していて、bedbfからBEDBFに変更しました。驚いたことにそれはうまくいった...
本番DBではお勧めできません。私はただこれを実験として試しました….
どちらかの方法で頑張ってください:-)
私はこれを投稿しました MySQLを使用してデータベース名を変更する方法 今日は頭を引っ掻いたり髪を引っ張ったりした日の後。解決策は、スキーマを.sqlファイルにエクスポートしてファイルを開き、上部のsql CREAT TABLEセクションでデータベース/スキーマ名を変更することです。マルチインスタンススキーマがファイルに保存されている場合、3つ以上のインスタンスがあり、ページの上部に表示されない場合があります。この方法でデータベース全体を編集することは可能ですが、大規模なデータベースでは、テーブルプロパティまたはインデックスのすべてのインスタンスに従うと、非常に面倒になる可能性があります。
I)。uが既存のDBの名前を変更できる直接的な方法はありません。 newdbを作成します。 2)。 newdbを使用してください。 3)。テーブルtable_nameを作成します(olddb.table_nameから*を選択)。
上記のようにして、olddbのテーブルからデータをコピーし、それらをnewdbテーブルに挿入します。テーブルの名前を同じにします。
II)。 RENAME TABLE old_db.table_name TO new_db.table_name;