MySQLデータベースの名前をすばやく変更するには(スキーマ名を変更)


959

でMySQLのマニュアルMySQLはこれをカバーしています。

通常、私はデータベースをダンプし、新しい名前で再インポートします。これは非常に大きなデータベースのオプションではありません。どうやらRENAME {DATABASE | SCHEMA} db_name TO new_db_name; 悪いことをし、少数のバージョンにのみ存在し、全体として悪い考えです。

これは、MyISAMとは非常に異なるものを格納するInnoDBと連携する必要があります。



5
このステートメントRENAME DATABASE構文はMySQL 5.1.7で追加されましたが、危険であることが判明し、MySQL 5.1.23で削除されました。
zloctb 2015年

11
うまくいけばRENAME DATABASE、現在このタスクを行う簡単な方法がないので、MySQLは危険を伴わない新しい機能するステートメントを実装します。ドキュメンテーションで危険だった明確な理由はないので、彼らは交換を行うことができます。少なくとも人々は彼らのウェブサイトに機能要求バグを載せました。たとえば、bugs.mysql.com / bug.php ?id = 58593およびbugs.mysql.com/bug.php?id=1698です。
エドワード

リンクが壊れています...
oldboy '24

回答:


833

以下のための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


26
file_per_table設定を使用して、30以上のテーブルを持つInnoDBデータベースでこれを実行したところ、一部のテーブルが300万以上の行であったとしても、1秒未満で完了しました。より複雑なことをするのではなく、ストレージ上のファイルを移動するように見えます...可能な場合は+2 :)
Dave Rix

87
「RENAME DATABASEは危険であることが判明し、MySQL 5.1.23で削除されました」-dev.mysql.com/doc/refman/5.1/en/rename-database.html
Palani

13
これはビューでは機能しないことに注意してください。ビューの名前を変更して、データベースから別のビューにジャンプさせることはできません。使用DROP VIEWしてCREATE VIEW代わりに。不器用、はい。mysqldump最初にすべてのテーブルを移動した後で、ビューを移動するためにaを実行したい場合があります。またSHOW TABLES、テーブルとビューが表示されるので注意してください。
tuomassalo 2013年

9
また、これはトリガーのあるテーブルでは機能しません。テーブルを移動する前にトリガーを検索、ダンプ、およびドロップしてから、ダンプされたトリガーをターゲットデータベースにインポートする必要があります。
Olfan

5
RENAME DATABASE削除された理由を説明する更新された(つまり、作業中の)リンク:dev.mysql.com/worklog/task/?id
alexis

443

次のいくつかの簡単なコマンドを使用します。

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

86
OPが言ったように、「これは非常に大きなデータベースのオプションではありません。」
ピルクロー

3
元のデータベースを
削除

3
素晴らしい答え!これはおそらくすべての能力によってググられているので、さらに改善するためのいくつかの提案:(1)Pablo Marin-Garciaのコードフラグメントを最良の答えのように上に移動します(2)プロンプトが表示されずにステートメントが実行されるよう-p<password>-pすべての場所ではなく配置します。
Steve Chambers 14

9
パイプバージョンを使用すると、 "Enter password:"プロンプトが次のように2つ表示さ Enter password: Enter password: れます。詳細が足りませんか?
ライアン

33
誰もこれについて言及していないことに驚いていますが--routines、ストアドプロシージャが確実にコピーされるように、mysqldumpコマンドにもフラグを追加する必要があります。
Carlos P

205

解決策はより単純で、一部の開発者から提案されたと思います。phpMyAdminにはこのための操作があります。

phpMyAdminから、選択するデータベースを選択します。タブには「操作」と呼ばれるものがあり、名前の変更セクションに移動します。それで全部です。

多くの人が提案したように、新しい名前で新しいデータベースを作成し、古いデータベースのすべてのテーブルを新しいデータベースにダンプして、古いデータベースを削除します。

ここに画像の説明を入力してください


76
環境にphpがあるか、phpmyadminを使用していると仮定します。
クリス

26
phpMyAdminを使用していてもかなり危険です。2つのdbが不明な状態のままになっている途中でバックエンドが失敗するか、非常に長い時間がかかり、フロントエンドがハングしたり、PHPがタイムアウトしたりする可能性があります。
mozboz 2012

20
それは本当の@mozbozですが、私はこれを10年間行っており、そのような問題は一度もありません。シェルを介してコマンドを実行し、コンピューターがクラッシュした場合も同じです。可能性はありますが何ですか?1から1兆?
raphie 2012

