在Docker上安装MYSQL 8.x---RelationalDb with SQL
应用环境
Ubuntu 20.04.6 LTS (GNU/Linux 5.15.0
文章目录
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.
### 注意,需要重新客户端才能生效。