So just some background. I needed to update a MySQL 5.7 DB to 8.0 in Docker. But I kept receiving the dreaded error below:
2025-07-11T07:39:47.498269Z 1 \[ERROR\] \[MY-012526\] \[InnoDB\] Upgrade is not supported after a crash or shutdown with innodb_fast_shutdown = 2. This redo log was created with MySQL 5.7.33, and it appears logically non empty. Please follow the instructions at http://dev.mysql.com/doc/refman/8.0/en/upgrading.html
2025-07-11T07:39:47.498314Z 1 \[ERROR\] \[MY-012930\] \[InnoDB\] Plugin initialization aborted with error Generic error.
2025-07-11T07:39:47.912827Z 1 \[ERROR\] \[MY-011013\] \[Server\] Failed to initialize DD Storage Engine.
2025-07-11T07:39:47.913225Z 0 \[ERROR\] \[MY-010020\] \[Server\] Data Dictionary initialization failed.
2025-07-11T07:39:47.913276Z 0 \[ERROR\] \[MY-010119\] \[Server\] Aborting
2025-07-11T07:39:47.914128Z 0 \[System\] \[MY-010910\] \[Server\] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.32) MySQL Community Server - GPL.
So how did I solve it:
I CANNOT EMPHASIZE HOW IMPORTANT IT IS TO GET A BACKUP THAT YOU CAN MOVE SOMEWHERE ELSE (another physical server with Docker) YOU CAN FREELY WORK WITH IT. I take a FULL copy at the slowest time of the DB (2:00am)
docker cp ACME_PRODUCTION_DOCKER_CONTAINER_NAME:/var/lib/mysql/ /tmp/acmeproddbs_mysql/
zip -q -r "/tmp/var_lib_mysql_Folder_2025-07-11.zip" /tmp/acmeproddbs_mysql/mysql/\*
!!! YOU ARE NOW ON YOUR TEST SERVER !!!
$ docker rm -f ACME_DOCKER_CONTAINER_NAME [[BE-CAREFUL TRIPLE VERIFY YOU HAVE A VALID BACKUP!]]
$ rm -r /var/lib/mysql_acme_dbs/ [[BE-CAREFUL SEE NOTE ABOVE ABOUT TRIPLE CHECKING YOUR BACKUP IS VALID]]
$ cat /etc/group | grep mysql [[IS THE mysql GROUP ALREADY EXISITNFG?]]
$ groupadd -r mysql && useradd -r -g mysql mysql [[RUN_IF_NEEDED]]
$ unzip /tmp/var_lib_mysql_Folder_2025-07-11.zip -d /var/lib/mysql_acme_dbs
$ chmod -R 777 /var/lib/mysql_acme_dbs [[MY_FRUSTRATION (ON MY SYSTEM) GOT THE BEST OF ME :( ]]
$ chown -R mysql:mysql /var/lib/mysql_acme_dbs
$ docker run [COMMAND_BELOW]
### NOT NEEDED BUT IT WILL SHOW YOU WHAT NEEDS TO HAPPEN BEFORE UPGRADE, SHOULD IT BE NEEDED.
$ docker exec -it ACME_DOCKER_CONTAINER_NAME bash
bash-4.2# mysqlsh
MySQL JS > \connect root@localhost:3306
Please provide the password for 'root@localhost:3306': MYSQL_PASSWORD
MySQL JS > util.checkForServerUpgrade()
[[REPORT AFTER CHECK IS SHOWN HERE]]
MySQL JS > \quit
###
$ docker exec -it ACME_DOCKER_CONTAINER_NAME mysql_upgrade -uroot -pMYSQL_PASSWORD
$ docker stop ACME_DOCKER_CONTAINER_NAME [[IMPORTANT YOU USE "stop" AND NOT "rm -f" SO IT WILL GRACEFULLY SHUTDOWN AND YOU WONT GET THE ERROR MESSAGE]]
$ docker rm ACME_DOCKER_CONTAINER_NAME
$ docker run [["docker run..." COMMAND_BELOW BUT THIS TIME WITH "-d mysql/mysql-server:8.0"]]
docker run -p 3306:3306 \
--name=ACME_DOCKER_CONTAINER_NAME \
--mount type=bind,src=/var/lib/mysql_acme_dbs,dst=/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=MYSQL_PASSWORD \
-d mysql/mysql-server:5.7 \
mysqld \
--lower_case_table_names=1 \
--max_connections=3001 \
--max_allowed_packet=128M \
--innodb_buffer_pool_size=128M \
--innodb_fast_shutdown=1 \
--host_cache_size=0
AT THE END YOU SHOULD SEE "MySQL 8.0"
$ docker exec -it ACME_DOCKER_CONTAINER_NAME mysql -uroot -pMYSQL_PASSWORD -v
HOPE THIS HELPS SOMEONE! Please write back here so others can use this with confidence. Ofcourse nothing here is written in stone, so change parameters to your needs. I am just pointing out the process to how I got it to work.