24
コンソール経由のスクリプトもフロントエンドであり、同じ問題でハングする可能性があります。
グレッグ

11
それでも、コンソール操作はPhpMyAdminよりもはるかに信頼性が高く、特にOPの場合、大きなデータベースが関係している場合に適しています。個人的には、データベースがかなり大きい場合は、PMAではなくコンソール方式を強くお勧めします。言うまでもなく、小規模なデータベースではPMAも同様に優れています。
Teodor Sandu 2013

107

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;(または他の大きな数)。


@BlakeFrederick RENAME DATABASEを使用しないので、問題は何ですか?
tuxayo 2016

テーブルに参照制約がある場合、これは機能しますか?期待しない。
ドルメン

42

RENAME DATABASEMySQLで不足しているコマンドをエミュレートします。

  1. 新しいデータベースを作成する
  2. 次のコマンドで名前変更クエリを作成します。

    SELECT CONCAT('RENAME TABLE ',table_schema,'.',table_name,
        ' TO ','new_schema.',table_name,';')
    FROM information_schema.TABLES
    WHERE table_schema LIKE 'old_schema';
  3. その出力を実行します

  4. 古いデータベースを削除

これは、MySQLの不足しているRENAME DATABASEコマンドのエミュレートから取得されました。


1
パーフェクト!これをInnoDBとMyISAMテーブルでテストしました。私がテストした最速のソリューション(テーブルの名前を変更するのはほとんど瞬時で、遅延はありません)!
フィリップ

すごい!後で特権を修正することを忘れないでください。
Adam Faryna

ps。ライブDBで作業している場合は、名前変更クエリを実行する前にこれを実行することをお勧めします。
Adam Faryna

テーブルに参照制約がある場合、これは機能しますか?期待しない。
ドルメン

24

3つのオプション:

  1. 新しいデータベースを作成し、サーバーを停止して、ファイルを1つのデータベースフォルダーから別のデータベースフォルダーに移動し、サーバーを再起動します。これは、すべてのテーブルがMyISAMである場合にのみ機能することに注意してください。

  2. 新しいデータベースを作成し、CREATE TABLE ... LIKEステートメントを使用してから、INSERT ... SELECT * FROMステートメントを使用します。

  3. mysqldumpを使用して、そのファイルでリロードします。


+ myisamリファレンス。これがうまくいかなかった理由がわかりませんでした。
クリスチャンペイン

5
質問では、これはMyISAMではなくInnoDBで機能する必要があると述べています
D-Rock

@ D-Rockは、タイトルに基づいて人々をここに連れてくるGoogleにそれを伝えます。
jiggunjer

24

簡単な方法

データベースディレクトリに移動します。

cd /var/lib/mysql/

MySQLをシャットダウンします...これは重要です!

/etc/init.d/mysql stop

わかりました、この方法はInnoDBまたはBDB-Databasesでは機能しません。

データベースの名前を変更:

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

完了...

OK、この方法はInnoDBまたはBDBデータベースでは機能しません。この場合、データベースをダンプして再インポートする必要があります。


16
フォルダの名前を変更するとおもちゃが壊れます。
ViniciusPires 2013

1
@Rahly、テーブルごとに1つのファイルが設定されている場合でも危険です。テーブルごとに1つのファイルが設定される前に作成されたテーブルは、そのフラグが設定された後にデータベースが作成されることが確実でない限り、問題が発生します。
Qian Chen

一般的に言えば、ほとんどの人はどちらかの方法でシステムを所有し、ファイルごとにテーブルを1つ持つか持たないかをランダムにフリップすることはありません。その上、あなたのシナリオでも、フラグの前にテーブルが作成された場合、そもそもそれらは個別のファイルとして存在しないため、移動は機能せず、安全であり、危険はありません。移動が行われている間、データベースは実行されていません。
Rahly

OS Xでhomebrewと共にインストールされたmysqlに相当するもの:launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist cd /usr/local/var/mysql mv old-name new-name launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
coberlin '19

22

次のシェルスクリプトを使用できます。

参照: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

6
これに注意してください。rootユーザーでログインしていない場合は、権限が制限されている可能性があります。名前の変更は失敗しますが、ドロップは成功し、データベースがドロップされます。それ以外の場合は素晴らしいスクリプトです。
Lex

3
set -eスクリプトの最初に追加しました。これにより、失敗時に実行が終了し、その問題を軽減するはずです。
ミッケル

