MySQL数据卷实战:持久化存储秘籍

在容器化场景中,MySQL数据卷通过挂载宿主机目录或命名卷实现数据持久化,解决容器重启导致的数据丢失风险。典型场景包括:

生产环境容器部署:确保业务数据在容器重建后仍可访问。

多实例集群管理:为每个MySQL实例分配独立存储空间。

备份恢复策略:通过物理/逻辑备份实现分钟级RTO。

实战案例:MySQL使用的数据卷

bash 复制代码
[root@ubuntu2404 ~]#docker pull mysql:8.0.29-oracle
[root@ubuntu2404 ~]#docker images mysql*
REPOSITORY   TAG             IMAGE ID       CREATED        SIZE
mysql        8.4.4           78e963ded248   2 months ago   769MB
mysql        8.0.29-oracle   33037edcac9b   2 years ago    444MB
[root@ubuntu2404 ~]#docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:8.0.29-oracle 
[root@ubuntu2404 ~]#docker ps -l
CONTAINER ID   IMAGE                 COMMAND                  CREATED         STATUS         PORTS                                                    NAMES
e8a5762f159d   mysql:8.0.29-oracle   "docker-entrypoint.s..."   4 minutes ago   Up 4 minutes   0.0.0.0:3306->3306/tcp, [::]:3306->3306/tcp, 33060/tcp   mysql
[root@ubuntu2404 ~]#docker exec -it mysql sh
bash-4.4# cat /etc/my.cnf
[mysqld]
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql 				#数据存放路径
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql

pid-file=/var/run/mysqld/mysqld.pid
[client]
socket=/var/run/mysqld/mysqld.sock

!includedir /etc/mysql/conf.d/
[root@ubuntu2404 ~]#mysql -uroot -p123456 -h127.0.0.1
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

mysql> create database dockerdb;
Query OK, 1 row affected (0.01 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| dockerdb           |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

#删除容器后,再创建新的容器,数据库信息丢失
[root@ubuntu2404 ~]#docker rm -f mysql 
mysql
[root@ubuntu2404 ~]#docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:8.0.29-oracle 
5cc6b8de5f20457d43254702594a8215efaba1c735021ecbcb98f16f2d22b04c
[root@ubuntu2404 ~]#mysql -uroot -p123456 -h127.0.0.1
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

#利用数据卷创建容器
[root@ubuntu2404 ~]#mkdir /data/mysql
[root@ubuntu2404 ~]#docker run -d -p 3306:3306 -v /data/mysql/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:8.0.29-oracle 
211483afb8595d414ce5f12ea325b6123e2e235aaebc664368a51e9c5a093d2e
[root@ubuntu2404 ~]#mysql -uroot -p123456 -h127.0.0.1
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

mysql> create database dockerbd;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| dockerbd           |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

#删除容器后,数据存放在挂载数据卷中,不会删除
[root@ubuntu2404 ~]#docker rm -f mysql 
mysql
[root@ubuntu2404 ~]#ls /data/mysql/
 auto.cnf        ca-key.pem        dockerbd             ibdata1      '#innodb_temp'   performance_schema   server-key.pem
 binlog.000001   ca.pem           '#ib_16384_0.dblwr'   ib_logfile0   mysql           private_key.pem      sys
 binlog.000002   client-cert.pem  '#ib_16384_1.dblwr'   ib_logfile1   mysql.ibd       public_key.pem       undo_001
 binlog.index    client-key.pem    ib_buffer_pool       ibtmp1        mysql.sock      server-cert.pem      undo_002
[root@ubuntu2404 ~]#docker run -d -p 3306:3306 -v /data/mysql/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:8.0.29-oracle 
c8610c8e4d24301aa4725b7dc0c1e868c959812d469b9c41149fea41d3ad0cb7
[root@ubuntu2404 ~]#mysql -uroot -p123456 -h127.0.0.1
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| dockerbd           |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

#指定多个数据卷,创建MySQL
[root@ubuntu2404 ~]#docker run -d -p 3306:3306 -v /data/mysql/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wordpress -e MYSQL_PASSWORD=123456 --name mysql mysql:8.0.29-oracle 
[root@ubuntu2404 ~]#docker run --name mysql-test2 -v /root/mysql/:/etc/mysql/conf.d -v /data/mysql2:/var/lib/mysql -e env.list -d -p 3307:3306 mysql:8.0.29-oracle

[root@ubuntu2404 ~]#cat env.list 
MYSQL_ROOT_PASSWORD=123456
MYSQL_DATABASE=wordpress
MYSQL_USER=wordpress
MYSQL_PASSWORD=123456

总结:通过合理配置数据卷、选择适配的持久化方案、结合性能调优与高可用架构,可构建满足企业级要求的MySQL持久化体系。实际部署中需根据业务负载、RTO/RPO要求、存储硬件特性综合选择方案,并通过监控体系持续优化。

相关推荐
瑞克-桑切斯17 分钟前
企业生产环境:https部署+nginx高可用(业务不中断)
linux·服务器·数据库
zyseo89 小时前
谷歌SEO 准首页词挖掘脚本:找出排在第 8-20 名的隐藏流量
大数据·数据库·人工智能
码间留白10 小时前
手把手把 GitHub 推上阿里云 ECS:Actions CI/CD 全链路避坑实录(折腾好几天,到 2 分钟见绿)
运维·阿里云·ci/cd·docker·devops·github actions
Vex2une10 小时前
Docker Desktop WSL2后端:2026年性能调优与避坑实战指南
windows·docker·desktop·gpu容器·容器开发·virtiofs·buildkit
xiaogai_gai10 小时前
仅查询策略实战:从金蝶云·星空旗舰版定时拉取收料通知单
大数据·数据库·python
数据工匠老o11 小时前
异构数据库DDL同步:260条链路的结构变更自动适配方案
数据库·架构
L00111 小时前
MySQL5.7 DATE 字段无法设置默认日期?用触发器搞定|个人任务清单项目实战
mysql
程序员老赵11 小时前
Docker 部署青龙面板:轻松搭建定时任务管理平台
前端·docker·开源
TTATTC11 小时前
为什么单会话聊天做不好复杂工程?Claude Code 创作者的并发 Worktree 与记忆闭环实践
docker·开源
TTATTC11 小时前
状态机驱动长事务,还是 DAG 编排高并发?高可靠业务流程引擎的双核架构设计
docker·开源