[mysql] MySQL에서 ibdata1 파일을 축소 / 제거하는 방법

localhost에서 MySQL을 R에서 통계를 수행하기위한 “쿼리 도구”로 사용하고 있습니다. 즉, R 스크립트를 실행할 때마다 새 데이터베이스 (A)를 만들고 새 테이블 (B)을 만들고 데이터를 B로 가져옵니다. , 필요한 것을 얻기 위해 쿼리를 제출 한 다음 B를 삭제하고 A를 삭제합니다.

그것은 잘 작동하지만 ibdata 파일 크기가 빠르게 증가하고 MySQL에 아무것도 저장하지 않았지만 ibdata1 파일이 이미 100MB를 초과했습니다.

설치에 기본 MySQL 설정을 사용하고 있습니다. 일정 시간이 지나면 ibdata1 파일을 자동으로 축소 / 지우는 방법이 있습니까?



답변

즉, ibdata1축소되지는 MySQL을의 특히 짜증나는 기능입니다. ibdata1파일은 실제로 당신이 모든 데이터베이스를 삭제 파일을 제거하고 덤프를 다시로드하지 않는 한 축소 할 수 없습니다.

그러나 인덱스를 포함한 각 테이블이 별도의 파일로 저장되도록 MySQL을 구성 할 수 있습니다. 그렇게하면 ibdata1커지지 않을 것입니다. Bill Karwin의 의견 에 따르면 이것은 MySQL 5.6.6 버전에서 기본적으로 활성화되어 있습니다.

얼마 전에 나는 이것을했다. 그러나 각 테이블에 대해 별도의 파일을 사용하도록 서버를 설정 my.cnf하려면이를 활성화하기 위해 변경해야합니다 .

[mysqld]
innodb_file_per_table=1

http://dev.mysql.com/doc/refman/5.5/en/innodb-multiple-tablespaces.html

공간을 확보 ibdata1하려면 실제로 파일을 삭제해야합니다.

  1. 수행합니다 mysqldump모든 데이터베이스, 프로 시저, 트리거 등의 제외 mysqlperformance_schema데이터베이스
  2. 위의 두 데이터베이스를 제외한 모든 데이터베이스를 삭제하십시오.
  3. MySQL을 중지
  4. 삭제 ibdata1ib_log파일
  5. mysql 시작
  6. 덤프에서 복원

5 단계에서 MySQL을 시작하면 ibdata1ib_log파일이 다시 생성됩니다.

이제 당신은 갈 수 있습니다. 분석 할 새 데이터베이스를 작성하면 테이블 ibd*이에있는 파일이 아닌 별도의 파일에 ibdata1있습니다. 보통 곧 데이터베이스를 ibd*삭제 하면 파일이 삭제됩니다.

http://dev.mysql.com/doc/refman/5.1/en/drop-database.html

아마 이것을 보았을 것입니다 :
http://bugs.mysql.com/bug.php?id=1341

명령을 사용 ALTER TABLE <tablename> ENGINE=innodb하거나 OPTIMIZE TABLE <tablename>ibdata1에서 데이터 및 색인 페이지를 추출하여 파일을 분리 할 수 ​​있습니다. 그러나 위의 단계를 수행하지 않으면 ibdata1이 축소되지 않습니다.

에 관해서는 information_schema, 그것은 떨어질 필요가 없습니다. 실제로는 테이블이 아니라 읽기 전용 뷰입니다. 그리고 데이터베이스 디렉토리조차도 그들과 관련된 파일이 없습니다. (가) informations_schema메모리 DB 엔진을 사용하고 떨어 정지에 재생됩니다 / mysqld에의 다시 시작합니다. https://dev.mysql.com/doc/refman/5.7/en/information-schema.html을 참조 하십시오 .


답변

에 추가 존 P의 대답은 ,

Linux 시스템의 경우 다음 명령으로 1-6 단계를 수행 할 수 있습니다.

  1. mysqldump -u [username] -p[root_password] [database_name] >
    dumpfilename.sql
  2. DROP DATABASE [database_name];
  3. sudo /etc/init.d/mysqld stop
  4. sudo rm /var/lib/mysql/ibdata1
    sudo rm /var/lib/mysql/ib_logfile
    (명명 될 수있는 다른 ib_logfile 년대를 삭제 ib_logfile0, ib_logfile1등 …)
  5. sudo /etc/init.d/mysqld start
  6. create database [database_name];
  7. mysql -u [username]-p[root_password] [database_name] < dumpfilename.sql

경고 :이 지침은이 mysql 인스턴스에 다른 데이터베이스가있는 경우 다른 데이터베이스를 잃을 수 있습니다. 보관하려는 모든 데이터베이스를 포함하도록 1, 2 및 6,7 단계를 수정하십시오.


답변

