안녕하세요
게임쪽에서 근무하는 서버프로그래머입니다
DBA가없고 사수가없는관계로 전문가 분들의 도움을 받고싶습니다
현재 DB이전을 계획하고있는데 로그DB(트랜잭션Log아님)의 크기가 1TB정도되며
그중 한 테이블이 약 900GB를 차지하고있으며 행의수는 약 40억개정도 됩니다
용량이 너무 큰관계로 일단 로그DB를 어느정도 정리하고 옮기려합니다
클러스터드 인덱스는 time(datetime) 컬럼을 기준으로 잡혀있고
이외에 BIGINT , INT 이리 2개의 컬럼이 인덱스로 잡혀있습니다
컬럼은 약 21개정도되는 테이블인데 이 테이블을 특정 날짜를 기준으로 그 날짜 이전을 삭제하려고합니다
데이터베이스 복구옵션은 simple로 설정되어있습니다
인터넷에서 여러가지 검색해본결과 WHILE을써서 10000~20000개씩 삭제하는방법과 동일한 테이블을 만들어서
남기고싶은 행들을 INSERT로 옮기고 기존의 테이블을 삭제하는 방법도 봤는데
이 상황에서 동일한 테이블을 생성하여 옮기는게 최선의 방법인지 여쭤보고싶습니다
이경우 신규 테이블은 PK , 클러스터드 인덱스 , 논클러스터드 인덱스를 동일하게 잡고 Insert Select 를 하면 되는지요
총 행수는 약 40억개이며 특정날짜 이후(남겨야할)의 행은 약 23억개정도로 예상하고있습니다
감사합니다
Comment 10
-
처리짱
2018.09.14 17:05
-
freighter
2018.09.18 17:31
안녕하세요
해당방식대로 새로운 테이블을만들어 클러스터 인덱스만 생성한상태로
insert into 새테이블
select from 이전테이블 where !@#$%
으로 내부적으로 미리 테스트를진행하였는데 insert작업으로인하여 너무 심한 트랜잭션로그가 남게되는데 어떻게 해결하면좋을까요
테스트로 사용한 테이블은 240GB이고 이중 40%를 insert하게 진행하였는데 로그가 170GB가 넘어 용량부족으로 중간에 중단하였습니다
-
처리짱
2018.09.19 14:51
insert 말로요. into로 하면 로그남 남지 않아요..
select * into 새테이블 from 이전테이블 where !@#$%
혹은 insert where 절을 더 쪼개서 조금씩 인서트 하거나요..
-
freighter
2018.09.19 16:15
안녕하세요
select into방식으로 하려했는데 추가적인 상황이 생깁니다
select into 실행시 새 테이블이 생성되게되는데 이전테이블에서 idx가 ID사양으로 설정되어있습니다
검색결과 ID사양을 중간에 추가하는경우에는 내부적으로 ID사양설정후 모든테이블을 복사하는방식으로 한다고알고있는데 SELECT INTO시 ID사양을 설정하는 방법이 있나요?
-
freighter
2018.09.19 16:21
추가적으로 검색하여봤는데
SELECT IDENTITY(BIGINT, 1,1) AS idx
,컬럼1 , 컬럼2 , 컬럼3 ....
INTO item_tmp
FROM item
WHERE time > '2017-09-01 00:00:00';
이런방식으로 진행하면 ID사양이 적용되는지 알고싶습니다
-
처리짱
2018.09.19 16:43
into로 만들어진 새 테이블에 IDENTITY가 필요한가요? 새테이블이 단순 로그백업용테이블이라면 새테이블에 IDENTITY속성을 주지 않고 매일 작업으로 새테이블쪽으로 이전데이터를 옴기는 것이 맞는거 같은데요...
-
freighter
2018.09.19 17:05
1.A와같은 B테이블을 만들면서 필요한 데이터 복사(SELECT INTO )
2.B테이블 인덱스 생성3.A테이블을 Truncate한뒤 Drop한 후 B테이블을 A로 이름변경
이렇게 진행하는걸로 알고있는데
기존테이블과 똑같이 ID사양도 잡아야하고 컬럼별 Default 값도 잡아줘야하는거 아닌가요?
-
처리짱
2018.09.19 17:14
위와같이 작업을 하실려면 IDENTITY(BIGINT, 1,1) AS idx 하시면 자동증가 계속 증가하고요..
테이블 복사가 끝나면
trancate 하지말지말고 아래처럼 테이블 이름을 바꾸세요.. 문제가 생기면 다시 돌려야 하니..
sp_rename 이전테이블, 임시테이블
sp_rename 새테이블, 이전테이블나중에 문제 없을때 drop 하심 됩니다..
-
freighter
2018.09.19 17:22
네 감사합니다
-
minsouk
2018.10.06 02:43
저라면 수일이나 수개월에 걸쳐 그냥 삭제 하겠습니다. 1000건씩......
cpu 사용량 disk 성능 여유가 충분히 있다면 천천히 지우는게 가장 좋은 방법 입니다.
옮기는 것이라면 당연히 여유가 된다면, 실시간으로 천천히 옮기는게 가장 안전한 방법 입니다. 빵 때리면 켁 죽어요~
제 개인적인 의견으로는 테이블을 생성하고 INSERT하는게 좋을거 같습니다.. 근데 테이블 사이즈가 너무 크네요.. 월이나 연도별로 쪼개는 것이 좋은거 같습니다.
SELECT * INTO TABLE WHERE 어쩌고 저쩌고.
이후 인덱스 생성.
인덱스는 클러스터인덱스를 먼저잡고 논클러스터를 잡으면 되요.
데이터베이스 사이즈를 미리 늘려놓고 작업하세요~