web-dev-qa-db-ja.com

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

hrmsという名前のデータベースを作成しました。データベース名をsunhrmに変更する必要があります。しかし、MySQLワークベンチでは無効になっています。 Linuxサーバー上でそれを実行できますか?

103
Dhileepan

私はあなたがこれを行うことができるとは思わない。そのデータベースをダンプし、新しく名前を付けたものを作成してから、そのダンプをインポートする必要があると思います。

これがライブシステムの場合は、それを停止する必要があります。できない場合は、このデータベースから新しいデータベースへの複製を設定する必要があります。

これを行うためのコマンドを見たいのであれば、 @ janに詳細があります

59
New Alexandria

コマンドラインから実行する必要がある場合は、このスニペットをコピー、修正、貼り付けをしてください。

mysql -e "CREATE DATABASE \`new_database\`;"
for table in `mysql -B -N -e "SHOW TABLES;" old_database`
do 
  mysql -e "RENAME TABLE \`old_database\`.\`$table\` to \`new_database\`.\`$table\`"
done
mysql -e "DROP DATABASE \`old_database\`;"
68
jan

ダンプをファイルに保存せずにmysqldumpコマンドでデータベースをコピーすることは可能です。

  1. mysql -u root -p -e "create database my_new_database"
  2. mysqldump -u root -p original_database | mysql -u root -p my_new_database
  3. mysql -u root -p -e "drop database original_database"
33

前のデータベースとまったく同じように新しいデータベースを作成し、完了したら古いデータベースを削除できます。 mysqldumpツールを使用してmysqldump orig_db > orig_db.sql経由でデータベースの.sqlバックアップを作成するか、ユーザー名とパスワードを使用する必要がある場合はmysqldump -u root -p orig_db > orig_db.sqlを実行します。 orig_dbは、名前を変更するデータベースの名前です。rootは、ログインしているユーザーで、orig_db.sqlは、バックアップを含んで作成されたファイルです。データベースに付けたい名前で、新しい空のデータベースを作成します。たとえば、mysql -u root -p -e "create database new_db"です。それが終わったら、mysql -u root -p new_db < orig_db.sqlを実行します。 new_dbは、orig_dbの完全なコピーとして存在します。その後、元のデータベースを新しいデータベースに既存のデータベース名で追加します。

上記の説明がすべて含まれていない短くて素早い手順は次のとおりです。

  1. mysqldump -u root -p original_database > original_database.sql
  2. mysql -u root -p -e "create database my_new_database"
  3. mysql -u root -p my_new_database < original_database.sql
  4. mysql -u root -p -e drop database originl_database

これが助けになることを願っていますし、これがあなたのデータを破壊し矛盾を生じさせるような特別な方法を使わずにそれを達成するための信頼できる手段であることを願います。

32
jetole

新しいスキーマ "other_db"を作成した後、 "current_db"内の各テーブルに対してRENAMEステートメントを使用してそれを実行できます。

RENAME TABLE current_db.tbl_name TO other_db.tbl_name

ソース テーブル構文の名前変更

21
Cristian Porta

2つの方法があります。

方法1:データベーススキーマの名前を変更するためのよく知られた方法は、Mysqldumpを使用してスキーマをダンプし、それを別のスキーマに復元してから古いスキーマを削除することです。 (必要に応じて)。

Shellから

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

上記の方法は簡単ですが、時間とスペースがかかります。スキーマが100GBを超える場合はどうなりますか?スペースを節約するために上記のコマンドを一緒にパイプ処理できる方法がありますが、時間を節約することはできません。 。

このような状況を解決するには、スキーマの名前を変更するための別の簡単な方法がありますが、それを実行する際には注意が必要です。

方法2:MySQLはテーブルをリネームするための非常に良い機能を持っています。この名前変更操作はアトミックであり、名前が変更されている間、他のユーザーはそのテーブルにアクセスできません。テーブルの名前またはそのスキーマの変更はメタデータの変更にすぎないため、これには短時間で完了します。これは、名前を変更する際の手続き型のアプローチです。

  1. 目的の名前で新しいデータベーススキーマを作成します。
  2. MySQLの「RENAME TABLE」コマンドを使用して、古いスキーマから新しいスキーマにテーブルの名前を変更します。
  3. 古いデータベーススキーマを削除します。

スキーマにviews, triggers, functions, stored proceduresがある場合は、それらも再作成する必要があります。テーブルにトリガーが存在する場合、MySQLの「RENAME TABLE」は失敗します。これを直すために私達は次のことをすることができる:

1)Dump the triggers, events and stored routines in a separate file.これは、(トリガをダンプする-t -dに加えて)-E、-Rフラグを使って行われます。トリガーがダンプされたら、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_privmysql.procs_privmysql.tables_priv、mysql.dbテーブルの単純なUPDATEold_schema namenew_schemaに更新し、「Flush特権」を呼び出すことで修正できます。 “ method 2”は“ method 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」に名前が変更されました。最後に、これは上記の“ method 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
11
Sathish D

一言で言えばいいえ。一般にデータベースの名前を変更するのは危険すぎると考えられています。 MySQLにはその機能が少しありましたが、削除されました。ワークベンチを使用してスキーマとデータの両方をSQLにエクスポートしてから、それを実行またはインポートする前にそこでのCREATE DATABASE名を変更することをお勧めします。

4
Luke Wyatt

せっかちなMySQLユーザー(私のような)の場合、解決策は以下のとおりです。

/etc/init.d/mysql stop
mv /var/lib/mysql/old_database /var/lib/mysql/new_database 
/etc/init.d/mysql start
3
user1972813

以下の方法でデータベースの名前を変更しました

  1. mysqldumpまたは任意のDBツール(heidiSQL、mysql管理者など)を使用してファイルのバックアップを取ります。

  2. 何らかのテキストエディタでバックアップ(例えばbackupfile.sql)ファイルを開きます。

  3. データベース名を検索して置き換え、ファイルを保存します。

  4. 編集したSQLファイルを復元する

2
Adarsha

DBにMyISAMテーブルしか含まれていない場合(InnoDBテーブルがある場合はこの方法を使用してください(doしない)。

  1. mySQLサーバーをシャットダウンします
  2. mysqlのdataディレクトリに移動し、データベースディレクトリの名前を変更します(注:アルファベット以外の文字は特別な方法でエンコードする必要があります)。
  3. サーバーを再起動します
  4. 必要に応じて特権を調整します(新しいDB名へのアクセスを許可します)。

1つのコマンドですべてのスクリプトを作成して、停止時間を1〜2秒にすることができます。

2
rustyx

まずHRMSという古いデータベースをバックアップし、WordのHRMSをSUNHRMに置き換えてスクリプトファイルを編集します。この手順の後、データベースファイルをMySQLにインポートします。

0
Dhileepan

データベースの名前を変更したり、データベースを画像化したりするもう1つの方法は、[データベース]タブの[リバースエンジニアリング]オプションを使用することです。データベースのERR図を作成します。そこでスキーマの名前を変更します。

その後、ファイルメニューに行き、データベースをエクスポートして転送するエンジニアに行きます。

それからデータベースをインポートできます。

0
Benny