当前位置: 首页 > news >正文

docker 部署 mysql 9.0.1

docker 如何部署 mysql 9 ,请看下面步骤:

1. 先看 mysql 官网

在这里插入图片描述

先点进去 8 版本的 Reference Manual 。

在这里插入图片描述
选择 9.0 版本的。

在这里插入图片描述

点到这里来看, 这里有一些基础的安装步骤,可以看一下。 - Basic Steps for MySQL Server Deployment with Docker。

在这里插入图片描述

有关使用 Docker 部署 MySQL Server 的更多主题,例如 服务器配置, 持久保存数据和配置, 服务器 错误日志和容器环境变量,请参阅 第 2.5.6.2 节 “有关使用 Docker 部署 MySQL 服务器的更多主题”。

在这里插入图片描述

docker run --name=mysql1 \
--mount type=bind,src=/path-on-host-machine/my.cnf,dst=/etc/my.cnf \
--mount type=bind,src=/path-on-host-machine/datadir,dst=/var/lib/mysql \
-d container-registry.oracle.com/mysql/community-server:tag

OK, 上面是官网的教程,接下来写上我自己的实操。

1. 首先我们要做下载 mysql 9.0.1 的镜像

docker pull mysql:9.0.1

2. 然后运行创建 mysql 容器

docker run -d \
--name mysql9 \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=root \
mysql:9.0.1

查看 mysql 是否正常启动:

docker ps

可以看到已经正常启动了。

在这里插入图片描述

3. 但我们的目标是要实现挂载mysql的 配置文件 到宿主机以便于修改 和 持久化 mysql 的数据。所以我们要先将 mysql 的 配置文件从容器中拷贝出来。

那么, mysql 9 的配置文件在哪呢?

我们从 dockerhub 仓库中可以看到 mysql 的配置文件在 /etc/mysql/my.cnf 。但是,你进去 mysql 9 的容器中会发现 这个路径找不到 my.cnf 文件。

在这里插入图片描述

其实 mysql 官网已经提到了, 在 /etc/my.cnf 。

在这里插入图片描述

OK,既然知道了配置文件的路径,那就拷贝出来。

先在宿主机中创建下面文件夹用于存放 mysql 9 的配置文件 以及 将来要存储 mysql 的数据目录。

mkdir -p /mydata/mysql/conf  /mydata/mysql/data

从 mysql 9 容器中拷贝配置文件出来:

docker cp mysql9:/etc/my.cnf:/mydata/mysql/conf

4. 删除 mysql 9 容器

docker stop mysql9
docker rm mysql9

5. 重新创建 mysql9 容器,并实现目录挂在。

docker run --name=mysql9 \
--mount type=bind,src=/mydata/mysql/conf/my.cnf,dst=/etc/my.cnf \ 
--mount type=bind,src=/mydata/mysql/data,dst=/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-p 3306:3306 \
-d mysql:9.0.1

你知道这两种写法有什么不同吗?请参考这篇文章 - 《docker 的目录挂载的新语法》

–mount type=bind,src=/path-on-host-machine/my.cnf,dst=/etc/my.cnf
-v /path-on-host-machine/my.cnf:/etc/my.cnf

到此 docker 就成功安装了 mysql 9 了。

那下一步我们要做什么呢? 远程连接 mysql 。 没错,所以继续往下看。

6. 修改配置文件添加允许远程访问配置

编辑 /mydata/mysql/conf/my.cnf

在配置文件中找到 [mysqld] 部分,添加下面属性

bind-address = 0.0.0.0

这会允许 MySQL 接受来自任何 IP 地址的连接。

修改完成后,需要重启 mysql 容器。

docker restart mysql9

7. 登录到 mysql 中赋予新用户远程访问的权限

注意:下面这段是旧 mysql 的用法了。在 mysql 9 中不能使用这种用法了。

# 1. 如果已经有现有用户,修改权限:
GRANT ALL PRIVILEGES ON database.* TO 'root'@'%' IDENTIFIED BY 'root';FLUSH PRIVILEGES;

上面这种写法在 mysql 9 中运行会报如下错误:

