2017-01-30 1 views
1

약 240GB의 데이터와 색인을 가진 큰 데이터베이스를 가지고 있습니다 (phpMyAdmin에서 읽음 - 내 테이블은 innodb입니다). 그러나 내 ibdata1 파일의 크기가 약 6Gb이고 내 SSD의 공간이 부족하여 서버의 데이터베이스 폴더 크기가 400Gb에 가깝습니다.MySQL 데이터베이스 폴더에서 'FTS _ * _ * _ INDEX_1.ibd'파일 크기를 줄일 수있는 방법은 무엇입니까?

나는 이것을 조사한 결과 크기가 수십 기가 바이트 인 FTS_0000000000000f86_00000000000019db_INDEX_1.ibd과 같은 많은 파일이있는 것으로 보입니다. 그들은 (그들의 파일 이름에 근거하여) 관련된 테이블에 대한 나의 전체 텍스트 인덱스로 보이며, 각각 6 개가 있습니다 (FTS_*_INDEX_1.ibd에서 FTS_*_INDEX_6.ibd).

나는 내 검색을 해봤이 게시물 건너 온 한 :

Howto: Clean a mysql InnoDB storage engine?

Database space doesn't match ibdata1 size

나는이 두 가지 질문/답변에 대한 의견에 내 질문을했습니다

을 아직 답장이 없습니다. 그래서 여기서 직접 질문을하기로했습니다. 내가 ( the first link above에서 제안)를 활성화 innodb_file_per_table와 '이노 정리'를 할 경우

, 난 여전히 내 데이터베이스 폴더에 FTS_\*_INDEX_1.ibd처럼 시작이 큰 파일을 많이있을 것입니다? 이 접근 방식은 ibdata1 파일 크기를 줄이는 데 도움이됩니까? 이 거대한 테이블에있는 일반 OPTIMIZE TABLE이 내 문제와 관련하여 도움이 될까요?

감사합니다.

가 UPDATE : 여기

가 역 파일 크기별로 정렬의 1Gb보다 큰 파일의 목록입니다 (파일 이름이 변경된다) :

-rw-rw----. 1 mysql mysql 1300234240 Jan 30 18:28 FTS_0000000000000fc2_DELETED.ibd 
-rw-rw----. 1 mysql mysql 1375731712 Jan 7 21:41 FTS_0000000000000f86_00000000000019db_INDEX_1.ibd 
-rw-rw----. 1 mysql mysql 1585446912 Jan 30 23:17 FTS_0000000000001000_0000000000001a68_INDEX_1.ibd 
-rw-rw----. 1 mysql mysql 1593835520 Jan 7 21:41 FTS_0000000000000f86_00000000000019bf_INDEX_1.ibd 
-rw-rw----. 1 mysql mysql 1673527296 Jan 29 23:41 FTS_0000000000001000_DELETED.ibd 
-rw-rw----. 1 mysql mysql 1824522240 Jan 7 21:41 FTS_0000000000000f86_00000000000019cd_INDEX_1.ibd 
-rw-rw----. 1 mysql mysql 2172649472 Jan 30 01:16 FTS_0000000000001073_0000000000001b3c_INDEX_1.ibd 
-rw-rw----. 1 mysql mysql 2281701376 Jan 7 21:41 FTS_0000000000000f86_00000000000019b1_INDEX_1.ibd 
-rw-rw----. 1 mysql mysql 2357198848 Jan 31 02:53 FTS_0000000000000fc2_0000000000001a0f_INDEX_1.ibd 
-rw-rw----. 1 mysql mysql 2495610880 Jan 28 13:59 FTS_0000000000000fc2_0000000000001a2b_INDEX_1.ibd 
-rw-rw----. 1 mysql mysql 2906652672 Jan 30 23:18 FTS_0000000000001000_0000000000001a76_INDEX_1.ibd 
-rw-rw----. 1 mysql mysql 3984588800 Jan 30 23:18 FTS_0000000000001000_0000000000001a6f_INDEX_1.ibd 
-rw-rw----. 1 mysql mysql 4135583744 Jan 30 08:03 FTS_0000000000000fc2_00000000000019fa_INDEX_1.ibd 
-rw-rw----. 1 mysql mysql 5716836352 Jan 28 13:59 FTS_0000000000000fc2_0000000000001a01_INDEX_1.ibd 
-rw-rw----. 1 mysql mysql 6400507904 Jan 31 05:39 my_k.ibd 
-rw-rw----. 1 mysql mysql 7449083904 Jan 7 21:41 FTS_0000000000000f86_00000000000019d4_INDEX_1.ibd 
-rw-rw----. 1 mysql mysql 8115978240 Jan 7 21:41 FTS_0000000000000f86_00000000000019c6_INDEX_1.ibd 
-rw-rw----. 1 mysql mysql 8308916224 Jan 30 08:03 FTS_0000000000000fc2_0000000000001a16_INDEX_1.ibd 
-rw-rw----. 1 mysql mysql 8434745344 Jan 7 21:41 FTS_0000000000000f86_00000000000019b8_INDEX_1.ibd 
-rw-rw----. 1 mysql mysql 9244246016 Jan 7 21:41 FTS_0000000000000f86_00000000000019aa_INDEX_1.ibd 
-rw-rw----. 1 mysql mysql 9714008064 Jan 30 01:16 my_a.ibd 
-rw-rw----. 1 mysql mysql 12738101248 Jan 31 05:43 my_s.ibd 
-rw-rw----. 1 mysql mysql 14038335488 Jan 31 02:53 FTS_0000000000000fc2_0000000000001a24_INDEX_1.ibd 
-rw-rw----. 1 mysql mysql 19906166784 Jan 30 08:03 FTS_0000000000000fc2_0000000000001a1d_INDEX_1.ibd 
-rw-rw----. 1 mysql mysql 21185429504 Jan 31 05:43 my_p_s.ibd 
-rw-rw----. 1 mysql mysql 29242687488 Jan 31 02:54 FTS_0000000000000fc2_0000000000001a32_INDEX_1.ibd 
-rw-rw----. 1 mysql mysql 30131879936 Jan 5 16:35 my_p.ibd 
-rw-rw----. 1 mysql mysql 47085256704 Jan 31 05:43 my_a_c.ibd 
-rw-rw----. 1 mysql mysql 76499910656 Jan 31 05:43 my_p_c.ibd 
-rw-rw----. 1 mysql mysql 76743180288 Jan 30 00:09 my_r.ibd 
+0

