写最好的Docker安装最新版MySQL8(mysql-8.0.31)教程(参考Docker Hub和MySQL官方文档)

news2024/11/25 10:26:50

一、前言

  MySQL官方安装包下载地址:
  https://dev.mysql.com/downloads/mysql/

 
  Docker Hub官方网址:
  https://hub.docker.com/

 
  如果需要了解Centos7下MySQL5.7最新版的安装部署,可参考教程【最新MySQL-5.7.40在云服务器Centos7.9安装部署)】。
 
  本教程是笔者参考Docker Hub和MySQL官方文档,经过多次操作,踩坑无数才撰写出来的,内容不能说是全网最好,但绝对不会很差,起码比网上很多博文要详细得多。例如配置编码集参数解决中文乱码问题,本教程中有多种方法处理,其它博文可能就只写一种。Docker中安装MySQL8容器,要注意的细节很多,比安装MySQL5.7要麻烦得多!
 
  笔者毕竟专业技能有限,文中的某些描述或者操作如果有错误,可以评论指出或加关注 @大白有点菜 讨论,大家互相学习进步。
 
  本文由 @大白有点菜 原创,请勿盗用,转载请说明出处!如果觉得文章还不错,请点点赞,加关注,谢谢!
 

二、安装部署

 

1、在Docker Hub中搜索关键字“mysql”,查看MySQL的最新稳定版,包含MySQL8和MySQL5.7系列。对应的MySQL页面有教程,读者也可自行去看,但是不是很完整,笔者的教程参考官网且有改动。

(1)Docker Hub中搜索“mysql”。
 
Docker Hub中搜索“mysql”
 
(2)选择官方的“mysql”。页面是MySQL在Docker中的版本的相关介绍,这里有这么一个规律:8.0.31, 8.0, 8, latest, 8.0.31-oracle, 8.0-oracle, 8-oracle, oracle 其实都是同一个版本,它们的镜像ID都是相同在页面中放在同一行展示的,都是同一个版本,笔者验证过。页面同时也有操作教程,并不是很全,只给出核心操作步骤。
 
  Docker Hub中MySQL介绍:https://hub.docker.com/_/mysql
 
选择官方的“mysql” 
MySQL在Docker中的版本的相关介绍 
MySQL在Docker中的操作教程
 

2、切换到“Tags”页面,官方列出了最新的版本和对应的命令,例如 docker pull mysql:latest ,拉取MySQL最新的版本。其实简写 docker pull mysql ,mysql后面不同带版本号,等同于latest版,后面教程会验证。

 
拉取MySQL最新的版本
 

3、回归正题,先创建三个目录,创建MySQL容器时会挂载为容器的卷(Volume),用于Docker和宿主机(Centos)之间共享文件,包括配置文件、数据文件和日志文件。

 
  什么是卷(Volume)?命令 docker -v 中的“-v”就是这个卷,“-v”只是“--volume”的简写。
 
  Docker官方文档解释的含义:https://docs.docker.com/storage/volumes/
 
使用 -p 创建多级目录,即 mydata 目录下创建 mysql 目录, mysql 目录下又创建 log 、data 、conf 三个目录:

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

创建多级目录

 

4、拉取MySQL镜像,可以看到,拉取的tag就是“latest”。

docker pull mysql

拉取MySQL镜像

 

5、创建容器前先了解一些前置知识点,更好地理解操作过程的一些参数配置。

(1)Docker Hub官方教程文档中提到两种方式去运行新容器:使用自定义的 .cnf 配置文件配置选项作为标志传递给mysqld,不用写xxx.cnf配置文件
 
Docker Hub官方教程文档中提到两种方式去运行新容器 
(2)【重要】了解必要的前置知识点,因为后面步骤配置用到的一些参数就以此有关:MySQL8.0容器中,Server 和 Client 都有默认的字符集。Client相关的字符集如果不为 utf8mb4 的话,连接Server查看表中数据,中文就显示为乱码。
 
Client连接Server查看表中数据,中文显示为乱码
 
  1)与 Client 相关的配置:character_set_clientcharacter_set_connectioncharacter_set_resultscollation_connection。可以看到,前三个默认字符集(character)的值为 latin1,最后一个排序规则(collation)的值默认为 latin1_swedish_ci 。连接 Server 时查看表数据,中文当然会显示乱码了。

