Innodb 에서 my sql 에서 2T 를 빠르게 삭제 하 는 큰 표 방법 예제

6865 단어 mysqlinnodb삭제 표
머리말
본 고 는 주로 Innodb 에서 my sql 이 2T 의 큰 시 계 를 빠르게 삭제 하 는 것 에 관 한 내용 을 소개 하 였 으 며,여러분 들 이 참고 학습 을 할 수 있 도록 공유 하 였 습 니 다.다음은 더 이상 말 하지 않 겠 습 니 다.상세 한 소 개 를 해 보 겠 습 니 다.
자,먼저 작은 만 화 를 보고 정 조 를 도 야 하 자.

OK,여기 있 습 니 다.만약 당신 이 아래 명령 을 직접 진행한다 면,당신 에 게 표 erp 가 있다 고 가정 하 세 요.

drop table erp
이 럴 때 모든 my sql 관련 프로 세 스 가 멈 추고 drop 이 끝 날 때 까지 my sql 이 실 행 됩 니 다.이 상황 이 발생 한 이 유 는 drop table 때 innodb 가 전체 자 물 쇠 를 유지 하고 drop 이 완료 되면 자 물 쇠 를 풀 었 기 때 문 입 니 다.
이 는 낮 에 방 문 량 이 매우 많 을 때 아무런 처리 조 치 를 하지 않 은 상태 에서 큰 시 계 를 삭제 하 라 는 명령 을 실행 하면 my sql 전체 가 거기에 걸 려 있다 는 뜻 이다.시 계 를 삭제 하 는 동안 QPS 가 심각하게 떨 어 지고 제품 매니저 가 차 를 마 시 러 왔 다.그래서 만화 의 한 장면 이 나 왔 습 니 다.밤 12 시,밤 이 깊 을 때 지 울 수 있 습 니 다.
물론 불복 하 는 사람 도 있다."시 계 를 삭제 하 는 저장 과정 을 써 서 밤 에 방문 할 수 없 을 때 한 번 만 실행 하면 된다"고 말 할 수도 있다.
나 는 마음 이 놀 라 서 곰 곰 이 생각해 보 니"여러분,말다툼 하지 마 세 요.제 가 업계 에서 통용 되 는 방법 을 말 하 는 것 을 들 어 보 세 요."라 고 말 할 수 밖 에 없 었 다.
하나의 가설
먼저 설명 하 겠 습 니 다.여기 서 하나의 전제 가 있 습 니 다.my sql 은 독립 표 공간 을 열 었 고 MySQL 5.6.7 이후 에 기본적으로 열 렸 습 니 다.
즉,my.cnf 에서 이러한 설정 이 있 습 니 다.

innodb_file_per_table = 1
표 공간 상 태 를 보고 아래 명령 으로

