在Docker上安装MYSQL 8.x—RelationalDb with SQL

在Docker上安装MYSQL 8.x---RelationalDb with SQL

应用环境

Ubuntu 20.04.6 LTS (GNU/Linux 5.15.0

文章目录

  • [在Docker上安装MYSQL 8.x---RelationalDb with SQL](#在Docker上安装MYSQL 8.x—RelationalDb with SQL)
    • [1. 拉取MySQL镜像](#1. 拉取MySQL镜像)
    • [2. 生成Run脚本](#2. 生成Run脚本)
        • [2.1 准备条件](#2.1 准备条件)
        • [2.2 参数解读](#2.2 参数解读)
        • [2.3 实例脚本](#2.3 实例脚本)
    • 常用维护命令
    • 参考文档
    • [3. 查询千条记录限制问题](#3. 查询千条记录限制问题)

1. 拉取MySQL镜像

MySQL是一个流行的关系型数据库管理系统(RDBMS),它使用结构化查询语言(SQL)进行数据库管理。MySQL由瑞典公司MySQL AB于1995年开发,并在2008年被Sun Microsystems收购,随后在2010年Sun被Oracle Corporation收购,因此目前MySQL是Oracle公司的一个产品。然而,MySQL的社区版仍然保持其开源特性,并受到GNU通用公共许可证(GPL)的保护。

bash 复制代码
# MySQL:8.0.32
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/mysql:8.0.32

# 添加标签名Tag
docker tag  swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/mysql:8.0.32  docker.io/mysql:8.0.32

# 移除标签名Tag
docker rmi swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/mysql:8.0.32

国内镜像参考:
渡渡鸟镜像

2. 生成Run脚本

可参考:渡渡鸟-Run助手

2.1 准备条件

创建实例存储路径目录

bash 复制代码
# 创建mysql实例目录及配置子目录
sudo mkdir -p /docker/mysql/{conf,data,logs}

创建实例配置文件sudo vim /docker/mysql/conf/my.cnf,内容如下

bash 复制代码
[mysql]
#设置mysql客户端默认字符集
default-character-set = utf8mb4

[mysqld]
# 数据存储路径
datadir = /var/lib/mysql

# 错误日志路径
# log-error = /var/log/mysql/error.log

# 启用远程连接
bind-address = 0.0.0.0

#设置3306端口
port = 3306

#允许最大连接数
max_connections = 200

#允许连接失败的次数
max_connect_errors = 10

#默认使用"mysql_native_password"插件认证
default_authentication_plugin = mysql_native_password

#服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server = utf8mb4

# 默认排序规则为 utf8mb4_0900_ai_ci,若需兼容 MySQL 5.7 可使用 utf8mb4_unicode_ci
collation-server = utf8mb4_0900_ai_ci

# 禁用DNS解析提升性能
skip-name-resolve

#开启查询缓存
explicit_defaults_for_timestamp = true

#创建新表时将使用的默认存储引擎
default-storage-engine = INNODB

#等待超时时间秒
wait_timeout = 60

#交互式连接超时时间秒
interactive-timeout = 600
2.2 参数解读
powershell 复制代码
# 将镜像进实例化成容器并运行
docker run 

# 【i】保持STDIN(标准输入)开放,即使没有附加任何东西。这通常用于让容器的进程保持运行,即使没有附加到终端。例如,你可以在容器内部运行一个交互式shell
# 【t】分配一个伪终端(pseudo-TTY),这对于交互式shell非常重要,比如当你想要在容器中运行bash或sh时。
# 【d】后台运行,即所谓的"detached"模式。容器会在后台启动,并且你会得到容器的ID或名称
-itd

# 容器命名
--name mysql \

# 重启策略
## no:不自动重启,缺省时默认
## always:始终重启
## unless-stopped:Docker 服务重启后自动启动容器,除非容器被手动停止。可指定最大重试次数,例如 --restart=on-failure:3(最多重启3次)。
## on-failure:仅在容器非正常退出(退出状态码非0)时重启。
--restart=unless-stopped \

# 【p】映射策略,<宿主端口>:<容器端口>
-p 3306:3306 \

# 使用本地时区
-e TimeZone='Asia/Shanghai' \
-e TZ='Asia/Shanghai' \
-v /etc/localtime:/etc/localtime \

# 挂载卷映射(宿主:容器)
## /docker/mysql/conf/my.conf:实例化配置文件
## /docker/mysql/data:应用数据
## /docker/mysql/logs:运行日志
-v /docker/mysql/cnf/my.cnf:/etc/mysql/my.cnf \
-v /docker/mysql/data:/var/lib/mysql \
-v /docker/mysql/logs:/var/log/mysql \

# 初始化数据库密码
-e MYSQL_ROOT_PASSWORD=123456  \

# 让容器获取宿主机root权限
--privileged=true \

# 引用的docker镜像源
-d mysql:8.0.32 \

# 忽略表名大小写检查
--lower_case_table_names=1
2.3 实例脚本

此处在卷标映射时,将配置文件以及数据库一起存放到mysql父目录,以便于维护和使用。

bash 复制代码
sudo docker run -itd \
--name mysql \
--restart=unless-stopped \
-p 3306:3306 \
-p 33060:33060 \
-e TimeZone='Asia/Shanghai' \
-e TZ='Asia/Shanghai' \
-v /etc/localtime:/etc/localtime \
-v /docker/mysql/conf/my.cnf:/etc/mysql/my.cnf \
-v /docker/mysql/data:/var/lib/mysql \
-v /docker/mysql/logs:/var/log/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--privileged=true \
-d mysql:8.0.32 \
--lower_case_table_names=1

MySQL服务33060端口是通过X Protocol协议进行通信的,X Protocol是MySQL 8.0中引入的一种新的协议,用于提供更高级别的API,以帮助开发人员更容易地开发大型、复杂的应用程序。这是旨在为现代Web应用、移动应用和云原生应用程序提供更好的扩展性。

常用维护命令

bash 复制代码
# 开启远程连接
sudo docker exec -it mysql mysql -u root -p
# 键入root密码
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.32 MySQL Community Server - GPL
Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

# 将'root'@'locahost'修改为'root'@'%'
mysql> grant all privileges on *.* to 'root'@'%';
Query OK, 0 rows affected (0.01 sec)
# 更新配置项
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

mysql> exit
Bye

# 通过docker查看容器服务日志
docker logs mysql

参考文档

Docker 部署 MySQL 8 详细图文教程
史上最全Docker安装mysql8.0.32

3. 查询千条记录限制问题

bash 复制代码
# 首先检查Mysql本身是否限制

## 1. 登录Mysql后端
docker exec -it mysql mysql -h localhost -u root -p

## 2. 查询max_allowed_packet
show VARIABLES like '%max_allowed_packet%';
+----------------------------+------------+
| Variable_name              | Value      |
+----------------------------+------------+
| max_allowed_packet         | 67108864   |
| mysqlx_max_allowed_packet  | 67108864   |
| replica_max_allowed_packet | 1073741824 |
| slave_max_allowed_packet   | 1073741824 |
+----------------------------+------------+
4 rows in set (0.01 sec)

### 67108864字节表示 1024 * 1024 * 64,也就是64M数据包,如果是10M以下则可以直接修改my.cnf配置文件
## 在[mysqld]块添加或修改
max_allowed_packet = 64M

## 3. 检查max_join_size
show variables like '%max_join_size%';
+---------------+----------------------+
| Variable_name | Value                |
+---------------+----------------------+
| max_join_size | 18446744073709551615 |
+---------------+----------------------+
1 row in set (0.02 sec)

### 作用为限制JOIN操作的最大返回行数,上面的值为上限上行数。如果低于1000,则可以直接修改它
SET GLOBAL max_join_size = 2000000;
### 当重启mysql服务会失效,全局配置则在配置文件[mysqld]块中添加或修改
max_join_size = 2000000

# 第三方客户端工具受限

## dbForge Studio for MySQL

### 关闭默认的分页模式即可
### 设置位置(去除此钩) 
### Tools -> Options -> Data Editor -> General -> Use paginal mode by default.
### 注意,需要重新客户端才能生效。
相关推荐
huahailing10247 小时前
docker 部署 rustfs
运维·docker·容器
yumgpkpm7 小时前
hadoop集群搭建 (超详细) 接入Impala、Hive,AI 大模型的数据底座
hive·hadoop·mysql·zookeeper·flink·kafka·hbase
pandarking7 小时前
[CTF]攻防世界:fakebook (sql注入)
数据库·sql·web安全·网络安全
都是蠢货7 小时前
mysql中null是什么意思?
android·数据库·mysql
爱技术的阿呆7 小时前
MySQL的表连接及案例演示
数据库·sql
光羽隹衡7 小时前
SQL的导入导出数据和查询
数据库·sql
爱技术的阿呆7 小时前
MySQL子查询及其案例
数据库·mysql
sg_knight8 小时前
Docker Engine 升级指南:保障容器安全的关键步骤
java·spring boot·安全·spring·spring cloud·docker·容器
小妖同学学AI8 小时前
告别SQL编写!开源WrenAI实现自然语言与数据库的智能对话
数据库·sql·开源