programing

MySQL 데이터베이스 이름( 스키마 이름 변경)을 변경하려면 어떻게 해야 합니까?

muds 2023. 9. 18. 22:46
반응형

MySQL 데이터베이스 이름( 스키마 이름 변경)을 변경하려면 어떻게 해야 합니까?

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

보통 데이터베이스를 덤프하고 새 이름으로 다시 가져옵니다.이것은 매우 큰 데이터베이스에는 선택사항이 아닙니다.RENAME {DATABASE | SCHEMA} db_name TO new_db_name; 나쁜 일을 하고, 소수의 버전에서만 존재하며, 전체적으로 나쁜 생각입니다.

이것은 My ISAM과는 매우 다른 것들을 저장하는 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

또는 @Pablo Marin-Garcia가 제안한 대로 I/O를 줄이기 위해 다음을 사용합니다.

mysqladmin -u username -p create newdatabase
mysqldump -u username -v olddatabase -p | mysql -u username -p -D newdatabase

해결책이 더 간단하다고 생각하고 몇몇 개발자들이 제안했습니다.phpMyAdmin은 이에 대한 작업을 수행합니다.

phpMyAdmin에서 선택할 데이터베이스를 선택합니다.탭에 Operations(운영)라는 항목이 있는데 이름 변경 섹션으로 이동합니다.그게 전부입니다.

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

Enter image description here

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;(또는 다른 큰 숫자).

된 된 RENAME DATABASEMySQL의 :

  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누락된 RENE DATABASE 명령 에뮬레이팅에서 가져온 것입니다.

다음 셸 스크립트를 사용할 수 있습니다.

참조: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

세 가지 옵션:

  1. 새 데이터베이스를 작성하고 서버를 다운한 후 한 데이터베이스 폴더에서 다른 데이터베이스 폴더로 파일을 이동한 후 서버를 재시작합니다.이는 모든 테이블이 MyISAM인 경우에만 작동합니다.

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

  3. 내 sqdump를 사용하고 그 파일로 다시 로드합니다.

간단한 방법

데이터베이스 디렉토리로 변경:

cd /var/lib/mysql/

MySQL 종료...이것은 중요합니다!

/etc/init.d/mysql stop

이 방법은 InnoDB나 BDB-Database에는 적용되지 않습니다.

데이터베이스 이름 변경:

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 데이터베이스에서는 사용할 수 없습니다.이 경우 데이터베이스를 덤프하고 다시 가져와야 합니다.

완전 이름 변경을 수행하는 가장 간단한 방법(복사가 아닌 이름 변경을 위해 이전 데이터베이스를 마지막에 삭제하는 것 포함):

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"로 입력).

최근에 와서야 My ISAM 및 InnoDB와 함께 작업할 수 있으며 속도가 매우 빠릅니다.

RENAME TABLE old_db.table TO new_db.table;

어디서 읽었는지는 기억이 안 나지만 신용은 내가 아닌 다른 사람에게 주어집니다.

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

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

두 가지 방법이 있습니다.

방법 1: 데이터베이스 스키마의 이름을 변경하는 잘 알려진 방법은 Mysqdump를 사용하여 스키마를 덤프하여 다른 스키마로 복원한 후(필요한 경우) 이전 스키마를 드롭하는 방법입니다.

From Shell

 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 TABLE합니다. 테이블에 트리거가 있는 경우 MySQL의 "RENAME TABLE"이 실패합니다.이 문제를 해결하기 위해 다음과 같은 작업을 수행할 수 있습니다.

1) Dump the triggers, events and stored routines in a separate file.이 작업은 mysqldump 명령에 -E, -R 플래그(트리거를 덤프하는 -t-d 외에도)를 사용하여 수행됩니다.트리거가 덤프되면 RENE 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단계에서 찾은 모든 "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

위 메서드와의 복잡성 : 사용자에 대한 GRANTS를 올바른 스키마_name과 일치하도록 업데이트해야 할 수 있습니다.이를 수정하려면 mysql.columns_priv, mysql.procs_priv, mysql.tables_priv, mysql.db 테이블에서 기존_schema 이름을 new_schema로 업데이트하고 "Flush 권한;"을 호출하는 간단한 업데이트가 필요합니다."방법 1"보다 "방법 2"가 조금 더 복잡해 보이지만, 이것은 완전히 스크립트화할 수 있습니다.위의 단계를 적절한 순서로 수행하기 위한 간단한 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"로 이름이 변경되었습니다.마지막으로 위에서 "방법 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

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

참고: 데이터베이스 이름을 바꾸려면 MySQL을 중지해야 합니다.

