という名前のデータベースを作成しましたhrms
。ここで、データベース名を に変更する必要がありますsunhrm
。ただし、MySQL ワークベンチでは無効になっています。Linuxサーバー自体でそれを行うことはできますか?
12 に答える
コマンドラインからそれを行う必要がある場合は、次のスニペットをコピー、適応、および貼り付けます。
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\`;"
私はあなたがこれを行うことができるとは思わない. 多くの場合、基本的な答えでうまくいきますが、データの破損を引き起こす場合もあります。データベースのヒューリスティック分析に基づいて戦略を選択する必要があります。 それが、この機能が実装され、その後削除された理由です。[ドキュメント]
そのデータベース内のすべてのオブジェクト タイプをダンプし、新しく名前を付けたものを作成してから、ダンプをインポートする必要があります。これが稼働中のシステムである場合は、停止する必要があります。できない場合は、このデータベースから新しいデータベースへのレプリケーションをセットアップする必要があります。
これを実行できるコマンドを確認したい場合は、@satishD に詳細があります。これは、ターゲット データベースに一致する戦略を構築するために必要ないくつかの課題を伝えています。
ダンプをファイルに保存せずに、mysqldump コマンドを使用してデータベースをコピーすることは可能です。
mysql -u root -p -e "create database my_new_database"
mysqldump -u root -p original_database | mysql -u root -p my_new_database
mysql -u root -p -e "drop database original_database"
以前のデータベースが存在していたのとまったく同じように新しいデータベースを作成し、完了したら古いデータベースを削除できます。mysqldump ツールを使用してデータベースの .sql バックアップを作成するmysqldump orig_db > orig_db.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 の完全なコピーとして存在するようになりました。必要なデータベース名で新しいデータベースに既存のデータベースがあるため、元のデータベースを削除できます。
上記のすべての説明を含まない、短くて簡単な手順は次のとおりです。
mysqldump -u root -p original_database > original_database.sql
mysql -u root -p -e "create database my_new_database"
mysql -u root -p my_new_database < original_database.sql
mysql -u root -p -e drop database originl_database
これがお役に立てば幸いです。これは、データを破損して不整合を引き起こすアドホックな方法を使用せずにそれを達成するための信頼できる手段です。
新しいスキーマ「other_db」を作成した後、「current_db」の各テーブルのRENAMEステートメントでそれを行うことができます
RENAME TABLE current_db.tbl_name TO other_db.tbl_name
ソースの名前変更テーブルの構文
さて、2つの方法があります:
方法 1 : データベース スキーマの名前を変更するよく知られた方法は、Mysqldump を使用してスキーマをダンプし、それを別のスキーマに復元してから、古いスキーマを削除することです (必要な場合)。
からShell
mysqldump emp > emp.out
mysql -e "CREATE DATABASE employees;"
mysql employees < emp.out
mysql -e "DROP DATABASE emp;"
上記の方法は簡単ですが、時間とスペースがかかります。スキーマが100GBを超える場合はどうなりますか? スペースを節約するために上記のコマンドを一緒にパイプする方法がありますが、時間は節約できません。
このような状況を改善するために、スキーマの名前を変更する簡単な方法がもう 1 つありますが、その際には注意が必要です。
方法 2 : MySQL には、異なるスキーマ間でも機能するテーブルの名前を変更するための非常に優れた機能があります。この名前変更操作はアトミックであり、名前が変更されている間、誰もテーブルにアクセスできません。テーブルの名前またはそのスキーマの変更はメタデータの変更に過ぎないため、これは完了するまでに少し時間がかかります。名前の変更を行う際の手続き型のアプローチは次のとおりです。
- 目的の名前で新しいデータベース スキーマを作成します。
- MySQL の「RENAME TABLE」コマンドを使用して、テーブルの名前を古いスキーマから新しいスキーマに変更します。
- 古いデータベース スキーマを削除します。
スキーマにある場合はviews, triggers, functions, stored procedures
、それらも再作成する必要があります。テーブルにトリガーが存在する場合、MySQL の「RENAME TABLE」は失敗します。これを解決するには、次のことを実行できます。
1) Dump the triggers, events and stored routines in a separate file.
これは、mysqldump コマンドに (トリガーをダンプする -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)ビューを出力ファイルにダンプします。ビューは、同じ 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.db テーブルを単純UPDATE
に更新し、 「特権のフラッシュ」を呼び出すことで修正できます。「<code>method 2」は「<code>method 1」より少し複雑に見えますが、これは完全にスクリプト可能です。上記の手順を適切な順序で実行するための単純な bash スクリプトは、次回データベース スキーマの名前を変更するときにスペースと時間を節約するのに役立ちます。mysql.columns_priv
mysql.procs_priv
mysql.tables_priv
old_schema name
new_schema
Percona リモート 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」に名前が変更されました。最後に、上記の「<code>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
要するにいいえ。一般に、データベースの名前を変更するのは危険すぎると考えられています。MySQL にはその機能が少しありましたが、削除されました。ワークベンチを使用してスキーマとデータの両方を SQL にエクスポートし、実行/インポートする前にそこで CREATE DATABASE 名を変更することをお勧めします。
DB に MyISAM テーブルのみが含まれている場合 ( InnoDB テーブルがある場合は、この方法を使用しないでください):
- MySQLサーバーをシャットダウンします
- mysql
data
ディレクトリに移動し、データベース ディレクトリの名前を変更します (注: 英字以外の文字は特別な方法でエンコードする必要があります)。 - サーバーを再起動します
- 必要に応じて権限を調整します (新しい DB 名へのアクセスを許可します)
ダウンタイムがわずか 1 ~ 2 秒になるように、すべてを 1 つのコマンドでスクリプト化できます。
せっかちな mysql ユーザー (私のような) の場合、解決策は次のとおりです。
/etc/init.d/mysql stop
mv /var/lib/mysql/old_database /var/lib/mysql/new_database
/etc/init.d/mysql start
まず、HRMSという古いデータベースをバックアップし、スクリプトファイルを編集してHRMSという単語をSUNHRMに置き換えます。このステップの後、データベースファイルをmysqlにインポートします
データベースの名前を変更するか、データベースのイメージを取得する別の方法は、データベース タブのリバース エンジニアリング オプションを使用することです。データベースの ERR ダイアグラムが作成されます。そこでスキーマの名前を変更します。
その後、ファイル メニューに移動し、データベースのエクスポートとフォワード エンジニアリングに移動します。
その後、データベースをインポートできます。