19

私は最近、それを行うための非常に素晴らしい方法に出くわしました。MyISAMとInnoDBで動作し、非常に高速です。

RENAME TABLE old_db.table TO new_db.table;

私はどこでそれを読んだか覚えていませんが、クレジットは私ではない誰かに与えられます。


@ArkadijKuzhelはそうは思わない。RENAME DATABASEの話だと思います。
ロブ・グラント

これは本当に役立ちました。新しい空のデータベースを作成してから、コードを使用しました。すべてのテーブルが目的の名前でインポートされました。
7

3
これには、受け入れられた回答と同じ問題があります。「データベースの名前変更は危険であることが判明し、MySQL 5.1.23で削除されました」-dev.mysql.com/doc/refman/5.1/en/rename-database.htmlから
ブレイクフレデリック

16

完全な名前変更を実行するための最も簡単で簡単な方法(古いデータベースを最後にドロップして、コピーではなく名前を変更することを含む)

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

手順:

  1. 行をメモ帳にコピーします。
  2. 「olddbname」、「newdbname」、「mypassword」(およびオプションで「root」)へのすべての参照を、同等のものに置き換えます。
  3. コマンドラインで1つずつ実行します(プロンプトが表示されたら「y」と入力します)。

安全ではないため、コンソールにパスワードを追加しないでください。これを既に行っている場合は、history -cwを使用して削除してください。代わりに、パスワードを空のままにして、プロンプトの後に入力します。
Tommie C.

異常に時間がかかり、20分以上も終了していません。キャンセルしても大丈夫ですか?
Sigu Magwa

15

これは私が使用するものです:

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

14
巨大なデータベースではできません。
mikesl 2009

14

MySQLは、現時点ではコマンドインターフェースを介したデータベースの名前変更をサポートしていませんが、MySQLがデータベースを格納するディレクトリにアクセスできる場合は、データベースの名前を変更できます。デフォルトのMySQLインストールの場合、これは通常、MySQLがインストールされたディレクトリの下のDataディレクトリにあります。名前を変更するデータベースの名前をDataディレクトリで見つけ、名前を変更します。ただし、ディレクトリの名前を変更すると、権限の問題が発生する可能性があります。注意してください。

注:データベースの名前を変更する前に、MySQLを停止する必要があります

(必要な名前を使用して)新しいデータベースを作成し、必要なデータを古いものから新しいものにエクスポート/インポートすることをお勧めします。ものすごく単純。


13

PHPMyAdminでデータベースの名前を変更すると、ダンプが作成され、データベースが削除されて新しい名前で再作成されます。


4
この機能は、データベースをクリックすると、[操作]タブで少し非表示になることに注意してください。
Maris B.

13

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.これは、mysqldumpコマンドに-E、-Rフラグ(トリガーをダンプする-t -dに加えてを使用して行われます。トリガーがダンプされたら、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で見つかったすべての「ベース」テーブルの名前が変更されたら、上記のダンプファイルを復元します。

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

上記の方法の複雑さ:ユーザーのGRANTSを更新して、正しいschema_nameと一致するようにする必要があります。これらは、mysql.columns_priv、mysql.procs_priv、mysql.tables_priv、mysql.dbテーブルでの単純なUPDATEで修正でき、old_schema名をnew_schemaに更新し、「フラッシュ特権;」を呼び出します。「方法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

参照制約についてはどうですか?
ドルメン

13

手順:

  1. ヒットのhttp:// localhost /をphpMyAdminは/
  2. DBを選択してください
  3. [操作]タブをクリックします
  4. 「データベースの名前を変更」というタブがあります。新しい名前を追加し、権限の調整を確認します。
  5. Goをクリックします。

ここに画像の説明を入力してください


1
一部の環境では環境が制限されているため、phpMyAdminソリューションは通常、貧弱なソリューションです。
Daniel Antunes Pinto

「良い」解決策ではありませんが、それが私が探していたものだったので、それでもなお感謝します。
ジェイミー

1
それがあなたのために働くなら親切に投票してください..それは助けになります..感謝
Shubham Jain

1
これは、phpMyAdmin環境では+1
William

12

Macユーザーの場合、Sequel Proの[データベース]メニューに[データベース名の変更]オプションがあります。 http://www.sequelpro.com/


5
データベースにビューまたはトリガーがある場合は、このオプションに注意してください。このメニューオプションの背後には、新しいデータベースを作成してすべてのテーブルを移動するスクリプトがあります。これはビューやトリガーでは機能しないため、古いデータベースに残されます。その結果、修正が必要な2つのデータベースが壊れています。
オルファン2015年

10

ここでの答えのほとんどは、次の2つの理由のいずれかのために間違っています。

  1. ビューやトリガーが存在する可能性があるため、RENAME TABLEだけを使用することはできません。トリガーがある場合、RENAME TABLEは失敗します
  2. 大きなデータベースの名前を「すばやく」(質問で要求されたとおりに)変更したい場合は、mysqldumpを使用できません。

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


私はこのスクリプトが好きです。ほとんど普遍的です。ただし、定義者がルートではないいくつかのチェーンされたVIEWがある場合、ケースの処理に失敗しました。
ENargit 2017

9

完全なダンプと復元を行わなくても、データベース内のすべてのテーブルの名前を別のデータベースの下に変更できます。

存在する場合のドロップ手順mysql.rename_db;
区切り文字||
CREATE PROCEDURE mysql.rename_db(IN old_db VARCHAR(100)、IN new_db VARCHAR(100))
ベギン
SELECT CONCAT( 'CREATE DATABASE'、new_db、 ';') `#create new database`;
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、 '`;') `#drop old database`;
終了||
区切り文字;

