디스크 사용량이 많은 문제

이 페이지에서는 알려진 높은 디스크 사용량 문제를 설명하고 문제 해결 도움말을 제공합니다.

알려진 높은 디스크 사용량 문제는 다음과 같습니다.

  • MySQL 8.0 이상에서 Temporary_files 파일의 사용량이 많습니다.
  • MySQL 8.0 이하에서 Others 파일의 사용량이 많습니다.

임시 파일 소비는 MySQL 8.0 이전 버전의 tmp_data 파일로 분류됩니다.

MySQL 스토리지 분류 측정항목

세부 디스크 사용량을 모니터링하는 데 사용되는 기본 측정항목은 cloudsql.googleapis.com/database/disk/bytes_used_by_data_type입니다. 이 측정항목은 데이터 유형별 인스턴스 디스크 사용량을 다음과 같이 분류합니다.

데이터 유형 정의
Binlog PITR(point-in-time recovery) 및 복제에 필수적인 MySQL 바이너리 로그에서 사용되는 스토리지입니다.
Cloudsql_mysql_audit_log Cloud SQL MySQL 감사 로그에서 사용되는 스토리지입니다.
Data 기본 InnoDB 테이블스페이스 (.ibd 파일) 및 시스템 테이블스페이스 (ibdata1)를 포함합니다.
General_log 일반 쿼리 로그에서 사용되는 스토리지입니다.
General_tablespace ibdata* 파일로 구성된 InnoDB 시스템 테이블스페이스에서 사용되는 스토리지입니다.
Last_sys_tablespace 최신 테이블스페이스에서 사용되는 스토리지입니다.
Others 내부 시스템 파일을 포함합니다.
Redo_log 비정상 종료 복구에 사용되는 InnoDB 재실행 로그에서 소비되는 스토리지입니다.
Relaylog 복제 중에 복제본 인스턴스의 릴레이 로그에서 사용되는 스토리지입니다.
Slow_log 느린 쿼리 로그가 사용 설정되어 디스크에 저장된 경우 느린 쿼리 로그에서 사용되는 스토리지입니다.
Temporary files MySQL에서 만든 임시 파일의 명시적으로 추적된 스토리지입니다.
Temporary_space /tmp 디렉터리의 운영체제 임시 파일에서 사용되는 스토리지입니다.
Tmp_data 정렬 및 조인과 같은 작업 중에 MySQL에서 만든 임시 데이터입니다.
Undo_log 실행취소 로그에서 사용되는 스토리지입니다.

Temporary_filesOthers 카테고리에서 파일 찾기

장기 실행 쿼리 (예: 복잡한 JOIN, ORDER BY 또는 GROUP BY 작업)는 MySQL 디렉터리에 대용량 임시 파일을 만듭니다.

2026년 4월부터 출시된 유지보수 버전을 사용하는 MySQL 인스턴스의 경우 이러한 임시 파일은 Temporary_files 카테고리에 명시적으로 보고됩니다.

이전 버전에서는 임시 파일이 Others 카테고리에 보고됩니다.

Google Cloud

높은 디스크 사용량 문제 해결

대용량 임시 파일로 인해 발생하는 높은 디스크 사용량 문제를 해결하려면 다음 단계를 따르세요.

  1. 활성 장기 실행 쿼리를 식별합니다.
  2. 즉각적인 완화.
  3. 쿼리 통계를 사용합니다.
  4. 소급적 분석을 수행합니다.
  5. 쿼리를 최적화합니다.
  6. 모니터링 및 알림을 설정합니다.

활성 장기 실행 쿼리 식별

높은 디스크 사용량 문제는 장기 실행 쿼리 (예: 복잡한 JOIN, ORDER BY 또는 GROUP BY 작업)가 MySQL 디렉터리에 대용량 임시 파일을 만들어 발생하는 경우가 가장 많습니다. 이러한 임시 파일은 Temporary_files 또는 Others 카테고리로 분류됩니다.

새 유지보수 버전 (r20260320.00_00 버전 이상)이 있는 MySQL 인스턴스에는 장기 실행 쿼리로 생성되고 MySQL에서 연결 해제된 임시 파일 (즉, 파일은 존재하지만 MySQL 프로세스에 연결되지 않음)을 보여주는 INFORMATION_SCHEMA.CLOUDSQL_OPEN_TEMP_FILES 테이블이 있습니다.

다음 쿼리를 사용하여 활성 장기 실행 쿼리를 가져옵니다.

SELECT
otf.fd, otf.size, p.id, p.info, p.user
FROM
 INFORMATION_SCHEMA.CLOUDSQL_OPEN_TEMP_FILES otf
LEFT JOIN
performance_schema.processlist p
ON
otf.SESSION_ID = p.ID;

샘플 출력:

+----+------------+------+----------------------------------+------+
| fd | size       | id   | info                             | user |
+----+------------+------+----------------------------------+------+
| 39 | 1670750208 |    8 | select * from t1 order by rand() | root |
| 40 | 1670750208 |    8 | select * from t1 order by rand() | root |
+----+------------+------+----------------------------------+------+
2 rows in set (0.00 sec)

유지보수 버전 r20260320.00_00 이하의 인스턴스의 경우 다음 쿼리를 사용하여 활성 장기 실행 쿼리를 가져옵니다.

SHOW FULL PROCESSLIST;

출력에서 디스크 임시 파일을 일반적으로 사용하는 작업을 찾습니다.

  • 대규모 JOIN 작업(특히 적절한 색인이 없는 경우)
  • 대규모 결과 집합에 대한 복잡한 ORDER BY 또는 GROUP BY 작업
  • 대규모 ALTER TABLE 작업