innodb 테이블을 삭제하면 MySQL은 ibdata 파일 내부의 공간을 비우지 않으므로 계속 커집니다. 이 파일들은 거의 줄어들지 않습니다.

기존 ibdata 파일을 축소하는 방법 :

http://dev.mysql.com/doc/refman/5.5/en/innodb-resize-system-tablespace.html

이를 스크립팅하고 일정 시간 후에 스크립트가 실행되도록 예약 할 수 있지만 위에서 설명한 설정의 경우 여러 테이블 스페이스가 더 쉬운 솔루션 인 것 같습니다.

구성 옵션을 사용하면 innodb_file_per_table여러 테이블 스페이스를 작성합니다. 즉, MySQL은 하나의 공유 파일 대신 각 테이블에 대해 별도의 파일을 만듭니다. 이러한 별도의 파일은 데이터베이스의 디렉토리에 저장되며이 데이터베이스를 삭제할 때 삭제됩니다. 이 경우 귀하의 경우 ibdata 파일을 축소 / 제거 할 필요가 없습니다.

다중 테이블 스페이스에 대한 추가 정보 :

http://dev.mysql.com/doc/refman/5.5/en/innodb-multiple-tablespaces.html


답변

MySQL 테이블 (일부)에 InnoDB 스토리지 엔진을 사용하는 경우 이미 기본 구성에 문제가있는 것 같습니다. MySQL의 데이터 디렉토리 (Debian / Ubuntu – / var / lib / mysql에 있음)에서 알 수 있듯이 ‘ibdata1’이라는 파일이 있습니다. MySQL 인스턴스의 거의 모든 InnoDB 데이터 (트랜잭션 로그가 아님)를 보유하며 상당히 커질 수 있습니다. 기본적으로이 파일의 초기 크기는 10Mb이며 자동으로 확장됩니다. 불행히도 InnoDB 데이터 파일은 의도적으로 축소 할 수 없습니다. 그렇기 때문에 DELETE, TRUNCATE, DROP 등이 파일에 사용 된 공간을 회수하지 않습니다.

좋은 설명과 해결책을 찾을 수 있다고 생각합니다.

http://vdachev.net/2007/02/22/mysql-reducing-ibdata1/


답변

bash에서 허용 된 답변의 절차를 신속하게 스크립팅했습니다.

#!/usr/bin/env bash
DATABASES="$(mysql -e 'show databases \G' | grep "^Database" | grep -v '^Database: mysql$\|^Database: binlog$\|^Database: performance_schema\|^Database: information_schema' | sed 's/^Database: //g')"
mysqldump --databases $DATABASES -r alldatabases.sql && echo "$DATABASES" | while read -r DB; do
    mysql -e "drop database \`$DB\`"
done && \
    /etc/init.d/mysql stop && \
    find /var/lib/mysql -maxdepth 1 -type f \( -name 'ibdata1' -or -name 'ib_logfile*' \) -delete && \
    /etc/init.d/mysql start && \
    mysql < alldatabases.sql && \
    rm -f alldatabases.sql

다른 이름으로 저장 purge_binlogs.sh하고 실행 하십시오 root.

제외 mysql, information_schema, performance_schema(및 binlog디렉토리).

관리자 자격 증명이 /root/.my.cnf있고 데이터베이스가 기본 /var/lib/mysql디렉토리 에 있다고 가정합니다 .

이 스크립트를 실행 한 후 이진 로그를 제거하여 다음과 같은 추가 디스크 공간을 확보 할 수도 있습니다.

PURGE BINARY LOGS BEFORE CURRENT_TIMESTAMP;


답변

MySQL 여유 공간을 모니터링하는 것이 목표이고 MySQL이 ibdata 파일을 축소하는 것을 막을 수 없다면 테이블 상태 명령을 통해 가져 오십시오. 예:

MySQL> 5.1.24 :

mysqlshow --status myInnodbDatabase myTable | awk '{print $20}'

MySQL <5.1.24 :

mysqlshow --status myInnodbDatabase myTable | awk '{print $35}'

그런 다음이 값을 ibdata 파일과 비교하십시오.

du -b ibdata1

출처 : http://dev.mysql.com/doc/refman/5.1/en/show-table-status.html


답변

mysql-server 레시피의 새로운 버전에서는 위의 “mysql”데이터베이스가 손상 될 것이다. 이전 버전에서는 작동합니다. 새로운 일부 테이블에서는 INNODB 테이블 유형으로 전환되며 그렇게하면 테이블이 손상됩니다. 가장 쉬운 방법은 다음과 같습니다.

  • 모든 데이터베이스를 덤프
  • mysql-server를 제거하고
  • 남아있는 my.cnf에 추가하십시오 :
    [mysqld]
    innodb_file_per_table=1
  • / var / lib / mysql에서 모두 지우기
  • mysql-server를 설치하십시오
  • 사용자 및 데이터베이스 복원