mysql>  GRANT ALL PRIVILEGES ON mysql.* TO 'root'@'%' IDENTIFIED BY 'root';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IDENTIFIED BY 'root'' at line 1

在 MySQL 8.0 和 9.0 版本中,GRANT 语句的语法发生了一些变化,尤其是涉及到用户创建和权限赋予的部分。特别地,MySQL 8.0+ 版本不允许在 GRANT 语句中直接使用 IDENTIFIED BY 来设置密码,密码设置应该通过 CREATE USER 或 ALTER USER 语句进行。

这个错误是因为在 MySQL 9.0.1 中,我们试图在 GRANT 语句中使用 IDENTIFIED BY,而 MySQL 9.0.1 的语法不允许这样做。

正确的做法:

# 1. 首先使用 CREATE USER 语句创建一个新用户,并设置密码:
CREATE USER 'username'@'%' IDENTIFIED BY 'password';# 2. 然后使用 GRANT 语句为该用户授予权限:
GRANT ALL PRIVILEGES ON mysql.* TO 'username'@'%';# 3. 最后,执行 FLUSH PRIVILEGES 使权限立即生效:
FLUSH PRIVILEGES;

不过我们已经有 root 用户了,不用去创建新用户了,在 mysql 库 下的 user 表可以查看到已有用户。

所以直接执行下面语句就行:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
FLUSH PRIVILEGES;

然后再用 Navicate 去连接,已经可以正常连接上了。

在这里插入图片描述

到此本教程已结束。


扩展:

更多 docker 教程可以参考这个人的文章 - Docker 教程(图文讲解),整理的挺好的。

相关文章:

docker 部署 mysql 9.0.1

docker 如何部署 mysql 9 ,请看下面步骤: 1. 先看 mysql 官网 先点进去 8 版本的 Reference Manual 。 选择 9.0 版本的。 点到这里来看, 这里有一些基础的安装步骤,可以看一下。 - Basic Steps for MySQL Server Deployment wit…...

SQL:从某行开始,查询一定行数的语句

比如实现从第五行开始查询5行数据的SQL语句 不同数据库有不同的实现方式,下面是各大数据库的查询语句。 1. SQL Server(适用于 SQL Server 2012 及之后版本)、DB2、Oracle(适用12c及以上版本) 这几种数据库的实现方式…...

18. 模块

一、什么是模块 模块化 指将一个完成的程序分解为一个一个小的模块。通过将模块组合,来搭建一个完整的程序。如果不采用模块化,那么所有的代码将统一保存到一个文件中。采用模块化后,将程序分别编写到多个文件中。使用模块化后,我…...

GroundingDINO微调训练_训练日志解释

文章目录 1. 训练日志1. Epoch 和 Iteration2. Learning Rate(学习率)3. ETA(预计剩余时间)4. Time 和 Data Time5. Memory6. Gradient Norm(梯度范数)7. Loss(损失)8. Individual L…...

华为eNSP:VRRP多网关负载分担

