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


151

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

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

INSERT INTO database2.table2 SELECT * from database1.table1

그러나 여기에서 문제는 모두이다 database1과는 database2다른 MySQL의 사용자 받고있다. 따라서 user1액세스 database1만 user2가능 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파이프 할 mysql수 database2있습니다. 여기서 문제 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.