it-swarm-ko.tech

MySQL 데이터베이스의 이름을 빠르게 바꾸려면 (스키마 이름 변경) 어떻게합니까?

MySQL 에있는 MySQL 매뉴얼은 이것을 다룹니다.

대개 나는 데이터베이스를 덤프하고 새 이름으로 다시 가져옵니다. 이것은 매우 큰 데이터베이스의 경우 옵션이 아닙니다. 분명히 RENAME {DATABASE | SCHEMA} db_name TO new_db_name;나쁜 일을하고 소수의 버전에만 존재하며 전반적으로 나쁜 생각입니다 .

이것은 InnoDB 와 함께 작동 할 필요가있다. 이것은 MyISAM 과 매우 다른 것을 저장한다.

866
deadprogrammer

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

756
Thorsten

다음과 같은 간단한 명령을 사용하십시오.

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
416
hendrasaputra

솔루션이 더 간단하고 일부 개발자가 제안했다고 생각합니다. phpMyAdmin에는이 작업이 있습니다.

PhpMyAdmin에서 선택하려는 데이터베이스를 선택하십시오. 탭에는 작업이라는 이름이 있으며 이름 변경 섹션으로 이동하십시오. 그게 다야.

많은 사람들이 제안한 것처럼 새로운 이름으로 새 데이터베이스를 만들고 이전 데이터베이스의 모든 테이블을 새 데이터베이스에 덤프하고 이전 데이터베이스를 삭제합니다.

Enter image description here

195
raphie

SQL을 사용하여 원본 데이터베이스의 각 테이블을 대상 데이터베이스로 전송하는 SQL 스크립트를 생성 할 수 있습니다.

명령에서 생성 된 스크립트를 실행하기 전에 대상 데이터베이스를 만들어야합니다.

