I run mysql container using Docker. I start it with like
sudo docker -d --name mysql -p 3306:3306 -v /var/lib/mysql:/var/lib/mysql mysql_image
I suspect that stopping mysql by stopping docker is not safe. Am I wrong?
sudo docker stop mysql
Is it safer to stop mysql inside of the container first?
sudo docker exec mysql /usr/bin/mysqladmin shutdown
looks safe, from the docs:
The main process inside the container will receive SIGTERM, and after a grace period, SIGKILL.
so if the main process is mysqld, it will have a decent chance to flush everything.
Seems like stopping docker container without shutting down MySQL within creates broken MySQL data volume. So it is necessary to run MySQL shutdown before stopping container in order for MySQL to flush all changes to a disk.
This is a log of starting mysql on volume, created from container, stopped by docker. Pay attention to XA crash recovery step exists.
2021-05-18 06:34:51+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL
Server 8.0.25-1debian10 started.
2021-05-18 06:34:54+00:00 [Note] [Entrypoint]: Switching to dedicated user
'mysql'
2021-05-18 06:34:54+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL
Server 8.0.25-1debian10 started.
2021-05-18T06:34:54.844455Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld
(mysqld 8.0.25) starting as process 1
2021-05-18T06:34:54.887402Z 1 [System] [MY-013576] [InnoDB] InnoDB
initialization has started.
2021-05-18T06:35:00.523370Z 1 [System] [MY-013577] [InnoDB] InnoDB
initialization has ended.
2021-05-18T06:35:11.094092Z 0 [System] [MY-011323] [Server] X Plugin ready for
connections. Bind-address: '::' port: 33060, socket:
/var/run/mysqld/mysqlx.sock
2021-05-18T06:35:11.181732Z 0 [System] [MY-010229] [Server] Starting XA crash
recovery...
2021-05-18T06:35:11.198947Z 0 [System] [MY-010232] [Server] XA crash recovery
finished.
2021-05-18T06:35:11.375917Z 0 [Warning] [MY-010068] [Server] CA certificate
ca.pem is self signed.
2021-05-18T06:35:11.376529Z 0 [System] [MY-013602] [Server] Channel mysql_main
configured to support TLS. Encrypted connections are now supported for this
channel.
2021-05-18T06:35:11.397202Z 0 [Warning] [MY-011810] [Server] Insecure
configuration for --pid-file: Location '/var/run/mysqld' in the path is
accessible to all OS users. Consider choosing a different directory.
2021-05-18T06:35:11.628776Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld:
ready for connections. Version: '8.0.25' socket:
'/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server - GPL.
When using
docker exec tu-live-db /usr/bin/mysqladmin -uroot -proot shutdown
before killing a container, XA crash recovery is not starting and data volume is valid for the next container start with it
2021-05-18 06:36:44+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL
Server 8.0.25-1debian10 started.
2021-05-18 06:36:47+00:00 [Note] [Entrypoint]: Switching to dedicated user
'mysql'
2021-05-18 06:36:47+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL
Server 8.0.25-1debian10 started.
2021-05-18T06:36:48.040045Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld
(mysqld 8.0.25) starting as process 1
2021-05-18T06:36:48.082740Z 1 [System] [MY-013576] [InnoDB] InnoDB
initialization has started.
2021-05-18T06:36:53.426493Z 1 [System] [MY-013577] [InnoDB] InnoDB
initialization has ended.
2021-05-18T06:36:57.611953Z 0 [System] [MY-011323] [Server] X Plugin ready for
connections. Bind-address: '::' port: 33060, socket:
/var/run/mysqld/mysqlx.sock
2021-05-18T06:36:57.827561Z 0 [Warning] [MY-010068] [Server] CA certificate
ca.pem is self signed.
2021-05-18T06:36:57.828060Z 0 [System] [MY-013602] [Server] Channel mysql_main
configured to support TLS. Encrypted connections are now supported for this
channel.
2021-05-18T06:36:57.845291Z 0 [Warning] [MY-011810] [Server] Insecure
configuration for --pid-file: Location '/var/run/mysqld' in the path is
accessible to all OS users. Consider choosing a different directory.
2021-05-18T06:36:58.014550Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld:
ready for connections. Version: '8.0.25' socket:
'/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server - GPL.
you can check the logs from mysql container
docker container logs mysql
to confirm whether the shutdown procedure is safe or not
to see the last line if shows:
[Note] mysqld: Shutdown complete
that should be safe