show variables like 'char%';
show variables like 'collation%';

 
Client 相关的配置对应的编码值

 
  2)与 Server 相关的配置:character_set_databasecharacter_set_servercollation_databasecollation_server。可以看到,前两个默认字符集(character)的值为 utf8mb4,最后两个排序规则(collation)的值默认为 utf8mb4_0900_ai_ci ,就是说MySQL8中 Server 配置默认的字符集就是 utf8mb4

show variables like 'char%';
show variables like 'collation%';

 
请添加图片描述
 
  3)“utf8_unicode_ci” 和“utf8mb4_general_ci”接触得比较多,但“utf8mb4_0900_ai_ci”又是什么?
 
  三者都是MySQL的utf8编码默认的排序规则,MySQL官网文档中介绍到:MySQL 5.7 和 8.0 之间的默认排序规则utf8mb4不同5.7版是 utf8mb4_general_ci, 8.0版是 utf8mb4_0900_ai_ci )。

  • utf8编码:MySQL5.7默认排序规则为 utf8_unicode_ci
  • utf8mb4编码:MySQL5.7默认排序规则为 utf8mb4_general_ciMySQL8.0默认排序规则为 utf8mb4_0900_ai_ci

 
  【MySQL 5.7 和 8.0 之间的默认排序规则utf8mb4不同,附谷歌翻译截图】:
  https://dev.mysql.com/doc/refman/8.0/en/charset-connection.html#charset-connection-system-variables

 
截图出处-1,附谷歌翻译截图1 
MySQL 5.7 和 8.0 之间的默认排序规则utf8mb4不同,附谷歌翻译截图
 
 
  【MySQL8.0服务器字符集和排序规则,附谷歌翻译截图】:
  https://dev.mysql.com/doc/refman/8.0/en/charset-server.html

 
MySQL8.0服务器字符集和排序规则,附谷歌翻译截图1 
MySQL8.0服务器字符集和排序规则,附谷歌翻译截图2
 
  【MySQL5.7服务器字符集和排序规则,附谷歌翻译截图】:
  https://dev.mysql.com/doc/refman/5.7/en/charset-server.html

 
MySQL5.7服务器字符集和排序规则,附谷歌翻译截图1
 
MySQL5.7服务器字符集和排序规则,附谷歌翻译截图2
 
  【MySQL8.0支持的字符集和默认排序规则,移除了 utf8,新增了 utf8mb3,保留 utf8mb4 ,附谷歌翻译截图】:
  https://dev.mysql.com/doc/refman/8.0/en/charset-charsets.html

 
MySQL8.0支持的字符集和默认排序规则,移除了 utf8,新增了 utf8mb3,保留 utf8mb4 ,附谷歌翻译截图
 
  【MySQL5.7支持的字符集和默认排序规则,有 utf8 和 utf8mb4 ,附谷歌翻译截图】:
  https://dev.mysql.com/doc/refman/5.7/en/charset-charsets.html

 
MySQL5.7支持的字符集和默认排序规则,有 utf8 和 utf8mb4  ,附谷歌翻译截图
 

6、方法一创建容器:将配置选项作为标志传递给mysqld,不用写xxx.cnf配置文件。

 
执行以下命令,创建一个 mysql 容器并指定目录挂载为容器的卷,设置客户端字符集:

docker run --name mysql -v /mydata/mysql/log:/var/log/mysql -v /mydata/mysql/data:/var/lib/mysql -v /mydata/mysql/conf:/etc/mysql/conf.d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql --init-connect="SET collation_connection=utf8mb4_0900_ai_ci" --init-connect="SET NAMES utf8mb4" --skip-character-set-client-handshake

执行命令,创建一个 mysql 容器并指定目录挂载为容器的卷,设置客户端字符集
 
字符集都改为utf8mb4了
 
以上命令的参数又是什么意思呢?使用 docker run --help 查看各参数的含义:

