docker mysql8.0.26 迁移 mysql8.3.0

本文介绍了如何在面临CVE漏洞的情况下,升级MySQL8.0.26到8.3.0,并详细描述了docker-compose的配置、安全设置,以及如何进行容器内的MySQL备份和恢复操作。

背景

mysql8.0.26 存在CVE-2021-3711、CVE-2022-32221漏洞,姑升级到mysql8.3.0

镜像准备

sudo  docker save -o mysql830.tar mysql:8.3.0

sudo docker load -i mysql830.tar

docker-compose

命令 docker-compose up -d (约定优于配置 默认当前目录下 docker-compose.yml)

docker-compose.yml配置修改,docker-compose会重新创建。

不在docker-compose.yml 配置的已有容器会被删除

docker-compose -mysql8参数配置

指定root密码、新数据库、新用户及密码 时区

挂载 数据、配置文件目录

version: "3"
services:
  db830:
    image: mysql:8.3.0
    container_name: mysql8.3.0
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: xxxx
      MYSQL_DATABASE: xxx
      MYSQL_USER: xxx
      MYSQL_PASSWORD: xxx
      TZ: Asia/Shanghai
    command:
      --max_connections=1000
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --default-authentication-plugin=mysql_native_password
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1
    ports:
      - 3307:3306
    volumes:
      - ./db-830:/var/lib/mysql
      - ./conf-830:/etc/mysql/conf.d

docker 备份mysql

进入mysql8容器

docker exec -it xxx bash

mysql-bk.sh

/data/mysql/mysqlbk/bk 是宿主主机目录

        注意这是这个目录允许其它用户u谢谢

         因为默认是以当前用户权限写入的,

        虽然加了sudo,但是写入文件时还是以当前普通用户权限进行写,会提示无权操作

        以为是容器内目录,没有权限,其实不是。

       要以root身份进入,docker  exec -u root,不然导不出数据,xxx.sql一直是空的

        --no-create-db 指定不输出创建数据库语句(因为实在已有的库上恢复,文件太大,又不好改)


#!/bin/sh
echo backup mes start  $(date +%Y-%m-%d\ %H:%M:%S)
docker  exec -u root -i mysql8.3.0 mysqldump -uroot -pxxxx  --single-transaction --triggers --routines --events  --no-create-db --databases xxx> /data
/mysql/mysqlbk/bk/mes_bak_$(date +%Y%m%d_%H-%M-%S).sql
echo bk  end  $(date +%Y-%m-%d\ %H:%M:%S)
/usr/bin/find /data/mysql/mysqlbk/bk/ -mtime +60 -exec rm -rf {} \;
echo clear 60 days expired files success: $(date +%Y-%m-%d\ %H:%M:%S)
echo backup success
echo

docker 还原mysql

把sql文件拷贝到容器内

docker cp  /xxxx/xxx.sql  容器id:/

docker exec -it xxx bash 进入容器

mysql -uroot -p 登录

source ./xxx.sql文件

极速执行完成

Docker 环境中将 MySQL8.0.26 升级到最新版本(如 8.0.36 或更高)需要考虑容器化部署的特性,即数据持久化、镜像版本替换等。以下是完整的升级步骤: ### 1. 确认当前运行的 MySQL 容器版本 可以通过以下命令查看当前容器中运行的 MySQL 版本: ```bash docker exec -it <mysql_container_name> mysql -V ``` 这将输出类似 `mysql Ver 8.0.26 for Linux on x86_64 (MySQL Community Server - GPL)` 的信息,确认当前版本[^2]。 ### 2. 备份数据库数据 在进行任何升级操作前,务必对数据库进行完整备份,尤其是使用 `docker volume` 持久化数据的情况下: ```bash docker exec <mysql_container_name> mysqldump -u root -p --all-databases > backup.sql ``` 确保将 `backup.sql` 文件保存到安全位置。 ### 3. 停止并删除旧容器 停止当前运行的 MySQL 容器: ```bash docker stop <mysql_container_name> ``` 删除旧容器(注意:不删除关联的 volume): ```bash docker rm <mysql_container_name> ``` ### 4. 获取最新 MySQL 镜像 拉取最新的 MySQL 官方镜像(默认为最新稳定版): ```bash docker pull mysql:8.0 ``` 如果需要特定版本(如 8.0.36),可以使用: ```bash docker pull mysql:8.0.36 ``` ### 5. 重新创建并运行新版本容器 使用与原容器相同的 volume 映射来启动新版本容器,确保数据一致性和配置保留: ```bash docker run --name mysql_latest \ -e MYSQL_ROOT_PASSWORD=<your_root_password> \ -v <your_data_volume>:/var/lib/mysql \ -v <your_config_volume>:/etc/mysql/conf.d \ -p 3306:3306 \ -d mysql:8.0.36 ``` 其中: - `MYSQL_ROOT_PASSWORD` 为你的 root 用户密码。 - `your_data_volume` 是之前用于存储数据的 volume。 - `your_config_volume` 是存放自定义配置文件的 volume。 ### 6. 验证升级 进入容器内部验证 MySQL 版本是否已更新: ```bash docker exec -it mysql_latest mysql -V ``` 同时可以连接数据库执行如下 SQL 检查系统表是否已升级: ```sql SELECT VERSION(); ``` 如果升级后数据库结构发生变化,MySQL 会自动运行 `mysql_upgrade` 工具来更新系统表结构[^5]。 ### 7. 配置兼容性注意事项 - 如果应用使用 JDBC 连接 MySQL,注意 MySQL 8.x 的驱动包与旧版本存在差异,需确保连接字符串中包含时区设置,如: ```properties jdbc:mysql://<host>:3306/<db>?serverTimezone=Asia/Shanghai ``` 否则可能导致连接失败或时区问题[^4]。 - 确保配置文件(如 `my.cnf`)兼容新版本 MySQL,某些参数可能已被弃用或更改。 ### 总结 通过上述步骤,可以在 Docker 环境中安全地将 MySQL8.0.26 升级到最新版本(如 8.0.36),同时保留原有数据和配置。升级过程中应特别注意数据备份与兼容性设置。 ---
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值