MariaDB column_stats 테이블 오류 해결 방법

MariaDB 로그에 다음과 같은 오류가 반복적으로 발생했습니다:

[ERROR] Incorrect definition of table mysql.column_stats: 
expected column 'histogram' at position 10 to have type varbinary(255), 
found type longblob.

여러 스레드 ID에서 동일한 오류가 계속 발생하며, 데이터베이스 성능에 영향을 줄 수 있는 상황이었습니다.


오류 발생 원인

이 오류는 시스템 테이블의 스키마 불일치로 인해 발생합니다. 주요 원인은 다음과 같습니다:

1. MariaDB 버전 업그레이드

  • 이전 버전에서 새 버전으로 업그레이드 시 시스템 테이블 구조가 변경됨
  • 업그레이드 후 mysql_upgrade를 실행하지 않은 경우

2. 데이터베이스 마이그레이션

  • 다른 버전의 MariaDB에서 덤프한 데이터를 복원한 경우
  • 서로 다른 버전 간 시스템 테이블 구조 차이

3. 수동 복원 작업

  • 백업 파일에 포함된 시스템 테이블이 현재 버전과 호환되지 않는 경우

column_stats 테이블이란?

mysql.column_stats는 MariaDB의 통계 정보 저장 테이블입니다:

  • 테이블 컬럼의 통계 데이터 저장
  • 쿼리 옵티마이저가 실행 계획 수립 시 사용
  • histogram 컬럼: 데이터 분포 정보를 저장하는 중요한 필드

MariaDB는 특정 버전부터 histogram 컬럼 타입을 longblob에서 varbinary(255)로 변경했으며, 이로 인해 호환성 문제가 발생할 수 있습니다.


해결 방법

방법 1: mysql_upgrade 사용 (권장)

가장 안전하고 포괄적인 방법입니다.

# MariaDB 업그레이드 도구 실행
sudo mysql_upgrade --force -u root -p

# MariaDB 재시작
sudo systemctl restart mariadb

장점:

  • 모든 시스템 테이블을 자동으로 검사 및 수정
  • column_stats 외 다른 호환성 문제도 함께 해결
  • 공식적으로 권장되는 방법

방법 2: 수동 테이블 수정

특정 테이블만 빠르게 수정하고 싶을 때 사용합니다.

# MariaDB 접속
sudo mysql
-- mysql 데이터베이스 선택
USE mysql;

-- histogram 컬럼 타입 변경
ALTER TABLE column_stats 
MODIFY COLUMN histogram varbinary(255);

-- 권한 테이블 새로고침
FLUSH PRIVILEGES;

-- 종료
EXIT;
# MariaDB 재시작
sudo systemctl restart mariadb

장점:

  • 빠른 실행
  • 특정 문제만 해결 가능

단점:

  • 다른 시스템 테이블 문제는 해결되지 않음

문제 해결 확인

수정 후 다음 명령어로 오류가 해결되었는지 확인합니다:

1. 로그 실시간 모니터링:

sudo journalctl -u mariadb -f

2. 최근 로그 확인:

sudo journalctl -u mariadb --since today

3. 테이블 정상 작동 확인:

sudo mysql -e "DESCRIBE mysql.column_stats;"

histogram 컬럼이 varbinary(255)로 표시되면 정상입니다.


root 계정 접근 오류 해결

만약 다음과 같은 오류가 발생한다면:

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

해결책:

# 비밀번호와 함께 실행
sudo mysql_upgrade --force -u root -p

# 또는 sudo로 직접 MySQL 접속
sudo mysql

AlmaLinux에서는 sudo mysql 명령으로 root 권한으로 직접 접속할 수 있습니다.


예방 조치

향후 동일한 문제를 방지하기 위한 모범 사례:

1. 업그레이드 후 필수 작업

sudo mysql_upgrade --force -u root -p
sudo systemctl restart mariadb

2. 백업 습관

# 전체 데이터베이스 백업
sudo mysqldump --all-databases > /backup/mariadb_$(date +%Y%m%d).sql

# 시스템 테이블만 백업
sudo mysqldump mysql > /backup/mysql_system_$(date +%Y%m%d).sql

3. 버전 확인

# MariaDB 버전 확인
mysql --version

4. 정기적인 로그 모니터링

# cron으로 매일 로그 확인 자동화
echo "0 9 * * * journalctl -u mariadb --since '1 day ago' | grep ERROR" | crontab -

결론

mysql.column_stats 테이블 오류는 MariaDB 버전 간 스키마 불일치로 인해 발생하며, mysql_upgrade 명령어로 간단히 해결할 수 있습니다.

핵심 포인트:

  • MariaDB 업그레이드 후 반드시 mysql_upgrade 실행
  • 정기적인 백업으로 안전성 확보
  • 로그 모니터링으로 조기 발견

이러한 관리 습관을 통해 데이터베이스를 안정적으로 운영할 수 있습니다.

Comments

Tips & Tech

Dev tips VSCode 한국어 설정법, Configure Display Language로 U…
Dev tips Apache Access Log 기반 도메인별 방문자 카운터 구현
Dev tips 네이버 검색 Open API
Dev tips 네이버 검색광고 키워드 도구 API 검색
Views Dev tips MariaDB column_stats 테이블 오류 해결 방법
Dev tips PHP-FPM 에러 로그 실시간 모니터링
Dev tips 다국어 번역 함수 구현 방법
Dev tips 애드센스 충돌 문제 해결하기
Dev tips 애드센스 자동 광고 사용 시 빈 화면이 출력된다면?
Dev tips 검색 로봇 접속시 종료
Dev tips REQUEST 값 받기(application/json 포함)
Dev tips Porto 테마에서 포스팅만 Loading Overlay
Dev tips 업데이트 이후 에러 발생([ERROR] Incorrect definition…
Dev tips MySQL, MariaDB 업데이트
Dev tips [RN] android directory was detected in the project.
Dev tips [부트스트랩] nav 에서 하위 항목 활성화 시 부모 항목 …
Dev tips Curl 접속 속도가 늦은 경우
Dev tips unblock with 'mysqladmin flush-hosts' 에러
Dev tips [ReactNative] 캐시 초기화 하는 방법
Dev tips Imagek 를 이용한 썸네일 생성
Dev tips 파일 포맷 알아내기
Dev tips PHP 수정시 적용이 안되는 경우 해결 (opcache 중지)
Dev tips [Ruby] 윈도우에서 pod install 실행시 UTF-8 오류
Dev tips [Ruby] Could not open library 'libcurl'
Dev tips [Android] Error type 3: Activity class {com.?.MainAc…
Dev tips WinDivert 오류코드
Dev tips Curl 을 이용하여 파일 다운로드
Dev tips Curl 을 이용하여 json 을 post 보내기
Dev tips 워드프레스와 그누보드 연동 모듈
Dev tips 날짜필드 연장하기