これについては、 MySQLの MySQL マニュアルで説明しています。
通常、データベースをダンプして、新しい名前で再インポートします。これは、非常に大きなデータベースのオプションではありません。どうやらRENAME {DATABASE | SCHEMA} db_name TO new_db_name;
悪いことをし、ほんの一握りのバージョンにしか存在せず、全体的に悪い考えです。
これは、 MyISAMとは非常に異なる方法で格納するInnoDBで動作する必要があります。
これについては、 MySQLの MySQL マニュアルで説明しています。
通常、データベースをダンプして、新しい名前で再インポートします。これは、非常に大きなデータベースのオプションではありません。どうやらRENAME {DATABASE | SCHEMA} db_name TO new_db_name;
悪いことをし、ほんの一握りのバージョンにしか存在せず、全体的に悪い考えです。
これは、 MyISAMとは非常に異なる方法で格納するInnoDBで動作する必要があります。
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から、選択するデータベースを選択します。タブには「操作」という名前のタブがあり、名前の変更セクションに移動します。それで全部です。
多くの人が示唆しているように、新しい名前で新しいデータベースを作成し、古いデータベースのすべてのテーブルを新しいデータベースにダンプして、古いデータベースを削除します。
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';
その出力を実行します
古いデータベースを削除する
これは、MySQLで欠落しているRENAMEDATABASEコマンドをエミュレートすることから取得されました。
次のシェルスクリプトを使用できます。
#!/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
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
終わり...
OK、この方法は InnoDB または BDB データベースでは機能しません。この場合、データベースをダンプして再インポートする必要があります。
私は最近、MyISAM と InnoDB で動作し、非常に高速な非常に優れた方法に出くわしました。
RENAME TABLE old_db.table TO new_db.table;
どこで読んだか覚えていませんが、クレジットは私ではなく他の誰かに帰属します。
さて、2つの方法があります:
方法 1:データベース スキーマの名前を変更するよく知られた方法は、Mysqldump を使用してスキーマをダンプし、それを別のスキーマに復元してから、古いスキーマを削除することです (必要な場合)。
シェルから
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」コマンドを使用して、テーブルの名前を古いスキーマから新しいスキーマに変更します。古いデータベース スキーマを削除します。
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 コマンドに (トリガーをダンプする -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.columns_priv、mysql.procs_priv、mysql.tables_priv、mysql.db テーブルで単純な UPDATE を実行して、old_schema 名を new_schema に更新し、「特権のフラッシュ」を呼び出すことで修正できます。「方法 2」は「方法 1」よりも少し複雑に見えますが、これは完全にスクリプト化可能です。上記の手順を適切な順序で実行するための単純な bash スクリプトは、次回データベース スキーマの名前を変更するときにスペースと時間を節約するのに役立ちます。
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」に名前が変更されました。最後に、上記の「方法 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
これは私が使用するものです:
$ 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;
現時点では、MySQL はコマンド インターフェイスを介したデータベースの名前変更をサポートしていませんが、MySQL がデータベースを格納するディレクトリにアクセスできる場合は、データベースの名前を変更できます。デフォルトの MySQL インストールの場合、これは通常、MySQL がインストールされたディレクトリの下の Data ディレクトリにあります。名前を変更するデータベースの名前を Data ディレクトリの下で見つけて、名前を変更します。ただし、ディレクトリの名前を変更すると、権限の問題が発生する可能性があります。注意してください。
注:データベースの名前を変更する前に、MySQL を停止する必要があります。
(必要な名前を使用して) 新しいデータベースを作成し、必要なデータを古いものから新しいものにエクスポート/インポートすることをお勧めします。ものすごく単純。
PHPMyAdmin でデータベースの名前を変更すると、ダンプが作成され、データベースが削除され、新しい名前で再作成されます。
Macユーザー向けに、SequelProの[データベース]メニューに[データベースの名前変更]オプションがあります。 http://www.sequelpro.com/
データベース内のすべてのテーブルの名前を変更して、完全なダンプと復元を行わなくても、別のデータベースの下に置くことができます。
DROP PROCEDURE IF EXISTS mysql.rename_db; 区切り記号 || CREATE PROCEDURE mysql.rename_db(IN old_db VARCHAR(100), IN new_db VARCHAR(100)) 始める SELECT CONCAT('CREATE DATABASE', 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, '`;') `# 古いデータベースをドロップ`; 終了|| 区切り文字; $ time mysql -uroot -e "call mysql.rename_db('db1', 'db2');" | | mysql -uroot
ただし、ターゲット データベース内のトリガーは満足しません。最初にそれらをドロップしてから、名前変更後に再作成する必要があります。
mysql -uroot -e "call mysql.rename_db('test', 'blah2');" | | mysql -uroot 4 行目の ERROR 1435 (HY000): 間違ったスキーマでのトリガー
最も簡単な方法は、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」を押します。
とても簡単です。
これは、コマンド ラインから自動化するために作成したバッチ ファイルですが、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=
以下は、db-name と new db-name の 2 つのパラメーターを使用して実行する必要がある小さなシェルスクリプトです。
ホーム ディレクトリで .my.cnf ファイルを使用しない場合は、mysql 行に 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"
MySQL Proxy を使用して非常に大規模なデータベースを復元する際のダウンタイムを回避しようとして、Server Faultについて質問しました。私は成功しませんでしたが、データベースのサイズのためにダンプ/インポートがオプションではなかったため、RENAME DATABASE 機能が必要であることに最終的に気付きました。
MySQL には RENAME TABLE 機能が組み込まれているため、単純な Python スクリプトを作成して、その機能を実行することになりました。他の人に役立つ可能性がある場合に備えて、GitHub に投稿しました。
TodoInTX のストアド プロシージャは、私にはうまく機能しませんでした。ここに私の刺し傷があります:
-- ストアド プロシージャ rename_db: テーブルのコピー手段としてデータベースの名前を変更します。 -- 注意事項: -- 「新しい」データベース名と同じ名前の既存のデータベースを上書きします。 -- テーブルのみをコピーします。ストアド プロシージャおよびその他のデータベース オブジェクトはコピーされません。 -- トマー・アルトマン (taltman@ai.sri.com) デリミタ // DROP PROCEDURE IF EXISTS rename_db; CREATE PROCEDURE rename_db(IN old_db VARCHAR(100), IN new_db VARCHAR(100)) 始める DECLARE current_table VARCHAR(100); DECLARE done INT DEFAULT 0; DECLARE old_tables CURSOR FOR select table_name from information_schema.tables where table_schema = old_db; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; SET @output = CONCAT('DROP SCHEMA IF EXISTS', new_db, ';'); PREPARE stmt FROM @output; EXECUTE ステートメント; SET @output = CONCAT('CREATE SCHEMA IF NOT EXISTS', new_db, ';'); PREPARE stmt FROM @output; EXECUTE ステートメント; old_tables を開きます。 繰り返す FETCH old_tables INTO current_table; 完了していない場合 SET @output = CONCAT('alter table', old_db, '.', current_table, ' rename ', new_db, '.', current_table, ';'); PREPARE stmt FROM @output; EXECUTE ステートメント; END IF; END REPEATが完了するまで。 CLOSE old_tables; 終わり// デリミタ;
ALTER DATABASE
これを回避するためにMySQLによって提案された方法であり、RENAME DATABASE
削除されます。
13.1.32からRENAMEDATABASE構文:
RENAME {DATABASE | SCHEMA} db_name TO new_db_name;
このステートメントはMySQL5.1.7で追加されましたが、危険であることが判明し、MySQL5.1.23で削除されました。
すべてのテーブルをあるスキーマから別のスキーマに移動するための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
古いスキーマに対する読み取り/書き込み/ドロップ権限と、新しいスキーマに対する読み取り/書き込み/作成権限があることを確認してください。
phpmyadminでは、データベースの名前を簡単に変更できます
select database
goto operations tab
in that rename Database to :
type your new database name and click go
古いテーブルを削除してテーブル データをリロードするように依頼し、両方で [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' ;
MySQL Administrator で次の操作を行います。
phpMyAdminを使用している場合は、名前を変更するデータベースを選択したら、[操作] タブに移動できます。次に、最後のセクション「データベースのコピー先」(またはそのようなもの) に移動し、名前を付けて、以下のオプションを選択します。この場合、「構造とデータ」と「コピー前にデータベースを作成」のチェックボックスを選択し、最後にそのセクションの「実行」ボタンを押す必要があると思います。
ところで、私はスペイン語で phpMyAdmin を使用しているので、セクションの名前が英語であることがわかりません。
これはすべてのデータベースで機能し、maatkit mysql ツールキットで各テーブルの名前を変更することで機能します
mk-find を使用して、各テーブルを印刷して名前を変更します。manページには、さらに多くのオプションと例があります
mk-find --dblike OLD_DATABASE --print --exec "RENAME TABLE %D.%N TO NEW_DATABASE.%N"
maatkit がインストールされている場合 (これは非常に簡単です)、これが最も簡単な方法です。
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%"
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 はビューの正しい順序を考慮しないため、mysqldump からの未加工の出力のインポートが機能しない場合があります。このため、ビューをオンザフライで正しい順序に並べ替えるスクリプトを作成しました。
次のようになります。
#!/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
次の方法を使用して、データベースの名前を変更しました
mysqldump または任意の DB ツール (heidiSQL、mysql 管理者など) を使用してファイルのバックアップを取ります。
バックアップ (backupfile.sql など) ファイルをテキスト エディタで開きます。
データベース名を検索して置換し、ファイルを保存します。
4.編集したSQLファイルを復元する
あなたたちはこれで私を撃つつもりです、そしておそらくこれは毎回うまくいくとは限りません、そして確かに、それはすべての論理に反しています... しかし、私が試したことは... MySQLエンジンを停止し、ログオンしますrootとして、ファイルシステムレベルでDBの名前を変更しただけです....
私はOSXを使用しており、ケースをbedbfからBEDBFに変更しただけです。驚いたことに、それはうまくいきました...
本番DBではお勧めしません。実験的にやってみましたが…
いずれにせよ頑張ってください:-)
これを投稿しましたMySQLを使用してデータベース名を変更するにはどうすればよいですか? 何日も頭を掻いたり、髪を引っ張ったりした後の今日。解決策は非常に簡単です。スキーマを .sql ファイルにエクスポートしてファイルを開き、上部の sql CREAT TABLE セクションでデータベース/スキーマ名を変更します。複数のスキーマがファイルに保存されている場合、3 つ以上のインスタンスがあり、ページの上部に表示されない場合があります。この方法でデータベース全体を編集することは可能ですが、大規模なデータベースでは、テーブル プロパティまたはインデックスのすべてのインスタンスを追跡するのは非常に面倒であると予想されます。
ここにはすでに多くの本当に良い答えがありますが、PHP バージョンは表示されません。これにより、約 1 秒で 800M DB がコピーされます。
$oldDbName = "oldDBName";
$newDbName = "newDBName";
$oldDB = new mysqli("localhost", "user", "pass", $oldDbName);
if($oldDB->connect_errno){
echo "Failed to connect to MySQL: (" . $oldDB->connect_errno . ") " . $oldDB->connect_error;
exit;
}
$newDBQuery = "CREATE DATABASE IF NOT EXISTS {$newDbName}";
$oldDB->query($newDBQuery);
$newDB = new mysqli("localhost", "user", "pass");
if($newDB->connect_errno){
echo "Failed to connect to MySQL: (" . $newDB->connect_errno . ") " . $newDB->connect_error;
exit;
}
$tableQuery = "SHOW TABLES";
$tableResult = $oldDB->query($tableQuery);
$renameQuery = "RENAME TABLE\n";
while($table = $tableResult->fetch_array()){
$tableName = $table["Tables_in_{$oldDbName}"];
$renameQuery .= "{$oldDbName}.{$tableName} TO {$newDbName}.{$tableName},";
}
$renameQuery = substr($renameQuery, 0, strlen($renameQuery) - 1);
$newDB->query($renameQuery);
実際、最も簡単な答えは、古いデータベースをエクスポートしてから、作成した新しいデータベースにインポートして、古いデータベースを置き換えることです。もちろん、これを行うにはphpMyAdminまたはコマンド ラインを使用する必要があります。
データベースの名前を変更してジェリーリギングするのは悪い考えです! それをしません。(あなたが母親の地下室で暗闇の中で座って、日中寝ながらピザを食べている「ハッカータイプ」でない限り.)
あなたは、あなたが望むよりも多くの問題や仕事をすることになります。
そう、
このファイルの拡張子は .sql です
-- phpMyAdmin SQL ダンプ -- バージョン 3.2.4
-- ホスト: localhost -- 生成時刻: 2010 年 6 月 30 日午後 12 時 17 分 -- サーバー バージョン: 5.0.90 -- PHP バージョン: 5.2.6
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT /; / !40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS /; / !40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION /; / !40101 セット名 utf8 */;
--
mydatab_online
--
user
CREATE TABLE IF NOT EXISTS user
(
timestamp
int(15) NOT NULL デフォルト '0',
ip
varchar(40) NOT NULL デフォルト '',
file
varchar(100) NOT NULL デフォルト '', PRIMARY KEY ( timestamp
), KEY ip
( ip
), KEY file
( file
) ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
user
INTO user
( timestamp
, ip
, file
) 値 (1277911052, '999.236.177.116', ''), (1277911194, '999.236.177.116', '');
これが .sql ファイルになります。エクスポートしたばかりのもの。
ハードドライブで見つけてください。通常は です/temp
。正しい名前を持つ空のデータベースを選択します (これを読んでいる理由)。発言: インポート - GO
通常は configuration.php ファイルにプログラムを入力して、プログラムを正しいデータベースに接続します。サーバーを更新してください (両方。なぜですか?私は UNIX のベテランだからです。そう言ったからです。これで、体調は万全です。さらに質問がある場合は、Web で私にアクセスしてください。
Simplest of all, open MYSQL >> SELECT DB whose name you want to change >> Click on "operation" then put New name in "Rename database to:" field then click "Go" button
Simple!
phpMyAdminを使用している場合はmysql
、xampのフォルダーに移動し、 phpMyAdmin を閉じて、そこに表示されているフォルダーの名前をデータベース名として変更し、phpMyAdmin を再起動します。そのデータベースの名前が変更されていることがわかります。