mysql> show variables like '%per_table'; 
+-----------------------+-------+ 
| Variable_name  | Value | 
+-----------------------+-------+ 
| innodb_file_per_table | OFF | 
+-----------------------+-------+
하면,만약,만약...file_per_table 의 value 값 은 OFF 이 고 공유 표 공간 을 사용 합 니 다.
하면,만약,만약...file_per_table 의 value 값 은 ON 이 고 독립 된 표 공간 을 사용 합 니 다.
그래서 여러분 은 저 에 게 독립 표 공간 과 공유 표 공간의 차 이 를 물 어보 시 겠 습 니까?
공유 표 공간:한 데이터베이스 의 모든 표 데이터,색인 파일 은 모두 한 파일 에 놓 여 있 습 니 다.기본적으로 이 공유 표 공간의 파일 경 로 는 data 디 렉 터 리 에 있 습 니 다.기본 파일 이름:ibdata 1(이 파일 은 여러 개 로 확장 할 수 있 습 니 다).이런 방식 하에 서 운송 이 매우 불편 하 다 는 것 을 주의해 라.보 세 요.모든 데 이 터 는 한 파일 에 있 습 니 다.단일 시 계 를 유지 하 는 것 이 매우 불편 합 니 다.또한,delete 작업 을 할 때 파일 에 많은 간격 이 남아 ibdata 1 파일 이 자동 으로 줄 어 들 지 않 습 니 다.공유 표 공간 으로 데 이 터 를 저장 하면 drop table 이후 공간 이 풀 리 지 않 는 문제 가 발생 한 다 는 것 이다.
독립 표 공간:모든 표 는 독립 적 인 방식 으로 배치 되 고 모든 표 에는.frm 표 설명 파일 이 있 으 며,또 하나의.ibd 파일 이 있 습 니 다.
.frm 파일:표 구조의 정의 등 을 포함 하여 모든 표 의 메타 데 이 터 를 저장 합 니 다.이 파일 은 데이터베이스 엔진 과 무관 합 니 다.
.ibd 파일:표 마다 데이터 와 색인 을 저장 한 파일 입 니 다.
주의 하 세 요.이런 방식 에서 모든 표 는 자신 만 의 독립 된 표 공간 이 있 습 니 다.이렇게 운반 하기에 편리 하고 단일 표 가 서로 다른 데이터 베이스 간 의 이동 을 실현 할 수 있 습 니 다.또한 drop table 작업 을 수행 할 때 표 공간 을 자동 으로 회수 할 수 있 습 니 다.delete 작업 을 실행 한 후 alter table Name engine=innodb 를 통 해 조각 을 정리 하고 일부 표 공간 을 회수 할 수 있 습 니 다.
ps:my.cnf 의 datadir 는 데이터 저장 디 렉 터 리 를 설정 하 는 데 사 용 됩 니 다.
자,위 에 바라 바라 가 잔뜩 쌓 여 있 습 니 다.한 가지 만 말씀 드 리 고 싶 습 니 다.
대부분의 상황 에서 운영 비 는 반드시 my sql 에 독립 표 공간의 저장 방식 을 선택 할 것 이다.독립 표 공간의 방식 을 사용 하기 때문에 성능 최적화 와 운영 난이도 측면 에서 볼 때 너무 강하 다.
그래서 제 가 처음에 언급 한 전제 에서 my sql 은 독립 표 공간 을 열 어야 합 니 다.이 가설 은 90%의 상황 에서 성립 된 것 이다.만약 정말 만 났 다 면,당신들 회사 의 my sql 은 공유 표 공간 을 사용 하 는 상황 입 니 다.당신 은 당신 집의 운영 과 마음 을 이야기 하고,왜 공유 표 공간 을 사용 하 는 지 물 어보 세 요.
바른 자세
만약 에 우리 에 게 datadir=/data/my sql/가 있다 고 가정 하면 우 리 는 database 가 있 는데 이름 은 my test 입 니 다.데이터베이스 my test 에 erp 라 는 표 가 있 습 니 다.다음 명령 을 수행 합 니 다.

mysql> system ls -l /data/mysql/mytest/
아래 출력 받 기(필터 링 했 습 니 다)

-rw-r----- 1 mysql mysql  9023 8 18 05:21 erp.frm
-rw-r----- 1 mysql mysql 2356792000512 8 18 05:21 erp.ibd
frm 와 ibd 의 역할 을 위 에서 소개 하 였 습 니 다.지금 은 erp.ibd 파일 이 너무 커서 삭제 가 걸 렸 습 니 다.
어떻게 이 문 제 를 해결 합 니까?
Liux 의 하 드 링크 지식 을 이용 하여 빠 른 삭제 가 필요 합 니 다.다음은'새 형의 개인 요리'의 내용 중 일 부 를 보 여 드 리 겠 습 니 다.
소프트 링크 는 사실 windows 의 빠 른 방식 으로 유추 할 수 있 으 므 로 더 이상 소개 하지 않 고 하 드 링크 를 소개 합 니 다.
이 하 드 링크 에 대해 서 는 간단하게 말씀 드 리 겠 습 니 다.많은 말 을 붙 이 고 싶 지 않 습 니 다.너무 피곤 해 보 입 니 다.
진짜 저 장 된 파일 에 있어 서

그리고 위 에 있 는 node Index 를 가리 키 는 파일 이름 이 있 습 니 다.

그러면 하 드 링크 란 하나의 파일 이름 만 node Index 를 가리 키 는 것 이 아니 라 여러 개의 파일 이름 이 node Index 를 가리 키 는 것 입 니 다.
만약 에 이 파일 이름 이 위의 node Index 를 가리 키 는 것 이 라 고 가정 합 니 다.즉,
이때,당신 은 파일 이름(1)을 삭제 하 는 작업 을 했 습 니 다.Liux 시스템 에서 파일 이름(2)이 node Index 를 가리 키 는 것 을 발 견 했 습 니 다.따라서 파일 을 진정 으로 삭제 하지 않 고 절차(2)의 인용 을 삭제 하 는 것 입 니 다.이 작업 은 매우 빠 릅 니 다.인용 만 삭제 하 는 것 이기 때 문 입 니 다.그래서 이렇게 되 려 고 했 어 요.
그 다음 에 파일 이름(2)을 삭제 하 는 작업 을 합 니 다.Liux 시스템 에서 이 node Index 를 가리 키 는 다른 파일 이름 이 없 으 면 실제 저장 파일 을 삭제 합 니 다.이 작업 은 실제 파일 을 삭제 하 는 것 이기 때문에 느 립 니 다.
OK,우리 가 사용 하 는 것 이 바로 위의 원리 입 니 다.
먼저 erp.ibd 에 하 드 링크 를 만 들 고 ln 명령 을 이용 합 니 다.