얼마나 큰 (GB에서)이 테이블 인'FULLTEXT' 지수? –

+0

디렉토리에있는 모든 (관련) 파일의 크기를 표시하십시오. 나는 손을 놓고 길을 잃었다. –

+0

실제로는 기가 바이트 이상의 크기를 가진 8 개의 테이블과 기가 바이트 이상의 크기를 가진 약 20 개의'FTS _ * _ INDEX_1.idb' 파일이 있습니다. 파일과 크기를 어떻게 보여줄까요? 주요 질문에있는 목록처럼? – SAVAFA

답변

0

*.ibd 파일은 모든 InnoDB의 테이블 스페이스 파일입니다. 그것들은 테이블 당 파일 방식으로 저장되는 InnoDB 테이블에 대한 데이터 및/또는 인덱스를 포함한다. 일반적으로 파일 이름은 그들이 저장 한 테이블과 일치합니다. 의심의 여지가 없습니다.

FTS_*.ibd 파일은 InnoDB의 전체 텍스트 색인 구현을위한 색인입니다. 이것은 MySQL 5.6에 도입 된 새로운 기능으로 저장소 특성에 대한 많은 문서화 된 지식이 없습니다. 분명히 그들은 어떤 이유에서 꽤 부피가 크다. OPTIMIZE TABLE이 전체 텍스트 색인에 어떤 영향을 주는지는 잘 알지 못합니다.

큰 파일을 제거하는 방법 중 하나는 물론 InnoDB 테이블에 정의한 전체 텍스트 인덱스를 삭제하는 것입니다.

ElasticSearch 또는 Apache Solr 또는 Sphinx Search와 같은 다른 전체 텍스트 색인 생성 제품은 색인을 더 압축 적으로 저장할 수 있습니다.

Full Text Search Throwdown

이노의 전체 텍스트 인덱스가 LIKE '%pattern%'와 테이블 스캔이 아닌 다른 내가 테스트 느린 솔루션이다 : 나는 여기에 전체 텍스트 인덱싱 솔루션의 비교를했다.

+0

감사합니다 빌, 내가 여기에있는 문제는 내 400Gb SSD가 거의 꽉 차서 많이 움직일 수 없다는 것입니다. 나는 데이터베이스를 덤프하고 다시 가져올 것이라고 생각한다. 이렇게하면 FT 인덱스를 비롯한 모든 인덱스가 다시 생성되고 일부 공간이 만들어지기를 바랍니다. 나는 그것에 대한 어떤 갱신이라도 있으면 여기에서 돌아갈 것이다. 이전에 보았던 슬라이드 쇼에 관해서는 슬라이드 69 중 64 번째 슬라이드를 고수해야한다고 생각합니다! :) 스핑크스 검색과 같은 복잡한 작업으로 마이그레이션하는 방법과 가져올 수있는 복잡한 문제가 전혀 없습니다. – SAVAFA