(원하는 이름을 사용하여) 새로운 데이터베이스를 생성하고 필요한 데이터를 이전 데이터에서 새 데이터로 내보내는 것을 권장합니다.아주 간단합니다.

여기서 대부분의 답은 두 가지 이유 중 하나로 틀렸습니다.

  1. 보기와 트리거가 있을 수 있으므로 RENE TABLE만 사용할 수는 없습니다.트리거가 있으면 RENETABLE이 실패합니다.
  2. 질문에서 요청한 대로 큰 데이터베이스 이름을 "빨리" 변경하려면 mysqldump를 사용할 수 없습니다.

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

그리고 그 게시물에서 제안된 것을 수행하는 사이먼 R 존스에 의해 게시된 스크립트(made?).대본에서 발견한 버그를 수정했습니다.여기에서 확인할 수 있습니다.

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

Mac 사용자의 경우 [데이터베이스] 메뉴에 [데이터베이스 이름 변경] 옵션이 있습니다.http://www.sequelpro.com/

아무도 이것에 대해 언급하지 않은 것 같지만 다른 방법이 있습니다.

create database NewDatabaseName like OldDatabaseName;

각 테이블에 대해 다음을 수행합니다.

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

그렇다면, 원한다면,

drop database OldDatabaseName;

이 접근 방식은 네트워크 트래픽이 거의 없는 서버에서 전체 전송을 수행할 수 있는 이점이 있으므로 덤프/복원보다 훨씬 더 빨리 전송할 수 있습니다.

저장 프로시저/뷰/등이 있는 경우 전송도 원할 수 있습니다.

전체 덤프 및 복원을 수행하지 않고도 데이터베이스 내의 모든 테이블 이름을 다른 데이터베이스 아래에 있도록 변경할 수 있습니다.