mysql> system ln /data/mysql/mytest/erp.ibd /data/mysql/mytest/erp.ibd.hdlk 
이 때 파일 디 렉 터 리 는 다음 과 같다.
-rw-r----- 1 mysql mysql          9023  8 18 05:21 erp.frm
-rw-r----- 2 mysql mysql 2356792000512  8 18 05:21 erp.ibd
-rw-r----- 2 mysql mysql 2356792000512  8 18 05:21 erp.ibd.hdlk
erp.ibd.hdlk 파일 이 하나 더 있 고 erp.ibd 와 erp.ibd.hdlk 의 inode 가 모두 2 라 는 것 을 알 게 될 것 입 니 다.
이 때 drop table 작업 을 수행 합 니 다.

mysql> drop table erp;
Query OK, 0 rows affected (0.99 sec)
너 는 1 초도 안 되 어 삭제 되 었 다 는 것 을 알 게 될 것 이다.이 때 두 개의 파일 이름(erp.ibd 와 erp.ibd.hdlk)이 있 고 하나의 inode 를 가리 키 고 있 을 때 삭제 작업 을 수행 합 니 다.인용 만 삭제 하기 때문에 매우 빠 릅 니 다.
그럼,이 때 삭 제 는 테이블 을 mysql 에서 삭 제 했 습 니 다.그러나 디스크 공간 은 아직 풀 리 지 않 았 습 니 다.erp.ibd.hdlk 파일 이 하나 남아 있 기 때 문 입 니 다.
어떻게 erp.ibd.hdlk 를 정확하게 삭제 합 니까?
만약 당신 이 경험 이 없다 면,반드시 나 에 게 대답 하고,rm 명령 으로 삭제 할 것 입 니 다.여기 서 설명 해 야 할 것 은 생산 환경 에서 rm 명령 으로 큰 파일 을 삭제 하면 디스크 IO 비용 이 급증 하고 CPU 부하 가 너무 높 으 면 다른 프로그램 운행 에 영향 을 줄 수 있다 는 것 이다.
그렇다면 이 럴 때 는 truncate 명령 으로 삭제 해 야 합 니 다.truncate 명령 은 coreutils 도구 에 집중 되 어 있 습 니 다.
자세 한 내용 은 바 이 두 에 가 보 세 요.rm 과 truncate 명령 에 대해 전문 적 으로 테스트 한 적 이 있 습 니 다.truncate 명령 은 디스크 IO,CPU 부하 에 거의 영향 을 주지 않 습 니 다.
다음 스 크 립 트 삭제

TRUNCATE=/usr/local/bin/truncate
for i in `seq 2194 -10 10 `; 
do 
 sleep 2
 $TRUNCATE -s ${i}G /data/mysql/mytest/erp.ibd.hdlk 
done
rm -rf /data/mysql/mytest/erp.ibd.hdlk ;
2194 G 부터 매번 10G 를 축소 하고 2 초 간 멈 추 며 파일 이 10G 만 남 을 때 까지 계속 하 다가 마지막 에 rm 명령 으로 나머지 부분 을 삭제 합 니 다.
기타 상황
데이터 베 이 스 를 windows 에 배치 하면 어떻게 하 느 냐 는 것 이다.이 문 제 는 내 가 대답 할 게,사실은 프로 답지 못 해.나 는 데뷔 이래 아직 만난 적 이 없 기 때문에 생산 환경 에서 my sql 은 windows 에 있 는 것 이다.만약 에 진짜 만 났 다 고 가정 하면 windows 다음 에 mklink 라 는 도구 가 있 습 니 다.windows 에서 하 드 링크 자 물 쇠 를 만 드 는 것 입 니 다.비슷 한 기능 을 완성 할 수 있 을 것 입 니 다.
총결산
본 고 에서 말 한 내용 은 중 소기 업 의 연구 개발 이 비교적 쉽게 만 날 수 있다.중 소기 업 들 은 전문 적 인 DBA 가 없 기 때문에,동 화 를 개발 하려 면 무엇이든 해 야 한다.모두 가 얻 은 것 이 있 기 를 바 랍 니 다.
자,이상 이 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기