이 두 스크립트 중 하나를 사용할 수 있습니다. (원래는 전 (前者)와 누군가가 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; (또는 다른 큰 번호)를 실행하여 제한을 변경할 수 있습니다.

97
ErichBSchulz

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에서 누락 된 RENAME DATABASE 명령을 에뮬레이트하는에서 가져 왔습니다..

33
Marciano

세 가지 옵션 :

  1. 새 데이터베이스를 작성하고 서버를 가져오고 한 데이터베이스 폴더에서 다른 데이터베이스 폴더로 파일을 이동 한 다음 서버를 다시 시작하십시오. 이 작업은 모든 테이블이 MyISAM 인 경우에만 작동합니다.

  2. 새 데이터베이스를 만들고 CREATE TABLE ... LIKE 문을 사용한 다음 INSERT ... SELECT * FROM 문을 사용하십시오.

  3. Mysqldump를 사용하여 해당 파일을 다시로드하십시오.

24
longneck

간단한 방법

데이터베이스 디렉토리로 변경하십시오.

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

끝난...

이 방법은 InnoDB 또는 BDB 데이터베이스에서는 작동하지 않습니다. 이 경우 데이터베이스를 덤프하고 다시 가져와야합니다.

23
DeeCee

나는 최근에야 아주 좋은 방법으로 MyISAM과 InnoDB와 함께 작업했으며 매우 빠릅니다 :

RENAME TABLE old_db.table TO new_db.table;

나는 그것을 읽은 곳을 기억하지 못하지만 신용은 나 아닌 다른 누군가에게 간다.

19
Amr Mostafa

이 쉘 스크립트를 사용할 수 있습니다 :

참조 : 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
18
Grijesh Chauhan

이것이 제가 사용하는 것입니다 :

$ 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;
16
eaykin

complete rename (끝에서 이전 데이터베이스를 삭제하여 복사본이 아닌 이름이 바뀜을 포함하여) :를 수행하는 가장 간단한 총알 -

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. 명령 행에서 하나씩 실행하십시오 (프롬프트가 표시되면 "y"입력).
15
Steve Chambers

MySQL은 현재 명령 인터페이스를 통해 데이터베이스의 이름 변경을 지원하지 않지만 MySQL이 데이터베이스를 저장하는 디렉토리에 액세스 할 수 있다면 데이터베이스의 이름을 바꿀 수 있습니다. 기본 MySQL 설치의 경우, 이는 일반적으로 MySQL이 설치된 디렉토리의 Data 디렉토리에 있습니다. 데이터 디렉토리에서 이름을 바꾸려는 데이터베이스의 이름을 찾아 이름을 변경하십시오. 디렉터리 이름을 변경하면 일부 사용 권한 문제가 발생할 수 있습니다. 알고 있어야합니다.

주의 : 데이터베이스 이름을 변경하기 전에 MySQL을 중지해야합니다

나는 당신이 원하는 이름을 사용하여 새 데이터베이스를 만들고 수출/이전에서 새로운 것으로 필요한 데이터를 가져 오는 것이 좋습니다. 아주 간단합니다.

14
bryanpearson

PHPMyAdmin에서 데이터베이스의 이름을 변경하면 덤프가 생성 된 다음 새 이름으로 데이터베이스가 삭제되고 다시 작성됩니다.

13
UnkwnTech

그럼 두 가지 방법이 있습니다.

방법 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

위의 방법에 대한 복잡한 점 : 올바른 schema_name과 일치하도록 사용자를 위해 GRANTS를 업데이트해야 할 수도 있습니다. 이것들은 mysql.columns_priv, mysql.procs_priv, mysql.tables_priv, mysql.db 테이블의 old_schema 이름을 new_schema로 업데이트하고 "Flush privileges;"를 호출하는 간단한 UPDATE로 해결할 수 있습니다. "방법 2"가 "방법 1"보다 약간 복잡해 보이지만, 이것은 완전히 스크립트 가능합니다. 위의 단계를 적절한 순서로 수행하는 간단한 bash 스크립트를 사용하면 다음에 데이터베이스 스키마의 이름을 바꾸는 동안 공간과 시간을 절약 할 수 있습니다.

Percona Remote DBA 팀은 다음과 같은 방식으로 작동하는 "rename_db"라는 스크립트를 작성했습니다.

[[email protected]~]# /tmp/rename_db
rename_db <server> <database> <new_database>

이 스크립트의 사용법을 보여주기 위해 샘플 스키마 "emp"를 사용하고 테스트 트리거와 해당 스키마에 저장된 루틴을 만들었습니다. 스크립트를 사용하여 데이터베이스 스키마의 이름을 바꾸려고 시도하는데 시간이 오래 걸리는 덤프/복원 방법과 달리 완료하는 데 몇 초가 걸립니다.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| emp                |
| mysql              |
| performance_schema |
| test               |
+--------------------+


[[email protected] ~]# 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"는 "emp_test"로 1 초 이내에 바뀌 었습니다. 마지막으로, 이것은 Percona의 "method 2"에 사용되는 스크립트입니다.

#!/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
12
Sathish D

Mac 사용자의 경우, Sequel Pro에는 데이터베이스 메뉴에 데이터베이스 이름 바꾸기 옵션이 있습니다. http://www.sequelpro.com/

12
Duke

전체 덤프 및 복원 작업을 수행하지 않고도 데이터베이스 내의 모든 테이블의 이름을 다른 데이터베이스로 바꿀 수 있습니다.

 DROP PROCEDURE가 존재한다면, mysql.rename_db; 
 DELIMITER || 
 CREATE PROCEDURE mysql.rename_db (IN old_db VARCHAR (100), IN new_db VARCHAR (100)). SELECT CONCAT ( 'RENAME TABLE`', old_db,``.` ','. '), 데이터베이스를 생성 할 때' SELECT CONCAT ( 'DROP DATABASE' ') 테이블을 닫을 때, 테이블의 이름을 바꿀 필요가 없습니다. $. mysql -root -e "mysql을 호출한다. (예 : old_db,``; ')) .rename_db ( 'db1', 'db2'); " | mysql -uroot 

그러나 목표 db의 모든 트리거는 만족스럽지 않습니다. 이름을 먼저 삭제 한 다음 이름을 변경 한 후에 다시 만들어야합니다.

 mysql -uroot -e "mysql.rename_db ( 'test', 'blah2');를 호출한다." | mysql -uroot 
 라인 4의 오류 1435 (HY000) : 잘못된 스키마에서 트리거 
9
TodoInTX

여기에 나와있는 대부분의 대답은 다음 두 가지 이유로 잘못되었습니다.

  1. 뷰와 트리거가있을 수 있으므로 RENAME TABLE을 사용할 수 없습니다. 트리거가 있으면 RENAME TABLE이 실패합니다.
  2. 큰 데이터베이스의 이름을 "빨리"(질문에서 요청한대로) 바꾸려면 mysqldump를 사용할 수 없습니다.

Percona에는이 작업을 수행하는 방법에 대한 블로그 게시물이 있습니다. https://www.percona.com/blog/2013/12/24/renaming-database-schema-mysql/

사이먼 R 존스 (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처럼 사용하십시오

8
ryantm

다음은 명령 줄에서 자동화하기 위해 작성한 배치 파일이지만 Windows/MS-DOS에서는 배치 파일입니다.

구문은 rename_mysqldb 데이터베이스입니다. 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
Johnny

TodoInTX의 저장 프로 시저가 나에게 적합하지 않았습니다. 여기 그것에 나의 찌르기가있다 :

 - 스토어드 프로 시저 rename_db : 데이터베이스를 테이블 복사의 이름으로 바꾸십시오. 
 -주의 사항 : 
 - 기존 데이터베이스를 'new' 데이터베이스 이름. 
 - 테이블 만 복사합니다. 저장 프로 시저 및 기타 데이터베이스 개체는 복사되지 않습니다. 
 - Tomer Altman ([email protected]) 
 
 구분 기호 // 
 DROP PROCEDURE IF EXISTS DECLARE current_table VARCHAR (100); 
 DECLARE done (rename_db; 
) CREATE PROCEDURE rename_db (old_db의 VARCHAR (100)에서 IN new_db VARCHAR (100)) 
 BEGIN [ INT DEFAULT 0; 
 DECLARE old_tables CURSOR FOR for information_schema.tables where table_schema = old_db; 
 DECLARE CONTINUE HANDLER NOT FOUND SET 완료 = 1; 
 
 SET @output = CONCAT ( 'DROP SCHEMA IF EXISTS', new_db, ';'); SET @output = CONCAT ( '존재하지 않는다면 SCHEMA 생성', new_db, ';'); @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 
 OPEN old_tables; 
 REPEAT 
 FETCH old_tables INTO current_table; 
 [@. CONCAT ( 'alter table', old_db, '.', current_table, 'rename', new_db, '.', current_table, ';'); 
 @ 출력에서 ​​준비하십시오. 
 실행 끝내기 
 
 끝 IF; 
 끝 반복 없음; 
 
 CLOSE old_tables; 
 
 END // 
 구분 기호; 
7
user757945

편의를 위해 다음은 db-name과 db-name이라는 두 개의 매개 변수로 실행해야하는 작은 쉘 스크립트입니다.

홈 디렉토리에서 .my.cnf-file을 사용하지 않으면 mysql-lines에 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"
6
gerrit damen

I MySQL 프록시를 사용하여 매우 큰 데이터베이스를 복원 할 때 서버 장애 에 대한 질문이있었습니다. 나는 성공을 거두지 못했지만 데이터베이스 크기 때문에 덤프/가져 오기가 옵션이 아니기 때문에 RENAME DATABASE 기능이 필요하다는 것을 깨달았습니다.

MySQL에는 RENAME TABLE 기능이 내장되어 있으므로 간단한 Python 스크립트를 작성하여 작업을 수행했습니다. 다른 사람이 사용할 수 있도록 GitHub 에 게시했습니다.

6
cclark

단계 :

  1. 히트 http : // localhost/phpmyadmin/
  2. DB 선택
  3. 작업 탭을 클릭하십시오.
  4. "데이터베이스 이름 변경"이라는 탭이 있습니다. 새 이름을 추가하고 조정 권한을 선택하십시오.
  5. 이동을 클릭하십시오.

 enter image description here

6
Shubham Jain

가장 간단한 방법은 HeidiSQL 소프트웨어를 사용하는 것입니다. 그것은 무료이며 오픈 소스입니다. Windows 및 Linux에서 Wine (Linux, BSD, Solaris 및 Mac OS X에서 Windows 응용 프로그램을 실행 함)에서 실행됩니다.

HeidiSQL을 다운로드하려면 goto http://www.heidisql.com/download.php .

Wine을 다운로드하려면 goto http://www.winehq.org/ .

HeidiSQL에서 데이터베이스의 이름을 바꾸려면 데이터베이스 이름을 마우스 오른쪽 단추로 클릭하고 '편집'을 선택하십시오. 그런 다음 새 이름을 입력하고 '확인'을 누릅니다.

너무 간단합니다.

5
Fathah Rehman P

이동할 표가 많은 경우 이름 바꾸기 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' ;
4
yantaq

아무도 이것을 언급하지 않았지만 여기에 또 다른 방법이 있습니다.

create database NewDatabaseName like OldDatabaseName;

다음 각 테이블에 대해 :

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

그러고 싶다면,

drop database OldDatabaseName;

이 방법은 네트워크 트래픽이 거의없는 서버에서 전체 전송을 수행하는 장점이 있으므로 덤프/복원보다 훨씬 빠르게 처리됩니다.

프로 시저/뷰/등을 저장 한 경우 해당 프로 시저를 전달할 수도 있습니다.

4

Mac 사용자의 경우 데이터베이스의 이름을 바꿀 수있는 옵션을 제공하는 Sequel Pro (무료)를 사용할 수 있습니다. 그것은 오래된 DB를 삭제하지 않지만.

관련 DB를 열면 클릭 만하면됩니다 : Database -> Rename database...

4
Roee Gavirel

MySQL Administrator에서 다음을 수행하십시오 :

  1. 카탈로그에서 새 데이터베이스 스키마를 만듭니다.
  2. 백업으로 이동하여 이전 스키마의 백업을 만듭니다.
  3. 백업을 실행하십시오.
  4. 복원으로 이동하여 3 단계에서 만든 파일을 엽니 다.
  5. 대상 스키마에서 '다른 스키마'를 선택하고 새 데이터베이스 스키마를 선택하십시오.
  6. 복원을 시작하십시오.
  7. 새 스키마를 확인하고, 정상적으로 보이면 이전 스키마를 삭제하십시오.
3
Tom

in phpmyadmin 당신은 쉽게 데이터베이스의 이름을 바꿀 수 있습니다

select database 

  goto operations tab

  in that rename Database to :

  type your new database name and click go

이전 테이블을 삭제하고 테이블 데이터를 다시로드하도록 요청하십시오. 모두에서 확인을 클릭하십시오.

데이터베이스 이름이 바뀌 었습니다.

3
murtaza.webdev

phpMyAdmin을 사용하는 경우 이름을 바꾸려는 데이터베이스를 선택하면 "작업"탭으로 이동할 수 있습니다. 그런 다음 마지막 섹션 "데이터베이스 복사"(또는 그와 비슷한 것)로 이동하여 이름을 지정하고 아래 옵션을 선택하십시오. 이 경우 "구조 및 데이터"와 "복사하기 전에 데이터베이스 만들기"확인란을 선택하고 마지막으로 해당 섹션의 "이동"버튼을 눌러야합니다.

그런데 스페인어로 phpMyAdmin을 사용하고 있기 때문에 섹션의 이름이 영어인지 확실하지 않습니다.

3
ecruz

하나의 스키마에서 다른 스키마로 모든 테이블을 이동시키는 한 줄짜리 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에 이전 스키마에 대한 읽기/쓰기/삭제 권한과 새 스키마에 대한 읽기/쓰기/작성 권한이 있는지 확인하십시오.

3
coffeefiend

나는 이렇게했다 : 당신의 기존 데이터베이스의 백업을 가져라. db.Zip.tmp를 입력 한 다음 프롬프트에서 다음과 같은 명령을 실행합니다.

"C : ₩ Program Files (x86) ₩ MySQL ₩ MySQL Server 5.6 ₩ bin ₩ mysql.exe"-h localhost -u root -p [암호] [새 db 이름] < "C :\Backups\db.Zip.tmp "

3
Samra

당신은 두 가지 방법으로 그것을 할 수 있습니다.

  1. RENAME TABLE old_db.table_name TO new_db.table_name;
  2. 작업 이동 -> 거기에서 테이블 옵션 탭을 볼 수 있습니다. 거기에서 테이블 이름을 편집 할 수 있습니다.
2
jeeva

이것은 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%"
2
Nadav Benedek

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에서 제거되었다.

2
xelber

이 작업은 모든 데이터베이스에서 작동하며 각 테이블의 이름을 maatkit mysql toolkit

Mk-find를 사용하여 각 테이블을 인쇄하고 이름을 바꿉니다. 맨 페이지 는 더 많은 옵션과 예제를 가지고 있습니다.

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

Maatkit을 설치 한 경우 ( 매우 쉽습니다 ), 이렇게하는 것이 가장 간단한 방법입니다.

2

여러 데이터베이스가있는 덤프 파일에서 시작하는 경우 덤프에서 sed를 수행 할 수 있습니다.

sed -i -- "s|old_name_database1|new_name_database1|g" my_dump.sql
sed -i -- "s|old_name_database2|new_name_database2|g" my_dump.sql
...

그런 다음 덤프를 가져옵니다. 이름 충돌이 발생하지 않도록하십시오.

1
RotS

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는 나중에 세션에 남아있을 것입니다. 나는 그것을 사용하지 않고이 기능을 쓸 수 없었다.

1
Milosz

다음과 같은 방법으로 데이터베이스의 이름을 바꿨습니다.

  1. mysqldump 또는 DB 도구 (예 : heidiSQL, mysql 관리자 등)를 사용하여 파일 백업

  2. 일부 텍스트 편집기에서 백업 파일 (예 : backupfile.sql)을 엽니 다.

  3. 검색하고 데이터베이스 이름을 바꾸고 파일을 저장하십시오.

4. 편집 된 sql 파일을 복원합니다.

1
Adarsha

계층 뷰 (다른 뷰에서 데이터를 가져 오는 뷰)를 사용하는 경우, mysqldump는 올바른 뷰 순서를 고려하지 않기 때문에 mysqldump에서 원시 출력을 가져올 수 없다. 이 때문에, 나는 스크립트 작성 즉석에서 순서를 수정하기 위해보기를 다시 주문합니다.

그것은 다음과 같이 loooks :

#!/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

1
gadelat

너희들이 나를 위해 총을 쏠 예정이며, 아마도 이것은 매번 작동하지 않을 것이며, 확실히 모든 논리에 위배된다.하지만 내가 방금 시도한 것은 ... MySQL 엔진을 멈추고 로그온한다. 루트로서 간단히 파일 시스템 레벨에서 DB 이름을 변경했습니다 ....

나는 OSX를 사용 중이며 bedbf에서 BEDBF로 변경했습니다. 놀랍게도 그것은 효과가있었습니다 ...

프로덕션 DB에서는 사용하지 않는 것이 좋습니다. 방금 실험으로 시도했는데 ...

행운을 빈다 .-)

0
Lawrence

이 글을 게시했습니다 . 오늘날 긁힘과 머리카락 당기기 후에 MySQL을 사용하여 데이터베이스 이름을 어떻게 변경합니까? ? 해결책은 스키마를 .sql 파일로 내보내고 파일을 열고 맨 위의 sql CREAT TABLE 섹션에서 데이터베이스/스키마 이름을 변경하는 것입니다. 여러 개의 스키마가 파일에 저장된 경우 세 개 이상의 인스턴스가 있으며 페이지 상단에 없을 수 있습니다. 이 방법으로 전체 데이터베이스를 편집하는 것이 가능하지만 큰 데이터베이스에서는 테이블 속성 또는 인덱스의 모든 인스턴스를 따르는 것이 상당히 어려울 수 있습니다.

0
E.R.Rider

I). 직접 기존 DB의 이름을 바꿀 수있는 방법은 없습니다.하지만 아래 단계에 따라 목표를 달성 할 수 있습니다. - 1). newdb를 만듭니다. 2). newdb를 사용하십시오. 삼). create table table_name (select * from olddb.table_name);

위와 같이하면, olddb의 테이블에서 데이터를 복사하고이를 newdb 테이블에 삽입합니다. 테이블의 이름을 동일하게 지정하십시오.

II). RENAME TABLE old_db.table_name TO new_db.table_name;

0
rajesh