docker run --help

 
docker run --help 之 --name 参数

 
docker run --help 之 -v 参数

 
docker run --help 之 -p 参数

 
docker run --help 之 -e 参数

 
docker run --help 之 -d 参数
 

  • --name
       容器名称。

  • -v
       参数 -v 是 --volume list 的简写,将指定的文件夹挂载为容器的卷(Volume),用来共享文件(日志文件、配置文件、数据文件)。

  • /mydata/mysql/log
       日志目录。

  • /mydata/mysql/data
       数据目录。

  • /mydata/mysql/conf
       配置文件目录。

  • -p 3306:3306
       参数 -p 是 --publish list 的简写,将3306端口映射到容器的3306端口,对外提供端口。如果同时启动多个mysql容器,对外端口号可以不同,服务之间不会冲突。

  • -e MYSQL_ROOT_PASSWORD=123456
       参数 -e 是 --env list 的简写,设置环境变量,将 root 用户的密码变量(MYSQL_ROOT_PASSWORD)设置为 123456。

  • -d mysql
       参数 -d 是 --detach 的简写,指的是容器运行在后台并打印容器ID。后面的mysql可以加版本号,例如mysql:latest、mysql:8.0.31 等等。

  • --init-connect="SET collation_connection=utf8mb4_0900_ai_ci"
       Client初始化连接Server时,将 collation_connection 排序规则的值设置为 utf8mb4_0900_ai_ci 并作为标志传递给 mysqld 。相当于my.cnf配置文件下,[mysqld]位置下添加 init-connect=“SET collation_connection=utf8mb4_0900_ai_ci” 参数。

  • --init-connect="SET NAMES utf8mb4"
       Client初始化连接Server时,设置系统变量 NAMES 的值为 utf8mb4 并作为标志传递给 mysqld 。在MySQL官方文档介绍中,设置 NAMES 的字符集,就是给三个会话系统变量 character_set_clientcharacter_set_connectioncharacter_set_results 设置一样的字符集。相当于my.cnf配置文件下,[mysqld]位置下添加 init-connect=“SET NAMES utf8mb4” 参数。

  • --skip-character-set-client-handshake
       相当于my.cnf配置文件下,【mysqld】位置下添加 skip-character-set-client-handshake 参数。–character-set-client-handshake 的一个开关,用来忽略客户端信息并使用默认服务器字符。官方文档中描述到,在MySQL 4.0版中,服务器和客户端都有一个“全局”字符集,服务器管理员决定使用哪个字符。但MySQL4.1之后,客户端连接服务器时,是有 handshake(握手)的【官方文档地址:连接字符集和排序规则】。
       MySQL4.1之后版本,当客户端连接时,它想发送指定的字符集给服务端来设置 character_set_client、character_set_connection、character_set_results 这三个系统变量,当 mysqld 以 –character-set-server=utf8 这种配置启动时,是无法控制客户端字符集设置的,但MySQL4.0是可以这么做的,为了保留MySQL4.0这种行为,–character-set-client-handshake 开关就诞生了。

 
  【设置 NAMES 的字符集,附谷歌翻译截图】:
  https://dev.mysql.com/doc/refman/8.0/en/set-names.html

 
设置 NAMES 的字符集,附谷歌翻译截图1
 
设置 NAMES 的字符集,附谷歌翻译截图2
 
  【“–skip-character-set-client-handshake”官方文档介绍,附谷歌翻译截图】:
  https://dev.mysql.com/doc/refman/8.0/en/faqs-cjk.html
  https://dev.mysql.com/doc/refman/8.0/en/server-options.html#option_mysqld_character-set-client-handshake

 
“--skip-character-set-client-handshake”官方文档介绍1
 
“--skip-character-set-client-handshake”官方文档介绍2
 
“--skip-character-set-client-handshake”官方文档介绍3
 
“--skip-character-set-client-handshake”官方文档介绍4
 

7、方法二创建容器:使用自定义的 custom.cnf 配置文件。

 
(1)在 /mydata/mysql/conf/ 目录下创建自定义的 custom.cnf 配置文件。文件名随意,文件格式必须为 .cnf

vim /mydata/mysql/conf/custom.cnf

创建自定义的 custom.cnf 配置文件

 
  MySQL默认配置文件 /etc/my.cnf 末尾中有这么一行:!includedir /etc/mysql/conf.d/ ,意思是,在 /etc/mysql/conf.d/ 目录下新建自定义的配置文件 custom.cnf也会被读取到,而且还是优先读取的(Docker Hub中的MySQL教程文档有说到)。
 
MySQL默认配置文件 /etc/my.cnf
 
Docker Hub中MySQL使用自定义配置文件1

 
Docker Hub中MySQL使用自定义配置文件2

 
(2)添加容器运行的配置参数。

