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

StackOverflow https://stackoverflow.com/questions/67093

  •  09-06-2019
  •  | 
  •  

문제

MySQL 매뉴얼은 MySQL 이것을 다룬다.

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

이것은 함께 작동해야합니다 InnoDB, 이는 사물을 매우 다르게 저장합니다. 마이ISAM.

도움이 되었습니까?

해결책

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에서 선택하려는 데이터베이스를 선택합니다.탭에는 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 DATABASE MySQL의 명령:

  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 명령 에뮬레이션.

세 가지 옵션:

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

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

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

간단한 방법

데이터베이스 디렉터리로 변경합니다.

cd /var/lib/mysql/

MySQL을 종료합니다...이건 중요하다!

/etc/init.d/mysql stop

좋아요, 이 방법은 InnoDB나 BDB-Databases에서는 작동하지 않습니다.

데이터베이스 이름 바꾸기:

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 데이터베이스에서는 작동하지 않습니다.이 경우 데이터베이스를 덤프하고 다시 가져와야 합니다.

저는 최근에 아주 좋은 방법을 발견했습니다. MyISAM 및 InnoDB와 함께 작동하며 속도가 매우 빠릅니다.

RENAME TABLE old_db.table TO new_db.table;

어디서 읽었는지는 기억나지 않지만 출처는 제가 아닌 다른 사람에게 있습니다.

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

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

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

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

가장 간단하고 완벽하게 수행할 수 있는 방법 완벽한 이름 바꾸기 (마지막에 이전 데이터베이스를 삭제하여 복사본이 아닌 이름 바꾸기를 포함):

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

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

메모: 데이터베이스 이름을 바꾸려면 먼저 MySQL을 중지해야 합니다.

원하는 이름을 사용하여 새 데이터베이스를 만들고 이전 데이터에서 새 데이터베이스로 필요한 데이터를 내보내거나 가져오는 것이 좋습니다.꽤 간단합니다.

PHPMyAdmin에서 데이터베이스 이름을 바꾸면 덤프가 생성된 다음 데이터베이스를 삭제하고 새 이름으로 다시 생성합니다.

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

두 가지 방법이 있습니다.

방법 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로 업데이트하고 “Flushprivileges;”를 호출하여 이러한 문제를 해결할 수 있습니다."방법 2"는 "방법 1"보다 조금 더 복잡해 보이지만 완전히 스크립트 가능합니다.위 단계를 적절한 순서로 수행하는 간단한 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"에 사용된 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

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

DROP PROCEDURE IF EXISTS mysql.rename_db;
DELIMITER ||
CREATE PROCEDURE mysql.rename_db(IN old_db VARCHAR(100), IN new_db VARCHAR(100))
BEGIN
SELECT CONCAT('CREATE DATABASE ', new_db, ';') `# create new database`;
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, '`;') `# drop old database`;
END||
DELIMITER ;

$ time mysql -uroot -e "call mysql.rename_db('db1', 'db2');" | mysql -uroot

그러나 대상 DB의 모든 트리거는 만족스럽지 않습니다.먼저 삭제한 다음 이름을 바꾼 후 다시 생성해야 합니다.

mysql -uroot -e "call mysql.rename_db('test', 'blah2');" | mysql -uroot
ERROR 1435 (HY000) at line 4: Trigger in wrong schema

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

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

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

그리고 해당 게시물에서 제안된 작업을 수행하는 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

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

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

TodoInTX의 저장 프로시저가 나에게는 제대로 작동하지 않았습니다.내 생각은 다음과 같습니다.

-- stored procedure rename_db: Rename a database my means of table copying.
-- Caveats: 
-- Will clobber any existing database with the same name as the 'new' database name.
-- ONLY copies tables; stored procedures and other database objects are not copied.
-- Tomer Altman (taltman@ai.sri.com)