$ time mysql -uroot -e "call mysql.rename_db( 'db1'、 'db2');" | mysql -uroot

ただし、ターゲットdbのトリガーは満足できません。最初にそれらをドロップし、名前変更後にそれらを再作成する必要があります。

mysql -uroot -e "call mysql.rename_db( 'test'、 'blah2');" | mysql -uroot
エラー1435(HY000)、4行目:不適切なスキーマでトリガー

mysql 5.xでこれを機能させる小さな微調整 mysql --batch-uroot -e "call mysql.rename_db('test', 'blah2');" | mysql -uroot 注意:--batchを使用して、フォーマットをゼロフォーマットの結果を出力するrawフォーマットに変更する必要があります。
mikesl 2009

8

コマンドラインから自動化するために書いたバッチファイルを次に示しますが、Windows / MS-DOS用です。

構文はrename_mysqldb database newdatabase -u [user] -p [password]です。

:: ***************************************************************************
:: FILE: RENAME_MYSQLDB.BAT
:: ***************************************************************************
:: DESCRIPTION
:: This is a Windows /MS-DOS batch file that automates renaming a MySQL database 
:: by using MySQLDump, MySQLAdmin, and MySQL to perform the required tasks.
:: The MySQL\bin folder needs to be in your environment path or the working directory.
::
:: WARNING: The script will delete the original database, but only if it successfully
:: created the new copy. However, read the disclaimer below before using.
::
:: DISCLAIMER
:: This script is provided without any express or implied warranties whatsoever.
:: The user must assume the risk of using the script.
::
:: You are free to use, modify, and distribute this script without exception.
:: ***************************************************************************

:INITIALIZE
@ECHO OFF
IF [%2]==[] GOTO HELP
IF [%3]==[] (SET RDB_ARGS=--user=root) ELSE (SET RDB_ARGS=%3 %4 %5 %6 %7 %8 %9)
SET RDB_OLDDB=%1
SET RDB_NEWDB=%2
SET RDB_DUMPFILE=%RDB_OLDDB%_dump.sql
GOTO START

:START
SET RDB_STEP=1
ECHO Dumping "%RDB_OLDDB%"...
mysqldump %RDB_ARGS% %RDB_OLDDB% > %RDB_DUMPFILE%
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
SET RDB_STEP=2
ECHO Creating database "%RDB_NEWDB%"...
mysqladmin %RDB_ARGS% create %RDB_NEWDB%
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
SET RDB_STEP=3
ECHO Loading dump into "%RDB_NEWDB%"...
mysql %RDB_ARGS% %RDB_NEWDB% < %RDB_DUMPFILE%
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
SET RDB_STEP=4
ECHO Dropping database "%RDB_OLDDB%"...
mysqladmin %RDB_ARGS% drop %RDB_OLDDB% --force
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
SET RDB_STEP=5
ECHO Deleting dump...
DEL %RDB_DUMPFILE%
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
ECHO Renamed database "%RDB_OLDDB%" to "%RDB_NEWDB%".
GOTO END

:ERROR_ABORT
IF %RDB_STEP% GEQ 3 mysqladmin %RDB_ARGS% drop %NEWDB% --force
IF %RDB_STEP% GEQ 1 IF EXIST %RDB_DUMPFILE% DEL %RDB_DUMPFILE%
ECHO Unable to rename database "%RDB_OLDDB%" to "%RDB_NEWDB%".
GOTO END

