반응형
문제
기존 MySQL 데이터를 복원하는 과정에서 컨테이너가 무한 재시작을 하길래 에러 로그를 확인해보았다.
[ERROR] [MY-014061] [InnoDB] Invalid MySQL server downgrade: Cannot downgrade from 80300 to 80200. Downgrade is only permitted between patch releases.
데이터 복원 작업을 위해 mysql:latest 태그가 붙은 이미지를 불러와서 docker volume 에 저장 후 그 볼륨을 기존에 사용하던 MySQL 이미지에 마운트하는 방식인데
태그가 latest 이다보니 그 사이 업데이트가 되어 버전이 맞지 않는듯 했다.
해결
태그명이 latest 로 되어 있기 때문에 정확한 버전을 알 수가 없다.
docker inspect 로 현재 실행 중인 MySQL 의 정보를 알아내야 한다.
docker inspect docker_이미지명
config > MYSQL_VERSION 에 해당 이미지의 MySQL 버전이 있다.
필자 같은 경우는 MYSQL_VERSION=8.2.0-1.el8 로 되어 있어서 8.2.0 버전으로 진행하면 되지 않을까 싶다.
MySQL 데이터 복원 스크립트
#!/bin/bash
echo "***** Executing restore_data.sh *****"
# .env 파일 로드
echo "Loading .env... [1/8]"
ENV_FILE="$HOME/.env"
if [ -f "$ENV_FILE" ]; then
export $(cat "$ENV_FILE" | xargs)
echo "$ENV_FILE exported"
else
echo "Cannot find $ENV_FILE"
exit 1
fi
# Docker 볼륨 생성
echo "Creating Docker volume... [2/8]"
docker volume create ${MYSQL_VOLUME}
# MySQL pull
echo "Pulling MySQL image... [3/8]"
docker pull mysql
# restore 용 MySQL 환경변수 재설정
MYSQL_IMAGE_NAME="mysql:latest"
MYSQL_DATABASE_PASSWORD=1234
MYSQL_CONTAINER_NAME="restore_container"
MYSQL_DATABASE="${MYSQL_DATABASE}"
# MySQL 실행
echo "Running MySQL container... [4/8]"
docker run --name $MYSQL_CONTAINER_NAME -v $MYSQL_DATA_PATH:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=$MYSQL_DATABASE_PASSWORD -d $MYSQL_IMAGE_NAME
# 백업 파일 복사
# echo "Copying backup file to the container... [5/8]"
# docker cp /home/$TARGET_SERVER_USERNAME/backup/backup.sql $MYSQL_CONTAINER_NAME:/var/lib/mysql/backup.sql
echo "Sleeping for 10 seconds..."
sleep 10
# MySQL에 접속하여 백업 데이터 복원
echo "Restoring data from backup... [6/8]"
docker exec -i $MYSQL_CONTAINER_NAME mysql -u root -p$MYSQL_DATABASE_PASSWORD <<< "CREATE DATABASE IF NOT EXISTS $MYSQL_DATABASE DEFAULT CHARACTER SET UTF8; USE $MYSQL_DATABASE;"
docker exec -i $MYSQL_CONTAINER_NAME mysql -u root -p$MYSQL_DATABASE_PASSWORD --database=$MYSQL_DATABASE < /home/$TARGET_SERVER_USERNAME/backup/backup.sql
# MySQL 컨테이너 중지 / 삭제
echo "Stopping and deleting MySQL container... [7/8]"
docker stop $MYSQL_CONTAINER_NAME
docker rm $MYSQL_CONTAINER_NAME
# MySQL 이미지 삭제
echo "Deleting MySQL image... [8/8]"
docker rmi $MYSQL_IMAGE_NAME
echo "***** restore_data.sh Ended *****"
docker pull mysql 부분에 태그명 :8.2.0 를 추가하여 pull 해서 스크립트를 실행하면
더이상 재시작 되지 않고 로그에도 에러를 발견되지 않는다.
반응형
'개발 ━━━━━ > Troubleshoot' 카테고리의 다른 글
[Ubuntu] '/swapfile': Text file busy (0) | 2024.09.24 |
---|---|
[Electron] APPIMAGE env is not defined, current application is not an AppImage (0) | 2024.09.24 |
[Nginx] default.conf 에 환경변수 적용하기 (0) | 2024.03.02 |
[Redis] NOAUTH Authentication required (0) | 2024.01.10 |
[Docker] Spring + MySQL + AWS EC2 + Github Actions + Docker 를 활용한 프로젝트 진행하면서 발생했던 각종 오류들 (1) | 2024.01.08 |