DROP PROCEDURE IF EXISTSmql.rename_db;구분 기호 ||CREATE PROCEDURE mysql.rename_db(INold_db VARCHAR(100), IN new_db VARCHAR(100))시작한다.CONCAT 선택('CREATE DATAB)ASE', new_db, ';' '# 새 데이터베이스 생성';CONCAT 선택('이름 변경 탭)LE ', old_db, ''debugust', table_name, ''TO', new_db, 'debugust', table_name, ';';'# artertable' FROM information_deb.where table_deb = old_db;SELECT CONCAT('DROP DATABATE ', old_db, ';') '# 오래된 데이터베이스 삭제';
END||구분 기호;
$ time mysql -uroot -e "call mysql.graphics_db('db1", 'db2';" | mysql -uroot

그러나 대상 db의 트리거는 모두 행복하지 않습니다.먼저 삭제한 다음 이름을 바꾼 후 다시 만들어야 합니다.

mysql -uroot -e "call mysql.jp_db('test", 'blah2';" | mysql -uroot행 4의 오류 1435(HY000): 잘못된 스키마에서 트리거

맥 사용자의 경우 다음을 사용할 수 있습니다.Sequel Pro데이터베이스 이름 변경 선택사항만 제공합니다.예전 DB를 삭제하지는 않지만요.

: DB 을 하면 를 하면 을 .Database-->Rename database...

아래는 편의상 db-name과 new db-name 두 개의 파라미터로 실행해야 하는 작은 셸 스크립트입니다.

홈 디렉토리에서 .my.cnf-파일을 사용하지 않는 경우 로그인 매개 변수를 mysql-line에 추가해야 할 수 있습니다.이 스크립트를 실행하기 전에 백업을 만드십시오.


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

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

구문은 rename_mysqldb 데이터베이스 new database -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=

가장 간단한 방법은 HeidiSQL 소프트웨어를 사용하는 것입니다.무료 오픈 소스입니다.윈도우와 와인이 있는 리눅스에서 실행됩니다(Linux, BSD, Solaris, Mac OS X에서 윈도우 응용 프로그램 실행).

HeidiSQL을 다운로드하려면 http://www.heidisql.com/download.php 로 이동합니다.

Wine을 다운로드하려면 http://www.winehq.org/ 로 이동합니다.

HeidiSQL에서 데이터베이스 이름을 변경하려면 데이터베이스 이름을 마우스 오른쪽 버튼으로 클릭하고 'Edit'을 선택하면 됩니다.그런 다음 새 이름을 입력하고 '확인'을 누릅니다.

정말 단순해요.

TodoInTX의 저장 절차는 저에게 잘 맞지 않았습니다.제가 한번 해보겠습니다.

-- 저장 프로시저 rename_db: 데이터베이스 이름을 테이블 복사 수단으로 변경합니다.
-- 주의 사항:-- '새' 데이터베이스 이름과 동일한 이름을 가진 기존 데이터베이스를 클로버합니다.
-- 테이블만 복사되며, 저장된 프로시저 및 기타 데이터베이스 개체는 복사되지 않습니다.
-- Tomer Altman (taltman@ai.sri.com )
구분 기호 //DROP PROCEDURE가 존재하는 경우 rename_db;CREATE PROCEDURE rename_db(구_db VARCHAR(100), new_db VARCHAR(100))시작한다.DELECORE current_table VARCHAR(100);DELCORE INT DEFAULT 0;dELECORE old_number COURS FOR select table_name from information_deb 여기서 table_number = old_db;찾을 수 없는 집합에 대한 계속 처리자 선언 = 1;
SET @output = CONCAT('DROP SCHEMA IF EXISTRES', new_db, ';');@output에서 stmt를 준비합니다;STMT를 실행합니다.
SET @output = CONCAT('CREATE Schema if not exists', new_db, ';');@output에서 stmt를 준비합니다;STMT를 실행합니다.
Open old_tables;따라하다old_table을 current_table로 가져옵니다.그렇지 않은 경우에는SET @output = CONCAT('alter table', old_db, '.', current_table, 'rename', new_db, '.', current_table,';');@output에서 stmt를 준비합니다;STMT를 실행합니다.
종료(ENDIF)끝까지 반복합니다.
CLOSE old_tables;
END//구분 기호;

당신이 이것을 할 수 없는 이유가 있습니다.(시도한 모든 답변 제공)

  • 기본적인 답변은 대부분의 경우에 효과가 있고 다른 경우에는 데이터 손상을 초래합니다.
  • 데이터베이스의 휴리스틱 분석을 기반으로 전략을 선택해야 합니다.
  • 이것이 이 기능이 구현된 다음 제거된 이유입니다.[doc]

해당 데이터베이스에 있는 모든 개체 유형을 덤프하고 새로 이름이 지정된 개체 유형을 만든 다음 덤프를 가져와야 합니다.이것이 라이브 시스템이라면 당신은 그것을 내려야 할 것입니다.그럴 수 없는 경우, 현재 데이터베이스에서 새 데이터베이스로의 복제를 설정해야 합니다.

이를 수행할 수 있는 명령어를 보려면 @satishD에 세부 정보가 있으므로 목표 데이터베이스와 일치하는 전략을 수립해야 하는 몇 가지 문제를 전달합니다.

phphmyadmin에서는 데이터베이스 이름을 쉽게 바꿀 수 있습니다.

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' ;

ALTER DATABASE MySQL에서 제안한 방법입니다.RENAME DATABASE떨어집니다.

13.1.32부터 데이터베이스 구문 이름 변경:

RENAME {DATABASE | SCHEMA} db_name TO new_db_name;

이 문은 MySQL 5.1.7에서 추가되었지만 위험한 것으로 확인되어 MySQL 5.1.23에서 제거되었습니다.

MySQL Administrator에서 다음을 수행합니다.

  1. 카탈로그에서 새 데이터베이스 스키마를 작성합니다.
  2. 백업으로 이동하여 이전 스키마의 백업을 만듭니다.
  3. 백업을 실행합니다.
  4. Restore로 이동하여 3단계에서 생성한 파일을 엽니다.
  5. Target Schema에서 'Another Schema'를 선택하고 새 데이터베이스 스키마를 선택합니다.
  6. 복원을 시작합니다.
  7. 새 스키마를 확인한 후 보기가 좋으면 이전 스키마를 삭제합니다.

다음은 모든 테이블을 한 스키마에서 다른 스키마로 이동하는 한 줄 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은(는) 이전 스키마에 대한 읽기/쓰기/드롭 권한을 가지고 있으며, 새 스키마에 대한 읽기/쓰기/만들기 권한을 가지고 있습니다.

기존 데이터베이스를 백업하는 방식으로 수행했습니다.db.zip.tmp를 제공하고 명령 프롬프트에서 다음을 기록합니다.

"C:\Program Files(x86)\MySQL\MySQL Server 5.6\bin\mysql.exe" -h localhost -u root -p[password] [new db name] < "C:\backups\db.zip.tmp"

MySQL 5.5.16에서는 TodoInTx의 솔루션이나 user757945의 적응된 솔루션 모두 제게 적합하지 않았습니다. 따라서 다음은 제 적응된 버전입니다.

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

언급URL : https://stackoverflow.com/questions/67093/how-do-i-rename-a-mysql-database-change-schema-name

반응형