:HELP
ECHO Renames a MySQL database.
ECHO Usage: %0 database new_database [OPTIONS]
ECHO Options: Any valid options shared by MySQL, MySQLAdmin and MySQLDump.
ECHO          --user=root is used if no options are specified.
GOTO END    

:END
SET RDB_OLDDB=
SET RDB_NEWDB=
SET RDB_ARGS=
SET RDB_DUMP=
SET RDB_STEP=

7

TodoInTXのストアドプロシージャは、私にはまったく機能しませんでした。これが私の刺しです:

-ストアドプロシージャrename_db:データベースの名前をテーブルコピーの手段で変更します。
-警告: 
-既存のデータベースを「新しい」データベース名と同じ名前で上書きします。
-テーブルのみをコピーします。ストアドプロシージャおよびその他のデータベースオブジェクトはコピーされません。
-Tomer Altman(taltman@ai.sri.com)

区切り文字//
存在する場合のドロップ手順rename_db;
CREATE PROCEDURE rename_db(IN old_db VARCHAR(100)、IN new_db VARCHAR(100))
ベギン
    DECLARE current_table VARCHAR(100);
    DECLAREはINT DEFAULT 0で実行されました。
    information_schema.tablesからtable_nameを選択するためにold_tables CURSORを宣言します。ここでtable_schema = old_db;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

    SET @output = CONCAT( 'DROP SCHEMA IF EXISTS'、new_db、 ';'); 
    @outputからstmtを準備します。
    EXECUTE stmt;

    SET @output = CONCAT( 'CREATE SCHEMA IF NOT NOT EXISTS'、new_db、 ';');
    @outputからstmtを準備します。
    EXECUTE stmt;

    OPEN old_tables;
    繰り返す
        FETCH old_tables INTO current_table;
        行わない場合
        SET @output = CONCAT( 'alter table'、old_db、 '。'、current_table、 'rename'、new_db、 '。'、current_table、 ';');
        @outputからstmtを準備します。
        EXECUTE stmt;

        終了IF;
    END REPEATが完了するまで。

    CLOSE old_tables;

終わり//
区切り文字;

これはテーブルに対してのみ機能し、これらのテーブルにトリガーがない場合にのみ機能します。これにより、ビューとトリガーは移動されません。
オルファン2015年

7

最も簡単な方法は、HeidiSQLソフトウェアを使用することです。無料でオープンソースです。これは、WindowsとWineを搭載したLinuxで動作します(Linux、BSD、Solaris、Mac OS XでWindowsアプリケーションを実行します)。

HeidiSQLをダウンロードするには、http: //www.heidisql.com/download.phpにアクセスしてください

Wineをダウンロードするには、http: //www.winehq.org/にアクセスしてください

HeidiSQLでデータベースの名前を変更するには、データベース名を右クリックして[編集]を選択します。次に、新しい名前を入力して「OK」を押します。

とても簡単です。


1
ストアドプロシージャがある場合、名前を変更することはできません。
abksharma

@abksharma実際には、メッセージDatabase "database_name" contains stored routine(s) which cannot be moved.トリガー(少なくともMariDBデータベースの場合)がストアドルーチンとしてカウントされます。ストアドプロシージャはありませんでしたが、すべてのトリガーを削除するまでデータベースの名前を変更できませんでした。
izogfif

7

Macユーザーの場合は、 Sequel Proデータベースの名前を変更するオプションを提供するだけの(無料)を。古いDBは削除されませんが。

関連DBを開いたら、次をクリックします。- Database>Rename database...


古いDBが存続する場合もありますが、空です。それでも、コピーを作成する場合は、コピーを作成して古いコピーを削除できます。それでも、2つの簡単な手順です。
Roee Gavirel

6

私は、サーバー障害に疑問を提起しました MySQLのプロキシを使用することにより、非常に大規模なデータベースを復元する際のダウンタイムを回避しようとしています。私は成功しませんでしたが、データベースのサイズのためにダンプ/インポートがオプションではなかったため、最終的にRENAME DATABASE機能が必要であることに気付きました。

MySQLにはRENAME TABLE機能が組み込まれているので、簡単なPythonスクリプトを作成して仕事をしてくれました。私がしましたGitHubの上でそれを掲示し、それが他の人に使用のものであってもよい場合。



