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 DATABASE
MySQL 에서 누락 된 명령을 에뮬레이션 :
- 새 데이터베이스 만들기
다음을 사용하여 이름 바꾸기 쿼리를 만듭니다.
SELECT CONCAT('RENAME TABLE ',table_schema,'.',table_name, ' TO ','new_schema.',table_name,';') FROM information_schema.TABLES WHERE table_schema LIKE 'old_schema';
해당 출력 실행
- 이전 데이터베이스 삭제
MySQL에서 누락 된 RENAME DATABASE 명령 에뮬레이션 에서 가져 왔습니다 .
세 가지 옵션 :
새 데이터베이스를 만들고 서버를 종료 한 다음 한 데이터베이스 폴더에서 다른 데이터베이스 폴더로 파일을 이동 한 다음 서버를 다시 시작합니다. 모든 테이블이 MyISAM 인 경우에만 작동합니다.
새 데이터베이스를 만들고 CREATE TABLE ... LIKE 문을 사용한 다음 INSERT ... SELECT * FROM 문을 사용합니다.
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
단계 :
- 줄을 메모장에 복사합니다.
- "olddbname", "newdbname", "mypassword"(+ 선택적으로 "root")에 대한 모든 참조를 동등한 것으로 바꾸십시오.
- 명령 줄에서 하나씩 실행합니다 (메시지가 표시되면 "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
단계 :
- http : // localhost / phpmyadmin /을 누르십시오 .
- DB 선택
- 작업 탭을 클릭하십시오.
- "데이터베이스 이름 바꾸기"라는 탭이 있습니다. 새 이름을 추가하고 권한 조정을 선택하십시오.
- 이동을 클릭하십시오.
전체 덤프 및 복원을 수행 할 필요없이 데이터베이스 내의 모든 테이블의 이름을 다른 데이터베이스 아래로 바꿀 수 있습니다.
존재하는 경우 삭제 절차 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) : 잘못된 스키마에서 트리거
여기에있는 대부분의 답변은 다음 두 가지 이유 중 하나로 잘못되었습니다.
- 뷰와 트리거가있을 수 있으므로 RENAME TABLE을 사용할 수 없습니다. 트리거가 있으면 RENAME TABLE이 실패합니다.
- 큰 데이터베이스의 이름을 "빠르게"(질문에서 요청한대로) 원하는 경우 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 관리자에서 다음을 수행하십시오.
- 카탈로그에서 새 데이터베이스 스키마를 만듭니다.
- 백업으로 이동하여 이전 스키마의 백업을 만듭니다.
- 백업을 실행합니다.
- 복원으로 이동하여 3 단계에서 만든 파일을 엽니 다.
- 대상 스키마에서 '다른 스키마'를 선택하고 새 데이터베이스 스키마를 선택하십시오.
- 복원을 시작하십시오.
- 새 스키마를 확인하고 괜찮아 보이면 이전 스키마를 삭제하십시오.
에 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
이전 스키마에 대한 읽기 / 쓰기 / 삭제 권한과 새 스키마에 대한 읽기 / 쓰기 / 만들기 권한이 있는지 확인하십시오 .
'programing' 카테고리의 다른 글
JSON을 C # 동적 개체로 역 직렬화 하시겠습니까? (0) | 2020.09.28 |
---|---|
어떤 @NotNull Java 주석을 사용해야합니까? (0) | 2020.09.28 |
bash 스크립트에서 정규식을 어떻게 사용합니까? (0) | 2020.09.25 |
JavaScript 키 코드 란 무엇입니까? (0) | 2020.09.25 |
INSERT 대 INSERT INTO (0) | 2020.09.25 |