一、实验拓扑及目的 二、实验命令及实验步骤 LSW1的配置命令 <Huawei>sy [Huawei]un in e [Huawei]sys S1 [S1]vlan batch 100 200 [S1]int g0/0/1 [S1-GigabitEthernet0/0/1]port link-type access [S1-GigabitEthernet0/0/1]port default vlan 100 [S1-GigabitEtherne…...

uni-app写的微信小程序如何实现账号密码登录后获取token,并且每天的第一次登录后都会直接获取参数而不是耀重新登录(1)

uni-app写的微信小程序如何实现账号密码登录后获取token&#xff08;而token的有效器一般是30分钟&#xff0c;当页面在操作时token是不会过去&#xff0c;&#xff0c;离开页面第二天登录时token就是过期状态&#xff0c;因为记住了账号密码就不会操作再次登录&#xff0c;但是…...

【linux】(29)shell-变量和引号

Shell 脚本中有三种引号&#xff1a;双引号 "、单引号 和反引号 。它们有不同的作用。 双引号 " 双引号允许引用的字符串中包含变量和命令替换。 #!/bin/bash name"Alice" echo "Hello, $name!"单引号 单引号中的内容被原样引用&#xff0…...

Linux如何安装discuz

在Linux上安装Discuz!程序通常涉及以下步骤&#xff1a; 安装Web服务器&#xff08;如Apache或Nginx&#xff09;和数据库&#xff08;如MySQL或PostgreSQL&#xff09;。 下载Discuz!的最新版本。 将Discuz!文件上传到Web服务器的公共目录中。 根据README.md文件配置Discuz…...

SpringBoot如何使用EasyExcel实现表格导出(简洁快速入门版本)

前言 前面给大家介绍了动态表头的导入&#xff0c;这篇文章给大家介绍如何实现导出 前面给大家介绍了动态表头的导入&#xff0c;我们了解了如何通过EasyExcel灵活地读取结构不固定的Excel文件。这次&#xff0c;我们将目光转向数据导出——即如何将数据以Excel文件的形式输出…...

Python爬虫使用示例-保存诗人简介到csv文件中

一、获取资源 目标网址&#xff1a;&#xff08;第一页&#xff09; https://www.shicimingju.com/category/all&#xff08;后续&#xff09; https://www.shicimingju.com/category/all_2 https://www.shicimingju.com/category/all_3 ... https://www.shicimingju.com/ca…...

yocto的xxx.bb文件在什么时候会拷贝文件到build目录

在 Yocto 中&#xff0c;.bb 文件用于描述如何构建和安装一个软件包&#xff0c;而文件在构建过程中的拷贝操作通常会在某些特定的步骤中进行。具体来说&#xff0c;文件会在以下几个阶段被拷贝到 build 目录&#xff08;或者更准确地说&#xff0c;拷贝到目标目录 ${D}&#x…...

Mysql定时数据库备份保姆级教程

目录 一、需要解决的问题 1、如何传输文件? 2、如何备份数据库? 3、如何建立一个定时任务? 二、实施步骤 1、建立SSH公钥&#xff0c;实现无密码登录 2、编写备份数据库脚本 3、编写定时任务 MySQL 是一种全球广泛使用的关系型数据库管理系统&#xff0c;它存储的数…...

使用 Grafana 展示多个TiDB集群的告警

作者&#xff1a; yangzhj 原文来源&#xff1a; https://tidb.net/blog/229e283c 背景 在日常运维工作中&#xff0c;我们有时需要将多个生产集群的告警信息展示在一起&#xff0c;统一集中观察和分析TiDB 集群的告警情况。 本文将通过 Grafana 的多数据源功能来将多个Ti…...

lnmp+discuz论坛 附实验:搭建discuz论坛

Inmpdiscuz论坛 Inmp: t: linux操作系统 nr: nginx前端页面 me: mysql数据库 账号密码&#xff0c;等等都是保存在这个数据库里面 p: php——nginx擅长处理的是静态页面&#xff0c;页面登录账户&#xff0c;需要请求到数据库&#xff0c;通过php把动态请求转发到数据库 n…...

AI时代的开发新纪元:云开发 Copilot

AI时代的开发新纪元&#xff1a;云开发 Copilot 目录 引言&#xff1a;AI时代的开发新纪元低代码与AI的完美融合云开发 Copilot的革命性意义云开发 Copilot 的核心特性解析 快速生成应用功能低代码与AI的深度结合 实战演练&#xff1a;云开发 Copilot 的应用案例 从需求到实现…...

探索 Java 中的 Bug 世界

在 Java 编程的旅程中&#xff0c;我们不可避免地会遇到各种 Bug。这些 Bug 可能会导致程序出现意外的行为、崩溃或者性能问题。了解 Java Bug 的类型、产生原因以及解决方法&#xff0c;对于提高我们的编程技能和开发出稳定可靠的应用程序至关重要。 一、Java Bug 的定义与分类…...

【C++】等差数列末项计算题解析及优化

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述与输入输出要求&#x1f4af;数学分析与公式推导公差的计算通项公式推导 &#x1f4af;示例解析解题步骤 &#x1f4af;程序实现与解析初版代码代码解析优点与不足…...

【LeetCode】55.跳跃游戏

文章目录 题目链接&#xff1a;题目描述&#xff1a;解题思路&#xff08;贪心算法&#xff09;&#xff1a; 题目链接&#xff1a; 55.跳跃游戏 题目描述&#xff1a; 解题思路&#xff08;贪心算法&#xff09;&#xff1a; 如果某一个位置的元素为N&#xff0c;表示后面N…...

linux基于systemd自启守护进程 systemctl自定义服务傻瓜式教程

系统服务 书接上文: linux自启任务详解 演示系统:ubuntu 20.04 开发部署项目的时候常常有这样的场景: 业务功能以后台服务的形式提供,部署完成后可以随着系统的重启而自动启动;服务异常挂掉后可以再次拉起 这个功能在ubuntu系统中通常由systemd提供 如果仅仅需要达成上述的场…...

SparkSQL编程实践

文章目录 SparkSQL编程实践1.1. 编程模型介绍1.2. SparkSQL编程1.2.1. 第三方库安装1.2.2. SparkSQL程序的结构1.2.3. SparkSQL执行模式1.2.3.1. Local模式1.2.3.2. 集群模式 1.2.4. 数据加载1.2.4.1. 通过RDD创建DataFrame1.2.4.2. 通过读取数据外部数据创建DataFrame标准读取…...

模型训练数据-MinerU一款Pdf转Markdown软件

模型训练数据-MinerU一款Pdf转Markdown软件-说明 简介&#xff1a; MinerU是什么 MinerU是上海人工智能实验室OpenDataLab团队推出的开源智能数据提取工具&#xff0c;专注于复杂PDF文档的高效解析与提取。MinerU能将包含图片、公式、表格等元素的多模态PDF文档转化为易于分析…...

shell基础用法

shell基础知识 shell中的多行注释 :<<EOF read echo $REPLY # read不指定变量&#xff0c;则默认写入$REPLY EOF # :<<EOF ...EOF 多行注释&#xff0c;EOF可以替换为&#xff01;# 等文件目录和执行目录 echo $0$0 # ./demo.sh echo $0的realpath$(realpath…...

Redisson分布式锁

概览 个人博客源地址 Redisson不只是一个 Java Redis 客户端&#xff0c;它是一个以内存 Redis 服务器作为后端的处理 Java 对象(如 java.util.List, java.util.Map, java.util.Set, java.util.concurrent.locks.Lock 等)的一个框架。 Redisson提供了使用Redis的最简单和最…...

【C语言--趣味游戏系列】--电脑关机整蛊小游戏

前言&#xff1a; 老铁们&#xff0c;还是那句话&#xff0c;学习很苦游戏来补&#xff0c; 为了提高大家与朋友之间的友谊&#xff0c;博主在这里分享一个电脑关机的恶作剧小游戏&#xff0c;快拿去试试吧&#xff01;&#xff01;&#xff01; 目录&#xff1a; 1.电脑关机代…...

C#实现一个HttpClient集成通义千问-开发前准备

集成一个在线大模型&#xff08;如通义千问&#xff09;&#xff0c;来开发一个chat对话类型的ai应用&#xff0c;我需要先了解OpenAI的API文档&#xff0c;请求和返回的参数都是以相关接口文档的标准进行的 相关文档 OpenAI API文档 https://platform.openai.com/docs/api-…...

二叉树优选算法(一)

一、根据二叉树创建字符串 题目介绍&#xff1a; 给你二叉树的根节点 root &#xff0c;请你采用前序遍历的方式&#xff0c;将二叉树转化为一个由括号和整数组成的字符串&#xff0c;返回构造出的字符串。 空节点使用一对空括号对 "()" 表示&#xff0c;转化后需…...

单片机C51--笔记8-STC89C51RC/RD-IIC协议

一、概述 IIC全称Inter-Integrated Circuit (集成电路总线) 是由PHILIPS公司在80年代开发的两线式串行总线&#xff0c;用于连接微控制器及其外围设备。IIC属于半双 工同步通信方式。 特点 简单性和有效性。 由于接口直接在组件之上&#xff0c;因此IIC总线占用的空间非常小…...

HttpUtil的get和post请求

Http工具类 import org.apache.http.Consts; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.ht…...

leetcode 二进制数转字符串

1.题目要求: 2.题目代码: class Solution { public:string printBin(double num) {string result;double compare_value 1.0;//先给把0和.赋值给result;result.push_back(0);result.push_back(.);while(result.size() < 33){//利用十进制转换成二进制的方法//1.先给num …...

前端项目使用gitlab-cicd+docker实现自动化部署

GitLab CI/CD 是一个强大的工具&#xff0c;可以实现项目的自动化部署流程&#xff0c;从代码提交到部署只需几个步骤。本文将带你配置 GitLab CI/CD 完成一个前端项目的自动化部署。 前言 为什么使用cicddocker&#xff1f; 目前我们公司开发环境使用的shell脚本部署&#…...

【Linux】进程

&#x1f33b;个人主页&#xff1a;路飞雪吖~ &#x1f320;专栏&#xff1a;Linux 目录 一、冯诺依曼体系结构 &#x1f31f;系统调用和库函数概念 二、操作系统OS 三、进程 &#x1f31f;查看进程 &#x1f31f;通过系统调用获取进程标示符 &#x1f31f;通过系统调用创…...

transformers生成式对话机器人

简介 生成式对话机器人是一种先进的人工智能系统&#xff0c;它能够通过学习大量的自然语言数据来模拟人类进行开放、连贯且创造性的对话。与基于规则或检索式的聊天机器人不同&#xff0c;生成式对话机器人并不局限于预定义的回答集&#xff0c;而是可以根据对话上下文动态地…...

Text2SQL(NL2sql)对话数据库:设计、实现细节与挑战

Text2SQL&#xff08;NL2sql&#xff09;对话数据库&#xff1a;设计、实现细节与挑战 前言1.何为Text2SQL&#xff08;NL2sql&#xff09;2.Text2SQL结构与挑战3.金融领域实际业务场景4.注意事项5.总结 前言 随着信息技术的迅猛发展&#xff0c;人机交互的方式也在不断演进。…...

C# 关于加密技术以及应用(二)

AES&#xff08;Advanced Encryption Standard&#xff09;和 RSA&#xff08;Rivest-Shamir-Adleman&#xff09;是两种不同的加密算法&#xff0c;它们各自有特定的使用场景和优势。下面是它们的主要区别和适用场景&#xff1a; AES&#xff08;高级加密标准&#xff09; 特…...

四十四:Web如何关闭会话

在Web应用中&#xff0c;关闭会话&#xff08;Session Termination&#xff09;是一个重要的机制&#xff0c;用于确保用户的会话状态被安全地终止。无论是用户主动退出登录还是因超时被动登出&#xff0c;正确地管理会话关闭有助于提升安全性并释放服务器资源。 一、为什么需…...

在wsl2中安装archlinux

在之前的博客中&#xff0c;我介绍了如何在虚拟机或者真实机上安装archlinux并且进行一定的配置&#xff0c;但是实际上Linux不管怎么配置在日常使用中都没有Windows简单便利&#xff0c;在开发有关Linux的程序时过去用虚拟机或者直接在Windows上使用ssh在远程服务器上进行开发…...

在Goland中对goroutine协程断点调试

在Goland中对goroutine协程断点调试 环境: Goland 参考了 chatgpt 的回复 进行断点调试的代码 package mainimport ("fmt""sync""time" )// worker 模拟处理任务 func worker(id int, wg *sync.WaitGroup) {defer wg.Done() // 确保任务完成后…...

最长连续递增序列

问题分解 1&#xff1a;要求 要求找到最长的连续递增子序列&#xff0c;即在原数组中位置连续且数值严格递增的一段序列 2&#xff1a;输入和输出 输入是一个未经排序的整数数组nums 输出是该数组中最长连续递增子序列的长度 3&#xff1a;边界调节 数组为空则长度为0 …...

apt 包 源 的维护 和缓存 命令

APT 包源维护命令 更新软件包列表&#xff1a; sudo apt update&#xff1a;从配置的软件源中获取最新的软件包信息。这是安装、升级或删除软件包前通常要执行的步骤&#xff0c;以确保使用的是最新的软件包信息。 升级软件包&#xff1a; sudo apt upgrade&#xff1a;升级系…...

【排序方法的总结】

在数据结构中常见的排序方法有&#xff1a; 插入排序、交换排序、选择排序、归并排序和基数排序等。 插入排序 特点&#xff1a; 简单直观&#xff0c;对于小规模的数据排序效率较高。它的工作原理是通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后…...

工作中常用springboot启动后执行的方法

前言&#xff1a; 工作中难免会遇到一些&#xff0c;程序启动之后需要提前执行的需求。 例如&#xff1a; 初始化缓存&#xff1a;在启动时加载必要的缓存数据。定时任务创建或启动&#xff1a;程序启动后创建或启动定时任务。程序启动完成通知&#xff1a;程序启动完成后通…...

QT 中使用 QTableView 和 QStandardItemModel 实现将数据导出到Excel 和 从Excel导入到 QTableView 的功能

简介 在Qt中&#xff0c;使用QTableView和QStandardItemModel来实现将数据导出到Excel和从Excel导入到QTableView的功能&#xff0c;而不使用第三方库&#xff08;如QXlsx&#xff09;。 效果 将 QTableView 中的数据导出到Excel //从tableview 导出到 EXcle void MainInterfa…...

模版方法模式的理解和实践

在软件开发中&#xff0c;设计模式为我们提供了一套经过验证的解决方案&#xff0c;用于解决常见的设计问题。其中&#xff0c;模版方法模式&#xff08;Template Method Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一个算法的框架&#xff0c;并允许子类在不改…...

05-树莓派-交叉编译

交叉编译的概念 交叉编译是什么 来源百度百科&#xff1a; 交叉编译是在一个平台上生成另一个平台上的可执行代码。同一个体系结构可以运行不同的操作系统&#xff1b;同样&#xff0c;同一个操作系统也可以在不同的体系结构上运行。 举例来说&#xff0c;我们常说的x86 Lin…...

杨振宁大学物理视频中黄色的字,c#写程序去掉

先看一下效果&#xff1a;&#xff08;还有改进的余地&#xff09; 我的方法是笨方法&#xff0c;也比较刻板。 1&#xff0c;首先想到&#xff0c;把屏幕打印下来。c#提供了这样一个函数&#xff1a; Bitmap bmp new Bitmap(640, 480, PixelFormat.Format32bppArgb); // 创…...

非归档模式下一个或多个数据文件损坏恢复

1. 介绍 有些时侯可能你的库处于非归档的模式下&#xff0c;而你的联机重做日志又currupted,你的数据文件不能完成完全的恢复&#xff0c;这里为大家介绍一个oracle的一个隐藏参数_allow_resetlogs_corruption&#xff0c;让数据库重生。 通过设置隐含参数恢复 alter system …...

k8s 之storageclass使用nfs动态申请PV

文章目录 配置角色权限部署nfs-client-provisioner创建 NFS StorageClass创建 PVC 来动态申请 PV在 Pod 中使用 PVC验证存储是否正确挂载使用 kubectl 和 jq 筛选 PVCwaiting for a volume to be created, either by external provisioner "nfs-diy" or manually cre…...

Spark实训

实训目的: 介绍本实训的基本内容,描述知识目标、,以及本实训的预期效果等。 1、知识目标 (1)了解spark概念、基础知识、spark处理的全周期,了解spark技术是新时代对人才的新要求。 (2)掌握Linux、hadoop、spark、hive集群环境的搭建、HDFS分布文件系统的基础知识与应用…...

Mitel MiCollab 企业协作平台 任意文件读取漏洞复现(CVE-2024-41713)

0x01 产品简介 Mitel MiCollab是加拿大Mitel(敏迪)公司推出的一款企业级协作平台,旨在为企业提供统一、高效、安全的通信与协作解决方案。通过该平台,员工可以在任何时间、任何地点,使用任何设备,实现即时通信、语音通话、视频会议、文件共享等功能,从而提升工作效率和…...

React学习笔记(一)

创建函数写法一&#xff1a; 重点&#xff1a;函数有几种写法 function DemoShow() {return (<div className"App">函数声明</div>); }export default DemoShow;对应js创建函数声明&#xff1a;function sum1(a,b){return ab } 创建函数写法二&#x…...