1076

これについては、 MySQLの MySQL マニュアルで説明しています。

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

これは、 MyISAMとは非常に異なる方法で格納するInnoDBで動作する必要があります。

4

51 に答える 51

947

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

于 2010-02-19T18:17:41.447 に答える
476

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

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
于 2009-07-02T07:34:44.087 に答える
227

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

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

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

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

于 2012-01-15T19:46:03.360 に答える
119

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

于 2011-11-26T03:35:05.717 に答える
63

MySQLで欠落しているRENAME DATABASEコマンドをエミュレートします。

  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で欠落しているRENAMEDATABASEコマンドをエミュレートすることから取得されました。

于 2012-08-10T20:43:45.390 に答える
31

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

参照: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
于 2013-02-07T06:54:29.630 に答える
25

3 つのオプション:

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

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

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

于 2008-09-15T21:28:12.787 に答える
24

簡単な方法

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

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 データベースでは機能しません。この場合、データベースをダンプして再インポートする必要があります。

于 2008-09-15T21:30:07.697 に答える
19

私は最近、MyISAM と InnoDB で動作し、非常に高速な非常に優れた方法に出くわしました。

RENAME TABLE old_db.table TO new_db.table;

どこで読んだか覚えていませんが、クレジットは私ではなく他の誰かに帰属します。

于 2010-05-07T13:15:27.437 に答える
15

さて、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
于 2014-01-29T11:14:37.917 に答える
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;
于 2010-10-28T15:01:12.227 に答える
14

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

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

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

于 2008-09-15T21:26:07.550 に答える
13

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

于 2008-09-15T21:24:15.230 に答える
12

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

于 2012-11-30T01:06:26.287 に答える
9

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

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): 間違ったスキーマでのトリガー
于 2010-05-19T17:16:59.373 に答える
8

最も簡単な方法は、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」を押します。

とても簡単です。

于 2013-02-07T07:02:35.620 に答える
8

これは、コマンド ラインから自動化するために作成したバッチ ファイルですが、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=
于 2008-12-12T10:27:41.293 に答える
8

以下は、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"
于 2012-03-15T14:05:13.083 に答える
7

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

MySQL には RENAME TABLE 機能が組み込まれているため、単純な Python スクリプトを作成して、その機能を実行することになりました。他の人に役立つ可能性がある場合に備えて、GitHub に投稿しました。

于 2010-04-18T09:51:26.960 に答える
7

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;

終わり//
デリミタ;
于 2011-05-17T18:24:19.407 に答える
5

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

13.1.32からRENAMEDATABASE構文

RENAME {DATABASE | SCHEMA} db_name TO new_db_name;

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

于 2012-08-16T02:04:49.880 に答える
4

すべてのテーブルをあるスキーマから別のスキーマに移動するための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古いスキーマに対する読み取り/書き込み/ドロップ権限と、新しいスキーマに対する読み取り/書き込み/作成権限があることを確認してください。

于 2012-03-19T00:54:47.747 に答える
4

phpmyadminでは、データベースの名前を簡単に変更できます

select database 

  goto operations tab

  in that rename Database to :

  type your new database name and click go

古いテーブルを削除してテーブル データをリロードするように依頼し、両方で [OK] をクリックします

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

于 2013-08-21T06:17:20.893 に答える
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' ;
于 2014-08-11T19:00:59.730 に答える
4

MySQL Administrator で次の操作を行います。

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

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

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

于 2011-07-12T15:30:43.283 に答える
2

これはすべてのデータベースで機能し、maatkit mysql ツールキットで各テーブルの名前を変更することで機能します

mk-find を使用して、各テーブルを印刷して名前を変更します。manページには、さらに多くのオプションと例があります

mk-find --dblike OLD_DATABASE --print --exec "RENAME TABLE %D.%N TO NEW_DATABASE.%N"

maatkit がインストールされている場合 (これは非常に簡単です)、これが最も簡単な方法です。

