2011-11-28 5 views
1

수백만 행 테이블의 데이터를 다른 테이블로 전송하려고합니다. 내가 직면 해요 문제는 다음과 같습니다큰 MySQL 테이블 간 데이터 전송

  • 내가 데이터를 사용할 수 없습니다 내가 WHERE 절
  • 필요하기 때문에 임시 테이블에 모든 행을 두는 것은 충돌 때문에 간단한 INSERT INTO ... SELECT ...을 할 수 없어, 덤프 서버

그래서 기본적으로 한 번에 100 개의 행을 가져 와서 다른 테이블에 삽입하는 저장 프로 시저 또는 유사한 작업을 수행해야한다고 생각합니다.

이 문제에 대한 해결책이나 모범 사례에 대한 아이디어가 있습니까?

감사합니다,

+1

이 단위 작업을 위해 외부 프로그램을 작성하는 것이 어떻습니까? updt : 하나의 서버 내에서 하나의 db? – triclosan

+0

[SQLyog] (http://webyog.com/en/downloads.php)를 사용해 볼 수 있습니다. 다운로드 할 수있는 30 일 평가판이 있습니다. SQLyog에는 데이터 동기화 마법사가있어 사용자가 시도하고있는 작업을 정확하게 수행 할 수 있습니다 (실제로 코드를 작성하지 않고). –

+1

mysqldump는 어디서나 --where 옵션을 사용할 수 있습니다. http://dev.mysql.com/doc/refman/5.1/en/mysqldump.hts.html – Devart

답변

2

당신은 SELECT INTO OUTFILE을 사용할 수

SELECT * INTO OUTFILE 'backup.csv' 
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' 
LINES TERMINATED BY '\n' 
FROM <tablename> WHERE <conditions> <Other Clause if required> 

그런 다음 삽입 :

LOAD DATA INFILE 'backup.csv' 
INTO TABLE <tablename> 
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' 
LINES TERMINATED BY '\n' 
(field1,field1,field2) etc 
+0

나는 우리가 말한대로 시도하고 있습니다. 그리고 backup.csv는 기본적으로 어디에 위치합니까? – evilpenguin

+0

신경 쓰지 마세요, 해당 데이터베이스의 모든 테이블을 보유하고있는 폴더에서 찾았습니다. – evilpenguin

0

하여 업데이트 주파수는 무엇인가.?

업데이트를 추적 할 필요가없는 경우 한도를 사용할 수 있습니다.

Function ExecCommandInParts(ByVal sql As String, Optional ByVal Updater As Func(Of Integer, Integer) = Nothing) As Integer 
    Dim limit As Integer = 10000 
    Dim count As Integer = limit 
    While count = limit 
     count = ExecCommandWithTimeout(sql & " limit " & limit) 
     If Updater IsNot Nothing Then Updater(count) 
    End While 
End Function 

SQL = SQL 쿼리 (INSERT ... SELECT, DELETE ...) 발신자를 업데이트 할 수 업데이터 = 대리자를 실행합니다 : I 행 = 0이 될 때까지 기다리 과거 기능 (VB.net)에 쓴 object/user 명령의 상태는 무엇입니까 ...

ExecCommandWithTimeout = SQL을 실행하고 500 밀리 초를 기다리는 기능입니다.

대량 생산 서버에서 테스트되었습니다.