한 데이터베이스에서 다른 데이터베이스로 테이블을 복사하는 가장 쉬운 방법은 무엇입니까?


151

데이터베이스가 다른 사용자에있을 때 한 데이터베이스의 테이블에서 다른 데이터베이스의 테이블로 데이터를 복사하는 가장 좋은 방법은 무엇입니까?

사용할 수 있다는 것을 알고 있습니다

INSERT INTO database2.table2 SELECT * from database1.table1

그러나 여기에서 문제는 모두이다 database1과는 database2다른 MySQL의 사용자 받고있다. 따라서 user1액세스 database1user2가능 database2합니다. 어떤 생각?


6
사용자에게 테이블 수준 권한을 부여 할 수 있습니다. 참조 : dev.mysql.com/doc/refman/5.5/en/grant.html
Omesh

2
불행히도 Godaddy 공유 호스팅 서버를 사용하고 있기 때문에이 경우에는 작동하지 않습니다. 그들은 데이터베이스로 그런 일을 할 수 없습니다.
스파키

@mmdemirbas 데이터베이스의 한 테이블에는 거의 백만 개의 행이 있습니다. 데이터베이스 덤프는 엄청납니다. 또한 내보내려고 할 때 약 10000 개의 행만 내보내고 있습니다. 아마도 큰 크기 때문입니다.
스파키

RENAME을 사용하여 테이블을 이동할 수 있다는 것을 알고 있으며 매우 빠릅니다. 테이블을 복사하는 동등한 트릭이 있습니까?
Dan

BTW : 두 테이블에서 필드 목록의 순서가 동일하도록주의해야합니다. 그렇지 않으면 database2의 테이블에서 올바른 필드에 맵핑되도록 database1의 테이블에서 이름으로 필드를 선택해야합니다. 이 문제는 초기 생성 후 table1이 수정 된 데이터베이스와 mysqldump 파일에서 생성 된 새 데이터베이스를 백업 한 곳에서 발생했습니다.
Steve L

답변:


113

쉘 액세스 권한이 mysqldump있는 경우 컨텐츠를 덤프하여에 database1.table1파이프 할 mysqldatabase2있습니다. 여기서 문제 table1는 여전히 그렇습니다 table1.

mysqldump --user=user1 --password=password1 database1 table1 \
| mysql --user=user2 --password=password2 database2

다른 쿼리 로 이름을 바꿔야 table1할 수도 있습니다 table2. 다른 방법으로 sed를 사용하여 파이프 간 table1을 table2로 변경할 수 있습니다.

mysqldump --user=user1 --password=password1 database1 table1 \
| sed -e 's/`table1`/`table2`/' \
| mysql --user=user2 --password=password2 database2

table2가 이미 존재하면 테이블 생성을 만들지 않는 첫 번째 mysqldump에 매개 변수를 추가 할 수 있습니다.

mysqldump --no-create-info --no-create-db --user=user1 --password=password1 database1 table1 \
| sed -e 's/`table1`/`table2`/' \
| mysql --user=user2 --password=password2 database2

이 문제는 자동화 될 때 비밀번호를 표시해야한다는 것입니다. 자동화되어 있지 않고 명령 줄에서 사용자가 수행하는 경우 문제가 없습니다.
Nelles

100

CREATE TABLE db1.table1 SELECT * FROM db2.table1

여기서 db1은 대상이고 db2는 소스입니다.


두 사용자가 서로 데이터를 선택할 권한이없는 경우이 기능이 작동합니까?
베릴륨

1
이것은 다른 mysql 서버에서 작동하지 않습니까?
PUG

8
이것은 인덱스를 복사하지 않습니다
bcoughlan

@Beryllium 아니오 이것은 사용자에게 두 DB에 대한 권한이 필요하지 않습니다. jaminator 아니요 다른 서버에서는 작동하지 않지만 질문에 대해서는 그렇게 생각하지 않습니다. bcoughlan 당신이 맞습니다. 이것은이 접근법의 큰 결함입니다. 테이블 구조를 올바르게 보존하지 못합니다.
thomasrutter 1

4
복사 된 테이블에 기본 키 및 자동 증분 세트가 없습니다. 다음을 실행해야합니다ALTER TABLE db1.table1 ADD PRIMARY KEY (id); ALTER TABLE db1.table1 MODIFY COLUMN id INT AUTO_INCREMENT;
Weston Ganger

60

PHPMyAdmin 을 사용하는 경우 정말 간단 할 수 있습니다. 다음 데이터베이스가 있다고 가정하십시오.

DB1 & DB2

DB1에는 DB2에 복사하려는 테이블 사용자가 있습니다.

PHPMyAdmin에서 DB1을 연 다음 users 테이블로 이동하십시오.

이 페이지에서 오른쪽 상단 의 "작업" 탭을 클릭하십시오 . 조작 아래 에서 (database.table)에 테이블 복사 섹션을 찾으십시오 .

당신은 끝났습니다!


1
간단하다! 내가 게으른 것을 축하 할 수있는 때입니다!
Daniel Dut

