불행히도 100 행의 작은 배치로 복사하는 작업도 일정 시간이 지난 후 상당한 지연을 발생시킵니다.
각 배치 사이에 지연을 추가하거나 업데이트를 배치하고 이전 배치 직후에 각 배치를 실행합니까?
그렇다면 다음과 같이 좋아하는 언어로 변환을 스크립팅하십시오.
repeat
copy oldest 100 rows that haven't been copied yet to new table
sleep for as long as that update took
until there are <100 rows unprocessed
stop logging service
move the last few rows
rename tables
restart logging
delete the old table when you are sure the conversion has worked
이렇게하면 시스템 사용이 시간에 따라 달라짐에 따라 부하의 차이를 허용하더라도 변환이 서버 용량의 절반 이상을 차지하지 않도록해야합니다.
데이터베이스 요구는 사용자에 대한 몇 가지 작업을 할 때 서비스가 상대적으로 유휴 상태 일 때 가능한 한 많은 시간을 같이 사용하지만 (잠재적으로 상당한 시간 기간 동안 일시 중지) 전원 백업 할 경우 또는 교체 sleep for as long as the update took
와 함께 if the server's load is above <upper measure>, sleep for some seconds then check again, loop around the sleep/check until the load drops below <lower measure>
. 즉, 조용한 시간에 미리 스팀을 낼 수 있지만 서버가 정상적인 작업을 수행하는 중일 때는 완전히 일시 중지됩니다. 로드 결정은 Linux에 따라 OS에 따라 달라지며 1 분로드 평균 값 /proc/loadavg
또는 출력 결과 와 비슷합니다 uptime
. <lower measure>
그리고 <upper measure>
당신의 프로세스가 바로 다음부터 부하 측정에 영향을 미치는 때문에 자신의 다시 시작하는 일시 보관하지 않도록 차이가이 같은 컨트롤에서 평소 불구하고, 같은 값이 될 수 있습니다.
물론 이것은 오래된 행이 수정 될 수있는 테이블에서는 작동하지 않지만 설명 한 것과 같은 로그 테이블에서는 제대로 작동합니다.
이 경우 새 테이블을 채운 후 인덱스를 작성하는 일반적인 지혜를 무시하고 싶을 것 입니다. 가능한 한 빨리 (시스템의 나머지 부분에 미치는 영향을 줄이려면) 원할 때 실제로 더 효율적이지만,이 경우 프로세스가 끝날 때 큰 부하를 원하지 않습니다. 인덱스는 한 번에 완전히 생성되므로 작업이 바쁠 때 일시 중지 할 수없는 프로세스입니다.