于 2010-10-12T18:30:29.140 に答える
2

2 つの方法でそれを行うことができます。

  1. RENAME TABLE old_db.table_name TO new_db.table_name;
  2. 操作に移動->テーブルオプションタブが表示されます。そこでテーブル名を編集できます。
于 2012-09-06T12:45:02.687 に答える
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%"
于 2011-10-06T12:59:05.060 に答える
2

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その後、セッションに残ります。この関数を使わずに書くことはできませんでした。

于 2013-01-11T22:33:05.577 に答える
1

階層ビュー (他のビューからデータを取得するビュー) を使用する場合、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

于 2015-08-21T12:48:48.440 に答える
1

次の方法を使用して、データベースの名前を変更しました

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

  2. バックアップ (backupfile.sql など) ファイルをテキスト エディタで開きます。

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

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

于 2013-09-11T05:24:23.600 に答える
0

あなたたちはこれで私を撃つつもりです、そしておそらくこれは毎回うまくいくとは限りません、そして確かに、それはすべての論理に反しています... しかし、私が試したことは... MySQLエンジンを停止し、ログオンしますrootとして、ファイルシステムレベルでDBの名前を変更しただけです....

私はOSXを使用しており、ケースをbedbfからBEDBFに変更しただけです。驚いたことに、それはうまくいきました...

本番DBではお勧めしません。実験的にやってみましたが…

いずれにせよ頑張ってください:-)

于 2013-08-02T13:20:43.453 に答える
0

これを投稿しましたMySQLを使用してデータベース名を変更するにはどうすればよいですか? 何日も頭を掻いたり、髪を引っ張ったりした後の今日。解決策は非常に簡単です。スキーマを .sql ファイルにエクスポートしてファイルを開き、上部の sql CREAT TABLE セクションでデータベース/スキーマ名を変更します。複数のスキーマがファイルに保存されている場合、3 つ以上のインスタンスがあり、ページの上部に表示されない場合があります。この方法でデータベース全体を編集することは可能ですが、大規模なデータベースでは、テーブル プロパティまたはインデックスのすべてのインスタンスを追跡するのは非常に面倒であると予想されます。

于 2014-04-20T16:25:26.277 に答える
-2

ここにはすでに多くの本当に良い答えがありますが、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);
于 2016-05-22T21:33:12.927 に答える
-3

実際、最も簡単な答えは、古いデータベースをエクスポートしてから、作成した新しいデータベースにインポートして、古いデータベースを置き換えることです。もちろん、これを行うにはphpMyAdminまたはコマンド ラインを使用する必要があります。

データベースの名前を変更してジェリーリギングするのは悪い考えです! それをしません。(あなたが母親の地下室で暗闇の中で座って、日中寝ながらピザを食べている「ハッカータイプ」でない限り.)

あなたは、あなたが望むよりも多くの問題や仕事をすることになります。

そう、

  1. new_database を作成し、正しい名前を付けます。
  2. phpMyAdmin に移動し、エクスポートするデータベースを開きます。
  3. エクスポートします (オプションを確認しますが、デフォルトで問題ないはずです。
  4. このようなファイルを取得します。
  5. このファイルの拡張子は .sql です

    -- phpMyAdmin SQL ダンプ -- バージョン 3.2.4

    -- http://www.phpmyadmin.net

    -- ホスト: 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( timestampint(15) NOT NULL デフォルト '0', ipvarchar(40) NOT NULL デフォルト '', filevarchar(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 で私にアクセスしてください。

于 2010-06-30T17:58:16.783 に答える
-3

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!

于 2012-01-05T10:04:26.880 に答える
-4

phpMyAdminを使用している場合はmysql、xampのフォルダーに移動し、 phpMyAdmin を閉じて、そこに表示されているフォルダーの名前をデータベース名として変更し、phpMyAdmin を再起動します。そのデータベースの名前が変更されていることがわかります。

于 2010-10-04T09:01:30.310 に答える