즉각적인 완화

조사에서 실행 중인 쿼리가 디스크 소비의 원인으로 확인되면 이를 종료하여 연결된 임시 파일 공간을 해제할 수 있습니다.

쿼리를 종료하려면 다음 명령어를 실행합니다.

KILL PROCESS_ID;

PROCESS_ID를 쿼리의 프로세스 ID로 바꿉니다.

  • 유지보수 버전 r20260320 이상에서는 PROCESS_ID 값을 SESSION_ID 열을 통해 INFORMATION_SCHEMA.CLOUDSQL_OPEN_TEMP_FILES 테이블에서 검색할 수 있습니다.

  • 이전 버전 (r20260117 버전 이하)의 경우 PROCESS_ID 값을 SHOW FULL PROCESSLIST 작업의 출력에서 검색할 수 있습니다.

임시 파일을 통해 디스크 소비를 늘리는 쿼리가 종료된 후 이러한 변경사항이 디스크 사용량 측정항목 내에 등록되기까지 최대 5분 정도 걸릴 수 있습니다.

쿼리 통계 사용

쿼리 통계를 사용하여 성능이 느린 쿼리를 식별하고 개선하는 것이 좋습니다.

자세한 내용은 쿼리 통계를 사용하여 쿼리 성능 향상을 참조하세요.

소급적 분석 수행

사용량 급증이 가라앉으면 다음을 사용하여 이전 데이터를 분석하여 원인을 파악할 수 있습니다.

  • 쿼리 통계. 대용량 임시 파일을 만들었을 수 있는 쿼리를 확인합니다. 쿼리 다이제스트에 나열된 쿼리 (평균 실행 시간, 쿼리 수, 스캔 후 반환된 평균 행 수 등의 측정항목 포함)를 검사합니다.

  • Slow_log. Slow_log를 사용 설정하고 long_query_time을 적절한 기준점으로 설정합니다. 이 로그는 분석 및 최적화를 위해 장기 실행 쿼리를 캡처합니다.

  • General_log. General_log (사용 설정된 경우)에서 대용량 임시 파일을 생성했을 수 있는 JOIN 또는 SORT 작업이 있는 사고 기간에 로깅된 쿼리를 확인합니다. 또는 General_log를 사용 설정하고 다음 이벤트에서 쿼리를 캡처할 수 있습니다.

  • Cloud Monitoring 측정항목. 다음 측정항목을 검토합니다.

    • cloudsql.googleapis.com/database/mysql/tmp_disk_tables_created_count: 디스크에 생성된 임시 테이블 수를 추적합니다. 이는 연결 해제된 대용량 파일의 원인인 경우가 많습니다.
    • cloudsql.googleapis.com/database/mysql/handler_operations_count: 해당 시간 전후로 작업 수 증가를 추적합니다.
    • cloudsql.googleapis.com/database/mysql/innodb/active_trx_total_time: 장기간 활성 상태인 트랜잭션을 추적합니다.

    디스크 사용량 급증과 동시에 이러한 측정항목이 증가하면 대용량 임시 테이블을 생성하는 쿼리가 근본 원인임을 강력하게 시사합니다.

  • 거래 내역. 다음 측정항목을 검토합니다.

    • cloudsql.googleapis.com/database/mysql/innodb/history_list_length metric: 실행취소 로그 삭제를 차단하는 장기 실행 트랜잭션으로 인해 기록 목록 길이가 길어질 수 있으며, 이는 디스크 사용량 문제의 원인이 될 수도 있습니다.
    • cloudsql.googleapis.com/database/mysql/innodb/active_trx_longest_time: 디스크 사용량이 많은 기간의 장기 실행 트랜잭션입니다.

쿼리 최적화

로그 분석을 통해 측정항목 급증을 일으키는 특정 쿼리를 파악한 후에는 광범위한 임시 파일 생성을 최소화하도록 쿼리를 최적화하거나 다시 작성할 수 있습니다.

쿼리를 최적화하려면 다음을 수행하면 됩니다.

  • 적절한 색인을 추가합니다.
  • 복잡한 조인 또는 정렬 작업을 리팩터링합니다.

자세한 내용은 쿼리 조정하기를 참조하세요.

모니터링 및 알림 설정

제어되지 않은 디스크 사용량, 특히 장기 실행 쿼리에서 생성된 임시 파일로 인해 발생하는 향후 인시던트를 방지하려면 Monitoring을 사용하여 사전 예방적 모니터링 및 알림을 구현하세요.

리소스 소비량이 많은 측정항목 또는 대용량 임시 파일을 생성하는 것으로 알려진 쿼리 패턴에 대한 알림을 만들 수 있습니다.

측정항목 이름 설명 권장 알림 기준점
cloudsql.googleapis.com/database/disk/utilization 할당된 디스크 공간의 사용된 비율입니다.

이 측정항목은 전반적인 디스크 용량 사용량을 모니터링합니다.

80% 초과(5분 이상 지속)
cloudsql.googleapis.com/database/disk/bytes_used 데이터베이스 인스턴스에서 사용한 총 디스크 공간(바이트)입니다.

이 측정항목은 절대 디스크 소비 증가를 추적합니다.

database/disk/quota 측정항목에 대해 모니터링합니다.

Cloud SQL 측정항목에 대한 알림 및 모니터링을 설정하는 방법을 알아보려면 알림 개요Cloud SQL 인스턴스 모니터링을 참조하세요.