1
당신은 내 시간을 절약합니다. 나는 순진한 접근을하고있었습니다.
Hamza Zafeer

1
다른 답변도 작동하지 않습니다. 색인도 복사하는 사람 만
Bsienn

1
테이블이 특히 큰 경우 (예 : 4GB를 초과하는 경우) 작동하지 않습니다. 예를 들어, phpMyAdmin이 작동 할 수없는 22GB의 테이블이 있습니다.
Mark D

1
완벽한 답변. phpmyadmin의이 기능에 대해 몰랐습니다.
zookastos

23

MySql Workbench : 강력 추천

MySql Workbench의 데이터베이스 마이그레이션 도구

마이그레이션 문제를 쉽게 처리 할 수 ​​있습니다. MySql과 SqlServer간에 선택된 데이터베이스의 선택된 테이블을 마이그레이션 할 수 있습니다. 반드시 시도해보십시오.


이 작업을 진행하려고합니다. 설정이 완료되었지만 mysql Workbench마이그레이션을 SQLYog의 데이터베이스 복사본 과 비교했는지 궁금 하십니까? 간단히 살펴보면 그것들은 매우 비슷해 보이지만 mysql 워크 벤치는 새로운 기능입니다
wired00

아니요, SQLYog를 시도하지 않았습니다.
mmdemirbas

MySql 워크 벤치를 사용하여 MySQL에서 SQL Server로 마이그레이션하는 방법은 명확하지 않습니다. 저는 Workbench에 있으며 도움말이나 UI에서 힌트를 찾지 못합니다. MySQL 용 SSMA가 저에게 효과적이라는 것을 알고 있습니다.
subsci

2
흥미롭지 만 프로그램이 큰 데이터베이스를 사용하여 마이그레이션을 수행하면 명령 줄이 가장 효과적이었습니다.
Claudionor Oliveira

1
@mmdemirbas, " 선택한 데이터베이스의 선택된 테이블을 MySql과 SqlServer간에 마이그레이션 할 수 있습니다. "OP의 질문은 SQL Server에 관한 것이 아닙니다.
sampablokuper

19

MySQL에 Navicat을 사용합니다 ...

모든 데이터베이스 조작이 쉬워집니다!

Navicat에서 두 데이터베이스를 모두 선택한 다음 사용하면됩니다.

 INSERT INTO Database2.Table1 SELECT * from Database1.Table1

13

나는 이것이 오래된 질문이라는 것을 알고 여기에 도착하는 사람이 더 나은 접근 방식을 얻도록 대답합니다.

5.6.10부터는 할 수 있습니다

CREATE TABLE new_tbl LIKE orig_tbl;

https://dev.mysql.com/doc/refman/5.7/en/create-table-like.html 문서를 참조하십시오.


1
데이터를 복사하지 않습니다! 참조한 문서를 읽으십시오 :> ** CREATE TABLE ... LIKE는 어떠한 데이터도 보존하지 않습니다 **
dgpro

11

테이블이 동일한 mysql 서버에 있으면 다음을 실행할 수 있습니다

CREATE TABLE destination_db.my_table SELECT * FROM source_db.my_table;
ALTER TABLE destination_db.my_table ADD PRIMARY KEY (id); 
ALTER TABLE destination_db.my_table MODIFY COLUMN id INT AUTO_INCREMENT;

다른 인덱스는 어떻습니까?! 이 질문은 데이터뿐만 아니라 테이블을 복사해야한다고 주장합니다
Jorj

9

MySql Workbench의 내보내기 및 가져 오기 기능을 사용하십시오. 단계 :
1. 원하는 값을 선택하십시오

E.g. select * from table1; 
  1. 내보내기 버튼을 클릭하고 CSV로 저장하십시오.
  2. 첫 번째와 비슷한 열을 사용하여 새 테이블을 만듭니다.

    E.g. create table table2 like table1; 
  3. 새 테이블에서 모두 선택

    E.g. select * from table2;  
  4. 가져 오기를 클릭하고 2 단계에서 내 보낸 CSV 파일을 선택하십시오.

MySql Workbench의 내보내기 및 가져 오기 단추 샘플


1
내가 생각하는 10 억 미만의 행이있는 테이블에서만 작동합니다.
Diogo Paim

9

또 다른 쉬운 방법이 있습니다.

  1. DB1을 사용하십시오. create create TB1 테이블;
    • 여기에 구문을 클립 보드에 복사하여 DB2에서 TB1을 작성하십시오.
  2. DB2를 사용하십시오.
    • TB1 테이블을 작성하려면 여기에 구문을 붙여 넣으십시오.

INSERT INTO DB2.TB1 SELECT * from DB1.TB1;


덕분에 gui 프로그램을 사용하지 않고도 데이터베이스 복사를 자동화 할 수있었습니다.
New2HTML

4

시도 mysqldbcopy( 문서 )

