2011-08-04 5 views
0

MySQL Workbench를 사용하여 수백만 행의 MyISAM 테이블을 InnoDB로 변경했습니다. 나는 테이블을 복제 한 후에 ALTER TABLE...INSERT INTO othertable SELECT * FROM mytable에 의해 그것을 시험해 보았지만, 테이블이 너무 크다고 보인다. 서버에 대한 연결이 끊어진 에 대한 오류로 인해 워크 벤치가 종료됩니다..거대한 MyISAM 테이블을 청크로 InnoDB로 내보내는 방법은 무엇입니까?

그래서 나는 10000 개의 엔트리마다 너무 많은 수를 반복하는 SQL 스크립트를 작성할 수 있고, 청크 내 MyISAM 테이블의 내용을 InnoDB 테이블에 복사 할 수 있다고 생각했다.

루프를위한 SQL이없는 것 같기 때문에 누군가가 이것을 실현하는 방법을 제안했는지 궁금합니다.

INSERT INTO `latest`.`AUTHORS` (author_id, author_name) 
SELECT 
`author_names`.`author_name_id`, 
`author_names`.`name` 
FROM `pubmap_latest`.`dblp_author_names`; 

이것은 청크로 실행하려는 쿼리입니다. count(*) -query는 985330 개의 행을 반환합니다.

+0

타 옵션도 수출/일반 텍스트 파일을 통해 테이블을 가져올 수 있습니다. –

+0

@ Scorpi0 :이 시간이 오래 걸리지 않을까요? – Aufwind

+0

한 번 작동하는 경우 오랜 시간이 걸릴지 걱정하지 않아도 작동합니다. 일상적인 일이라면 더 큰 문제가 있습니다. –

답변

1

이전 테이블의 데이터를 내 보낸 다음 새 테이블로 가져 오기 위해 mysqldump (명령 줄 도구)를 사용합니다. 뭔가 같이 :

mysqldump database table > file.sql

그런 다음 파일에 테이블 이름과 유형을 편집 :

mysql database < file.sql

0

키워드는 표시 할 결과 행 수를 정의하여 SELECT 문에 사용할 수 있습니다. 오프셋과 함께 사용하면 테이블을 청크로 나눌 수 있습니다. 물론 테이블을 청크로 분할 할 때 동일한 결과 집합에 대해 작업하려면 order by 절을 사용해야합니다.

SELECT `author_names`.`author_name_id`, `author_names`.`name` 
FROM `pubmap_latest`.`dblp_author_names` 
ORDER BY `author_names`.`author_name_id` 
LIMIT 10000 OFFSET 0 
INTO OUTFILE dblp_author_names_0.sql 

당신이 MySQL 5.1 reference manual를 참조하십시오

LOAD DATA INFILE ... 

과 결과를로드 10000, 20000, 30000, ...

사용할 필요가 오프셋.

관련 문제