programing

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

nasanasas 2020. 9. 28. 09:13
반응형

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


에서 MySQL의 매뉴얼 MySQL은 이를 다루고 있습니다.

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

이것은 MyISAM 과는 매우 다른 것을 저장 하는 InnoDB 와 함께 작동해야합니다 .


InnoDB의 경우 다음이 작동하는 것 같습니다. 비어있는 새 데이터베이스를 만든 다음 각 테이블의 이름을 차례로 새 데이터베이스로 바꿉니다.

RENAME TABLE old_db.table TO new_db.table;

그 후에 권한을 조정해야합니다.

셸에서 스크립팅하려면 다음 중 하나를 사용할 수 있습니다.

mysql -u username -ppassword old_db -sNe 'show tables' | while read table; \ 
    do mysql -u username -ppassword -sNe "rename table old_db.$table to new_db.$table"; done

또는

for table in `mysql -u root -ppassword -s -N -e "use old_db;show tables from old_db;"`; do mysql -u root -ppassword -s -N -e "use old_db;rename table old_db.$table to new_db.$table;"; done;

메모:

  • 옵션 -p과 비밀번호 사이에는 공백이 없습니다 . 데이터베이스에 암호가 없으면 -u username -ppassword부품을 제거하십시오 .
  • 일부 테이블에 트리거가있는 경우 위의 방법으로 다른 데이터베이스로 이동할 수 없습니다 ( Trigger in wrong schema오류 발생). 이 경우 기존 방법을 사용하여 데이터베이스를 복제 한 다음 이전 데이터베이스를 삭제합니다.

    mysqldump old_db | mysql new_db

  • 저장 프로 시저가있는 경우 나중에 복사 할 수 있습니다.

    mysqldump -R old_db | mysql new_db


다음 몇 가지 간단한 명령을 사용하십시오.

mysqldump -u username -p -v olddatabase > olddbdump.sql
mysqladmin -u username -p create newdatabase
mysql -u username -p newdatabase < olddbdump.sql

또는 I / O를 줄이려면 @Pablo Marin-Garcia가 제안한대로 다음을 사용하십시오.

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

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

phpMyAdmin에서 선택하려는 데이터베이스를 선택합니다. 탭에는 작업이라는 이름이 있으며 이름 바꾸기 섹션으로 이동하십시오. 그게 다야.

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

여기에 이미지 설명 입력


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

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

다음 두 스크립트 중 하나를 사용할 수 있습니다 (원래는 이전을 제안했고 누군가가를 사용하기 위해 내 대답을 "개선"했습니다 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에서 누락 된 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 데이터베이스에서 작동하지 않습니다. 이 경우 데이터베이스를 덤프하고 다시 가져와야합니다.


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

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

나는 최근에야 아주 좋은 방법을 발견하고 MyISAM 및 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;

완전한 이름 바꾸기 를 수행하는 가장 간단한 방탄 방법입니다 (마지막에 이전 데이터베이스를 삭제하여 복사본이 아닌 이름 바꾸기 포함) .

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를 사용하여 스키마를 덤프하고 다른 스키마에서 복원 한 다음 이전 스키마를 삭제하는 것입니다 (필요한 경우).

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. 테이블에 트리거가 있으면 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) 아웃 파일에서 뷰를 덤프합니다. 동일한 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 테이블에 대한 간단한 UPDATE로 old_schema 이름을 new_schema로 업데이트하고 "Flush permissions;"를 호출하면 이러한 문제를 해결할 수 있습니다. "방법 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

단계 :

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

여기에 이미지 설명 입력


전체 덤프 및 복원을 수행 할 필요없이 데이터베이스 내의 모든 테이블의 이름을 다른 데이터베이스 아래로 바꿀 수 있습니다.

존재하는 경우 삭제 절차 mysql.rename_db;
DELIMITER ||
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, '`;')`# 이전 데이터베이스 삭제`;
끝 ||
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
4 행의 오류 1435 (HY000) : 잘못된 스키마에서 트리거

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

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

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

그리고 그 포스트에서 제안 된 것을하는 Simon R Jones가 게시 한 스크립트 (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


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

구문은 rename_mysqldb database 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=

TodoInTX의 저장 프로시 저는 저에게 잘 맞지 않았습니다. 여기에 내 찌르기가 있습니다.

-저장 프로 시저 rename_db : 테이블 복사 수단으로 데이터베이스 이름을 바꿉니다.
-주의 사항 : 
- '새'데이터베이스 이름과 동일한 이름을 가진 기존 데이터베이스를 제거합니다.
-테이블 만 복사합니다. 저장 프로 시저 및 기타 데이터베이스 개체는 복사되지 않습니다.
-Tomer Altman (taltman@ai.sri.com)

구분자 //
존재하는 경우 삭제 절차 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;
    CONTINUE HANDLER FOR NOT FOUND SET done = 1을 선언합니다.

    SET @output = CONCAT ( 'DROP SCHEMA IF EXISTS', new_db, ';'); 
    @output에서 stmt를 준비합니다.
    EXECUTE stmt;

    SET @output = CONCAT ( 'CREATE SCHEMA IF NOT EXISTS', new_db, ';');
    @output에서 stmt를 준비합니다.
    EXECUTE stmt;

    OPEN old_tables;
    반복
        FETCH old_tables INTO current_table;
        완료되지 않은 경우 다음
        SET @output = CONCAT ( 'alter table', old_db, '.', current_table, 'rename', new_db, '.', current_table, ';');
        @output에서 stmt를 준비합니다.
        EXECUTE stmt;

        END IF;
    완료 될 때까지 END REPEAT;

    old_tables 닫기;

종료//
구분자;

서버 오류에 대한 질문을 제기 MySQL의 프록시를 사용하여 매우 큰 데이터베이스를 복원 할 때 다운 타임을 해결하기 위해 노력. 나는 성공하지 못했지만 결국 데이터베이스 크기 때문에 덤프 / 가져 오기가 옵션이 아니기 때문에 원하는 것이 RENAME DATABASE 기능이라는 것을 깨달았습니다.

MySQL에 내장 된 RENAME TABLE 기능이 있으므로 작업을 수행하기 위해 간단한 Python 스크립트를 작성했습니다. 나는 한 GitHub의에 게시 그것을 다른 사람에게 유용 할 수있는 경우에.


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

홈 디렉토리에서 .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"

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

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


가장 간단한 방법은 HeidiSQL 소프트웨어를 사용하는 것입니다. 무료이며 오픈 소스입니다. Windows 및 Wine이 있는 모든 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;

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

저장 프로 시저 / 뷰 등이있는 경우에도 전송하는 것이 좋습니다.


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

시작시 history 명령은 단순히 암호가 포함 된 MySQL 명령이 셸 기록에 저장되지 않도록합니다.

db_user이전 스키마에 대한 읽기 / 쓰기 / 삭제 권한과 새 스키마에 대한 읽기 / 쓰기 / 만들기 권한이 있는지 확인하십시오 .

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

반응형