[mysqld]
init-connect="SET collation_connection=utf8mb4_0900_ai_ci"
init_connect="SET NAMES utf8mb4"
skip-character-set-client-handshake

添加容器运行的配置参数

 
(3)创建容器并运行。一些参数在【方法一创建容器】里面有说明,这里不再细说。

docker run --name mysql -v /mydata/mysql/log:/var/log/mysql -v /mydata/mysql/data:/var/lib/mysql -v /mydata/mysql/conf:/etc/mysql/conf.d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql

创建容器并运行 
字符集都改为utf8mb4了
 

8、禁用 root 账户被外部工具连接。

 
  进入到容器里,连接mysql,删除mysql数据库user表中 user=“root”,host="%"的那条记录。因为这条数据会允许 root 账户被允许外部工具(如Navicat或SQLyog)连接,实际上,应该禁止这么做,正确做法是只允许 root 账户本地连接。如果想 root 账户继续被外部工具连接,那就把root密码设置得更复杂,过于简单不安全!
 
允许 root 账户被允许外部工具(如Navicat或SQLyog)连接
 
切换到 mysql 数据库:

use mysql;

删除mysql数据库user表中 user=“root”,host="%"的那条记录:

delete user from mysql.user where user='root' and host='%';

刷新权限:

flush privileges;

删除mysql数据库user表中 user="root",host="%"的那条记录
 
禁止 root 账户被允许外部工具(如Navicat或SQLyog)连接 

9、创建新账户供外部工具连接。可参考文章【如何优雅地创建MySQL账户供外部工具连接】。

(1)使用 CREATE 创建账户,例如对应mysql.user表中,字段user为 zyt ,字段host为 % ,账号密码为 dbydc&666 ,“%”代表任何主机。使用 GRANT 授予账户特定权限
 
  1)创建用户和密码

CREATE USER 'zyt'@'%' IDENTIFIED BY 'dbydc&666';

create user 'zyt'@'%' identified by 'dbydc&666';

  2)授予账户特定权限。ALL 和 ALL PRIVILEGES 是一样的,可简写为 ALL

GRANT ALL ON *.* TO 'zyt'@'%' WITH GRANT OPTION;

grant all on *.* to 'zyt'@'%' with grant option;

 
(2)刷新账号权限。

FLUSH PRIVILEGES;

flush privileges;

 
(3)使用Navicat工具测试连接,账户“zyt”是正常连接的。
 
使用Navicat工具测试连接,账户“zyt”是正常连接的

 

10、设置容器自启动。

docker update --restart=always mysql

设置容器自启动 

11、容器的启动、停止、删除、重新启动、查看运行状态。

(1)启动容器

docker start mysql

docker start 容器ID

(2)停止容器

docker stop mysql

docker stop 容器ID

(3)删除容器

docker rm mysql

docker rm 容器ID

(4)重新启动容器

docker restart mysql

docker restart 容器ID

(5)查看容器运行状态
 
查看所有容器的运行状态,包括运行的和停止的

docker ps -a

查看所有运行中的容器的状态,不包括停止的

docker ps

 

12、创建数据库并验证功能。

(1)创建 dbydc 数据库,数据表为 tb_account 和 tb_user。

-- MySQL dump 10.13  Distrib 8.0.31, for Linux (x86_64)
--
-- Host: localhost    Database: dbydc
-- ------------------------------------------------------
-- Server version	8.0.31

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Current Database: `dbydc`
--

CREATE DATABASE /*!32312 IF NOT EXISTS*/ `dbydc` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;

USE `dbydc`;

--
-- Table structure for table `tb_account`
--