delimiter //
DROP PROCEDURE IF EXISTS rename_db;
CREATE PROCEDURE rename_db(IN old_db VARCHAR(100), IN new_db VARCHAR(100))
BEGIN
    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 stmt;

    SET @output = CONCAT('CREATE SCHEMA IF NOT EXISTS ', new_db, ';');
    PREPARE stmt FROM @output;
    EXECUTE stmt;

    OPEN old_tables;
    REPEAT
        FETCH old_tables INTO current_table;
        IF NOT done THEN
        SET @output = CONCAT('alter table ', old_db, '.', current_table, ' rename ', new_db, '.', current_table, ';');
        PREPARE stmt FROM @output;
        EXECUTE stmt;

        END IF;
    UNTIL done END REPEAT;

    CLOSE old_tables;

END//
delimiter ;

단계:

  1. 때리다 http://localhost/phpmyadmin/
  2. DB를 선택하세요
  3. 작업 탭을 클릭하세요.
  4. "데이터베이스 이름 바꾸기"라는 탭이 있습니다.새 이름을 추가하고 권한 조정을 확인하세요.
  5. 이동을 클릭하세요.

enter image description here

서버 결함에 질문을 올렸습니다. MySQL 프록시를 사용하여 매우 큰 데이터베이스를 복원할 때 가동 중지 시간을 해결하려고 합니다.저는 성공하지 못했지만, 결국 제가 원하는 것은 RENAME DATABASE 기능이라는 것을 깨달았습니다. 데이터베이스 크기로 인해 덤프/가져오기가 옵션이 아니었기 때문입니다.

MySQL에는 RENAME TABLE 기능이 내장되어 있으므로 이 작업을 수행하기 위해 간단한 Python 스크립트를 작성하게 되었습니다.나는 GitHub에 게시했습니다. 다른 사람에게 도움이 될 수 있는 경우.

귀하의 편의를 위해 다음은 두 개의 매개변수를 사용하여 실행해야 하는 작은 쉘스크립트입니다:db 이름 및 새 db 이름.

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


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

가장 간단한 방법은 HeidiSQL 소프트웨어를 사용하는 것입니다.무료이며 오픈 소스입니다.Windows 및 모든 Linux에서 실행됩니다. 와인 (Linux, BSD, Solaris 및 Mac OS X에서 Windows 애플리케이션 실행)

HeidiSQL을 다운로드하려면 다음으로 이동하세요. http://www.heidisql.com/download.php.

Wine을 다운로드하려면 다음으로 이동하세요. http://www.winehq.org/.

HeidiSQL에서 데이터베이스 이름을 바꾸려면 데이터베이스 이름을 마우스 오른쪽 버튼으로 클릭하고 '편집'을 선택하세요.그런 다음 새 이름을 입력하고 '확인'을 누르세요.

너무 간단합니다.

이동할 테이블이 많은 경우 이름 바꾸기 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' ;

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

create database NewDatabaseName like OldDatabaseName;

그런 다음 각 테이블에 대해 다음을 수행하십시오.

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

그럼, 네가 원한다면,

drop database OldDatabaseName;

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

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

Mac 사용자의 경우 다음을 사용할 수 있습니다. Sequel Pro (무료), 데이터베이스 이름을 바꾸는 옵션만 제공합니다.하지만 기존 DB를 삭제하지는 않습니다.

관련 DB를 열면 다음을 클릭하십시오. Database --> Rename database...

MySQL 관리자에서 다음을 수행합니다.

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

~에 phpmyadmin 데이터베이스 이름을 쉽게 바꿀 수 있습니다

select database 

  goto operations tab

  in that rename Database to :

  type your new database name and click go

이전 테이블을 삭제하고 테이블 데이터를 다시 로드하도록 요청하고 둘 다에서 확인을 클릭합니다.

데이터베이스 이름이 변경되었습니다.

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

그런데 저는 phpMyAdmin을 스페인어로 사용하고 있어서 섹션 이름이 영어로 무엇인지 잘 모르겠습니다.

다음은 한 스키마에서 다른 스키마로 모든 테이블을 이동하는 한 줄 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

시작 시의 기록 명령은 단순히 비밀번호가 포함된 MySQL 명령이 셸 기록에 저장되지 않았는지 확인합니다.

다음을 확인하세요. db_user 이전 스키마에 대한 읽기/쓰기/삭제 권한이 있고 새 스키마에 대한 읽기/쓰기/생성 권한이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top