2
RENAME TABLEではなく、RENAME DATABASEが構文から削除されました。
デューク

6

便宜上、以下は、db-nameとnew db-nameの2つのパラメーターで実行する必要がある小さなシェルスクリプトです。

ホームディレクトリで.my.cnf-fileを使用しない場合は、mysql-linesにログインパラメータを追加する必要がある場合があります。このスクリプトを実行する前にバックアップを作成してください。


#!/usr/bin/env bash

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

1
これも、トリガーがアタッチされたテーブルや、他のデータベースに名前を変更できないビューでは機能しません。
オルファン2015年

6

誰もこれについて言及していないようですが、ここに別の方法があります:

create database NewDatabaseName like OldDatabaseName;

次に、各テーブルについて次のようにします。

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

次に、必要に応じて、

drop database OldDatabaseName;

このアプローチには、ネットワークトラフィックがほぼゼロのサーバーで転送全体を実行できるという利点があるため、ダンプ/復元よりもはるかに高速になります。

ストアドプロシージャ/ビュー/その他がある場合は、それらも転送することをお勧めします。


2
私の知る限り、5.xは "like"キーワードをcreate databaseステートメントでサポートしていませんか?どこから手に入れたの?
Dragas

これがcreate table like構文のリンクです:dev.mysql.com/doc/refman/5.7/en/create-table-like.html。create database likeに関しては、MySQLがその節を削除したようです。
TuncayGöncüoğlu18年

4

移動するテーブルが多い場合に、名前を変更する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' ;

見た目は良いですが、これはストアドプロシージャまたはビューを移動しません。
davidpricedev 2015年

おそらくハッシュマークを追加して、テーブル名とスキーマ名を
囲む必要が

4

ALTER DATABASEこれはMySQLによって提案された方法であり、RENAME DATABASE削除されます。

13.1.32 RENAME DATABASEの構文

RENAME {DATABASE | SCHEMA} db_name TO new_db_name;

このステートメントはMySQL 5.1.7で追加されましたが、危険であることが判明し、MySQL 5.1.23で削除されました。


7
構文例はありますか?私はalter databaseデータベース自体の名前を変更するために使用する方法を知りません、そしてあなたがリンクしたドキュメントはそれが可能であることを示唆していません。
ジョーダン

@ジョーダン私も興味があります。私は試してみましたが、バージョン> 5.1でのみ動作することがわかりましたが、現在更新できません。
fancyPants 2012

5
-1:提案されたウェイについて書くために、提案されていないウェイの例を示しながら、例を示すことさえまったくできません。
hakre 2014年

3
これは間違っています。MySQLのデータベースの名前変更ドキュメントでは、rename_databaseは、(DBの名前変更の一般的なケースではなく)非常に特定の名前変更タスクを対象としたものであり、alter databaseで処理されるようになっています。 DATA DIRECTORY NAME代わりに 'これを使用してデータベースの名前を好きなように変更することはできません。このコマンドには新しいデータベース名の場所さえありません!
Kanat Bolazar、2015年

3

MySQL Administratorで以下を実行します。

  1. [カタログ]で、新しいデータベーススキーマを作成します。
  2. バックアップに移動し、古いスキーマのバックアップを作成します。
  3. バックアップを実行します。
  4. 復元に進み、ステップ3で作成したファイルを開きます。
  5. [ターゲットスキーマ]で[別のスキーマ]を選択し、新しいデータベーススキーマを選択します。
  6. 復元を開始します。
  7. 新しいスキーマを確認し、問題がなければ、古いスキーマを削除します。

MySQLアドミニストレーターは大きなデータベースを処理できず、それについてすぐには何もありません
デッドプログラマー

3

phpMyAdminに簡単にデータベースの名前を変更することができます

select database 

  goto operations tab

  in that rename Database to :

  type your new database name and click go

古いテーブルを削除してテーブルデータを再読み込みするように依頼する

データベースの名前が変更されます


3

phpMyAdminを使用している場合を、名前を変更するデータベースを選択したら、[操作]タブに移動できます。次に、最後のセクション「データベースのコピー先」(またはそのようなもの)に移動し、名前を付けて、以下のオプションを選択します。この場合、「構造とデータ」と「コピーする前にデータベースを作成する」チェックボックスを選択し、最後にそのセクションの「実行」ボタンを押す必要があると思います。

ちなみに、私はphpMyAdminをスペイン語で使用しているので、セクションの名前が英語で何であるかわかりません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.