또는 대상 호스트에서 " 연합 테이블 "을 작성할 수 있습니다 . 연합 테이블을 사용하면 다른 데이터베이스 서버의 테이블을 마치 로컬 데이터베이스 인 것처럼 볼 수 있습니다. ( 문서 )

페더 레이 티드 테이블을 작성한 후 평소와 같이 데이터를 복사 할 수 있습니다. insert into TARGET select * from SOURCE


1
페더레이션 테이블에 대해 읽었지만 Amazon RDS (현재)는이를 지원하지 않습니다 ... XP
Chococroc

4

MySQL Workbench를 사용하면 Data Export를 사용하여 테이블 만 로컬 SQL 파일 (Data Only, Structure Only 또는 Structure and Data)에 덤프 한 다음 Data Import를 사용하여 다른 DB로로드 할 수 있습니다.

여러 개의 연결 (다른 호스트, 데이터베이스, 사용자)을 동시에 열 수 있습니다.


3

필요한 모든 쿼리를 얻는 간단한 방법은 information_schema 및 concat의 데이터를 사용하는 것입니다.

SELECT concat('CREATE TABLE new_db.', TABLE_NAME, ' LIKE old_db.', TABLE_NAME, ';') FROM `TABLES` WHERE TABLE_SCHEMA = 'old_db';

그러면 다음과 같은 결과 목록이 나타납니다.

CREATE TABLE new_db.articles LIKE old_db.articles;
CREATE TABLE new_db.categories LIKE old_db.categories;
CREATE TABLE new_db.users LIKE old_db.users;
...

그런 다음 해당 쿼리를 실행할 수 있습니다.

그러나 MySQL Views에서는 작동하지 않습니다. AND TABLE_TYPE = 'BASE TABLE'초기 쿼리를 추가하여 피할 수 있습니다 .


1

이것이 당신이 정기적으로해야하는 일입니까, 아니면 한 번만해야합니까?

테이블과 그 내용을 텍스트 파일로 스크립팅하는 내보내기 (예 : phpMyAdmin 또는 유사한 기능 사용)를 수행 한 다음 다른 데이터베이스로 다시 가져올 수 있습니다.


한 번만하면됩니다. 그러나 문제는 데이터베이스의 테이블에 거의 백만 개의 행이 있다는 것입니다. 데이터베이스 덤프는 엄청납니다. 또한 내보내려고 할 때 약 10000 개의 행만 내보내고 있습니다. 아마도 큰 크기 때문입니다.
스파키

아, 그렇습니다. 그것은 한계입니다. 이 WordPress Codex 기사 가 도움이 될까요? 그것은 워드 프레스 기사이지만 약간의 통찰력을 제공 할 수 있습니다 (DB가 너무 커서 phpMyAdmin이 처리 할 수없는 경우 명령 줄을 사용하여 테이블을 덤프하는 방법에 대한 섹션이 있습니다).
Sepster

mysqldump 명령 행 도구는 1 백만 행 또는 수십억 행에 문제가 없습니다. 영향을 미치는 모든 것은 소요되는 시간과 결과가 차지하는 하드 드라이브의 양 (파일로 출력한다고 가정)에 달려 있습니다. phpMyAdmin의 export 명령에 대한 나의 경험은 mysqldump보다 훨씬 제한적이라는 것입니다.
thomasrutter

1

아래 단계를 사용하여 한 데이터베이스 테이블에서 다른 데이터베이스 테이블로 일부 열을 복사하고 삽입하십시오.

  1. CREATE TABLE tablename (columnname 데이터 유형 (size), columnname 데이터 유형 (size));

2. db2.tablename에 삽입 SELECT columnname1, columnname2 FROM db1.tablename;


1

먼저 덤프를 작성하십시오. 이미 존재하는 --no-create-info --no-create-db경우 플래그를 추가했습니다 table2.

mysqldump -u user1 -p database1 table1 > dump.sql

그런 다음 user1비밀번호를 입력하십시오 . 그때:

sed -e 's/`table1`/`table2`/' dump.sql
mysql -u user2 -p database2 < dump.sql

그런 다음 user2비밀번호를 입력하십시오 .

@helmors 답변과 동일하지만 암호가 원시 텍스트로 콘솔에 표시되지 않기 때문에 접근 방식이 더 안전합니다 (reverse-i-search, 암호 스니퍼 등). 권한에 대한 적절한 제한이있는 스크립트 파일에서 실행하면 다른 접근 방식이 좋습니다.



-1

sakila.customer (Database_name.tablename) 와 같은 destination_customer 테이블을 작성 하면 소스 테이블의 구조 만 복사됩니다. 데이터를 구조와 함께 복사 하려면 sakila.customer에서 *를 선택하여 destination_customer 테이블을 작성하십시오.


이것은 완전히 다른 질문에 대한 답변 인 것 같습니다. CREATE TABLE LIKE질문에 없습니다 , 왜 그것이 틀렸다고 언급합니까? 그리고이 답변이 어떤 사용자도 다른 사람의 테이블에 액세스 할 수없는 문제를 어떻게 해결 하는지에 대한 설명은 없습니다 .
Toby Speight
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.