다른 이름으로 mysql 데이터베이스 복원


답변:


58

mysqldump가 데이터베이스를 만들거나 선택하지 않는 방식으로 덤프를 만들도록 할 수 있습니다.

예 : 데이터베이스 db1을 덤프하고 데이터베이스 db2로로드 중입니다.

이것은 CREATE DATABASE와 USE 명령을 덤프에 넣습니다.

mysqldump -u... -p... --routines --triggers --databases db1 > /root/db1.sql

이것은 CREATE DATABASE와 USE 명령을 덤프에 넣지 않습니다 ( 원하는 것입니다 ).

mysqldump -u... -p... --routines --triggers db1 > /root/db1.sql

다음 네 가지 방법 중 하나로 다른 데이터베이스 (예 : db2)에로드 할 수 있습니다.

옵션 1

$ mysqldump -u... -p... --routines --triggers db1 | mysql -u... -p... -A -Ddb2

옵션 2

$ mysqldump -u... -p... --routines --triggers db1 > /root/db1.sql
$ mysql -u... -p... -A -Ddb2 < /root/db1.sql

옵션 3

$ mysqldump -u... -p... --routines --triggers db1 > /root/db1.sql
$ mysql -u... -p... -A -Ddb2
mysql> source /root/db1.sql

옵션 4

$ mysqldump -u... -p... --routines --triggers db1 > /root/db1.sql
$ mysql -u... -p... -A
mysql> use db2
mysql> source /root/db1.sql

시도 해봐 !!!


다른 사람이 이것으로 어려움을 겪고 -Ddb2있다면 앞에 하이픈 이 없어야합니다. 적어도 포함시킬 때 MySQL 구문 오류가 발생했습니다.
gwg

작동하지 않는 것 같습니다. 내 덤프에는 CREATE 또는 USE 데이터베이스가 없지만 여전히 ALTER DATABASE ... CHARACTER SET ...가져 오기를 방해하는 데이터베이스 가 있습니다. 편집 : Oracle은 기본적으로 버그를 무시합니다 .
mpen

5

나는 덤프, 편집 및 삽입의 큰 팬입니다. 그러나 텍스트 파일 (덤프 파일)을 열어서 변경할 필요는 없습니다 (여러 줄 길이 일 때 특히 유용합니다). 데이터베이스를 덤프하려면 MYDATABASE.

mysqldump MYDATABASE > mydump.sql

그런 다음 sed를 사용하여 이전 데이터베이스 이름을 다음과 같이 새 이름으로 바꿉니다.

sed -i 's/MYDATABASE/MYNEWDATABASE/g' mydump.sql

새 데이터베이스를 생성하고 다시 가져 오기만하면 새 데이터 배지 MYNEWDATABASE에 모든 테이블이 생성됩니다.

mysqladmin create MYNEWDATABASE

mysql MYNEWDATABASE < mydump.sql

편집 : 의견 섹션의 일부 좋은 사람들이 지적했듯이, 일부 데이터가 위의 방법으로 변경되면이를 피할 수있는 정확한 방법이 위험합니다.

1) 이렇게 변경하기 전에 덤프에서이를 잡으십시오.

cat mydump.sql | grep "MYDATABASE"

2)`를 추가하여 다음과 같이 더 안전하게 만들 수 있습니다.

sed -i 's/`MYDATABASE`/`MYNEWDATABASE`/g' mydump.sql

다른 사람이 구체적으로 제안하는 경우 4 년 후에 답변을 편집 해 드리겠습니다.


문제는 기존 데이터베이스 내에서 하나의 테이블을 복사하는 것이 아니라 다른 이름의 enitre 데이터베이스를 복원하는 것이 중요하다고 생각합니다.
Michael Green

3
sed 부분이 필요합니다
Steve Buzonas

10
이 명령은 나쁜 생각이며 가능하다면 투표를 중단합니다. 문자열을 교체하려는 경우 최소한 CREATE TABLE 및 USE 행을 일치시켜 다른 데이터를 바꾸지 마십시오.
bksunday

1
sed 명령 ( sed -i 's/MYDATABASE/MYNEWDATABASE/g' mydump.sql)을 실행하기 전에 MYDATABASE의 모든 발생을 점검 cat mydump.sql | grep "MYDATABASE"하여 데이터베이스 이름 만 변경되고 다른 데이터는 그대로 유지하십시오.
Rafaf Tahsin

1
sed -i 's/`MYDATABASE`/`MYNEWDATABASE`/g' mydump.sql # 잠재적으로 더 안전한 스팀 편집. 내 데이터베이스 덤프에는 USE 또는 CREATE DATABASE 문이 포함되어 있지 않지만 db 이름은 SQL 주석, 뷰 및 트리거 (MySQL 5.7)에 있습니다. 주석에서 데이터베이스 이름을 바꾸지는 않지만 결과 데이터베이스에는 영향을 미치지 않습니다. 이것은 나를 위해 잘 작동했습니다.
Jonathan

3

나는 오래 전에 이것을 한 번했습니다.

모든 데이터를 내보낼 때 파일의 시작 부분에 "use database x"와 같은 데이터베이스 이름을 설정하는 옵션이 있습니다.

따라서이 선언을 변경할 수 있습니다.


3

파일이 당신이 가지고 있고 쉘 / 콘솔에서 파일을 조작하는 경우 ,, 및 옵션으로 sed시작하는 줄에서 문자열 대체를 수행 하는 데 사용 합니다 (mysqldump 주석)CREATE DABATASECREATE TABLEUSE--

데이터베이스 작성, 테이블 작성, 사용 및 mysqldump 주석과 일치하는 행에서 db 이름 바꾸기

dbfile="yoursqldumpfile.sql";
dbname="current_db_name";
dbnewname="new_db_name";
dbnewfile="/tmp/$dbnewname.sql";
cat $dbfile | sed "/^CREATE DATABASE/ s=$dbname=$dbnewname=" | sed "/^CREATE TABLE/ s=$dbname=$dbnewname=" | sed "/^USE / s=$dbname=$dbnewname=" | sed "/^-- / s=$dbname=$dbnewname=" > $dbnewfile


물론 여기에 언급 된 많은 답변과 같이 mysqldump 백업에 CREATE DATABASE 및 USE 행이 포함되어 있지 않은 경우 더 쉽습니다. 옵션을 의미 --all-databases, --databases또는 짧은 버전 -A또는 -B사용되지 않았다.


MySQL은 5.7에서 mysqldump를도와 트리거 및 뷰의 데이터베이스 이름을 포함 --no-create-db하고하지 않고 --database또는 --databases.
Jonathan

2

다음 두 규칙을 사용하여 덤프를 수행하는 경우 :

  1. --databases, 등의 옵션을 사용하지 말고 --database이러한 옵션없이 명령 끝에 데이터베이스 이름을 입력하십시오.
  2. 옵션을 포함 --no-create-db

다음을 수행하면 mysqldump가 데이터베이스를 참조하지 않고 SQL을 작성하므로 가져 오기 중에 mysql 명령 끝에 새 데이터베이스 이름을 사용할 수 있습니다!

mysqldump  --no-create-db old_db_name --single-transaction --compress --order-by-primary --host old_db_host -u old_db_user -pOld_db_password | mysql --host new_host -u new_user -pnewpassword new_db_name

MySQL은 5.7에서 mysqldump를도와 트리거 및 뷰의 데이터베이스 이름을 포함 --no-create-db하고하지 않고 --database또는 --databases.
Jonathan

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.