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
하려면 실제로 파일을 삭제해야합니다.
- 수행합니다
mysqldump
모든 데이터베이스, 프로 시저, 트리거 등의 제외mysql
및performance_schema
데이터베이스 - 위의 두 데이터베이스를 제외한 모든 데이터베이스를 삭제하십시오.
- MySQL을 중지
- 삭제
ibdata1
및ib_log
파일 - mysql 시작
- 덤프에서 복원
5 단계에서 MySQL을 시작하면 ibdata1
및 ib_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 단계를 수행 할 수 있습니다.
mysqldump -u [username] -p[root_password] [database_name] >
dumpfilename.sqlDROP DATABASE [database_name];
sudo /etc/init.d/mysqld stop
sudo rm /var/lib/mysql/ibdata1
sudo rm /var/lib/mysql/ib_logfile
(명명 될 수있는 다른 ib_logfile 년대를 삭제ib_logfile0
,ib_logfile1
등 …)sudo /etc/init.d/mysqld start
create database [database_name];
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 등이 파일에 사용 된 공간을 회수하지 않습니다.
좋은 설명과 해결책을 찾을 수 있다고 생각합니다.
답변
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를 설치하십시오
- 사용자 및 데이터베이스 복원