DROP TABLE IF EXISTS `tb_account`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `tb_account` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增主键',
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '账户名称',
  `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '密码',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `tb_account`
--

LOCK TABLES `tb_account` WRITE;
/*!40000 ALTER TABLE `tb_account` DISABLE KEYS */;
INSERT INTO `tb_account` VALUES (1,'zyt','123456'),(2,'君莫笑','654321');
/*!40000 ALTER TABLE `tb_account` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `tb_user`
--

DROP TABLE IF EXISTS `tb_user`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `tb_user` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增主键',
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '姓名',
  `age` int DEFAULT NULL COMMENT '年龄',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `tb_user`
--

LOCK TABLES `tb_user` WRITE;
/*!40000 ALTER TABLE `tb_user` DISABLE KEYS */;
INSERT INTO `tb_user` VALUES (1,'大白有点菜',18),(2,'CSDN新人',20);
/*!40000 ALTER TABLE `tb_user` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2022-11-18  4:02:16

 
(2)创建 dbydc2 数据库,数据表为 tb_user。

-- MySQL dump 10.13  Distrib 8.0.31, for Linux (x86_64)
--
-- Host: localhost    Database: dbydc2
-- ------------------------------------------------------
-- Server version	8.0.31

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Current Database: `dbydc2`
--

CREATE DATABASE /*!32312 IF NOT EXISTS*/ `dbydc2` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;

USE `dbydc2`;

--
-- Table structure for table `tb_user`
--

DROP TABLE IF EXISTS `tb_user`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `tb_user` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增主键',
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '姓名',
  `age` int DEFAULT NULL COMMENT '年龄',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `tb_user`
--

LOCK TABLES `tb_user` WRITE;
/*!40000 ALTER TABLE `tb_user` DISABLE KEYS */;
INSERT INTO `tb_user` VALUES (1,'大白有点菜666',20),(2,'CSDN新人666',22);
/*!40000 ALTER TABLE `tb_user` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2022-11-19  2:33:53

 
(3)在不进入容器的情况下查询数据库的表数据。
 
  通过 shell 方式运行mysql,-e 参数后面加上要执行的指令,等同于mysql连接后输入的指令一样。此处先切换到 dbydc 数据库,再查询 tb_account 和 tb_user 两个数据表的所有数据。

docker exec -i mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e "use dbydc;" -e "select * from tb_account;" -e "select * from tb_user;"'

在不进入容器的情况下查询数据库dbydc的表数据1 
  还有另外一种写法,就是不用执行 “use dbydc;”这条指令去切换数据库,直接在 “select * from tb_account;” 后面加 dbydc 数据库即可。

docker exec -i mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e "select * from tb_account;" dbydc -e "select * from tb_user;"'

在不进入容器的情况下查询数据库dbydc的表数据2 
  插入数据的语法是怎么写的呢?SQL语句 insert into tb_user(name,age) values("西门吃鸡", 36); 中有双引号,需要使用斜杠“\”来转义

docker exec -i mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e "use dbydc;" -e "insert into tb_user(name,age) values(\"西门吃鸡\", 36);" -e "select * from tb_user;"'

插入数据 

13、MySQL数据库备份。

 
  MySQL官方文档备份数据库:
  https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html#option_mysqldump_databases

 
(1)创建数据备份目录 db_backup

mkdir -p /mydata/db_backup

(2)备份所有数据库。参数 --all-databases 代表所有数据库。备份sql文件名称随意,如 all-databases.sql

docker exec mysql sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /mydata/db_backup/all-databases.sql

(3)同时备份多个指定的数据库。参数 --databases 后面可以指定数据库名称,支持1个或以上。备份sql文件名称随意,如 multi-databases.sql

docker exec mysql sh -c 'exec mysqldump --databases dbydc dbydc2 -uroot -p"$MYSQL_ROOT_PASSWORD"' > /mydata/db_backup/multi-databases.sql

(4)备份一个数据库。这里有两种方式,但是,只有加了参数 --databases 才能被正确地还原!
  1)有参数 --databases ,可以被还原,最好使用这种方式。

docker exec mysql sh -c 'exec mysqldump --databases dbydc -uroot -p"$MYSQL_ROOT_PASSWORD"' > /mydata/db_backup/dbydc.sql

  2)无参数 --databases ,不能被还原,不要使用这种方式。MySQL官网有写到可以这么做,但是经过笔者验证和查询官网资料,这方式无法达到还原效果。笔者的专业技能有限,可能是支持还原的,但暂时写不出来这样的指令。

docker exec mysql sh -c 'exec mysqldump dbydc -uroot -p"$MYSQL_ROOT_PASSWORD"' > /mydata/db_backup/dbydc.sql

笔者试过以下的指令去还原数据,但是发现,根本行不通:

docker exec -i mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e "use dbydc;"' < /mydata/db_backup/dbydc.sql

(5)备份指定的数据表。这种方式笔者验证过,无法还原。

docker exec mysql sh -c 'exec mysqldump dbydc tb_user -uroot -p"$MYSQL_ROOT_PASSWORD"' > /mydata/db_backup/tb_user.sql

 

14、MySQL数据库还原。

(1)还原所有数据库。

docker exec -i mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < /mydata/db_backup/all-databases.sql

(2)还原集合的数据库。

docker exec -i mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < /mydata/db_backup/multi-databases.sql

(3)还原一个数据库。这里注意,必须是前面加了 --databases 参数 mysqldump 出来的sql文件才会被正常还原!其实呢,使用 mysql 客户端方式去还原sql文件,sql文件中必须要有 CREATE DATABASEUSE 这两个语句,只有加了参数 --all-databases--databases 的才会正常被加载。

docker exec -i mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < /mydata/db_backup/dbydc.sql

 
  【加载备份的sql格式文件,附谷歌翻译】:
  https://dev.mysql.com/doc/refman/8.0/en/reloading-sql-format-dumps.html

 
加载备份的sql格式文件1 
加载备份的sql格式文件2 
加载备份的sql格式文件3 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/586580.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《深入理解计算机系统(CSAPP)》第9章虚拟内存 - 学习笔记

写在前面的话&#xff1a;此系列文章为笔者学习CSAPP时的个人笔记&#xff0c;分享出来与大家学习交流&#xff0c;目录大体与《深入理解计算机系统》书本一致。因是初次预习时写的笔记&#xff0c;在复习回看时发现部分内容存在一些小问题&#xff0c;因时间紧张来不及再次整理…

chatgpt赋能python:Python中对列表求和-一篇全面介绍和使用建议的SEO文章

Python中对列表求和 - 一篇全面介绍和使用建议的SEO文章 什么是Python中的列表&#xff1f; 在Python中&#xff0c;列表&#xff08;List&#xff09;是一种非常有用的数据结构&#xff0c;它是一组有序的元素集合。列表能够存储多个元素&#xff0c;每个元素都可以是不同的…

Ubuntu20.04安装VMware player16.2.4,不弹出安装界面的问题

1.先在官网上下载VMware player16.2.4进行下载&#xff0c;Ubuntu20.04对VMware player16.2.4进行安装 2.安装完成后&#xff0c;应该会有如图下的弹窗界面&#xff0c;但是我没有 解决方法&#xff1a; 点击Ubuntu的VMware player的程序图标&#xff0c;弹窗报错:"Comma…

【Leetcode60天带刷】day03链表——203. 移除链表元素,707.设计链表,206. 反转链表

链表基础知识: 链表就像一串小火车&#xff0c;有一节一节的车厢&#xff0c;每个车厢都叫做一个节点。 单链表&#xff1a;每个链表车厢里有两个内容&#xff0c;一个放的是真正的数据&#xff0c;另一个放的是下一节车厢的编号。 双链表&#xff1a;每个链表车厢里有三个内…

chatgpt赋能python:如何在Python中取消换行?

如何在Python中取消换行&#xff1f; 如果你是一名经验丰富的Python工程师&#xff0c;你一定会遇到在输出过程中需要取消换行的情况。在本文中&#xff0c;我将告诉你如何使用Python取消换行。 什么是换行&#xff1f; 在计算机编程中&#xff0c;换行是指在输入文件或者输…

spring入门-bean

Spring 是一个开源的、轻量级的企业级 Java 应用程序框架&#xff0c;它提供了一种全新的、基于 IoC &#xff08;控制反转&#xff09;和 AOP&#xff08;面向切面编程&#xff09;的软件开发方式&#xff0c;以及众多的企业级应用程序开发组件和 API。使用 Spring 框架可以大…

算法02-入门算法枚举与模拟算法

文章目录 总结大纲要求枚举算法枚举思想枚举举例题目描述 统计因数题目描述 质数判定错误方法一&#xff1a;优化方法1&#xff1a; 用break实现优化优化方法2&#xff1a; sqrt(n) 题目描述 水仙花数题目描述 7744问题实现方法1优化方法2 题目描述 余数相同问题题目描述 特殊自…

安卓Termux搭建web服务器【公网远程手机Android服务器】

文章目录 概述1.搭建apache2.安装cpolar内网穿透3.公网访问配置4.固定公网地址5.添加站点 转载自cpolar极点云的文章&#xff1a;【手机建站】TermuxCpolar内网穿透&#xff0c;搭建可以被外网访问的网站 概述 Termux是一个Android终端仿真应用程序&#xff0c;用于在 Android…

代码随想录算法训练营第三十九天 | 力扣 62.不同路径, 63. 不同路径 II

62.不同路径 题目 62. 不同路径 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多…

Stable Diffusion

文章目录 1.主界面功能介绍2.咒语一&#xff1a;3.参数3.1 采样步数3.2 提示词系数和随机种子 4.魔法书5.模型5.1 模型介绍5.2 模型种类及使用方法一览模型后缀名之谜常见模型种类及使用方法1.大模型。 2.Embedding (Textual inversion)3.Hypernetwork4.LoRA5.VAE模型 1.主界面…

代码随想录算法训练营第四十四天 | 力扣 518. 零钱兑换 II, 377. 组合总和 Ⅳ

完全背包 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品都有无限个&#xff08;也就是可以放入背包多次&#xff09;&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 完全背包和01背包问题唯一不同…

SpringCloud(1)

文章目录 1.认识微服务1.0.学习目标1.1.单体架构1.2.分布式架构1.3.微服务1.4.SpringCloud1.5.总结 1.认识微服务 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢&…

【C数据结构】单链表的基本操作(多功能+思路+图解+代码备注+完整代码+效果图)

文章目录 前言1、单链表的定义2、结点的申请3、单链表的插入3.1、头插3.2、尾插3.3、在第i位插入 4、单链表的删除4.1、头删4.2、尾删4.3、在第i位删除 6、单链表的查找6.1、按值查找6.2、按位查找6.3、两者查找到后的更多的操作&#xff1a;插入操作&#xff1a;6.3.1、在第po…

Java中BitSet和Set统计不重复字符数量时间复杂度和空间复杂度分析

题目:HJ10 字符个数统计 牛客网上一道简单的题目&#xff0c;计算字符串中含有的不同字符的个数&#xff0c;一看这个题目&#xff0c;通常直接意识到方案的基本实现思路&#xff1a;设置一个容器&#xff0c;遍历字符串中的每个字符&#xff0c;若字符与容器中字符相同&#…

chatgpt赋能python:Python中求最大公约数的方法及实现

Python中求最大公约数的方法及实现 在数学中&#xff0c;最大公约数是指两个或多个整数的共同约数中最大的一个。对于Python开发工程师来说&#xff0c;求最大公约数是一个非常基本的操作&#xff0c;尤其在处理算法或数学题目时更加常见。本篇文章就是为了帮助大家更好的理解…

华为OD机试真题B卷 Java 实现【最长子字符串的长度】

一、题目描述 给你一个字符串s&#xff0c;字符串s首尾相连组成一个环形&#xff0c;请你在环形中找出‘o’字符出现了偶数次最长子字符串的长度。 二、输入描述 输入一串小写字母组成的字符串。 三、输出描述 输出一个整数。 四、解题思路 题目要求在给定的环形字符串中…

kong网关安装及konga安装

一、kong安装 安装机器地址&#xff1a;192.168.19.50 1、自定义一个docker网络 [rootmin ~]# docker network create kong-net a9bde4e7d16e4838992000cd5612476b238f7a88f95a07c994a9f57be7f64c10查看网络是否创建成功 [rootmin ~]# docker network ls NETWORK ID NA…

3DMAX车缝线生成器插件使用方法详解

3dMax车缝线生成器插件,用于创建缝合对象和一个对象,以沿样条线或仅通过绘制选定边上的缝合之间的孔。 目前有两种类型的缝线,圆形缝线和平面缝线。对于给定类型的针脚,它们的厚度是最常用的。缝线的长度和间距以及旋转都可以很容易地调整,这些参数也可以随机设置,以创造…

vscode + CMake 构建C语言项目

文章目录 1. 所需工具2. 配置1. 编写顶级目录下的 CMakeLists.txt2. 编写子目录 src 里的 CMakeLists.txt3. 添加测试文件4. 开始构建 1. 所需工具 Visual Stduio Code&#xff08;vscode&#xff09; CMake 简介&#xff1a; CMake 是一个跨平台的 构建工具&#xff0c;用于 …

[论文阅读73]Prefix-Tuning:Optimizing Continuous Prompts for Generation

1. 基本信息 题目论文作者与单位来源年份Prefix-Tuning&#xff1a;Optimizing Continuous Prompts for GenerationXiang Lisa Li等 Stanford UniversityAnnual Meeting of the Association for Computational Linguistics2021 Citations 1009, References 论文链接&#xf…