+0

Bill, 전체 데이터베이스를 덤프하고 다시 생성하는 프로세스가 성공적이지 않았습니다. 48 시간 이상이 걸려서 처리 중이기 때문에 취소했습니다. 이제 막 FT 색인을 재정의하기 시작했습니다. 이전 색인을 쉽게 제거했지만 일부 색인 (텍스트 단락이있는 열에있는 색인)을 다시 정의하면 mysql 연결이 'mysql이 사라지는 문제'로 인해 손실됩니다. 나는 phpMyAdmin을 사용하여 이것을 수행하고있다. – SAVAFA

+0

공간이 너무 짧다면 적어도 전체 텍스트 인덱스가 필요한 테이블의 경우 MyISAM으로 전환하는 것이 좋습니다. MyISAM은 일반적으로 InnoDB보다 더 컴팩트하게 데이터를 저장합니다. 우리가 InnoDB를 사용한다면 문자 그대로 서버에 맞지 않기 때문에 MyISAM을 사용하는 하나의 DB 서버를 관리합니다. –

0

예상대로, FTS_*.ibd 파일은 InnoDB FULLTEXT 색인 파일입니다.이러한 파일을 축소하는 가장 좋은 방법은 일반적으로 FULLTEXT 인덱스를 삭제하고 다시 작성하는 것입니다. OPTIMIZE TABLE을 실행하면 innodb_optimize_fulltext_only이 활성화되었는지 여부에 따라 도움이 될 수도 있지만 도움이되지 않을 수도 있지만 공간을 회수하는 가장 안전한 방법은 드롭/추가입니다.

삽입 전용 작업 부하에서 드롭/추가는 일반적으로 파일을 더 작게 만들며 이러한 테이블에 대량의 업데이트 및/또는 삭제가 발생하면 드롭/추가 크기가 더 커야합니다. 큰 FTS_*_DELETED.ibd 파일이 있다는 것은 해당 테이블에서 일부 데이터를 삭제했음을 의미하므로 인덱스를 삭제/추가하면 디스크 공간이 절약됩니다.

SHOW CREATE TABLE을 사용하여 기존 FULLTEXT 색인의 이름과 열을 찾아 적절하게 다시 작성할 수 있습니다. 예를 들어

:

다음
mysql > show create table your_table\G 
*************************** 1. row *************************** 
     Table: your_table 
Create Table: CREATE TABLE `your_table` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `col1` varchar(255) DEFAULT NULL, 
    `col2` varchar(255) DEFAULT NULL, 
    ... 
    PRIMARY KEY (`id`), 
    FULLTEXT KEY `fti_idx` (`col1`,`col2`) 
) ENGINE=InnoDB; 
1 row in set (0.00 sec) 

당신이 드롭 단일 ALTER TABLE 문에 인덱스를 추가 할 수 있습니다

alter table your_table 
    drop index fti_idx, 
    add fulltext index fti_idx (col1,col2); 
+0

여기에있는 문제는 내 400Gb SSD가 거의 꽉 차서 많이 기동 할 수 없다는 것입니다. 나는 데이터베이스를 덤프하고 다시 가져올 것이라고 생각한다. 이렇게하면 FT 인덱스를 비롯한 모든 인덱스가 다시 생성되고 일부 공간이 만들어지기를 바랍니다. 나는 그것에 대한 어떤 갱신이라도 있으면 여기에서 돌아갈 것이다. – SAVAFA

+0

전체 테이블을 다시 작성하는 것과는 달리 FULLTEXT 인덱스를 삭제 한 다음 다시 추가하면 이미 사용중인 디스크 공간 이상으로 추가 디스크 공간이 필요하지 않습니다.덤프를 수행하고 다시 가져올 경우 업데이트 및 삭제로 인해 낭비되는 공간을 확보하여 파일을 작게 만들지 만 전체 텍스트 인덱스를 삭제하거나 추가하면 전체 공간을 절약하지는 못합니다. –

+0

전체 데이터베이스의 덤프 가져 오기 프로세스가 실패한 후 FT 인덱스를 다시 정의하기 시작했습니다. 이전 색인을 쉽게 제거했지만 일부 색인 (텍스트 단락이있는 열에있는 색인)을 다시 정의하면 mysql 연결이 'mysql이 사라지는 문제'로 인해 손실됩니다. 나는 phpMyAdmin을 사용하여 이것을하고있다. – SAVAFA

관련 문제