From 18658935563ad649ac713a326020cc351a8dc023 Mon Sep 17 00:00:00 2001 From: sulinehk Date: Thu, 9 May 2019 20:22:21 +0800 Subject: [PATCH 01/41] fix typo --- 21-minutes-MySQL-basic-entry.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/21-minutes-MySQL-basic-entry.md b/21-minutes-MySQL-basic-entry.md index 3b4f08e..ece9ee4 100644 --- a/21-minutes-MySQL-basic-entry.md +++ b/21-minutes-MySQL-basic-entry.md @@ -119,7 +119,7 @@ COMMENT='用户表信息'; - `NULL`:数据列可包含NULL值; - `NOT NULL`:数据列不允许包含NULL值; - `DEFAULT`:默认值; -- `PRIMARY`:KEY 主键; +- `PRIMARY KEY`:主键; - `AUTO_INCREMENT`:自动递增,适用于整数类型; - `UNSIGNED`:是指数值类型只能为正数; - `CHARACTER SET name`:指定一个字符集; From 841dc9969a303e954d2a1785d0281a3fbb32196b Mon Sep 17 00:00:00 2001 From: sulinehk Date: Thu, 9 May 2019 20:59:59 +0800 Subject: [PATCH 02/41] fix typo --- 21-minutes-MySQL-basic-entry.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/21-minutes-MySQL-basic-entry.md b/21-minutes-MySQL-basic-entry.md index ece9ee4..2418c35 100644 --- a/21-minutes-MySQL-basic-entry.md +++ b/21-minutes-MySQL-basic-entry.md @@ -540,7 +540,7 @@ alter table students rename workmates; ### 清空表数据 > 方法一:`delete from 表名;` -> 方法二:`truncate from "表名";` +> 方法二:`truncate table "表名";` - `DELETE:`1. DML语言;2. 可以回退;3. 可以有条件的删除; - `TRUNCATE:`1. DDL语言;2. 无法回退;3. 默认所有的表内容都删除;4. 删除速度比delete快。 From e54b2bf68b708f433cb1a78f972bfdac803bb06f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=BC=9F=E8=B0=83=E8=B0=83=E2=84=A2?= <398188662@qq.com> Date: Tue, 4 Jun 2019 22:42:17 +0800 Subject: [PATCH 03/41] Create FUNDING.yml --- .github/FUNDING.yml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..3d336b4 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,9 @@ +# These are supported funding model platforms + +github: [jaywcjlove] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +custom: https://jaywcjlove.github.io/sponsor.html From 2701a06526bf34b4b5e6b1d68c3be93341ce4519 Mon Sep 17 00:00:00 2001 From: Woody Wang Date: Thu, 1 Aug 2019 15:09:05 +0800 Subject: [PATCH 04/41] fix: correct typo (#28) --- chapter1/1.1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapter1/1.1.md b/chapter1/1.1.md index cee20fa..329bffc 100644 --- a/chapter1/1.1.md +++ b/chapter1/1.1.md @@ -22,7 +22,7 @@ RDBMS即关系数据库管理系统(Relational Database Management System)的特 ## 数据库分类 -数据库的可多了去了,在维基百科上面有下面这些数据库,并粗略的分了个类别。一看这里面的学问大了去了,还是先搬一些代表性的吧,长长见识,要深入了解各种概念推荐看《数据库系统概论》。 +数据库的分类可多了去了,在维基百科上面有下面这些数据库,并粗略的分了个类别。一看这里面的学问大了去了,还是先搬一些代表性的吧,长长见识,要深入了解各种概念推荐看《数据库系统概论》。 ### 关系数据库 From 7a9faa29b332538b3d82015c3c72510c41aaa5e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=BC=9F=E8=B0=83=E8=B0=83=E2=84=A2?= <398188662@qq.com> Date: Fri, 11 Oct 2019 14:06:15 +0800 Subject: [PATCH 05/41] Update awesome-mysql.md --- awesome-mysql.md | 1 + 1 file changed, 1 insertion(+) diff --git a/awesome-mysql.md b/awesome-mysql.md index b9d96c2..e8bae4f 100644 --- a/awesome-mysql.md +++ b/awesome-mysql.md @@ -57,6 +57,7 @@ _这里是搜集的一些 MySQL 的客户端,也有命令行客户端。_ * [phpMyAdmin](https://www.phpmyadmin.net/) - 一个 PHP 写成的开源软件,意图对 web 上的 MySQL 进行管理。 * [mycli](https://github.com/dbcli/mycli) - 为MySQL命令行客户端,提供语法高亮和提示功能的工具! [![Open-Source Software][OSS Icon]](https://github.com/dbcli/mycli) ![Freeware][Freeware Icon] ![tuijian][tuijian Icon] ![star 5][star5 Icon] +* [dbdiagram](https://dbdiagram.io/) - 创建数据库的实体-关系图的工具。 ## 服务器 From 65712e37931de01e02c1d0ecfbe22a8fe470d6f5 Mon Sep 17 00:00:00 2001 From: jaywcjlove <398188662@qq.com> Date: Mon, 30 Dec 2019 09:36:08 +0800 Subject: [PATCH 06/41] Update awesome-mysql.md --- awesome-mysql.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/awesome-mysql.md b/awesome-mysql.md index e8bae4f..d3c435f 100644 --- a/awesome-mysql.md +++ b/awesome-mysql.md @@ -52,9 +52,9 @@ _这里是搜集的一些 MySQL 的客户端,也有命令行客户端。_ * [Navicat](https://www.navicat.com/products/navicat-for-mysql) - 同样跨平台,同时支持多个数据库系统(MySQL、SQL Server、Oracle)。 * [ElectroCRUD](http://garrylachman.github.io/ElectroCRUD/) - MySQL数据库CRUD应用程序。[![Open-Source Software][OSS Icon]](https://github.com/garrylachman/ElectroCRUD) ![Freeware][Freeware Icon] * [Chrome MySQL Admin](https://www.eisbahn.jp/chrome_mysql_admin) - 一个Chrome插件,是MySQL开发的跨平台、可视化数据库工具。[![Open-Source Software][OSS Icon]](https://github.com/yoichiro/chrome_mysql_admin) ![Freeware][Freeware Icon] -* [Adminer](https://www.adminer.org/) - 一个 PHP 编写的数据库管理工具。 -* [HeidiSQL](http://www.heidisql.com/) - Windows 下的 MySQL 图形化管理工具。 -* [phpMyAdmin](https://www.phpmyadmin.net/) - 一个 PHP 写成的开源软件,意图对 web 上的 MySQL 进行管理。 +* [Adminer](https://www.adminer.org/) - 一个 PHP 编写的数据库管理工具。[![Open-Source Software][OSS Icon]](https://github.com/vrana/adminer) ![Freeware][Freeware Icon] +* [HeidiSQL](http://www.heidisql.com/) - Windows 下的 MySQL 图形化管理工具。[![Open-Source Software][OSS Icon]](https://github.com/HeidiSQL/HeidiSQL) ![Freeware][Freeware Icon] +* [phpMyAdmin](https://www.phpmyadmin.net/) - 一个 PHP 写成的开源软件,意图对 web 上的 MySQL 进行管理。[![Open-Source Software][OSS Icon]](https://github.com/phpmyadmin/phpmyadmin) * [mycli](https://github.com/dbcli/mycli) - 为MySQL命令行客户端,提供语法高亮和提示功能的工具! [![Open-Source Software][OSS Icon]](https://github.com/dbcli/mycli) ![Freeware][Freeware Icon] ![tuijian][tuijian Icon] ![star 5][star5 Icon] * [dbdiagram](https://dbdiagram.io/) - 创建数据库的实体-关系图的工具。 From 23233a905767b758c057cf1d46864564d6e42e0c Mon Sep 17 00:00:00 2001 From: jaywcjlove <398188662@qq.com> Date: Mon, 30 Dec 2019 10:50:30 +0800 Subject: [PATCH 07/41] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0docker=E9=83=A8?= =?UTF-8?q?=E7=BD=B2MySQL=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 39 +-- chapter2/2.3.md | 290 +++++++-------------- chapter2/2.4.md | 318 +++++++++++++++-------- chapter2/2.5.md | 654 ++++++++---------------------------------------- chapter2/2.6.md | 588 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 1015 insertions(+), 874 deletions(-) create mode 100644 chapter2/2.6.md diff --git a/README.md b/README.md index 82d8337..ed5f830 100644 --- a/README.md +++ b/README.md @@ -62,23 +62,28 @@ MariaDB,是 MySQL server 的一个由社区开发的分支,MariaDB大部分 - [查看安装目录](chapter2/2.2.md#查看安装目录) - [MariaDB切换MySQL](chapter2/2.2.md#mariadb切换mysql) - [卸载 MySQL 软件](chapter2/2.2.md#卸载-mysql-软件) -- 2.3 [启动数据库设置初始密码](chapter2/2.3.md) - - [命令行启动关闭重启MySQL服务](chapter2/2.3.md#命令行启动关闭重启mysql服务) - - [图像界面启动关闭重启MySQL服务](chapter2/2.3.md#图像界面启动关闭重启mysql服务) - - [查看初始密码](chapter2/2.3.md#查看初始密码) - - [设置初始化密码](chapter2/2.3.md#设置初始化密码) - - [启动报错处理](chapter2/2.3.md#启动报错处理) -- 2.4 [MySQL工具](chapter2/2.4.md) - - [命令行使用程序](chapter2/2.4.md#命令行使用程序) - - [MySQL Workbench客户端](chapter2/2.4.md#mysql-workbench客户端) - - [常用图形管理工具](chapter2/2.4.md#常用图形管理工具) - - [MyCli替代MySQL的mysql命令行工具](chapter2/2.4.md#mycli替代mysql的mysql命令行工具) -- 2.5 [MySQL配置修改](chapter2/2.5.md) - - [MySQL安装目录说明](chapter2/2.5.md#mysql安装目录说明) - - [配置文件的位置](chapter2/2.5.md#配置文件的位置) - - [Windows系统配置文件读取](chapter2/2.5.md#windows系统配置文件读取) - - [Linux系统配置文件读取](chapter2/2.5.md#linux系统配置文件读取) - - [配置文件内容](chapter2/2.5.md#配置文件内容) +- 2.3 [Docker 安装 MySQL](chapter2/2.3.md) + - [快速启动一个 MySQL 服务器实例](chapter2/2.3.md#快速启动一个-mysql-服务器实例) + - [通过命令行访问 MySQL 容器](#通过命令行访问-mysql-容器) + - [使用 MySQL 自定义配置文件](#使用-mysql-自定义配置文件) + - [使用 stack 部署 MySQL](#使用-stack-部署-mysql) +- 2.3 [启动数据库设置初始密码](chapter2/2.4.md) + - [命令行启动关闭重启MySQL服务](chapter2/2.4.md#命令行启动关闭重启mysql服务) + - [图像界面启动关闭重启MySQL服务](chapter2/2.4.md#图像界面启动关闭重启mysql服务) + - [查看初始密码](chapter2/2.4.md#查看初始密码) + - [设置初始化密码](chapter2/2.4.md#设置初始化密码) + - [启动报错处理](chapter2/2.4.md#启动报错处理) +- 2.4 [MySQL工具](chapter2/2.5.md) + - [命令行使用程序](chapter2/2.5.md#命令行使用程序) + - [MySQL Workbench客户端](chapter2/2.5.md#mysql-workbench客户端) + - [常用图形管理工具](chapter2/2.5.md#常用图形管理工具) + - [MyCli替代MySQL的mysql命令行工具](chapter2/2.5.md#mycli替代mysql的mysql命令行工具) +- 2.5 [MySQL配置修改](chapter2/2.6.md) + - [MySQL安装目录说明](chapter2/2.6.md#mysql安装目录说明) + - [配置文件的位置](chapter2/2.6.md#配置文件的位置) + - [Windows系统配置文件读取](chapter2/2.6.md#windows系统配置文件读取) + - [Linux系统配置文件读取](chapter2/2.6.md#linux系统配置文件读取) + - [配置文件内容](chapter2/2.6.md#配置文件内容) #### 第3章 数据库的基本操作 diff --git a/chapter2/2.3.md b/chapter2/2.3.md index 75968d7..078c2b8 100644 --- a/chapter2/2.3.md +++ b/chapter2/2.3.md @@ -1,259 +1,139 @@ - -启动数据库设置初始密码 +Docker 安装 MySQL === -这一小节介绍在Mac OS、Linux、Windows上启动关闭重启MySQL服务,以及部分图形化界面对服务的操控。安装完成后,可以使用 service 命令启动 mysql 服务,在Mac上`service`命令不存在。 +通过 Docker 搭建 MySQL 数据库环境,同时能同时启动多个 MySQL 版本。在安装前,最好上 [docker](https://hub.docker.com/_/mysql) 官网上看一下 MySQL 的版本,更具具体需求版本安装 MySQL,假设你已经搭建好 Docker 环境下面介绍如何创建一个 MySQL 服务器实例。 + -## 命令行启动关闭重启MySQL服务 +- [快速启动一个 MySQL 服务器实例](#快速启动一个-mysql-服务器实例) +- [通过命令行访问 MySQL 容器](#通过命令行访问-mysql-容器) +- [使用 MySQL 自定义配置文件](#使用-mysql-自定义配置文件) +- [使用 stack 部署 MySQL](#使用-stack-部署-mysql) +- [参考资料](#参考资料) -在命令行终端启动 MySQL 非常方便,下面大概介绍几个平台通过命令启动服务的方法。 + +## 快速启动一个 MySQL 服务器实例 -### 查看服务是否启动 +下面,我们通过通过 [docker](https://hub.docker.com/_/mysql) 镜像,或者 [MySQL](https://hub.docker.com/r/mysql/mysql-server) 官方镜像,进行快速启动一个实例。 ```bash -# 还可以这么查看,MySQL服务器是否启动 -ps -ef | grep mysqld - -# 查看服务运行的状态 -service mysqld status +# Docker 官方镜像 +$ docker image pull library/mysql:8.0.18 +# MySQL 官方镜像 +$ docker image pull mysql/mysql-server:8.0.18 ``` -### Mac OS X 下命令操作 - -在 Mac 系统下操作起来就非常方便了。安装完之后就可以在终端上运行全局命令 mysql.server 命令,假设这个命令没有,你在系统的MySQL安装目录中找到 mysql.server 命令,运行它是一样的效果。 +上面命令中 `docker image pull` 是抓取 `image` 镜像的命令。`library/mysql:8.0.18` 是指定镜像仓库的位置和相对应的 `tag` 版本。由于 `Docker` 官方提供的 image 文件,都放在 [`library`](https://hub.docker.com/r/library/) 组里面,所以它的是默认组,可以省略。因此,上面的 Docker 命令可以写成下面这样。 ```bash -mysqld start -mysql.server start # 1. 启动 -mysql.server stop # 2. 停止 -mysql.server restart # 3. 重启 +# Docker 官方镜像拉取,简写 +$ docker image pull mysql:8.0.18 ``` -当你安装过 MySQL 并没有找到 mysql.server 命令,那这时你需要找到安装目录中的 mysql.server 命令工具了,如 `sudo /usr/local/mysql/support-files/mysql.server start` - -### Linux 下命令操作 - -Linux生态系统中对服务的操作有点区别。其实在 Mac 系统下也可以直接 `mysqld start` 来启动服务。 - -1. 启动:`service mysqld start` -2. 停止:`service mysqld stop` -3. 重启:`service mysqld restart` -3. 查看状态:`service mysqld status` -4. 查看状态:`systemctl status mysqld.service` - -systemctl是一个systemd工具,主要负责控制systemd系统和服务管理器,在 Linux 系统中可以通过它来启动 mysql 服务。 - -启动过程中有可能会报错,错误处理,通过 **systemctl status mysqld.service** 和 **journalctl -xe** 命令查看服务启动失败的原因。 +拉取镜像成功以后,就可以在本机看到这个 `image` 文件了。 ```bash -systemctl status mysqld.service - - ● mysqld.service - SYSV: MySQL database server. - Loaded: loaded (/etc/rc.d/init.d/mysqld) - Active: failed (Result: exit-code) since 三 2016-11-02 22:14:36 EDT; 11s ago - Docs: man:systemd-sysv-generator(8) - Process: 14940 ExecStart=/etc/rc.d/init.d/mysqld start (code=exited, status=1/FAILURE) - - 11月 02 22:14:34 localhost.localdomain systemd[1]: Starting SYSV: MySQL database server.... - 11月 02 22:14:35 localhost.localdomain mysqld[14940]: MySQL Daemon failed to start. - 11月 02 22:14:35 localhost.localdomain mysqld[14940]: Starting mysqld: [FAILED] - 11月 02 22:14:36 localhost.localdomain systemd[1]: mysqld.service: control process exited, code=exited status=1 - 11月 02 22:14:36 localhost.localdomain systemd[1]: Failed to start SYSV: MySQL database server.. - 11月 02 22:14:36 localhost.localdomain systemd[1]: Unit mysqld.service entered failed state. - 11月 02 22:14:36 localhost.localdomain systemd[1]: mysqld.service failed. +$ docker image ls ``` -```bash -# 查看配置文件 my.cnf 的位置 -whereis my.cnf -# 输出: my: /etc/my.cnf - -# 编辑 -vi /etc/my.cnf -``` - -里面有个 log_error=/var/log/mysqld.log 的配置,通过命令 **tail -25 /var/log/mysqld.log** 查看 MySQL 错误日志 +现在,运行这个 image 文件。 ```bash -2016-01-20T10:00:19.935771Z 0 [ERROR] /usr/sbin/mysqld: Can't create/write to file '/var/run/mysqld/mysqld.pid' (Errcode: 2 - No such file or directory) -2016-01-20T10:00:19.935795Z 0 [ERROR] Can't start server: can't create PID file: No such file or directory -160120 18:00:20 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended +# Docker 官方镜像 +$ docker run --name mysqlname \ + -p 3308:3306 \ + -e MYSQL_ROOT_PASSWORD=my123456 \ + -v /etc/localtime:/etc/localtime:ro \ + --rm \ + -d mysql:8.0.18 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci +# MySQL 官方镜像 +$ docker run -d --name mysqlname mysql/mysql-server:8.0.18 --character-set-server=utf8mb4 --collation-server=utf8mb4_col ``` -上面日志错误说,MySQL服务在启动的时候,不能创建pid文件。前去看一下 mysqld 文件是否存在,不存在创建 mysqld 目录。 - -```bash -# 创建 mysqld 目录 -mkdir -p /var/run/mysqld/ - -# 启动MySQL -/etc/init.d/mysqld start - -# 输出下面内容 -# Starting mysqld (via systemctl): Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe" for details. -# [FAILED] -``` +上面命令的各个参数含义如下: -创建 mysqld 目录还是启动报错,按照下面命令尝试解决问题 +- `--name mysqlname` 容器的名字叫做 `mysqlname` +- `-p 3308:3306` 容器 MySQL 默认端口 `3306` 射到本机的 `3308` 端口。 +- `-d` 在后台运行容器并打印容器ID。 +- `--rm` 停止运行后,自动删除容器文件。 +- `-e MYSQL_ROOT_PASSWORD=my123456` 设置环境变量 `MYSQL_ROOT_PASSWORD` 值为 `my123456` 来设置 `root` 密码,[更多环境变量参考](https://dev.mysql.com/doc/refman/8.0/en/environment-variables.html)。 +- `--character-set-server=utf8mb4 --collation-server=utf8mb4_col` 该命令以默认字符集 `utf8mb4` 和数据库默认排序规则 `utf8mb4` 启动 `MySQL` 服务,可以将许多配置选项作为标志传递给 mysqld。这将使您可以灵活地自定义容器,而无需 `cnf` 配置文件,配置 `MySQL Server` 的另一种方法是准备一个配置文件,并将其安装在容器内服务器配置文件的位置。有关详细信息,请参见[持久数据和配置更改](https://dev.mysql.com/doc/refman/8.0/en/docker-mysql-more-topics.html#docker-persisting-data-configuration)。 +- `-v /etc/localtime:/etc/localtime:ro` 是让容器的时钟与宿主机时钟同步,避免时区的问题,`ro` 是 `read only` 的意思,就是只读。 -```shell -ls -ld /var/run/mysqld/ - -# mysqld 文件夹如果不存在通过命令创建 - -mkdir /var/run/mysqld - -# 会输出下面内容 -# drwxr-xr-x. 2 mysql mysql 60 11月 2 22:15 /var/run/mysqld/ -chown mysql.mysql /var/run/mysqld/ -/etc/init.d/mysqld start -``` - -通过查看目录 /var/run/mysqld/ 的属主和属组还是root,mysql并不能在其中创建文件,后修改该目录的属主和属组,启动OK。 - -创建脚本`cat start-mysql.sh`,这个问题每次都会出现,因为Centos7上MySQL5.7.12系统不兼容启动失败, 每次开机后手动执行,或放在定时调度里。 - -```shell -#!/bin/bash - -mkdir -p /var/run/mysqld/ -chown mysql.mysql /var/run/mysqld/ - -/etc/init.d/mysqld start -``` - -### Windows 下命令操作 - -Windows平台操作起来有点不顺手,个人感觉 Windows 的DOS太难用了,下面简单的介绍一下操作过程。先找到 MySQL 的安装位置,如我的电脑的安装位置是:C:\Program Files\MySQL\MySQL Server 5.7,我就执行这样的操作:开始->运行->输入“cmd”开启命令行,然后输入“C:”。通过命令进入到 MySQL Server 5.7 的 bin 目录下,输入 MySQL 命令行的服务启用命令,如下: +可以通过 `容器id`/`容器名称` 查看 MySQL 日志 ```bash -# net start [mysql服务名] - -# 启动 mysql 服务 -net start mysql - -# 停止 mysql 服务 -net stop mysql +$ docker logs mysqlname ``` -有很多情况可能导致无法启动 MySQL,常见解决方法如下: - -1. 在 CMD 命令中断运行这条命令 C:\Program Files\MySQL\MySQL Server 5.7\bin\mysqladmin-u root -p shutdown 来关闭MYSQL,如果有密码根据提示输入密码即可。 -2. 在 CMD 命令中断,执行net start mysql启动 MySQL,参考上面方法来启动 MySQL 服务。 - - -## 图像界面启动关闭重启MySQL服务 - -### Mac OS X 下操作 +## 通过命令行访问 MySQL 容器 -在 Mac 系统下如果你官方下载安装就可以在`系统偏好设置` > `MySQL` 里面点击 `Stop MySQL Server` 按钮进行启动关闭。 - -![MySQL](../img/2.3.1.png) - -通过 [XAMMPP](https://www.apachefriends.org/zh_cn/index.html) 安装的 MySQL ,这个软件安装之后会自动安装 Apache + MySQL + PHP 对于初学者特别方便,新版本是默认安装`Apache + MariaDB + PHP + Perl`。 - -### Windows 下操作 - -Windows 系统下启动关闭重启MySQL服务。 - -## 查看初始密码 - -默认情况下MySQL是有个初始密码,知道了初始密码才能改密码。 - -```bash -[root@localhost home]# grep 'temporary password' /var/log/mysqld.log - -2017-07-17T13:40:11.842835Z 1 [Note] A temporary password is generated for root@localhost: b&iu(sf;>ws -``` - -## 设置初始化密码 - -启动后我们需要简单配置一下 mysql ,默认安装以后 mysql 的 root 用户是没有密码的,对于生产环境来说,这肯定是不行的,另外还有一些安全相关的设置,可以使用下面这行命令去配置一下,它是一个向导,问你一些问题,你要给出答案,比如是否要设置 root 用户的密码, 密码是什么等等。 +可以通过[容器名字]或者[容器 ID]进入 MySQL 容器 ```bash -mysql_secure_installation - -Enter current password for root (enter for none): -# 解释:输入当前 root 用户密码,默认为空,直接回车。 - -Set root password? [Y/n] y -# 解释:要设置 root 密码吗?输入 y 表示愿意。 - -Remove anonymous users? [Y/n] y -# 解释:要移除掉匿名用户吗?输入 y 表示愿意。 - -Disallow root login remotely? [Y/n] y -# 解释:不想让 root 远程登陆吗?输入 y 表示愿意。 - -Remove test database and access to it? [Y/n] y -# 解释:要去掉 test 数据库吗?输入 y 表示愿意。 - -Reload privilege tables now? [Y/n] y -# 解释:想要重新加载权限吗?输入 y 表示愿意。 - +$ docker exec -it mysqlname bash ``` +## 使用 MySQL 自定义配置文件 -你安装成功后,可以查看一下 MySQL 版本,`mysql --version`,如果版本并非你所使用的版本,你可以参考这里进行升级数据库操作[Centos6下升级MySQL数据库](../chapter17/1.2.md)。 - -## 启动报错处理 +MySQL 的默认配置可以在 `/etc/mysql/my.cnf` 中找到,该目录可以包含附加目录,例如 `/etc/mysql/conf.d` 或 `/etc/mysql/mysql.conf.d`。 请检查 MySQL 镜像本身中的相关文件和目录,以获取更多详细信息。 -下面是我尝试在Mac上启动MySQL报错 - -**启动失败** +如果 `/my/custom/config-file.cnf` 是自定义配置文件的路径和名称,则可以像这样启动 MySQL 容器(请注意,此命令仅使用自定义配置文件的目录路径): ```bash -sudo /usr/local/mysql/support-files/mysql.server start -Password: -Starting MySQL -. ERROR! The server quit without updating PID file (/usr/local/mysql/data/localhost.pid +$ docker run --name mysqlname \ + --rm \ + -p 3306:3306 \ + -e MYSQL_ROOT_PASSWORD=my123456 \ + -v /my/custom:/etc/mysql/conf.d \ + -v /etc/localtime:/etc/localtime:ro \ + -d mysql:8.0.18 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci ``` -通过日志查看报错信息 - -```bash -# 编辑配置文件 -sudo vim /etc/my.cnf - -# 在配置文件最后添加一行错误日志输入的配置 -log_error = /usr/local/mysql/data/error.log -``` +上面命令将启动一个新的容器 `mysqlname`,其中 MySQL 实例使用 `/etc/mysql/my.cnf` 和 `/etc/mysql/conf.d/config-file.cnf` 中的组合启动设置,其中后者的设置优先。 -上面添加完成之后,重新启动再查看日志 +配置修改,可以通过【容器名字】或者【容器 ID】来重启 MySQL,可让配置生效。 ```bash -sudo /usr/local/mysql/support-files/mysql.server start -tail -100 /usr/local/mysql/data/error.log +docker restart mysqlname ``` -### 日志显示错误一 - -```bash -2017-01-19T03:48:24.695505Z 0 [ERROR] InnoDB: Unable to lock ./ibdata1 error: 35 -2017-01-19T03:48:24.695540Z 0 [Note] InnoDB: Check that you do not already have another mysqld process using the same InnoDB data or log files. -``` +## 使用 stack 部署 MySQL -日志显示 mysqld 进程使用相同的InnoDB data 文件或日志文件,通过 `ps -ef | grep mysql | grep -v grep` 查看是否有该进程,发现果然有,这时候你需要杀掉该进程,我在我本地是杀不掉的,于是我尝试使用 mysqld 启动MySQL,启动成功。 +MySQL 的实例 `stack.yml`,下面实例使用 `root`/`example` 作为 `用户`/`密码` 凭据,`default_authentication_plugin=mysql_native_password` 这个是因 `MySQL 8` 的安全机制升级而需要修改的配置,不配置的话将无法登录管理: -```bash -sudo /usr/local/mysql/bin/mysqld restart -``` +```yml +version: '3.1' +services: -### 日志显示错误二 + db: + image: mysql:8.0.18 + command: --default-authentication-plugin=mysql_native_password + restart: always + ports: + - "3306:3306" + volumes: + # - /my/custom:/etc/mysql/conf.d + - /etc/localtime:/etc/localtime:ro + environment: + MYSQL_ROOT_PASSWORD: example + adminer: + image: adminer + restart: always + ports: + - 8080:8080 ``` -[ERROR] InnoDB: The innodb_system data file 'ibdata1' must be writable -``` - -上面的错误信息说的是 `ibdata1` 文件不可写。`ibdata1` 是InnoDB的共有表空间,默认情况下会把表空间存放在一个文件`ibdata1`中,(此原因会造成这个文件越来越大)。所以大概能猜测是 mysql 用户的权限不够了。所以再给 `ibdata1` 目录分配一下权限即可。 -这个时候需要查看一下mysql 安装目录权限。使用 chown 改变了整个 mysql 目录的权限,这是一个非常不好的习惯。 +通过下面命令运行 `stack`,等待它初始化,然后可以访问 `http://swarm-ip:8080`,`http://localhost:8080`, 或者 `http://host-ip:8080`,web 界面来管理 MySQL,有 web 管理工具是因为,在这个 stack 中我们除了添加了 `db` 的 `mysql` 容器,还添加了个添加了个额外的 `adminer` 容器,对外暴露了 `8080` 端口。 ```bash -cd /usr/local/mysql -sudo chown -R _mysql:_mysql * +$ docker stack deploy -c stack.yml mysql +# 或者使用 docker-compose,方便开发模式下调试。 +$ docker-compose -f stack.yml up ``` -这里需要注意的是,Mac OS系统下,mysql 的用户组和用户名都是 `_mysql`,Linux 是 `mysql`。然后再重启 MySQL 你就完事大吉了。 +## 参考资料 -上面调试定位错误的方法非常有用。我通过这个方法多次解决各种问题。 \ No newline at end of file +- [Docker 官方镜像地址](https://hub.docker.com/_/mysql) +- [Docker 官方 Github 文档地址](https://github.com/docker-library/docs/tree/master/mysql) +- [MySQL 官方资料:使用 Docker 在 Linux 上部署 MySQL](https://dev.mysql.com/doc/refman/8.0/en/docker-mysql-more-topics.html) \ No newline at end of file diff --git a/chapter2/2.4.md b/chapter2/2.4.md index b3bc9dd..449c72f 100644 --- a/chapter2/2.4.md +++ b/chapter2/2.4.md @@ -1,148 +1,258 @@ - -MySQL工具 +启动数据库设置初始密码 === -由于 MySQL 软件是基于 C/S 模式的数据库管理系统(一个客户机—服务器DBMS),因此在日常各种工作中,可以通过各种客户端软件来与 MySQL 数据库管理系统关联。MySQL,需要有一个客户机,即你需要用来与MySQL打交道(给MySQL 提供要执行的命令)的一个应用。有许多客户机应用可供选择,但在学习MySQL(确切地说,在编写 和测试MySQL脚本时),最好是使用专门用途的实用程序。官方自带 MySQL Command Line Client 和 MySQL-Workbench 客户端。 +这一小节介绍在Mac OS、Linux、Windows上启动关闭重启MySQL服务,以及部分图形化界面对服务的操控。安装完成后,可以使用 service 命令启动 mysql 服务,在Mac上`service`命令不存在。 -MySQL 官方数据库管理系统提供了许多的命令工具,这些工具可以用来管理 MySQL 服务器,对数据库进行访问、管理 MySQL 用户以及数据库备份和恢复工具等。而且 MySQL 提供图形化管理工具,这样操作更简单。 +## 命令行启动关闭重启MySQL服务 -## 命令行使用程序 +在命令行终端启动 MySQL 非常方便,下面大概介绍几个平台通过命令启动服务的方法。 -每个 MySQL 安装都有一个名为 MySQL 的简单命令行实用程序。这 个实用程序没有下拉菜单、流行的用户界面、鼠标支持或任何类似的东西。 +### 查看服务是否启动 -#### MySQL 服务器端使用工具程序 +```bash +# 还可以这么查看,MySQL服务器是否启动 +ps -ef | grep mysqld -1. `mysqld` - SQL 后台程序(即 MySQL 服务器进程)。该程序必须启动运行,才能连接服务器来访问数据库。 -2. `mysqld_safe` - 服务器启动脚本,可以通过 mysqld_safe 来启动 mysqld 服务器。mysqld_safe 增加了一些安全特性,例如当前出现错误时重启服务器并向错误日至文件写入运行时间信息。 -3. `mysql.server` - 服务器启动脚本。该脚本用于使用包含为特定级别的运行启动服务的脚本的运行目录的系统。 -4. `mysqld_multi` - 服务器启动脚本,可以启动或停止系统上安装的多个服务器。 +# 查看服务运行的状态 +service mysqld status +``` -#### MySQL 安装相关程序 +### Mac OS X 下命令操作 -1. `comp_err` - 编译MySQL错误信息文件。 -2. `mysql_install_db` - 该脚本用默认权限创建MySQL授权表。通常只是在系统上首次安装MySQL时执行一次。 -3. `mysql_plugin` - 配置MySQL服务器插件。 -4. `mysql_secure_installation` - 提高MySQL安装的安全性。 -5. `mysql_ssl_rsa_setup` - 创建 SSL/RSA 文件。 -6. `mysql_tzinfo_to_sql` - 加载时区表。 -7. `mysql_upgrade` - 检查并升级MySQL表。 +在 Mac 系统下操作起来就非常方便了。安装完之后就可以在终端上运行全局命令 mysql.server 命令,假设这个命令没有,你在系统的MySQL安装目录中找到 mysql.server 命令,运行它是一样的效果。 -#### MySQL 客户端使用工具程序 +```bash +mysqld start +mysql.server start # 1. 启动 +mysql.server stop # 2. 停止 +mysql.server restart # 3. 重启 +``` -1. `mysql` - MySQL命令行工具。 -2. `mysqladmin` - 用于管理MySQL服务器客户端。 -3. `mysqlcheck` - 表维护程序。 -4. `mysqldump` - 数据库备份程序。 -5. `mysqlimport` - 数据导入程序。 -6. `mysqlpump` - 数据库备份程序。 -7. `mysqlsh` - Shell下执行 mysql 命令。 -8. `mysqlshow` - 显示数据库、表和列的信息,。 -9. `mysqlslap` - 负载仿真客户端。 +当你安装过 MySQL 并没有找到 mysql.server 命令,那这时你需要找到安装目录中的 mysql.server 命令工具了,如 `sudo /usr/local/mysql/support-files/mysql.server start` -#### MySQL 程序开发工具 +### Linux 下命令操作 -1. `mysql_config` - 编译客户端的显示选项。 -2. `my_print_defaults` - 显示选项文件的选项。 -3. `resolve_stack_dump` - 解析数字堆栈跟踪转储到符号。 +Linux生态系统中对服务的操作有点区别。其实在 Mac 系统下也可以直接 `mysqld start` 来启动服务。 -#### MySQL 管理实用程序 +1. 启动:`service mysqld start` +2. 停止:`service mysqld stop` +3. 重启:`service mysqld restart` +3. 查看状态:`service mysqld status` +4. 查看状态:`systemctl status mysqld.service` -1. `innochecksum` - 离线InnoDB文件校验工具。 -2. `myisam_ftdump` - 显示全文索引信息。 -3. `myisamchk` - MyISAM表维护实用工具。 -4. `myisamlog` - 显示MyISAM日志文件内容。 -5. `myisampack` - 产生压缩,只读MyISAM表。 -6. `mysql_config_editor` - MySQL的配置实用程序。 -7. `mysqlbinlog` - 处理二进制日志文件的效用。 -8. `mysqldumpslow` - 总结慢查询日志文件。 +systemctl是一个systemd工具,主要负责控制systemd系统和服务管理器,在 Linux 系统中可以通过它来启动 mysql 服务。 -#### 杂项程序 +启动过程中有可能会报错,错误处理,通过 **systemctl status mysqld.service** 和 **journalctl -xe** 命令查看服务启动失败的原因。 -1. `lz4_decompress` - 解压缩mysqlpump lz4压缩输出。 -2. `perror` - 解释错误代码。 -3. `replace` - 一个字符串替换工具。 -4. `resolveip` - 解析主机名到IP地址或反之亦然。 -5. `zlib_decompress` - 解压缩mysqlpump zlib压缩输出。 +```bash +systemctl status mysqld.service + + ● mysqld.service - SYSV: MySQL database server. + Loaded: loaded (/etc/rc.d/init.d/mysqld) + Active: failed (Result: exit-code) since 三 2016-11-02 22:14:36 EDT; 11s ago + Docs: man:systemd-sysv-generator(8) + Process: 14940 ExecStart=/etc/rc.d/init.d/mysqld start (code=exited, status=1/FAILURE) + + 11月 02 22:14:34 localhost.localdomain systemd[1]: Starting SYSV: MySQL database server.... + 11月 02 22:14:35 localhost.localdomain mysqld[14940]: MySQL Daemon failed to start. + 11月 02 22:14:35 localhost.localdomain mysqld[14940]: Starting mysqld: [FAILED] + 11月 02 22:14:36 localhost.localdomain systemd[1]: mysqld.service: control process exited, code=exited status=1 + 11月 02 22:14:36 localhost.localdomain systemd[1]: Failed to start SYSV: MySQL database server.. + 11月 02 22:14:36 localhost.localdomain systemd[1]: Unit mysqld.service entered failed state. + 11月 02 22:14:36 localhost.localdomain systemd[1]: mysqld.service failed. +``` -MySQL 命令行实用程序是使用最多的实用程序之一,它对于快速测试 和执行脚本非常有价值。事实上,本书中使用的所有输出例子都是从 MySQL 命令行输出中抓取的。 +```bash +# 查看配置文件 my.cnf 的位置 +whereis my.cnf +# 输出: my: /etc/my.cnf -## MySQL Workbench客户端 +# 编辑 +vi /etc/my.cnf +``` -对于命令行客户端软件,想熟悉使用,必需对每一个相关命令需要非常熟悉,这对于现在初级 MySQL 用户来说,还得玩儿上好长一段时间。于是官方专卖开发了图形化客户端软件 [MySQL Workbench](http://dev.mysql.com/downloads/workbench/),进入 [MySQL Workbench](http://dev.mysql.com/downloads/workbench/) 进行下载安装程序,这里安装我是按照默认选项安装,直接不停的下一步。 +里面有个 log_error=/var/log/mysqld.log 的配置,通过命令 **tail -25 /var/log/mysqld.log** 查看 MySQL 错误日志 -![MySQL](../img/1.4.1.jpg) +```bash +2016-01-20T10:00:19.935771Z 0 [ERROR] /usr/sbin/mysqld: Can't create/write to file '/var/run/mysqld/mysqld.pid' (Errcode: 2 - No such file or directory) +2016-01-20T10:00:19.935795Z 0 [ERROR] Can't start server: can't create PID file: No such file or directory +160120 18:00:20 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended +``` -MySQL Workbench 主要是为数据库管理员和开发人员提供了一整套可视化数据看操作环境,主要有以下功能: +上面日志错误说,MySQL服务在启动的时候,不能创建pid文件。前去看一下 mysqld 文件是否存在,不存在创建 mysqld 目录。 -- 数据看设计和模型建立 -- SQL开发(取代MySQL Query Browser) -- 数据看管理(取代MySQL Administrator) +```bash +# 创建 mysqld 目录 +mkdir -p /var/run/mysqld/ -MySQL Workbench以前老版本分两个版本,MySQL Workbench Community Edition(也叫 MySQL Workbench OSS,社区版本)和 MySQL Workbench Standard Edition (MySQL Workbench SE,商业版),商业版是收费的,现在官网只看到社区版,官网不在提供商业版的技术支持和更新了。 +# 启动MySQL +/etc/init.d/mysqld start -## 常用图形管理工具 +# 输出下面内容 +# Starting mysqld (via systemctl): Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe" for details. +# [FAILED] +``` -MySQL Workbench 功能繁缛,操作复杂,而且在 Mac 上面启动慢操作不方便。对于太多大段英文操作界面十分不友好,长得也特别丑陋,所以在 Mac 上推荐一款界面简单、大方、好用的图形管理工具 [Sequel Pro](http://www.sequelpro.com/) 。这也是一个开源免费的软件,[源码在这里](https://github.com/sequelpro/sequelpro) 如果你有兴趣可研究研究它的源码,做出你的一点贡献。 +创建 mysqld 目录还是启动报错,按照下面命令尝试解决问题 -Sequel Pro 安装也特别简单,有着 Mac 安装应用的风范,下载之后打开 dmg 拖拽 APP 到你的应用程序文件夹即可安装成功,下面是它漂亮的界面: +```shell +ls -ld /var/run/mysqld/ -![MySQL](../img/1.4.2.jpg) -![MySQL](../img/1.4.3.jpg) -![MySQL](../img/1.4.4.jpg) +# mysqld 文件夹如果不存在通过命令创建 -我在开发过程中一直使用它来配合命令行终端来使用。在这个过程中熟悉了不少命令,为今后在 Linux 服务器中也玩儿得如鱼得水,非常happy!个人小建议,终归是要熟悉一些命令行的,因为部署到生产环境,极为可能连操作系统都没有图形界面。 +mkdir /var/run/mysqld +# 会输出下面内容 +# drwxr-xr-x. 2 mysql mysql 60 11月 2 22:15 /var/run/mysqld/ +chown mysql.mysql /var/run/mysqld/ +/etc/init.d/mysqld start +``` -## MyCli替代MySQL的mysql命令行工具 +通过查看目录 /var/run/mysqld/ 的属主和属组还是root,mysql并不能在其中创建文件,后修改该目录的属主和属组,启动OK。 -[MyCli](http://mycli.net/) 是一个 MySQL 命令行工具,支持自动补全和语法高亮。也可用于 MariaDB 和 Percona。推荐好用的图形界面也得推荐好用的命令行工具,这个工具也是免费开源的,[源码在这里](https://github.com/dbcli/mycli) +创建脚本`cat start-mysql.sh`,这个问题每次都会出现,因为Centos7上MySQL5.7.12系统不兼容启动失败, 每次开机后手动执行,或放在定时调度里。 +```shell +#!/bin/bash + +mkdir -p /var/run/mysqld/ +chown mysql.mysql /var/run/mysqld/ + +/etc/init.d/mysqld start +``` -![MySQL](../img/1.4.5.gif) +### Windows 下命令操作 -看上图就已经高潮了吧,它的安装也毫无压力,不费吹灰之力就搞定安装,没有复杂的配置,[MyCli](http://mycli.net/)实在太厉害了,不得不推荐它。安装方法如下: +Windows平台操作起来有点不顺手,个人感觉 Windows 的DOS太难用了,下面简单的介绍一下操作过程。先找到 MySQL 的安装位置,如我的电脑的安装位置是:C:\Program Files\MySQL\MySQL Server 5.7,我就执行这样的操作:开始->运行->输入“cmd”开启命令行,然后输入“C:”。通过命令进入到 MySQL Server 5.7 的 bin 目录下,输入 MySQL 命令行的服务启用命令,如下: ```bash +# net start [mysql服务名] + +# 启动 mysql 服务 +net start mysql + +# 停止 mysql 服务 +net stop mysql +``` + +有很多情况可能导致无法启动 MySQL,常见解决方法如下: -# 如果你已会安装 Python 包,那就简单了: -$ pip install mycli +1. 在 CMD 命令中断运行这条命令 C:\Program Files\MySQL\MySQL Server 5.7\bin\mysqladmin-u root -p shutdown 来关闭MYSQL,如果有密码根据提示输入密码即可。 +2. 在 CMD 命令中断,执行net start mysql启动 MySQL,参考上面方法来启动 MySQL 服务。 -# 只能在 Mac OS X 中安装 -$ brew update && brew install mycli -# 只能在debian 或者 ubuntu 系统中安装 -$ sudo apt-get install mycli +## 图像界面启动关闭重启MySQL服务 + +### Mac OS X 下操作 + +在 Mac 系统下如果你官方下载安装就可以在`系统偏好设置` > `MySQL` 里面点击 `Stop MySQL Server` 按钮进行启动关闭。 + +![MySQL](../img/2.3.1.png) + +通过 [XAMMPP](https://www.apachefriends.org/zh_cn/index.html) 安装的 MySQL ,这个软件安装之后会自动安装 Apache + MySQL + PHP 对于初学者特别方便,新版本是默认安装`Apache + MariaDB + PHP + Perl`。 + +### Windows 下操作 + +Windows 系统下启动关闭重启MySQL服务。 + +## 查看初始密码 + +默认情况下MySQL是有个初始密码,知道了初始密码才能改密码。 + +```bash +[root@localhost home]# grep 'temporary password' /var/log/mysqld.log + +2017-07-17T13:40:11.842835Z 1 [Note] A temporary password is generated for root@localhost: b&iu(sf;>ws ``` -工具的帮助文档,在命令行中运行`mycli --help`就可以输出帮助文档 +## 设置初始化密码 + +启动后我们需要简单配置一下 mysql ,默认安装以后 mysql 的 root 用户是没有密码的,对于生产环境来说,这肯定是不行的,另外还有一些安全相关的设置,可以使用下面这行命令去配置一下,它是一个向导,问你一些问题,你要给出答案,比如是否要设置 root 用户的密码, 密码是什么等等。 ```bash -$ mycli --help -Usage: mycli [OPTIONS] [DATABASE] - -Options: - -h, --host TEXT 数据库的主机地址。 - -P, --port INTEGER 用于连接的端口号。 Honors $MYSQL_TCP_PORT - -u, --user TEXT 连接到数据库的用户名。 - -S, --socket TEXT 用于连接的套接字文件。 - -p, --password TEXT 连接到数据库的密码。 - --pass TEXT 连接到数据库的密码。 - -v, --version mycli的版本输出。 - -D, --database TEXT 使用数据库。 - -R, --prompt TEXT 提示格式 (Default: "\t \u@\h:\d> ") - -l, --logfile FILENAME 将每一个查询和它的结果记录到一个文件中。 - --defaults-group-suffix TEXT 读取指定的后缀的配置组。 - --defaults-file PATH 只从给定文件中读取默认选项。 - --auto-vertical-output 如果结果比终端更宽,自动切换到垂直输出模式。 - --login-path TEXT 从登录文件中读取此路径。 - --help 显示此帮助消息 -``` - - -使用例子 - -```bash -$ mycli local_database -$ mycli -h localhost -u root app_db -$ mycli mysql://amjith@localhost:3306/django_poll -``` \ No newline at end of file +mysql_secure_installation + +Enter current password for root (enter for none): +# 解释:输入当前 root 用户密码,默认为空,直接回车。 + +Set root password? [Y/n] y +# 解释:要设置 root 密码吗?输入 y 表示愿意。 + +Remove anonymous users? [Y/n] y +# 解释:要移除掉匿名用户吗?输入 y 表示愿意。 + +Disallow root login remotely? [Y/n] y +# 解释:不想让 root 远程登陆吗?输入 y 表示愿意。 + +Remove test database and access to it? [Y/n] y +# 解释:要去掉 test 数据库吗?输入 y 表示愿意。 + +Reload privilege tables now? [Y/n] y +# 解释:想要重新加载权限吗?输入 y 表示愿意。 + +``` + + +你安装成功后,可以查看一下 MySQL 版本,`mysql --version`,如果版本并非你所使用的版本,你可以参考这里进行升级数据库操作[Centos6下升级MySQL数据库](../chapter17/1.2.md)。 + +## 启动报错处理 + +下面是我尝试在Mac上启动MySQL报错 + +**启动失败** + +```bash +sudo /usr/local/mysql/support-files/mysql.server start +Password: +Starting MySQL +. ERROR! The server quit without updating PID file (/usr/local/mysql/data/localhost.pid +``` + +通过日志查看报错信息 + +```bash +# 编辑配置文件 +sudo vim /etc/my.cnf + +# 在配置文件最后添加一行错误日志输入的配置 +log_error = /usr/local/mysql/data/error.log +``` + +上面添加完成之后,重新启动再查看日志 + +```bash +sudo /usr/local/mysql/support-files/mysql.server start +tail -100 /usr/local/mysql/data/error.log +``` + +### 日志显示错误一 + +```bash +2017-01-19T03:48:24.695505Z 0 [ERROR] InnoDB: Unable to lock ./ibdata1 error: 35 +2017-01-19T03:48:24.695540Z 0 [Note] InnoDB: Check that you do not already have another mysqld process using the same InnoDB data or log files. +``` + +日志显示 mysqld 进程使用相同的InnoDB data 文件或日志文件,通过 `ps -ef | grep mysql | grep -v grep` 查看是否有该进程,发现果然有,这时候你需要杀掉该进程,我在我本地是杀不掉的,于是我尝试使用 mysqld 启动MySQL,启动成功。 + +```bash +sudo /usr/local/mysql/bin/mysqld restart +``` + +### 日志显示错误二 + +``` +[ERROR] InnoDB: The innodb_system data file 'ibdata1' must be writable +``` + +上面的错误信息说的是 `ibdata1` 文件不可写。`ibdata1` 是InnoDB的共有表空间,默认情况下会把表空间存放在一个文件`ibdata1`中,(此原因会造成这个文件越来越大)。所以大概能猜测是 mysql 用户的权限不够了。所以再给 `ibdata1` 目录分配一下权限即可。 + +这个时候需要查看一下mysql 安装目录权限。使用 chown 改变了整个 mysql 目录的权限,这是一个非常不好的习惯。 + +```bash +cd /usr/local/mysql +sudo chown -R _mysql:_mysql * +``` + +这里需要注意的是,Mac OS系统下,mysql 的用户组和用户名都是 `_mysql`,Linux 是 `mysql`。然后再重启 MySQL 你就完事大吉了。 + +上面调试定位错误的方法非常有用。我通过这个方法多次解决各种问题。 \ No newline at end of file diff --git a/chapter2/2.5.md b/chapter2/2.5.md index 849792b..e583c93 100644 --- a/chapter2/2.5.md +++ b/chapter2/2.5.md @@ -1,589 +1,147 @@ - -MySQL配置修改 +MySQL 工具 === -安装完了之后更改配置的需求比较少,所以你需要根据实际使用过程中来修改 MySQL 配置参数,MySQL提供了两个更改配置的方式。 +由于 MySQL 软件是基于 C/S 模式的数据库管理系统(一个客户机—服务器DBMS),因此在日常各种工作中,可以通过各种客户端软件来与 MySQL 数据库管理系统关联。MySQL,需要有一个客户机,即你需要用来与MySQL打交道(给MySQL 提供要执行的命令)的一个应用。有许多客户机应用可供选择,但在学习MySQL(确切地说,在编写 和测试MySQL脚本时),最好是使用专门用途的实用程序。官方自带 MySQL Command Line Client 和 MySQL-Workbench 客户端。 -- 通过配置想来修改,听说在windows上面有个配置工具(MySQL server instance config) 提供了自动配置服务,真嗨皮。 -- 另一种是手工修改配置文件来修改。 +MySQL 官方数据库管理系统提供了许多的命令工具,这些工具可以用来管理 MySQL 服务器,对数据库进行访问、管理 MySQL 用户以及数据库备份和恢复工具等。而且 MySQL 提供图形化管理工具,这样操作更简单。 -对于初学者刚接触MySQL来说,使用工具来修改配置是非常好的,但是在 Mac 系统下面没有找到这样的工具,如果你部署到Linux下面好像没有这种工具,所以在真正的生产环境还是得修改配置来更改 MySQL 配置。接下来只讲解配置文件来修改,为你将来在 Mac 或者 Linux ,包括windows平台系统下容易配置做点准备吧,通过配置文件来配置,让你做跨平台玩儿 MySQL ,让你逼格更高一点,哈哈。 +## 命令行使用程序 +每个 MySQL 安装都有一个名为 MySQL 的简单命令行实用程序。这 个实用程序没有下拉菜单、流行的用户界面、鼠标支持或任何类似的东西。 -## MySQL安装目录说明 +#### MySQL 服务器端使用工具程序 -MySQL 不同的版本安装目录会有一点不一致,但是大致会差不多,会有一点差异,我这个是 Mac OS X 系统中的安装目录,在这里`/usr/local/mysql` +1. `mysqld` - SQL 后台程序(即 MySQL 服务器进程)。该程序必须启动运行,才能连接服务器来访问数据库。 +2. `mysqld_safe` - 服务器启动脚本,可以通过 mysqld_safe 来启动 mysqld 服务器。mysqld_safe 增加了一些安全特性,例如当前出现错误时重启服务器并向错误日至文件写入运行时间信息。 +3. `mysql.server` - 服务器启动脚本。该脚本用于使用包含为特定级别的运行启动服务的脚本的运行目录的系统。 +4. `mysqld_multi` - 服务器启动脚本,可以启动或停止系统上安装的多个服务器。 -|目录 | 目录内容 | -| ---- | ---- | -|bin/ | 客户端程序和mysqld服务器,相关命令 | -|data/ | | -|docs/ | | -|include/ | 包含头文件| -|lib/ | 库 | -|man/ | | -|share/ | | -|support-files/ | 存在一些默认配置文件,如`my-default.cnf` | +#### MySQL 安装相关程序 +1. `comp_err` - 编译MySQL错误信息文件。 +2. `mysql_install_db` - 该脚本用默认权限创建MySQL授权表。通常只是在系统上首次安装MySQL时执行一次。 +3. `mysql_plugin` - 配置MySQL服务器插件。 +4. `mysql_secure_installation` - 提高MySQL安装的安全性。 +5. `mysql_ssl_rsa_setup` - 创建 SSL/RSA 文件。 +6. `mysql_tzinfo_to_sql` - 加载时区表。 +7. `mysql_upgrade` - 检查并升级MySQL表。 -## 配置文件的位置 +#### MySQL 客户端使用工具程序 -从命令行终端运行此命令,将在寻找Linux/BSD / OS X系统中的MySQL配置文件 my.cnf 文件: +1. `mysql` - MySQL命令行工具。 +2. `mysqladmin` - 用于管理MySQL服务器客户端。 +3. `mysqlcheck` - 表维护程序。 +4. `mysqldump` - 数据库备份程序。 +5. `mysqlimport` - 数据导入程序。 +6. `mysqlpump` - 数据库备份程序。 +7. `mysqlsh` - Shell下执行 mysql 命令。 +8. `mysqlshow` - 显示数据库、表和列的信息,。 +9. `mysqlslap` - 负载仿真客户端。 -```bash -mysql --help | grep 'Default options' -A 1 -``` +#### MySQL 程序开发工具 -上面命令执行后,会有这样的输出: +1. `mysql_config` - 编译客户端的显示选项。 +2. `my_print_defaults` - 显示选项文件的选项。 +3. `resolve_stack_dump` - 解析数字堆栈跟踪转储到符号。 -```bash -Default options are read from the following files in the given order: -/etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf -``` +#### MySQL 管理实用程序 -现在,可以检查你正在使用的 my.cnf 文件是否存在。在 Mac OS X 中默认式没有 my.cnf 文件的。你可以从这个地方复制一份过去 `/usr/local/mysql/support-files/my-default.cnf` 每个版本都不一样,你只需要找到一个 `.cnf` 后缀结尾的文件即可。复制到`/etc/`目录下并重新命名为 `my.cnf` +1. `innochecksum` - 离线InnoDB文件校验工具。 +2. `myisam_ftdump` - 显示全文索引信息。 +3. `myisamchk` - MyISAM表维护实用工具。 +4. `myisamlog` - 显示MyISAM日志文件内容。 +5. `myisampack` - 产生压缩,只读MyISAM表。 +6. `mysql_config_editor` - MySQL的配置实用程序。 +7. `mysqlbinlog` - 处理二进制日志文件的效用。 +8. `mysqldumpslow` - 总结慢查询日志文件。 -## Windows系统配置文件读取 +#### 杂项程序 -在Windows上,MySQL的程序读取从下表中显示的文件,按照指定的顺序启动配置选项(顶部文件首先被读取,文件读取后优先)。 +1. `lz4_decompress` - 解压缩mysqlpump lz4压缩输出。 +2. `perror` - 解释错误代码。 +3. `replace` - 一个字符串替换工具。 +4. `resolveip` - 解析主机名到IP地址或反之亦然。 +5. `zlib_decompress` - 解压缩mysqlpump zlib压缩输出。 -| 文件名字 | 作用 | -| ---- | ---- | -| **%PROGRAMDATA%**\MySQL\MySQL Server 5.6\my.ini, **%PROGRAMDATA%**\MySQL\MySQL Server 5.6\my.cnf | 全局配置 | -| %WINDIR%\my.ini, %WINDIR%\my.cnf | 全局配置 | -| C:\my.ini, C:\my.cnf | 全局配置 | -| **BASEDIR**\my.ini, **BASEDIR**\my.cnf | 全局配置 | -| defaults-extra-file | 如果有的话指定该文件`--defaults-extra-file=文件名字` | -| %APPDATA%\MySQL\.mylogin.cnf | 登录路径选项(仅适用于客户端) | +MySQL 命令行实用程序是使用最多的实用程序之一,它对于快速测试 和执行脚本非常有价值。事实上,本书中使用的所有输出例子都是从 MySQL 命令行输出中抓取的。 +## MySQL Workbench客户端 -- **%PROGRAMDATA%** 这个路径默认为 `C:\ProgramData` 老版本的Windows系统, 默认在 ` C:\Documents and Settings\All Users\Application Data\MySQL` -- **%WINDIR%** 表示Windows的目录位置。使用下面的命令从windir环境变量的值确定其精确位置 `C:\> echo %WINDIR%` -- **BASEDIR** 表示MySQL的安装目录。 -- **%APPDATA%** 表示Windows的目录位置。使用下面的命令从windir环境变量的值确定其精确位置 `C:\> echo %WINDIR%` +对于命令行客户端软件,想熟悉使用,必需对每一个相关命令需要非常熟悉,这对于现在初级 MySQL 用户来说,还得玩儿上好长一段时间。于是官方专卖开发了图形化客户端软件 [MySQL Workbench](http://dev.mysql.com/downloads/workbench/),进入 [MySQL Workbench](http://dev.mysql.com/downloads/workbench/) 进行下载安装程序,这里安装我是按照默认选项安装,直接不停的下一步。 -MySQL 提供的二进制安装代码所创建的默认目录,在Windows中,默认安装路径是`C:\Program Files\MySQL\MySQL Server 5.7` +![MySQL](../img/1.4.1.jpg) -## Linux系统配置文件读取 +MySQL Workbench 主要是为数据库管理员和开发人员提供了一整套可视化数据看操作环境,主要有以下功能: -| 文件名字 | 作用 | -| ---- | ---- | -| /etc/my.cnf | 全局配置 | -| /etc/mysql/my.cnf | 全局配置 | -| SYSCONFDIR/my.cnf | 全局配置 | -| $MYSQL_HOME/my.cnf | Server-specific 服务器特定的选项 (仅适用于服务端) | -| defaults-extra-file | 如果有的话指定该文件`--defaults-extra-file=文件名字` | -| ~/.my.cnf | Server-specific 服务器特定的选项 | -| ~/.mylogin.cnf | User-specific 登录路径选择 (仅适用于客户端) | +- 数据看设计和模型建立 +- SQL开发(取代MySQL Query Browser) +- 数据看管理(取代MySQL Administrator) -- **$HOME** 上表中表示用户的主目录,即用户的根目录。 -- **SYSCONFDIR** 代表指定的目录与SYSCONFDIR配置文件的安装路径,默认情况这个是位于安装目录里面的目录。 -- **$MYSQL_HOME** 是包含在该服务器的具体my.cnf文件所在的目录的路径环境变量。如果 $MYSQL_HOME 没有设置,你启动服务器使用mysqld_safe程序,mysqld_safe试图设置 $MYSQL_HOME +MySQL Workbench以前老版本分两个版本,MySQL Workbench Community Edition(也叫 MySQL Workbench OSS,社区版本)和 MySQL Workbench Standard Edition (MySQL Workbench SE,商业版),商业版是收费的,现在官网只看到社区版,官网不在提供商业版的技术支持和更新了。 -工具 **mysqld_safe** 使用注意: +## 常用图形管理工具 -- 让BASEDIR和DATADIR分别代表MySQL的基本目录和数据目录的路径名。 -- 如果my.cnf文件在DATADIR但不是在BASEDIR中,mysqld_safe设置MYSQL_HOME到DATADIR。 -- 否则,如果MYSQL_HOME未设置并且在DATADIR没有my.cnf文件,mysqld_safe设置MYSQL_HOME到BASEDIR。 +MySQL Workbench 功能繁缛,操作复杂,而且在 Mac 上面启动慢操作不方便。对于太多大段英文操作界面十分不友好,长得也特别丑陋,所以在 Mac 上推荐一款界面简单、大方、好用的图形管理工具 [Sequel Pro](http://www.sequelpro.com/) 。这也是一个开源免费的软件,[源码在这里](https://github.com/sequelpro/sequelpro) 如果你有兴趣可研究研究它的源码,做出你的一点贡献。 -## 配置文件内容 +Sequel Pro 安装也特别简单,有着 Mac 安装应用的风范,下载之后打开 dmg 拖拽 APP 到你的应用程序文件夹即可安装成功,下面是它漂亮的界面: +![MySQL](../img/1.4.2.jpg) +![MySQL](../img/1.4.3.jpg) +![MySQL](../img/1.4.4.jpg) +我在开发过程中一直使用它来配合命令行终端来使用。在这个过程中熟悉了不少命令,为今后在 Linux 服务器中也玩儿得如鱼得水,非常happy!个人小建议,终归是要熟悉一些命令行的,因为部署到生产环境,极为可能连操作系统都没有图形界面。 -```bash -# 以下选项会被MySQL客户端应用读取。 -# 注意只有MySQL附带的客户端应用程序保证可以读取这段内容。 -# 如果你想你自己的MySQL应用程序获取这些值。 -# 需要在MySQL客户端库初始化的时候指定这些选项。 - -# For advice on how to change settings please see -# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html -# *** DO NOT EDIT THIS FILE. It's a template which will be copied to the -# *** default location during install, and will be replaced if you -# *** upgrade to a newer version of MySQL. - -# mysqld程序 - -[mysqld] - -# Remove leading # and set to the amount of RAM for the most important data -# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%. -# innodb_buffer_pool_size = 128M - -# ★★★这里很重要️能让MySQL登陆链接变快速 -skip-name-resolve - -# Remove leading # to turn on a very important data integrity option: logging -# changes to the binary log between backups. -# log_bin - -# These are commonly set, remove the # and set as required. -# 使用给定目录作为根目录(安装目录)。 -# basedir = ..... -# 从给定目录读取数据库文件。 -# datadir = ..... -# 为mysqld程序指定一个存放进程ID的文件(仅适用于UNIX/Linux系统); -# pid-file = ..... -# 指定MsSQL侦听的端口 -# port = ..... -# server_id = ..... -# 为MySQL客户程序与服务器之间的本地通信指定一个套接字文件(Linux下默认是/var/lib/mysql/mysql.sock文件) -# socket = ..... - - -sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES - -# 一般配置选项 -basedir = /data/apps/mysql -datadir = /data/appData/mysql -port = 3306 -socket = /var/run/mysqld/mysqld.sock -# 设置 -character-set-server=utf8 - - -# 指定MySQL可能的连接数量。 -# 当MySQL主线程在很短时间内接收到非常多的连接请求,该参数生效,主线程花费很短时间检查连接并且启动一个新线程。 -# back_log参数的值指出在MySQL暂时停止响应新请求之前的短时间内多少个请求可以被存在堆栈中。 -# 如果系统在一个短时间内有很多连接,则需要增大该参数的值,该参数值指定到来的TCP/IP连接的侦听队列的大小。 -# 试图设定back_log高于你的操作系统的限制将是无效的。默认值为50。对于Linux系统推荐设置为小于512的整数。 - -# back_log 是操作系统在监听队列中所能保持的连接数, -# 队列保存了在 MySQL 连接管理器线程处理之前的连接. -# 如果你有非常高的连接率并且出现 “connection refused” 报错, -# 你就应该增加此处的值. -# 检查你的操作系统文档来获取这个变量的最大值. -# 如果将back_log设定到比你操作系统限制更高的值,将会没有效果 -back_log = 300 - -# 不在 TCP/IP 端口上进行监听. -# 如果所有的进程都是在同一台服务器连接到本地的 mysqld, -# 这样设置将是增强安全的方法 -# 所有 mysqld 的连接都是通过 Unix Sockets 或者命名管道进行的. -# 注意在 Windows下如果没有打开命名管道选项而只是用此项 -# (通过 “enable-named-pipe” 选项) 将会导致 MySQL 服务没有任何作用! -#skip-networking - -# MySQL 服务所允许的同时会话数的上限 -# 其中一个连接将被 SUPER 权限保留作为管理员登录. -# 即便已经达到了连接数的上限. -max_connections = 3000 - -# 每个客户端连接最大的错误允许数量,如果达到了此限制. -# 这个客户端将会被 MySQL 服务阻止直到执行了 “FLUSH HOSTS” 或者服务重启 -# 非法的密码以及其他在链接时的错误会增加此值. -# 查看 “Aborted_connects” 状态来获取全局计数器. -max_connect_errors = 50 - -# 所有线程所打开表的数量. -# 增加此值就增加了 mysqld 所需要的文件描述符的数量 -# 这样你需要确认在 [mysqld_safe] 中 “open-files-limit” 变量设置打开文件数量允许至少等于 table_cache 的值 -table_open_cache = 4096 - -# 允许外部文件级别的锁. 打开文件锁会对性能造成负面影响 -# 所以只有在你在同样的文件上运行多个数据库实例时才使用此选项(注意仍会有其他约束!) -# 或者你在文件层面上使用了其他一些软件依赖来锁定 MyISAM 表 -#external-locking - -# 服务所能处理的请求包的最大大小以及服务所能处理的最大的请求大小(当与大的 BLOB 字段一起工作时相当必要) -# 每个连接独立的大小,大小动态增加 -max_allowed_packet = 32M - -# 在一个事务中 binlog 为了记录 SQL 状态所持有的 cache 大小 -# 如果你经常使用大的,多声明的事务,你可以增加此值来获取更大的性能. -# 所有从事务来的状态都将被缓冲在 binlog 缓冲中然后在提交后一次性写入到 binlog 中 -# 如果事务比此值大, 会使用磁盘上的临时文件来替代. -# 此缓冲在每个连接的事务第一次更新状态时被创建 -binlog_cache_size = 4M - -# 独立的内存表所允许的最大容量。 -# 此选项为了防止意外创建一个超大的内存表导致永尽所有的内存资源。 -max_heap_table_size = 128M - -# 随机读取数据缓冲区使用内存(read_rnd_buffer_size):和顺序读取相对应, -# 当 MySQL 进行非顺序读取(随机读取)数据块的时候,会利用>这个缓冲区暂存读取的数据 -# 如根据索引信息读取表数据,根据排序后的结果集与表进行 Join 等等 -# 总的来说,就是当数据块的读取需要满足>一定的顺序的情况下,MySQL 就需要产生随机读取,进而使用到 read_rnd_buffer_size 参数所设置的内存缓冲区 -read_rnd_buffer_size = 16M - -# 排序缓冲被用来处理类似 ORDER BY 以及 GROUP BY 队列所引起的排序 -# 如果排序后的数据无法放入排序缓冲,一个用来替代的基于磁盘的合并分类会被使用 -# 查看 “Sort_merge_passes” 状态变量。 -# 在排序发生时由每个线程分配 -# 每个需要进行排序的线程分配该大小的一个缓冲区。增加这值加速ORDER BY或GROUP BY操作。 -# 注意:该参数对应的分配内存是每连接独占!如果有100个连接,那么实际分配的总共排序缓冲区大小为100×6=600MB -sort_buffer_size = 16M - -# 此缓冲被使用来优化全联合(FULL JOINS 不带索引的联合)。 -# 类似的联合在极大多数情况下有非常糟糕的性能表现,但是将此值设大能够减轻性能影响。 -# 通过 “Select_full_join” 状态变量查看全联合的数量 -# 当全联合发生时,在每个线程中分配 -join_buffer_size = 16M - -# 缓存可重用的线程数 -# thread_cache = 8 - -# 避免MySQL的外部锁定,减少出错几率增强稳定性。 -# skip-locking - -# 我们在 cache 中保留多少线程用于重用 -# 当一个客户端断开连接后,如果 cache 中的线程还少于 thread_cache_size,则客户端线程被放入cache 中。 -# 这可以在你需要大量新连接的时候极大的减少线程创建的开销 -# (一般来说如果你有好的线程模型的话,这不会有明显的性能提升。) -thread_cache_size = 16 - -# 此允许应用程序给予线程系统一个提示在同一时间给予渴望被运行的线程的数量。 -# 此值只对于支持 thread_concurrency() 函数的系统有意义( 例如Sun Solaris)。 -# 你可可以尝试使用 [CPU数量]*(2..4) 来作为 thread_concurrency 的值 -#****(此属性对当前环境无效)**** -# thread_concurrency = 8 - -# 查询缓冲常被用来缓冲 SELECT 的结果并且在下一次同样查询的时候不再执行直接返回结果。 -# 打开查询缓冲可以极大的提高服务器速度, 如果你有大量的相同的查询并且很少修改表。 -# 查看 “Qcache_lowmem_prunes” 状态变量来检查是否当前值对于你的负载来说是否足够高。 -# 注意: 在你表经常变化的情况下或者如果你的查询原文每次都不同, -# 查询缓冲也许引起性能下降而不是性能提升。 -query_cache_size = 128M - -# 只有小于此设定值的结果才会被缓冲 -# 此设置用来保护查询缓冲,防止一个极大的结果集将其他所有的查询结果都覆盖。 -query_cache_limit = 4M - -# 被全文检索索引的最小的字长。 -# 你也许希望减少它,如果你需要搜索更短字的时候。 -# 注意在你修改此值之后,你需要重建你的 FULLTEXT 索引 -ft_min_word_len = 8 - -# 如果你的系统支持 memlock() 函数,你也许希望打开此选项用以让运行中的 mysql 在在内存高度紧张的时候,数据在内存中保持锁定并且防止可能被 swapping out -# 此选项对于性能有益 -#memlock - -# 当创建新表时作为默认使用的表类型, -# 如果在创建表示没有特别执行表类型,将会使用此值 -#****(此属性对当前环境无效)**** -#default_table_type = InnoDB - -# 线程使用的堆大小. 此容量的内存在每次连接时被预留. -# MySQL 本身常不会需要超过 64K 的内存 -# 如果你使用你自己的需要大量堆的 UDF 函数或者你的操作系统对于某些操作需要更多的堆,你也许需要将其设置的更高一点. -thread_stack = 512K - -# 设定默认的事务隔离级别.可用的级别如下: -# READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE -transaction_isolation = REPEATABLE-READ - -# 内部(内存中)临时表的最大大小 -# 如果一个表增长到比此值更大,将会自动转换为基于磁盘的表。 -# 此限制是针对单个表的,而不是总和。 -tmp_table_size = 128M - -# 打开二进制日志功能。 -# 在复制(replication)配置中,作为 MASTER 主服务器必须打开此项 -# 如果你需要从你最后的备份中做基于时间点的恢复,你也同样需要二进制日志。 -log-bin=mysql-bin - -# 如果你在使用链式从服务器结构的复制模式 (A->B->C), -# 你需要在服务器B上打开此项。 -# 此选项打开在从线程上重做过的更新的日志, 并将其写入从服务器的二进制日志。 -#log_slave_updates - -# 打开全查询日志。 所有的由服务器接收到的查询 (甚至对于一个错误语法的查询) -# 都会被记录下来。 这对于调试非常有用, 在生产环境中常常关闭此项。 -#log - -# 将警告打印输出到错误 log 文件。 如果你对于 MySQL 有任何问题 -# 你应该打开警告 log 并且仔细审查错误日志,查出可能的原因。 -#log_warnings - -# 记录慢速查询。 慢速查询是指消耗了比 “long_query_time” 定义的更多时间的查询。 -# 如果 log_long_format 被打开,那些没有使用索引的查询也会被记录。 -# 如果你经常增加新查询到已有的系统内的话。 一般来说这是一个好主意, -#log_slow_queries - -# 有的使用了比这个时间(以秒为单位)更多的查询会被认为是慢速查询。 -# 不要在这里使用“1″, 否则会导致所有的查询,甚至非常快的查询页被记录下来(由于 MySQL 目前时间的精确度只能达到秒的级别)。 -long_query_time = 6 - -# 在慢速日志中记录更多的信息。 -# 一般此项最好打开。 -# 打开此项会记录使得那些没有使用索引的查询也被作为到慢速查询附加到慢速日志里 -#log_long_format - -# 此目录被MySQL用来保存临时文件。例如, -# 它被用来处理基于磁盘的大型排序,和内部排序一样。 -# 以及简单的临时表。 -# 如果你不创建非常大的临时文件,将其放置到 swapfs/tmpfs 文件系统上也许比较好 -# 另一种选择是你也可以将其放置在独立的磁盘上。 -# 你可以使用”;”来放置多个路径 -# 他们会按照 roud-robin 方法被轮询使用。 -#tmpdir = /tmp - -# *** 主从复制相关的设置 - -# 唯一的服务辨识号,数值位于 1 到 2^32-1之间。 -# 此值在master和slave上都需要设置。 -# 如果 “master-host” 没有被设置,则默认为1, 但是如果忽略此选项,MySQL不会作为master生效。 -server-id = 1 - -# 复制的Slave (去掉master段的注释来使其生效) -# -# 为了配置此主机作为复制的slave服务器,你可以选择两种方法: -# -# 1) 使用 CHANGE MASTER TO 命令 (在我们的手册中有完整描述) - -# 语法如下: -# -# CHANGE MASTER TO MASTER_HOST=, MASTER_PORT=, -# MASTER_USER=, MASTER_PASSWORD= ; -# -# 你需要替换掉,等被尖括号包围的字段以及使用master的端口号替换 (默认3306)。 -# -# 例子: -# -# CHANGE MASTER TO MASTER_HOST=’125.564.12.1′, MASTER_PORT=3306, -# MASTER_USER=’joe’, MASTER_PASSWORD=’secret’; -# -# 或者 -# -# 2) 设置以下的变量. 不论如何, 在你选择这种方法的情况下, 然后第一次启动复制(甚至不成功的情况下, -# 例如如果你输入错密码在master-password字段并且slave无法连接), -# slave会创建一个 master.info 文件,并且之后任何对于包含在此文件内的参数的变化都会被忽略 -# 并且由 master.info 文件内的内容覆盖, 除非你关闭slave服务, 删除 master.info 并且重启slave 服务。 -# 由于这个原因,你也许不想碰一下的配置(注释掉的) 并且使用 CHANGE MASTER TO (查看上面) 来代替 -# -# 所需要的唯一id号位于 2 和 2^32 – 1之间 -# (并且和master不同) -# 如果master-host被设置了.则默认值是2 -# 但是如果省略,则不会生效 -#server-id = 2 -# -# 复制结构中的master – 必须 -#master-host = -# -# 当连接到master上时slave所用来认证的用户名 – 必须 -#master-user = -# -# 当连接到master上时slave所用来认证的密码 – 必须 -#master-password = -# -# master监听的端口. -# 可选 – 默认是3306 -#master-port = - -# 使得slave只读。只有用户拥有SUPER权限和在上面的slave线程能够修改数据。 -# 你可以使用此项去保证没有应用程序会意外的修改slave而不是master上的数据 -#read_only - -#*** MyISAM 相关选项 - -# 关键词缓冲的大小, 一般用来缓冲 MyISAM 表的索引块。 -# 不要将其设置大于你可用内存的30%, -# 因为一部分内存同样被OS用来缓冲行数据 -# 甚至在你并不使用 MyISAM 表的情况下, 你也需要仍旧设置起 8-64M 内存由于它同样会被内部临时磁盘表使用。 -# key_buffer_size = 128M - -# 用来做 MyISAM 表全表扫描的缓冲大小. -# 当全表扫描需要时,在对应线程中分配. -# read_buffer_size = 8M - -# 当在排序之后,从一个已经排序好的序列中读取行时,行数据将从这个缓冲中读取来防止磁盘寻道. -# 如果你增高此值,可以提高很多 ORDER BY 的性能. -# 当需要时由每个线程分配 -# read_rnd_buffer_size = 64M - -# MyISAM 使用特殊的类似树的 cache 来使得突发插入 -# (这些插入是,INSERT … SELECT, INSERT … VALUES (…), (…), …, 以及 LOAD DATA INFILE) 更快. -# 此变量限制每个进程中缓冲树的字节数. -# 设置为 0 会关闭此优化. -# 为了最优化不要将此值设置大于 “key_buffer_size”. -# 当突发插入被检测到时此缓冲将被分配. -# bulk_insert_buffer_size = 256M - -# 此缓冲当 MySQL 需要在 REPAIR, OPTIMIZE, ALTER 以及 LOAD DATA INFILE 到一个空表中引起重建索引时被分配. -# 这在每个线程中被分配.所以在设置大值时需要小心. -# myisam_sort_buffer_size = 256M - -# MySQL 重建索引时所允许的最大临时文件的大小 (当 REPAIR, ALTER TABLE 或者 LOAD DATA INFILE). -# 如果文件大小比此值更大,索引会通过键值缓冲创建(更慢) -# myisam_max_sort_file_size = 10G - -# 如果被用来更快的索引创建索引所使用临时文件大于制定的值,那就使用键值缓冲方法. -# 这主要用来强制在大表中长字串键去使用慢速的键值缓冲方法来创建索引. -# myisam_max_extra_sort_file_size = 10G - -# 如果一个表拥有超过一个索引, MyISAM 可以通过并行排序使用超过一个线程去修复他们. -# 这对于拥有多个 CPU 以及大量内存情况的用户,是一个很好的选择. -# myisam_repair_threads = 1 - -# 自动检查和修复没有适当关闭的 MyISAM 表. -# myisam_recover - -# 默认关闭 Federated -# skip-federated - -# *** BDB 相关选项 *** - -# 如果你运行的MySQL服务有BDB支持但是你不准备使用的时候使用此选项. 这会节省内存并且可能加速一些事. -#****(此属性对当前环境无效)**** -#skip-bdb - -# *** INNODB 相关选项 *** - -# 如果你的 MySQL 服务包含 InnoDB 支持但是并不打算使用的话, -# 使用此选项会节省内存以及磁盘空间,并且加速某些部分 -#skip-innodb - -# 附加的内存池被 InnoDB 用来保存 metadata 信息(5.6中不再推荐使用) -# 如果 InnoDB 为此目的需要更多的内存,它会开始从 OS 这里申请内存. -# 由于这个操作在大多数现代操作系统上已经足够快, 你一般不需要修改此值. -# SHOW INNODB STATUS 命令会显示当先使用的数量. -#****(此属性对当前环境无效)**** -#innodb_additional_mem_pool_size = 64M - -# InnoDB使用一个缓冲池来保存索引和原始数据, 不像 MyISAM. -# 这里你设置越大,这能保证你在大多数的读取操作时使用的是内存而不是硬盘,在存取表里面数据时所需要的磁盘 I/O 越少. -# 在一个独立使用的数据库服务器上,你可以设置这个变量到服务器物理内存大小的80% -# 不要设置过大,否则,由于物理内存的竞争可能导致操作系统的换页颠簸. -# 注意在32位系统上你每个进程可能被限制在 2-3.5G 用户层面内存限制, -# 所以不要设置的太高. -innodb_buffer_pool_size = 6G - -# InnoDB 将数据保存在一个或者多个数据文件中成为表空间. -# 如果你只有单个逻辑驱动保存你的数据,一个单个的自增文件就足够好了. -# 其他情况下.每个设备一个文件一般都是个好的选择. -# 你也可以配置 InnoDB 来使用裸盘分区 – 请参考手册来获取更多相关内容 -innodb_data_file_path = ibdata1:10M:autoextend - -# 设置此选项如果你希望InnoDB表空间文件被保存在其他分区. -# 默认保存在MySQL的datadir中. -#innodb_data_home_dir = - -# 用来同步IO操作的IO线程的数量. -# 此值在Unix下被硬编码为8,但是在Windows磁盘I/O可能在一个大数值下表现的更好. -#innodb_file_io_threads = 8 - -# 如果你发现 InnoDB 表空间损坏, 设置此值为一个非零值可能帮助你导出你的表. -# 从1开始并且增加此值知道你能够成功的导出表. -#innodb_force_recovery=1 - -# 在 InnoDb 核心内的允许线程数量. -# 最优值依赖于应用程序,硬件以及操作系统的调度方式. -# 过高的值可能导致线程的互斥颠簸. -innodb_thread_concurrency = 16 - -# 如果设置为1 ,InnoDB 会在每次提交后刷新(fsync)事务日志到磁盘上, -# 这提供了完整的 ACID 行为. -# 如果你愿意对事务安全折衷, 并且你正在运行一个小的事物, 你可以设置此值到0或者2来减少由事务日志引起的磁盘I/O -# 0代表日志只大约每秒写入日志文件并且日志文件刷新到磁盘. -# 2代表日志写入日志文件在每次提交后,但是日志文件只有大约每秒才会刷新到磁盘上. -innodb_flush_log_at_trx_commit = 2 -#(说明:如果是游戏服务器,建议此值设置为2;如果是对数据安全要求极高的应用,建议设置为1; -#设置为0性能最高,但如果发生故障,数据可能会有丢失的危险! -#默认值1的意思是每一次事务提交或事务外的指令都需要把日志写入(flush)硬盘,这是很费时的。 -#特别是使用电池供电缓存(Battery backed up cache)时。 -#设成2对于很多运用,特别是从MyISAM表转过来的是可以的,它的意思是不写入硬盘而是写入系统缓存。 -#日志仍然会每秒flush到硬盘,所以你一般不会丢失超过1-2秒的更新。 -#设成0会更快一点,但安全方面比较差,即使MySQL挂了也可能会丢失事务的数据。而值2只会在整个操作系统挂了时才可能丢数据。) - -# 加速 InnoDB 的关闭. 这会阻止 InnoDB 在关闭时做全清除以及插入缓冲合并. -# 这可能极大增加关机时间, 但是取而代之的是 InnoDB 可能在下次启动时做这些操作. -#innodb_fast_shutdown - -# 用来缓冲日志数据的缓冲区的大小. -# 当此值快满时, InnoDB 将必须刷新数据到磁盘上. -# 由于基本上每秒都会刷新一次,所以没有必要将此值设置的太大(甚至对于长事务而言) -innodb_log_buffer_size = 16M - -# 在日志组中每个日志文件的大小. -# 你应该设置日志文件总合大小到你缓冲池大小的25%~100% -# 来避免在日志文件覆写上不必要的缓冲池刷新行为. -# 不论如何, 请注意一个大的日志文件大小会增加恢复进程所需要的时间. -innodb_log_file_size = 512M - -# 在日志组中的文件总数. -# 通常来说2~3是比较好的. -innodb_log_files_in_group = 3 - -# InnoDB 的日志文件所在位置. 默认是 MySQL 的 datadir. -# 你可以将其指定到一个独立的硬盘上或者一个RAID1卷上来提高其性能 -#innodb_log_group_home_dir - -# 在 InnoDB 缓冲池中最大允许的脏页面的比例. -# 如果达到限额, InnoDB 会开始刷新他们防止他们妨碍到干净数据页面. -# 这是一个软限制,不被保证绝对执行. -innodb_max_dirty_pages_pct = 90 - -# InnoDB 用来刷新日志的方法. -# 表空间总是使用双重写入刷新方法 -# 默认值是 “fdatasync”, 另一个是 “O_DSYNC”. -# 一般来说,如果你有硬件 RAID 控制器,并且其独立缓存采用 write-back 机制,并有着电池断电保护,那么应该设置配置为 O_DIRECT -# 否则,大多数情况下应将其设为 fdatasync -#innodb_flush_method=fdatasync - -# 在被回滚前,一个 InnoDB 的事务应该等待一个锁被批准多久. -# InnoDB 在其拥有的锁表中自动检测事务死锁并且回滚事务. -# 如果你使用 LOCK TABLES 指令, 或者在同样事务中使用除了 InnoDB 以外的其他事务安全的存储引擎 -# 那么一个死锁可能发生而 InnoDB 无法注意到. -# 这种情况下这个 timeout 值对于解决这种问题就非常有帮助. -innodb_lock_wait_timeout = 120 - -# 这项设置告知InnoDB是否需要将所有表的数据和索引存放在共享表空间里(innodb_file_per_table = OFF) 或者为每张表的数据单独放在一个.ibd文件(innodb_file_per_table = ON) -# 每张表一个文件允许你在drop、truncate或者rebuild表时回收磁盘空间 -# 这对于一些高级特性也是有必要的,比如数据压缩,但是它不会带来任何性能收益 -innodb_file_per_table = on - -[mysqldump] -# 不要在将内存中的整个结果写入磁盘之前缓存. 在导出非常巨大的表时需要此项 -quick - -max_allowed_packet = 32M - -[mysql] -no-auto-rehash -default-character-set=utf8 -# 仅仅允许使用键值的 UPDATEs 和 DELETEs . -safe-updates - -[myisamchk] -key_buffer = 16M -sort_buffer_size = 16M -read_buffer = 8M -write_buffer = 8M - -[mysqlhotcopy] -interactive-timeout - -[mysqld_safe] -# 增加每个进程的可打开文件数量. -# 警告: 确认你已经将全系统限制设定的足够高! -# 打开大量表需要将此值设大 -open-files-limit = 8192 - -# -# MySQL 服务端 -# -[client] -default-character-set=utf8 -``` +## MyCli替代MySQL的mysql命令行工具 + +[MyCli](http://mycli.net/) 是一个 MySQL 命令行工具,支持自动补全和语法高亮。也可用于 MariaDB 和 Percona。推荐好用的图形界面也得推荐好用的命令行工具,这个工具也是免费开源的,[源码在这里](https://github.com/dbcli/mycli) -配置好定制配置文件 my.cnf 之后需要初始化一下 +![MySQL](../img/1.4.5.gif) + +看上图就已经高潮了吧,它的安装也毫无压力,不费吹灰之力就搞定安装,没有复杂的配置,[MyCli](http://mycli.net/)实在太厉害了,不得不推荐它。安装方法如下: ```bash -mysqld --initialize + +# 如果你已会安装 Python 包,那就简单了: +$ pip install mycli + +# 只能在 Mac OS X 中安装 +$ brew update && brew install mycli + +# 只能在debian 或者 ubuntu 系统中安装 +$ sudo apt-get install mycli ``` -初始化之后需要重启服务 +工具的帮助文档,在命令行中运行`mycli --help`就可以输出帮助文档 ```bash -# 重启服务 -mysql.server restart +$ mycli --help +Usage: mycli [OPTIONS] [DATABASE] + +Options: + -h, --host TEXT 数据库的主机地址。 + -P, --port INTEGER 用于连接的端口号。 Honors $MYSQL_TCP_PORT + -u, --user TEXT 连接到数据库的用户名。 + -S, --socket TEXT 用于连接的套接字文件。 + -p, --password TEXT 连接到数据库的密码。 + --pass TEXT 连接到数据库的密码。 + -v, --version mycli的版本输出。 + -D, --database TEXT 使用数据库。 + -R, --prompt TEXT 提示格式 (Default: "\t \u@\h:\d> ") + -l, --logfile FILENAME 将每一个查询和它的结果记录到一个文件中。 + --defaults-group-suffix TEXT 读取指定的后缀的配置组。 + --defaults-file PATH 只从给定文件中读取默认选项。 + --auto-vertical-output 如果结果比终端更宽,自动切换到垂直输出模式。 + --login-path TEXT 从登录文件中读取此路径。 + --help 显示此帮助消息 +``` -# Linux 这么运行,启动服务 -service mysqld start -# Mac 运行去掉 service -mysqld start -# Linux 查看服务运行的状态 -service mysqld status -``` +使用例子 + +```bash +$ mycli local_database +$ mycli -h localhost -u root app_db +$ mycli mysql://amjith@localhost:3306/django_poll +``` \ No newline at end of file diff --git a/chapter2/2.6.md b/chapter2/2.6.md new file mode 100644 index 0000000..2e6ca06 --- /dev/null +++ b/chapter2/2.6.md @@ -0,0 +1,588 @@ +MySQL 配置修改 +=== + +安装完了之后更改配置的需求比较少,所以你需要根据实际使用过程中来修改 MySQL 配置参数,MySQL提供了两个更改配置的方式。 + +- 通过配置想来修改,听说在windows上面有个配置工具(MySQL server instance config) 提供了自动配置服务,真嗨皮。 +- 另一种是手工修改配置文件来修改。 + +对于初学者刚接触MySQL来说,使用工具来修改配置是非常好的,但是在 Mac 系统下面没有找到这样的工具,如果你部署到Linux下面好像没有这种工具,所以在真正的生产环境还是得修改配置来更改 MySQL 配置。接下来只讲解配置文件来修改,为你将来在 Mac 或者 Linux ,包括windows平台系统下容易配置做点准备吧,通过配置文件来配置,让你做跨平台玩儿 MySQL ,让你逼格更高一点,哈哈。 + + +## MySQL安装目录说明 + +MySQL 不同的版本安装目录会有一点不一致,但是大致会差不多,会有一点差异,我这个是 Mac OS X 系统中的安装目录,在这里`/usr/local/mysql` + +|目录 | 目录内容 | +| ---- | ---- | +|bin/ | 客户端程序和mysqld服务器,相关命令 | +|data/ | | +|docs/ | | +|include/ | 包含头文件| +|lib/ | 库 | +|man/ | | +|share/ | | +|support-files/ | 存在一些默认配置文件,如`my-default.cnf` | + + +## 配置文件的位置 + +从命令行终端运行此命令,将在寻找Linux/BSD / OS X系统中的MySQL配置文件 my.cnf 文件: + +```bash +mysql --help | grep 'Default options' -A 1 +``` + +上面命令执行后,会有这样的输出: + +```bash +Default options are read from the following files in the given order: +/etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf +``` + +现在,可以检查你正在使用的 my.cnf 文件是否存在。在 Mac OS X 中默认式没有 my.cnf 文件的。你可以从这个地方复制一份过去 `/usr/local/mysql/support-files/my-default.cnf` 每个版本都不一样,你只需要找到一个 `.cnf` 后缀结尾的文件即可。复制到`/etc/`目录下并重新命名为 `my.cnf` + +## Windows系统配置文件读取 + +在Windows上,MySQL的程序读取从下表中显示的文件,按照指定的顺序启动配置选项(顶部文件首先被读取,文件读取后优先)。 + +| 文件名字 | 作用 | +| ---- | ---- | +| **%PROGRAMDATA%**\MySQL\MySQL Server 5.6\my.ini, **%PROGRAMDATA%**\MySQL\MySQL Server 5.6\my.cnf | 全局配置 | +| %WINDIR%\my.ini, %WINDIR%\my.cnf | 全局配置 | +| C:\my.ini, C:\my.cnf | 全局配置 | +| **BASEDIR**\my.ini, **BASEDIR**\my.cnf | 全局配置 | +| defaults-extra-file | 如果有的话指定该文件`--defaults-extra-file=文件名字` | +| %APPDATA%\MySQL\.mylogin.cnf | 登录路径选项(仅适用于客户端) | + + +- **%PROGRAMDATA%** 这个路径默认为 `C:\ProgramData` 老版本的Windows系统, 默认在 ` C:\Documents and Settings\All Users\Application Data\MySQL` +- **%WINDIR%** 表示Windows的目录位置。使用下面的命令从windir环境变量的值确定其精确位置 `C:\> echo %WINDIR%` +- **BASEDIR** 表示MySQL的安装目录。 +- **%APPDATA%** 表示Windows的目录位置。使用下面的命令从windir环境变量的值确定其精确位置 `C:\> echo %WINDIR%` + +MySQL 提供的二进制安装代码所创建的默认目录,在Windows中,默认安装路径是`C:\Program Files\MySQL\MySQL Server 5.7` + +## Linux系统配置文件读取 + +| 文件名字 | 作用 | +| ---- | ---- | +| /etc/my.cnf | 全局配置 | +| /etc/mysql/my.cnf | 全局配置 | +| SYSCONFDIR/my.cnf | 全局配置 | +| $MYSQL_HOME/my.cnf | Server-specific 服务器特定的选项 (仅适用于服务端) | +| defaults-extra-file | 如果有的话指定该文件`--defaults-extra-file=文件名字` | +| ~/.my.cnf | Server-specific 服务器特定的选项 | +| ~/.mylogin.cnf | User-specific 登录路径选择 (仅适用于客户端) | + +- **$HOME** 上表中表示用户的主目录,即用户的根目录。 +- **SYSCONFDIR** 代表指定的目录与SYSCONFDIR配置文件的安装路径,默认情况这个是位于安装目录里面的目录。 +- **$MYSQL_HOME** 是包含在该服务器的具体my.cnf文件所在的目录的路径环境变量。如果 $MYSQL_HOME 没有设置,你启动服务器使用mysqld_safe程序,mysqld_safe试图设置 $MYSQL_HOME + +工具 **mysqld_safe** 使用注意: + +- 让BASEDIR和DATADIR分别代表MySQL的基本目录和数据目录的路径名。 +- 如果my.cnf文件在DATADIR但不是在BASEDIR中,mysqld_safe设置MYSQL_HOME到DATADIR。 +- 否则,如果MYSQL_HOME未设置并且在DATADIR没有my.cnf文件,mysqld_safe设置MYSQL_HOME到BASEDIR。 + +## 配置文件内容 + + + +```bash + +# 以下选项会被MySQL客户端应用读取。 +# 注意只有MySQL附带的客户端应用程序保证可以读取这段内容。 +# 如果你想你自己的MySQL应用程序获取这些值。 +# 需要在MySQL客户端库初始化的时候指定这些选项。 + +# For advice on how to change settings please see +# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html +# *** DO NOT EDIT THIS FILE. It's a template which will be copied to the +# *** default location during install, and will be replaced if you +# *** upgrade to a newer version of MySQL. + +# mysqld程序 + +[mysqld] + +# Remove leading # and set to the amount of RAM for the most important data +# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%. +# innodb_buffer_pool_size = 128M + +# ★★★这里很重要️能让MySQL登陆链接变快速 +skip-name-resolve + +# Remove leading # to turn on a very important data integrity option: logging +# changes to the binary log between backups. +# log_bin + +# These are commonly set, remove the # and set as required. +# 使用给定目录作为根目录(安装目录)。 +# basedir = ..... +# 从给定目录读取数据库文件。 +# datadir = ..... +# 为mysqld程序指定一个存放进程ID的文件(仅适用于UNIX/Linux系统); +# pid-file = ..... +# 指定MsSQL侦听的端口 +# port = ..... +# server_id = ..... +# 为MySQL客户程序与服务器之间的本地通信指定一个套接字文件(Linux下默认是/var/lib/mysql/mysql.sock文件) +# socket = ..... + + +sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES + +# 一般配置选项 +basedir = /data/apps/mysql +datadir = /data/appData/mysql +port = 3306 +socket = /var/run/mysqld/mysqld.sock +# 设置 +character-set-server=utf8 + + +# 指定MySQL可能的连接数量。 +# 当MySQL主线程在很短时间内接收到非常多的连接请求,该参数生效,主线程花费很短时间检查连接并且启动一个新线程。 +# back_log参数的值指出在MySQL暂时停止响应新请求之前的短时间内多少个请求可以被存在堆栈中。 +# 如果系统在一个短时间内有很多连接,则需要增大该参数的值,该参数值指定到来的TCP/IP连接的侦听队列的大小。 +# 试图设定back_log高于你的操作系统的限制将是无效的。默认值为50。对于Linux系统推荐设置为小于512的整数。 + +# back_log 是操作系统在监听队列中所能保持的连接数, +# 队列保存了在 MySQL 连接管理器线程处理之前的连接. +# 如果你有非常高的连接率并且出现 “connection refused” 报错, +# 你就应该增加此处的值. +# 检查你的操作系统文档来获取这个变量的最大值. +# 如果将back_log设定到比你操作系统限制更高的值,将会没有效果 +back_log = 300 + +# 不在 TCP/IP 端口上进行监听. +# 如果所有的进程都是在同一台服务器连接到本地的 mysqld, +# 这样设置将是增强安全的方法 +# 所有 mysqld 的连接都是通过 Unix Sockets 或者命名管道进行的. +# 注意在 Windows下如果没有打开命名管道选项而只是用此项 +# (通过 “enable-named-pipe” 选项) 将会导致 MySQL 服务没有任何作用! +#skip-networking + +# MySQL 服务所允许的同时会话数的上限 +# 其中一个连接将被 SUPER 权限保留作为管理员登录. +# 即便已经达到了连接数的上限. +max_connections = 3000 + +# 每个客户端连接最大的错误允许数量,如果达到了此限制. +# 这个客户端将会被 MySQL 服务阻止直到执行了 “FLUSH HOSTS” 或者服务重启 +# 非法的密码以及其他在链接时的错误会增加此值. +# 查看 “Aborted_connects” 状态来获取全局计数器. +max_connect_errors = 50 + +# 所有线程所打开表的数量. +# 增加此值就增加了 mysqld 所需要的文件描述符的数量 +# 这样你需要确认在 [mysqld_safe] 中 “open-files-limit” 变量设置打开文件数量允许至少等于 table_cache 的值 +table_open_cache = 4096 + +# 允许外部文件级别的锁. 打开文件锁会对性能造成负面影响 +# 所以只有在你在同样的文件上运行多个数据库实例时才使用此选项(注意仍会有其他约束!) +# 或者你在文件层面上使用了其他一些软件依赖来锁定 MyISAM 表 +#external-locking + +# 服务所能处理的请求包的最大大小以及服务所能处理的最大的请求大小(当与大的 BLOB 字段一起工作时相当必要) +# 每个连接独立的大小,大小动态增加 +max_allowed_packet = 32M + +# 在一个事务中 binlog 为了记录 SQL 状态所持有的 cache 大小 +# 如果你经常使用大的,多声明的事务,你可以增加此值来获取更大的性能. +# 所有从事务来的状态都将被缓冲在 binlog 缓冲中然后在提交后一次性写入到 binlog 中 +# 如果事务比此值大, 会使用磁盘上的临时文件来替代. +# 此缓冲在每个连接的事务第一次更新状态时被创建 +binlog_cache_size = 4M + +# 独立的内存表所允许的最大容量。 +# 此选项为了防止意外创建一个超大的内存表导致永尽所有的内存资源。 +max_heap_table_size = 128M + +# 随机读取数据缓冲区使用内存(read_rnd_buffer_size):和顺序读取相对应, +# 当 MySQL 进行非顺序读取(随机读取)数据块的时候,会利用>这个缓冲区暂存读取的数据 +# 如根据索引信息读取表数据,根据排序后的结果集与表进行 Join 等等 +# 总的来说,就是当数据块的读取需要满足>一定的顺序的情况下,MySQL 就需要产生随机读取,进而使用到 read_rnd_buffer_size 参数所设置的内存缓冲区 +read_rnd_buffer_size = 16M + +# 排序缓冲被用来处理类似 ORDER BY 以及 GROUP BY 队列所引起的排序 +# 如果排序后的数据无法放入排序缓冲,一个用来替代的基于磁盘的合并分类会被使用 +# 查看 “Sort_merge_passes” 状态变量。 +# 在排序发生时由每个线程分配 +# 每个需要进行排序的线程分配该大小的一个缓冲区。增加这值加速ORDER BY或GROUP BY操作。 +# 注意:该参数对应的分配内存是每连接独占!如果有100个连接,那么实际分配的总共排序缓冲区大小为100×6=600MB +sort_buffer_size = 16M + +# 此缓冲被使用来优化全联合(FULL JOINS 不带索引的联合)。 +# 类似的联合在极大多数情况下有非常糟糕的性能表现,但是将此值设大能够减轻性能影响。 +# 通过 “Select_full_join” 状态变量查看全联合的数量 +# 当全联合发生时,在每个线程中分配 +join_buffer_size = 16M + +# 缓存可重用的线程数 +# thread_cache = 8 + +# 避免MySQL的外部锁定,减少出错几率增强稳定性。 +# skip-locking + +# 我们在 cache 中保留多少线程用于重用 +# 当一个客户端断开连接后,如果 cache 中的线程还少于 thread_cache_size,则客户端线程被放入cache 中。 +# 这可以在你需要大量新连接的时候极大的减少线程创建的开销 +# (一般来说如果你有好的线程模型的话,这不会有明显的性能提升。) +thread_cache_size = 16 + +# 此允许应用程序给予线程系统一个提示在同一时间给予渴望被运行的线程的数量。 +# 此值只对于支持 thread_concurrency() 函数的系统有意义( 例如Sun Solaris)。 +# 你可可以尝试使用 [CPU数量]*(2..4) 来作为 thread_concurrency 的值 +#****(此属性对当前环境无效)**** +# thread_concurrency = 8 + +# 查询缓冲常被用来缓冲 SELECT 的结果并且在下一次同样查询的时候不再执行直接返回结果。 +# 打开查询缓冲可以极大的提高服务器速度, 如果你有大量的相同的查询并且很少修改表。 +# 查看 “Qcache_lowmem_prunes” 状态变量来检查是否当前值对于你的负载来说是否足够高。 +# 注意: 在你表经常变化的情况下或者如果你的查询原文每次都不同, +# 查询缓冲也许引起性能下降而不是性能提升。 +query_cache_size = 128M + +# 只有小于此设定值的结果才会被缓冲 +# 此设置用来保护查询缓冲,防止一个极大的结果集将其他所有的查询结果都覆盖。 +query_cache_limit = 4M + +# 被全文检索索引的最小的字长。 +# 你也许希望减少它,如果你需要搜索更短字的时候。 +# 注意在你修改此值之后,你需要重建你的 FULLTEXT 索引 +ft_min_word_len = 8 + +# 如果你的系统支持 memlock() 函数,你也许希望打开此选项用以让运行中的 mysql 在在内存高度紧张的时候,数据在内存中保持锁定并且防止可能被 swapping out +# 此选项对于性能有益 +#memlock + +# 当创建新表时作为默认使用的表类型, +# 如果在创建表示没有特别执行表类型,将会使用此值 +#****(此属性对当前环境无效)**** +#default_table_type = InnoDB + +# 线程使用的堆大小. 此容量的内存在每次连接时被预留. +# MySQL 本身常不会需要超过 64K 的内存 +# 如果你使用你自己的需要大量堆的 UDF 函数或者你的操作系统对于某些操作需要更多的堆,你也许需要将其设置的更高一点. +thread_stack = 512K + +# 设定默认的事务隔离级别.可用的级别如下: +# READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE +transaction_isolation = REPEATABLE-READ + +# 内部(内存中)临时表的最大大小 +# 如果一个表增长到比此值更大,将会自动转换为基于磁盘的表。 +# 此限制是针对单个表的,而不是总和。 +tmp_table_size = 128M + +# 打开二进制日志功能。 +# 在复制(replication)配置中,作为 MASTER 主服务器必须打开此项 +# 如果你需要从你最后的备份中做基于时间点的恢复,你也同样需要二进制日志。 +log-bin=mysql-bin + +# 如果你在使用链式从服务器结构的复制模式 (A->B->C), +# 你需要在服务器B上打开此项。 +# 此选项打开在从线程上重做过的更新的日志, 并将其写入从服务器的二进制日志。 +#log_slave_updates + +# 打开全查询日志。 所有的由服务器接收到的查询 (甚至对于一个错误语法的查询) +# 都会被记录下来。 这对于调试非常有用, 在生产环境中常常关闭此项。 +#log + +# 将警告打印输出到错误 log 文件。 如果你对于 MySQL 有任何问题 +# 你应该打开警告 log 并且仔细审查错误日志,查出可能的原因。 +#log_warnings + +# 记录慢速查询。 慢速查询是指消耗了比 “long_query_time” 定义的更多时间的查询。 +# 如果 log_long_format 被打开,那些没有使用索引的查询也会被记录。 +# 如果你经常增加新查询到已有的系统内的话。 一般来说这是一个好主意, +#log_slow_queries + +# 有的使用了比这个时间(以秒为单位)更多的查询会被认为是慢速查询。 +# 不要在这里使用“1″, 否则会导致所有的查询,甚至非常快的查询页被记录下来(由于 MySQL 目前时间的精确度只能达到秒的级别)。 +long_query_time = 6 + +# 在慢速日志中记录更多的信息。 +# 一般此项最好打开。 +# 打开此项会记录使得那些没有使用索引的查询也被作为到慢速查询附加到慢速日志里 +#log_long_format + +# 此目录被MySQL用来保存临时文件。例如, +# 它被用来处理基于磁盘的大型排序,和内部排序一样。 +# 以及简单的临时表。 +# 如果你不创建非常大的临时文件,将其放置到 swapfs/tmpfs 文件系统上也许比较好 +# 另一种选择是你也可以将其放置在独立的磁盘上。 +# 你可以使用”;”来放置多个路径 +# 他们会按照 roud-robin 方法被轮询使用。 +#tmpdir = /tmp + +# *** 主从复制相关的设置 + +# 唯一的服务辨识号,数值位于 1 到 2^32-1之间。 +# 此值在master和slave上都需要设置。 +# 如果 “master-host” 没有被设置,则默认为1, 但是如果忽略此选项,MySQL不会作为master生效。 +server-id = 1 + +# 复制的Slave (去掉master段的注释来使其生效) +# +# 为了配置此主机作为复制的slave服务器,你可以选择两种方法: +# +# 1) 使用 CHANGE MASTER TO 命令 (在我们的手册中有完整描述) - +# 语法如下: +# +# CHANGE MASTER TO MASTER_HOST=, MASTER_PORT=, +# MASTER_USER=, MASTER_PASSWORD= ; +# +# 你需要替换掉,等被尖括号包围的字段以及使用master的端口号替换 (默认3306)。 +# +# 例子: +# +# CHANGE MASTER TO MASTER_HOST=’125.564.12.1′, MASTER_PORT=3306, +# MASTER_USER=’joe’, MASTER_PASSWORD=’secret’; +# +# 或者 +# +# 2) 设置以下的变量. 不论如何, 在你选择这种方法的情况下, 然后第一次启动复制(甚至不成功的情况下, +# 例如如果你输入错密码在master-password字段并且slave无法连接), +# slave会创建一个 master.info 文件,并且之后任何对于包含在此文件内的参数的变化都会被忽略 +# 并且由 master.info 文件内的内容覆盖, 除非你关闭slave服务, 删除 master.info 并且重启slave 服务。 +# 由于这个原因,你也许不想碰一下的配置(注释掉的) 并且使用 CHANGE MASTER TO (查看上面) 来代替 +# +# 所需要的唯一id号位于 2 和 2^32 – 1之间 +# (并且和master不同) +# 如果master-host被设置了.则默认值是2 +# 但是如果省略,则不会生效 +#server-id = 2 +# +# 复制结构中的master – 必须 +#master-host = +# +# 当连接到master上时slave所用来认证的用户名 – 必须 +#master-user = +# +# 当连接到master上时slave所用来认证的密码 – 必须 +#master-password = +# +# master监听的端口. +# 可选 – 默认是3306 +#master-port = + +# 使得slave只读。只有用户拥有SUPER权限和在上面的slave线程能够修改数据。 +# 你可以使用此项去保证没有应用程序会意外的修改slave而不是master上的数据 +#read_only + +#*** MyISAM 相关选项 + +# 关键词缓冲的大小, 一般用来缓冲 MyISAM 表的索引块。 +# 不要将其设置大于你可用内存的30%, +# 因为一部分内存同样被OS用来缓冲行数据 +# 甚至在你并不使用 MyISAM 表的情况下, 你也需要仍旧设置起 8-64M 内存由于它同样会被内部临时磁盘表使用。 +# key_buffer_size = 128M + +# 用来做 MyISAM 表全表扫描的缓冲大小. +# 当全表扫描需要时,在对应线程中分配. +# read_buffer_size = 8M + +# 当在排序之后,从一个已经排序好的序列中读取行时,行数据将从这个缓冲中读取来防止磁盘寻道. +# 如果你增高此值,可以提高很多 ORDER BY 的性能. +# 当需要时由每个线程分配 +# read_rnd_buffer_size = 64M + +# MyISAM 使用特殊的类似树的 cache 来使得突发插入 +# (这些插入是,INSERT … SELECT, INSERT … VALUES (…), (…), …, 以及 LOAD DATA INFILE) 更快. +# 此变量限制每个进程中缓冲树的字节数. +# 设置为 0 会关闭此优化. +# 为了最优化不要将此值设置大于 “key_buffer_size”. +# 当突发插入被检测到时此缓冲将被分配. +# bulk_insert_buffer_size = 256M + +# 此缓冲当 MySQL 需要在 REPAIR, OPTIMIZE, ALTER 以及 LOAD DATA INFILE 到一个空表中引起重建索引时被分配. +# 这在每个线程中被分配.所以在设置大值时需要小心. +# myisam_sort_buffer_size = 256M + +# MySQL 重建索引时所允许的最大临时文件的大小 (当 REPAIR, ALTER TABLE 或者 LOAD DATA INFILE). +# 如果文件大小比此值更大,索引会通过键值缓冲创建(更慢) +# myisam_max_sort_file_size = 10G + +# 如果被用来更快的索引创建索引所使用临时文件大于制定的值,那就使用键值缓冲方法. +# 这主要用来强制在大表中长字串键去使用慢速的键值缓冲方法来创建索引. +# myisam_max_extra_sort_file_size = 10G + +# 如果一个表拥有超过一个索引, MyISAM 可以通过并行排序使用超过一个线程去修复他们. +# 这对于拥有多个 CPU 以及大量内存情况的用户,是一个很好的选择. +# myisam_repair_threads = 1 + +# 自动检查和修复没有适当关闭的 MyISAM 表. +# myisam_recover + +# 默认关闭 Federated +# skip-federated + +# *** BDB 相关选项 *** + +# 如果你运行的MySQL服务有BDB支持但是你不准备使用的时候使用此选项. 这会节省内存并且可能加速一些事. +#****(此属性对当前环境无效)**** +#skip-bdb + +# *** INNODB 相关选项 *** + +# 如果你的 MySQL 服务包含 InnoDB 支持但是并不打算使用的话, +# 使用此选项会节省内存以及磁盘空间,并且加速某些部分 +#skip-innodb + +# 附加的内存池被 InnoDB 用来保存 metadata 信息(5.6中不再推荐使用) +# 如果 InnoDB 为此目的需要更多的内存,它会开始从 OS 这里申请内存. +# 由于这个操作在大多数现代操作系统上已经足够快, 你一般不需要修改此值. +# SHOW INNODB STATUS 命令会显示当先使用的数量. +#****(此属性对当前环境无效)**** +#innodb_additional_mem_pool_size = 64M + +# InnoDB使用一个缓冲池来保存索引和原始数据, 不像 MyISAM. +# 这里你设置越大,这能保证你在大多数的读取操作时使用的是内存而不是硬盘,在存取表里面数据时所需要的磁盘 I/O 越少. +# 在一个独立使用的数据库服务器上,你可以设置这个变量到服务器物理内存大小的80% +# 不要设置过大,否则,由于物理内存的竞争可能导致操作系统的换页颠簸. +# 注意在32位系统上你每个进程可能被限制在 2-3.5G 用户层面内存限制, +# 所以不要设置的太高. +innodb_buffer_pool_size = 6G + +# InnoDB 将数据保存在一个或者多个数据文件中成为表空间. +# 如果你只有单个逻辑驱动保存你的数据,一个单个的自增文件就足够好了. +# 其他情况下.每个设备一个文件一般都是个好的选择. +# 你也可以配置 InnoDB 来使用裸盘分区 – 请参考手册来获取更多相关内容 +innodb_data_file_path = ibdata1:10M:autoextend + +# 设置此选项如果你希望InnoDB表空间文件被保存在其他分区. +# 默认保存在MySQL的datadir中. +#innodb_data_home_dir = + +# 用来同步IO操作的IO线程的数量. +# 此值在Unix下被硬编码为8,但是在Windows磁盘I/O可能在一个大数值下表现的更好. +#innodb_file_io_threads = 8 + +# 如果你发现 InnoDB 表空间损坏, 设置此值为一个非零值可能帮助你导出你的表. +# 从1开始并且增加此值知道你能够成功的导出表. +#innodb_force_recovery=1 + +# 在 InnoDb 核心内的允许线程数量. +# 最优值依赖于应用程序,硬件以及操作系统的调度方式. +# 过高的值可能导致线程的互斥颠簸. +innodb_thread_concurrency = 16 + +# 如果设置为1 ,InnoDB 会在每次提交后刷新(fsync)事务日志到磁盘上, +# 这提供了完整的 ACID 行为. +# 如果你愿意对事务安全折衷, 并且你正在运行一个小的事物, 你可以设置此值到0或者2来减少由事务日志引起的磁盘I/O +# 0代表日志只大约每秒写入日志文件并且日志文件刷新到磁盘. +# 2代表日志写入日志文件在每次提交后,但是日志文件只有大约每秒才会刷新到磁盘上. +innodb_flush_log_at_trx_commit = 2 +#(说明:如果是游戏服务器,建议此值设置为2;如果是对数据安全要求极高的应用,建议设置为1; +#设置为0性能最高,但如果发生故障,数据可能会有丢失的危险! +#默认值1的意思是每一次事务提交或事务外的指令都需要把日志写入(flush)硬盘,这是很费时的。 +#特别是使用电池供电缓存(Battery backed up cache)时。 +#设成2对于很多运用,特别是从MyISAM表转过来的是可以的,它的意思是不写入硬盘而是写入系统缓存。 +#日志仍然会每秒flush到硬盘,所以你一般不会丢失超过1-2秒的更新。 +#设成0会更快一点,但安全方面比较差,即使MySQL挂了也可能会丢失事务的数据。而值2只会在整个操作系统挂了时才可能丢数据。) + +# 加速 InnoDB 的关闭. 这会阻止 InnoDB 在关闭时做全清除以及插入缓冲合并. +# 这可能极大增加关机时间, 但是取而代之的是 InnoDB 可能在下次启动时做这些操作. +#innodb_fast_shutdown + +# 用来缓冲日志数据的缓冲区的大小. +# 当此值快满时, InnoDB 将必须刷新数据到磁盘上. +# 由于基本上每秒都会刷新一次,所以没有必要将此值设置的太大(甚至对于长事务而言) +innodb_log_buffer_size = 16M + +# 在日志组中每个日志文件的大小. +# 你应该设置日志文件总合大小到你缓冲池大小的25%~100% +# 来避免在日志文件覆写上不必要的缓冲池刷新行为. +# 不论如何, 请注意一个大的日志文件大小会增加恢复进程所需要的时间. +innodb_log_file_size = 512M + +# 在日志组中的文件总数. +# 通常来说2~3是比较好的. +innodb_log_files_in_group = 3 + +# InnoDB 的日志文件所在位置. 默认是 MySQL 的 datadir. +# 你可以将其指定到一个独立的硬盘上或者一个RAID1卷上来提高其性能 +#innodb_log_group_home_dir + +# 在 InnoDB 缓冲池中最大允许的脏页面的比例. +# 如果达到限额, InnoDB 会开始刷新他们防止他们妨碍到干净数据页面. +# 这是一个软限制,不被保证绝对执行. +innodb_max_dirty_pages_pct = 90 + +# InnoDB 用来刷新日志的方法. +# 表空间总是使用双重写入刷新方法 +# 默认值是 “fdatasync”, 另一个是 “O_DSYNC”. +# 一般来说,如果你有硬件 RAID 控制器,并且其独立缓存采用 write-back 机制,并有着电池断电保护,那么应该设置配置为 O_DIRECT +# 否则,大多数情况下应将其设为 fdatasync +#innodb_flush_method=fdatasync + +# 在被回滚前,一个 InnoDB 的事务应该等待一个锁被批准多久. +# InnoDB 在其拥有的锁表中自动检测事务死锁并且回滚事务. +# 如果你使用 LOCK TABLES 指令, 或者在同样事务中使用除了 InnoDB 以外的其他事务安全的存储引擎 +# 那么一个死锁可能发生而 InnoDB 无法注意到. +# 这种情况下这个 timeout 值对于解决这种问题就非常有帮助. +innodb_lock_wait_timeout = 120 + +# 这项设置告知InnoDB是否需要将所有表的数据和索引存放在共享表空间里(innodb_file_per_table = OFF) 或者为每张表的数据单独放在一个.ibd文件(innodb_file_per_table = ON) +# 每张表一个文件允许你在drop、truncate或者rebuild表时回收磁盘空间 +# 这对于一些高级特性也是有必要的,比如数据压缩,但是它不会带来任何性能收益 +innodb_file_per_table = on + +[mysqldump] +# 不要在将内存中的整个结果写入磁盘之前缓存. 在导出非常巨大的表时需要此项 +quick + +max_allowed_packet = 32M + +[mysql] +no-auto-rehash +default-character-set=utf8 +# 仅仅允许使用键值的 UPDATEs 和 DELETEs . +safe-updates + +[myisamchk] +key_buffer = 16M +sort_buffer_size = 16M +read_buffer = 8M +write_buffer = 8M + +[mysqlhotcopy] +interactive-timeout + +[mysqld_safe] +# 增加每个进程的可打开文件数量. +# 警告: 确认你已经将全系统限制设定的足够高! +# 打开大量表需要将此值设大 +open-files-limit = 8192 + +# +# MySQL 服务端 +# +[client] +default-character-set=utf8 +``` + + +配置好定制配置文件 my.cnf 之后需要初始化一下 + +```bash +mysqld --initialize +``` + +初始化之后需要重启服务 + +```bash +# 重启服务 +mysql.server restart + +# Linux 这么运行,启动服务 +service mysqld start +# Mac 运行去掉 service +mysqld start + +# Linux 查看服务运行的状态 +service mysqld status +``` From a46b0c8f2d3385cfe9f4dc2bd086c720fb0a36ae Mon Sep 17 00:00:00 2001 From: jaywcjlove <398188662@qq.com> Date: Mon, 17 Feb 2020 09:49:15 +0800 Subject: [PATCH 08/41] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index ed5f830..45548e9 100644 --- a/README.md +++ b/README.md @@ -67,18 +67,18 @@ MariaDB,是 MySQL server 的一个由社区开发的分支,MariaDB大部分 - [通过命令行访问 MySQL 容器](#通过命令行访问-mysql-容器) - [使用 MySQL 自定义配置文件](#使用-mysql-自定义配置文件) - [使用 stack 部署 MySQL](#使用-stack-部署-mysql) -- 2.3 [启动数据库设置初始密码](chapter2/2.4.md) +- 2.4 [启动数据库设置初始密码](chapter2/2.4.md) - [命令行启动关闭重启MySQL服务](chapter2/2.4.md#命令行启动关闭重启mysql服务) - [图像界面启动关闭重启MySQL服务](chapter2/2.4.md#图像界面启动关闭重启mysql服务) - [查看初始密码](chapter2/2.4.md#查看初始密码) - [设置初始化密码](chapter2/2.4.md#设置初始化密码) - [启动报错处理](chapter2/2.4.md#启动报错处理) -- 2.4 [MySQL工具](chapter2/2.5.md) +- 2.5 [MySQL工具](chapter2/2.5.md) - [命令行使用程序](chapter2/2.5.md#命令行使用程序) - [MySQL Workbench客户端](chapter2/2.5.md#mysql-workbench客户端) - [常用图形管理工具](chapter2/2.5.md#常用图形管理工具) - [MyCli替代MySQL的mysql命令行工具](chapter2/2.5.md#mycli替代mysql的mysql命令行工具) -- 2.5 [MySQL配置修改](chapter2/2.6.md) +- 2.6 [MySQL配置修改](chapter2/2.6.md) - [MySQL安装目录说明](chapter2/2.6.md#mysql安装目录说明) - [配置文件的位置](chapter2/2.6.md#配置文件的位置) - [Windows系统配置文件读取](chapter2/2.6.md#windows系统配置文件读取) From fcedb08806c7932d487999b41b25123ad197d93e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=BC=9F=E8=B0=83=E8=B0=83=E2=84=A2?= Date: Tue, 17 Nov 2020 10:56:32 +0800 Subject: [PATCH 09/41] Update 21-minutes-MySQL-basic-entry.md --- 21-minutes-MySQL-basic-entry.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/21-minutes-MySQL-basic-entry.md b/21-minutes-MySQL-basic-entry.md index 2418c35..b3047b3 100644 --- a/21-minutes-MySQL-basic-entry.md +++ b/21-minutes-MySQL-basic-entry.md @@ -370,12 +370,14 @@ SELECT MAX(OrderPrice) AS LargestOrderPrice FROM Orders ## 触发器 > 语法: -> create trigger <触发器名称> -> { before | after} # 之前或者之后出发 -> insert | update | delete # 指明了激活触发程序的语句的类型 -> on <表名> # 操作哪张表 -> for each row # 触发器的执行间隔,for each row 通知触发器每隔一行执行一次动作,而不是对整个表执行一次。 +> ``` +> create trigger <触发器名称> +> { before | after} # 之前或者之后出发 +> insert | update | delete # 指明了激活触发程序的语句的类型 +> on <表名> # 操作哪张表 +> for each row # 触发器的执行间隔,for each row 通知触发器每隔一行执行一次动作,而不是对整个表执行一次。 > <触发器SQL语句> +> ``` ```sql delimiter $ From de1087cf18620b0f33442ae6b6c3d00af04fdeca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=BC=9F=E8=B0=83=E8=B0=83=E2=84=A2?= Date: Mon, 18 Jan 2021 16:29:10 +0800 Subject: [PATCH 10/41] Update 3.3.md #33 --- chapter3/3.3.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapter3/3.3.md b/chapter3/3.3.md index acfa574..f447ca9 100644 --- a/chapter3/3.3.md +++ b/chapter3/3.3.md @@ -64,7 +64,7 @@ $ mysqladmin -uroot -p create test Enter password:*** ``` -如果数据库不存在则提示下面信息: +如果数据库存在则提示下面信息: ```bash $ mysqladmin -uroot -p create test From 0259e8c8107e2d7e320b511358f18397cbec1ba2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=BC=9F=E8=B0=83=E8=B0=83=E2=84=A2?= Date: Sun, 24 Oct 2021 21:48:52 +0800 Subject: [PATCH 11/41] Create .gitattributes --- .gitattributes | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..1d1ce11 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.md linguist-detectable=true From 1fe6eb1bcc44920daafeab1702b72d43f3920c7d Mon Sep 17 00:00:00 2001 From: jaywcjlove <398188662@qq.com> Date: Sun, 5 Dec 2021 16:33:48 +0800 Subject: [PATCH 12/41] feat: add website scripts. --- package.json | 21 ++++++++++++ scripts/build.mjs | 73 ++++++++++++++++++++++++++++++++++++++++ scripts/node/favicon.mjs | 1 + scripts/node/footer.mjs | 60 +++++++++++++++++++++++++++++++++ scripts/node/header.mjs | 55 ++++++++++++++++++++++++++++++ scripts/style.css | 67 ++++++++++++++++++++++++++++++++++++ 6 files changed, 277 insertions(+) create mode 100644 package.json create mode 100644 scripts/build.mjs create mode 100644 scripts/node/favicon.mjs create mode 100644 scripts/node/footer.mjs create mode 100644 scripts/node/header.mjs create mode 100644 scripts/style.css diff --git a/package.json b/package.json new file mode 100644 index 0000000..180611f --- /dev/null +++ b/package.json @@ -0,0 +1,21 @@ +{ + "name": "mysql-tutorial", + "version": "1.0.0", + "description": "从零开始学习MySQL,主要是面向MySQL数据库管理系统初学者。", + "homepage": "https://jaywcjlove.github.io/mysql-tutorial", + "author": "jaywcjlove", + "license": "MIT", + "private": true, + "scripts": { + "start": "node scripts/build.mjs" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/jaywcjlove/mysql-tutorial.git" + }, + "devDependencies": { + "fs-extra": "^10.0.0", + "markdown-to-html-cli": "^3.2.4", + "recursive-readdir-files": "^2.0.7" + } +} diff --git a/scripts/build.mjs b/scripts/build.mjs new file mode 100644 index 0000000..a5af8b8 --- /dev/null +++ b/scripts/build.mjs @@ -0,0 +1,73 @@ +import path from 'path'; +import fs from 'fs-extra'; +import getFiles from 'recursive-readdir-files'; +import { create } from 'markdown-to-html-cli'; +import { favicon } from './node/favicon.mjs'; +import { header } from './node/header.mjs'; +import { footer } from './node/footer.mjs'; + +const styleStr = fs.readFileSync(path.relative(process.cwd(), 'scripts/style.css')); +function createOption(editPath) { + const href = path.relative(process.cwd(), editPath); + return { + 'github-corners': 'https://github.com/jaywcjlove/handbook.git', + document: { + style: [styleStr.toString()], + link: [ + { rel: 'icon', href: favicon, type: 'image/x-icon' } + // { rel: 'shortcut icon', href: './favicon.ico' }, + ] + }, + rewrite: (node) => { + if (node.type === 'element' && node.properties.href && !node.properties['data-edit'] && /\.md(.*?)$/.test(node.properties.href)) { + if (/(readme).md$/.test(node.properties.href.toLocaleLowerCase())) { + node.properties.href = node.properties.href.replace(/(readme|README).md$/, 'index.html'); + } else if (/.md$/.test(node.properties.href.toLocaleLowerCase())) { + node.properties.href = node.properties.href.replace(/.md$/, '.html'); + } else { + node.properties.href = node.properties.href.replace(/.md(.*?)$/, '.html$1');; + } + } + if (node.type === 'element' && node.tagName === 'body') { + node.properties = { ...node.properties, id: 'totop' }; + const homeUrl = path.relative(`${href}/..`, './index.html'); + node.children = [header(homeUrl), ...node.children, footer(href)]; + } + } + } +} + +;(async () => { + await fs.ensureDir('build'); + const files = await getFiles(process.cwd(), { + ignored: /\/(node_modules|\.git|build)/, + filter: (item) => /(.md|.svg|.jpg|.png|.mp4)$/.test(item.path) + }); + await Promise.all(files.map(async (item) => { + const markdown = await fs.readFile(item.path); + const outputPath = path.join('build', path.relative(process.cwd(), item.path).replace(/(README|readme).md$/, 'index.html').replace(/.md$/, '.html')); + await fs.ensureDir(path.dirname(outputPath)); + if (/.md$/.test(item.path)) { + const options = createOption(item.path); + let title = markdown.toString().match(/^([\s\S]*?)===/) + title = title ? title[1].replace(/\n/, '') : ''; + const html = create({ + markdown, ...options, + document: { + title: `${title ? `${title} - ` : ''}mysql-tutorial`, + ...options.document, + meta: [ + { description: `${title ? `${title}。`: '' }从零开始学习MySQL,主要是面向MySQL数据库管理系统初学者。- mysql-tutorial` }, + { keywords: 'example,mysql-tutorial,mysql,tutorial' } + ] + } + }); + await fs.writeFile(outputPath, html); + console.log(`♻️ create file: \x1b[32;1m ${outputPath} \x1b[0m`); + } else { + await fs.copyFile(item.path, outputPath); + console.log(`🏞 copied file: \x1b[32;1m ${outputPath} \x1b[0m`); + } + + })); +})(); \ No newline at end of file diff --git a/scripts/node/favicon.mjs b/scripts/node/favicon.mjs new file mode 100644 index 0000000..8d371ed --- /dev/null +++ b/scripts/node/favicon.mjs @@ -0,0 +1 @@ +export const favicon = 'data:image/png;base64,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' \ No newline at end of file diff --git a/scripts/node/footer.mjs b/scripts/node/footer.mjs new file mode 100644 index 0000000..34ae26d --- /dev/null +++ b/scripts/node/footer.mjs @@ -0,0 +1,60 @@ + +export const footer = (editPath) => { + return { + type: 'element', + tagName: 'div', + properties: { + className: 'footer', + }, + children: [ + { + type: 'element', + tagName: 'a', + properties: { + 'data-edit': true, + target: '__blank', + title: `https://github.com/jaywcjlove/handbook/edit/master/${editPath}`, + href: `https://github.com/jaywcjlove/handbook/edit/master/${editPath}`, + }, + children: [ { type: 'text', value: '编辑当前页面' } ] + }, + { + type: 'element', + tagName: 'a', + properties: { + target: '__blank', + href: 'https://jaywcjlove.gitee.io/handbook/', + }, + children: [ { type: 'text', value: '国内镜像站点 🇨🇳' } ] + }, + { + type: 'element', + tagName: 'a', + properties: { + target: '__blank', + href: 'https://github.com/jaywcjlove/handbook', + }, + children: [ { type: 'text', value: 'Github' } ] + }, + { + type: 'element', + tagName: 'a', + properties: { + target: '__blank', + href: 'https://gitee.com/jaywcjlove/handbook', + }, + children: [ { type: 'text', value: 'Gitee' } ] + }, + { + type: 'element', + tagName: 'div', + properties: { + className: 'copyright', + }, + children: [ + { type: 'text', value: 'Copyright © 2021. All rights reserved.' } + ] + } + ] + } +} \ No newline at end of file diff --git a/scripts/node/header.mjs b/scripts/node/header.mjs new file mode 100644 index 0000000..3395366 --- /dev/null +++ b/scripts/node/header.mjs @@ -0,0 +1,55 @@ +import { favicon } from './favicon.mjs'; + +export const header = (homeUrl) => { + return { + type: 'element', + tagName: 'header', + properties: { className: 'header', }, + children: [ + { + type: 'element', + tagName: 'article', + properties: { className: 'inner', }, + children: [ + { + type: 'element', + tagName: 'a', + properties: { + className: 'logo', + href: homeUrl || 'https://jaywcjlove.github.io/mysql-tutorial', + }, + children: [ + { + type: 'element', + tagName: 'img', + properties: { + src: favicon, + alt: 'mysql-tutorial logo', + }, + children: [] + } + ] + }, { + type: 'element', + tagName: 'div', + properties: { + className: 'title', + }, + children: [ + { type: 'text', value: 'mysql-tutorial' } + ] + }, { + type: 'element', + tagName: 'nav', + properties: { + className: 'nav', + }, + children: [ + + ] + } + ] + } + ] + } +} \ No newline at end of file diff --git a/scripts/style.css b/scripts/style.css new file mode 100644 index 0000000..b590252 --- /dev/null +++ b/scripts/style.css @@ -0,0 +1,67 @@ +.header { + position: fixed; + width: 100%; + background: #fff; + backdrop-filter: saturate(180%) blur(0.4rem); + background-color: rgba(255,255,255,0.55); + border-bottom: 1px solid #00000014; + z-index: 99; + top: 0; +} + +.header .inner { + max-width: 960px; + margin: 0 auto; + display: flex; + justify-content: space-between; + padding: 5px 0; +} + +.header .logo { + margin-right: 10px; +} +.header .title { + display: flex; + align-items: center; + font-size: 16px; + font-weight: bold; + color: #333; +} +.header .logo img { + height: 26px; + display: block; +} + +.markdown-body { + margin-top: 78px; +} + +.footer { + max-width: 960px; + margin: 0 auto; + text-align: center; + padding: 0 0 110px 0; + border-top: 1px solid hsla(210,18%,87%,1); + padding-top: 18px; +} + +.footer a { + font-size: 14px; + text-decoration: initial; + color: #3f51b5; +} + +.footer a:hover { + color:#009688; + text-decoration: underline; +} + +.footer a + a { + margin-left: 10px; +} + +.footer .copyright { + color: #596068; + font-size: 14px; + padding-top: 5px; +} \ No newline at end of file From 591f59f90c4df87c5e5b7138c1f270d938858c2d Mon Sep 17 00:00:00 2001 From: jaywcjlove <398188662@qq.com> Date: Sun, 5 Dec 2021 16:34:05 +0800 Subject: [PATCH 13/41] chore: update .gitignore --- .gitignore | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index eea8c72..2531707 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,26 @@ # .DS_Store -# node.js -# -node_modules/ -npm-debug.log \ No newline at end of file +build +node_modules +npm-debug.log +package-lock.json + +.DS_Store +.cache +.vscode +.idea +.snap +.env + +*.bak +*.tem +*.temp +#.swp +*.*~ +~*.* + +# IDEA +*.iml +*.ipr +*.iws \ No newline at end of file From 80a6a4434043d51cb2e8b4a60e0d31fa8d22685f Mon Sep 17 00:00:00 2001 From: jaywcjlove <398188662@qq.com> Date: Sun, 5 Dec 2021 16:34:30 +0800 Subject: [PATCH 14/41] doc: update awesome-mysql.md --- awesome-mysql.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/awesome-mysql.md b/awesome-mysql.md index d3c435f..c69949b 100644 --- a/awesome-mysql.md +++ b/awesome-mysql.md @@ -1,5 +1,5 @@ Awesome MySQL ---- +=== 这是一个MySQL软件库和资源列表清单。部分资源搜集来源于[shlomi-noach/awesome-mysql](https://github.com/shlomi-noach/awesome-mysql),它的[中文翻译](https://github.com/jobbole/awesome-mysql-cn)在这里,没有完全fork过来,没有完全拷贝,是因为部分排版比较丑陋,部分工具慢慢搜集理解。 From 30ccd5f7c8d70f28bc189ed1ef70e800fa08d50a Mon Sep 17 00:00:00 2001 From: jaywcjlove <398188662@qq.com> Date: Sun, 5 Dec 2021 16:34:45 +0800 Subject: [PATCH 15/41] chore: update .github/workflows/ci.yml --- .github/workflows/ci.yml | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..5209163 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,25 @@ +name: Build Website +on: + push: + branches: + - master + +jobs: + Build: + runs-on: ubuntu-18.04 + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: 14 + + - run: npm install + - run: node scripts/build.mjs + + - name: Deploy + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./build + user_name: 'github-actions[bot]' + user_email: 'github-actions[bot]@users.noreply.github.com' \ No newline at end of file From 4daf9bb8dfb3296b4e734f21683e866cfbbd1598 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 5 Dec 2021 16:35:37 +0800 Subject: [PATCH 16/41] chore(deps): add renovate.json (#34) Co-authored-by: Renovate Bot --- renovate.json | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 renovate.json diff --git a/renovate.json b/renovate.json new file mode 100644 index 0000000..f45d8f1 --- /dev/null +++ b/renovate.json @@ -0,0 +1,5 @@ +{ + "extends": [ + "config:base" + ] +} From 044d56d08c47e3ed38b7ddb37010f45c4d561a71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=BC=9F=E8=B0=83=E8=B0=83=E2=84=A2?= Date: Sun, 5 Dec 2021 16:36:08 +0800 Subject: [PATCH 17/41] Create LICENSE --- LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..64e05d5 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 小弟调调™ + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From daf75a80c3f774edd5634c72751d218c5bbc13c9 Mon Sep 17 00:00:00 2001 From: jaywcjlove <398188662@qq.com> Date: Sun, 5 Dec 2021 17:00:07 +0800 Subject: [PATCH 18/41] chore: update favicon icon. --- scripts/node/favicon.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/node/favicon.mjs b/scripts/node/favicon.mjs index 8d371ed..8e4effd 100644 --- a/scripts/node/favicon.mjs +++ b/scripts/node/favicon.mjs @@ -1 +1 @@ -export const favicon = 'data:image/png;base64,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' \ No newline at end of file +export const favicon = 'data:image/png;base64,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' \ No newline at end of file From 3e07e31a62ec8447f07e7c1b1b843550d1bc3baa Mon Sep 17 00:00:00 2001 From: jaywcjlove <398188662@qq.com> Date: Sun, 5 Dec 2021 17:31:52 +0800 Subject: [PATCH 19/41] chore: update footer url errors. --- scripts/node/footer.mjs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/scripts/node/footer.mjs b/scripts/node/footer.mjs index 34ae26d..89a1e70 100644 --- a/scripts/node/footer.mjs +++ b/scripts/node/footer.mjs @@ -13,8 +13,8 @@ export const footer = (editPath) => { properties: { 'data-edit': true, target: '__blank', - title: `https://github.com/jaywcjlove/handbook/edit/master/${editPath}`, - href: `https://github.com/jaywcjlove/handbook/edit/master/${editPath}`, + title: `https://github.com/jaywcjlove/mysql-tutorial/edit/master/${editPath}`, + href: `https://github.com/jaywcjlove/mysql-tutorial/edit/master/${editPath}`, }, children: [ { type: 'text', value: '编辑当前页面' } ] }, @@ -23,7 +23,7 @@ export const footer = (editPath) => { tagName: 'a', properties: { target: '__blank', - href: 'https://jaywcjlove.gitee.io/handbook/', + href: 'https://jaywcjlove.gitee.io/mysql-tutorial/', }, children: [ { type: 'text', value: '国内镜像站点 🇨🇳' } ] }, @@ -32,7 +32,7 @@ export const footer = (editPath) => { tagName: 'a', properties: { target: '__blank', - href: 'https://github.com/jaywcjlove/handbook', + href: 'https://github.com/jaywcjlove/mysql-tutorial', }, children: [ { type: 'text', value: 'Github' } ] }, @@ -41,7 +41,7 @@ export const footer = (editPath) => { tagName: 'a', properties: { target: '__blank', - href: 'https://gitee.com/jaywcjlove/handbook', + href: 'https://gitee.com/jaywcjlove/mysql-tutorial', }, children: [ { type: 'text', value: 'Gitee' } ] }, From a9fc6fbee9298fcbefd5df2a32bf07875feedccf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=BC=9F=E8=B0=83=E8=B0=83=E2=84=A2?= Date: Wed, 26 Jan 2022 11:12:39 +0800 Subject: [PATCH 20/41] Update 21-minutes-MySQL-basic-entry.md --- 21-minutes-MySQL-basic-entry.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/21-minutes-MySQL-basic-entry.md b/21-minutes-MySQL-basic-entry.md index b3047b3..9e8ead3 100644 --- a/21-minutes-MySQL-basic-entry.md +++ b/21-minutes-MySQL-basic-entry.md @@ -69,7 +69,7 @@ MySQL 为关系型数据库(Relational Database Management System),一个关 ### 登录MySQL ```shell -mysql -h 127.0.0.1 -u 用户名 -p +mysql -h 127.0.0.1 -u <用户名> -p<密码>. # 默认用户名,-p 是密码,⚠️参数后面不需要空格 mysql -D 所选择的数据库名 -h 主机名 -u 用户名 -p mysql> exit # 退出 使用 “quit;” 或 “\q;” 一样的效果 mysql> status; # 显示当前mysql的version的各种信息 From 2311d5d04215d3f0028bfbf7c7cbf7979561e682 Mon Sep 17 00:00:00 2001 From: jaywcjlove <398188662@qq.com> Date: Sat, 23 Apr 2022 01:20:36 +0800 Subject: [PATCH 21/41] chore: move folder. --- README.md | 190 +++++++++--------- .../21-minutes-MySQL-basic-entry.md | 0 awesome-mysql.md => docs/awesome-mysql.md | 0 {chapter1 => docs/chapter1}/1.1.md | 0 {chapter1 => docs/chapter1}/1.2.md | 0 {chapter1 => docs/chapter1}/1.3.md | 0 {chapter1 => docs/chapter1}/1.4.md | 0 {chapter1 => docs/chapter1}/1.md | 0 {chapter17 => docs/chapter17}/17.1.md | 0 {chapter17 => docs/chapter17}/17.2.md | 0 {chapter17 => docs/chapter17}/17.3.md | 0 {chapter2 => docs/chapter2}/2.1.md | 0 {chapter2 => docs/chapter2}/2.2.md | 0 {chapter2 => docs/chapter2}/2.3.md | 0 {chapter2 => docs/chapter2}/2.4.md | 0 {chapter2 => docs/chapter2}/2.5.md | 0 {chapter2 => docs/chapter2}/2.6.md | 0 {chapter3 => docs/chapter3}/3.1.md | 0 {chapter3 => docs/chapter3}/3.2.md | 0 {chapter3 => docs/chapter3}/3.3.md | 0 {chapter3 => docs/chapter3}/3.4.md | 0 {chapter3 => docs/chapter3}/3.5.md | 0 {chapter3 => docs/chapter3}/3.md | 0 package.json | 2 +- 24 files changed, 99 insertions(+), 93 deletions(-) rename 21-minutes-MySQL-basic-entry.md => docs/21-minutes-MySQL-basic-entry.md (100%) rename awesome-mysql.md => docs/awesome-mysql.md (100%) rename {chapter1 => docs/chapter1}/1.1.md (100%) rename {chapter1 => docs/chapter1}/1.2.md (100%) rename {chapter1 => docs/chapter1}/1.3.md (100%) rename {chapter1 => docs/chapter1}/1.4.md (100%) rename {chapter1 => docs/chapter1}/1.md (100%) rename {chapter17 => docs/chapter17}/17.1.md (100%) rename {chapter17 => docs/chapter17}/17.2.md (100%) rename {chapter17 => docs/chapter17}/17.3.md (100%) rename {chapter2 => docs/chapter2}/2.1.md (100%) rename {chapter2 => docs/chapter2}/2.2.md (100%) rename {chapter2 => docs/chapter2}/2.3.md (100%) rename {chapter2 => docs/chapter2}/2.4.md (100%) rename {chapter2 => docs/chapter2}/2.5.md (100%) rename {chapter2 => docs/chapter2}/2.6.md (100%) rename {chapter3 => docs/chapter3}/3.1.md (100%) rename {chapter3 => docs/chapter3}/3.2.md (100%) rename {chapter3 => docs/chapter3}/3.3.md (100%) rename {chapter3 => docs/chapter3}/3.4.md (100%) rename {chapter3 => docs/chapter3}/3.5.md (100%) rename {chapter3 => docs/chapter3}/3.md (100%) diff --git a/README.md b/README.md index 45548e9..6115988 100644 --- a/README.md +++ b/README.md @@ -2,15 +2,15 @@ MySQL入门教程 ---- +=== [![](https://jaywcjlove.github.io/sb/ico/mysql.svg)](http://www.mysql.com/) [![](https://jaywcjlove.github.io/sb/ico/awesome.svg)](awesome-mysql.md) [![](https://jaywcjlove.github.io/sb/license/mit.svg)](#) 从零开始学习MySQL,主要是面向MySQL数据库管理系统初学者。前端开发工程师为什么写这个入门教程呢?最近项目强迫我这个前端老司机使用MySQL,虽然我在项目中已经使用过一段时间,为了写出高质量的SQL语句,能快速定位解决数据库引发的问题,系统的过一遍基础,你也可以当做是我的笔记。有幸也认识一些 MySQL 的 DBA,这让我学习起来比较快,能快速入门,进入实战开发阶段。 -原本我是使用 MongoDB 这类型的 NoSQL 数据库,MongoDB在 Nodejs 在 Mongoose 包的帮助下 JSON 的数据格式直接插入 MongoDB 中,对于一个前端开发工程师,使用起来非常舒服。但是没有办法,我是被逼的,从此入了一个新坑,我就决心系统的好好学习一下。如果你对本小电子书阅读非常没有耐心,你可以看看我做的一篇笔记 **《[21分钟MySQL基础入门](21-minutes-MySQL-basic-entry.md)》** ,这个笔记还可以在 [SegmentFault](https://segmentfault.com/a/1190000006876419) 里面阅读,有导航阅读非常方便,为什么只需要21分钟呢?因为在我们大天朝有句话叫做“不管三七二十一”,你可以不管三七二十一开始使用 MySQL 及快速入门,里面系统的整理了,一些常用的SQL语句。 +原本我是使用 MongoDB 这类型的 NoSQL 数据库,MongoDB在 Nodejs 在 Mongoose 包的帮助下 JSON 的数据格式直接插入 MongoDB 中,对于一个前端开发工程师,使用起来非常舒服。但是没有办法,我是被逼的,从此入了一个新坑,我就决心系统的好好学习一下。如果你对本小电子书阅读非常没有耐心,你可以看看我做的一篇笔记 **《[21分钟MySQL基础入门](./docs/21-minutes-MySQL-basic-entry.md)》** ,这个笔记还可以在 [SegmentFault](https://segmentfault.com/a/1190000006876419) 里面阅读,有导航阅读非常方便,为什么只需要21分钟呢?因为在我们大天朝有句话叫做“不管三七二十一”,你可以不管三七二十一开始使用 MySQL 及快速入门,里面系统的整理了,一些常用的SQL语句。 -在本书中所搜集到得各种资源,我把它将放到这里 **[Awesome MySQL](awesome-mysql.md)**。所有SQL语句例子,是基于 MySQL 5.7.14 或者 MySQL 5.7.16 运行的。这里面的一些理论知识都是从[维基百科](https://zh.wikipedia.org)等各种百科、各种官网搬运过来的,偶尔会有一些基础理论知识总结,如果有错误或者误差,可以给我来个疯狂的[Pull requesets](https://github.com/jaywcjlove/mysql-tutorial/pulls)或[Issue](https://github.com/jaywcjlove/mysql-tutorial/issues)。如果实在看不下去你可以🔫。 +在本书中所搜集到得各种资源,我把它将放到这里 **[Awesome MySQL](./docs/awesome-mysql.md)**。所有SQL语句例子,是基于 MySQL 5.7.14 或者 MySQL 5.7.16 运行的。这里面的一些理论知识都是从[维基百科](https://zh.wikipedia.org)等各种百科、各种官网搬运过来的,偶尔会有一些基础理论知识总结,如果有错误或者误差,可以给我来个疯狂的[Pull requesets](https://github.com/jaywcjlove/mysql-tutorial/pulls)或[Issue](https://github.com/jaywcjlove/mysql-tutorial/issues)。如果实在看不下去你可以🔫。 MariaDB,是 MySQL server 的一个由社区开发的分支,MariaDB大部分跟 MySQL 5.5 以前版本使用差不多。自己电脑上是 MySQL 5.7.14,公司服务器上面是 MariaDB 最新版本,生产上 MySQL 5.7.16,所以很尴尬,偶尔提及MariaDB也是很正常的吧。 @@ -18,95 +18,95 @@ MariaDB,是 MySQL server 的一个由社区开发的分支,MariaDB大部分 #### Awesome MySQL -- [21分钟MySQL基础入门](21-minutes-MySQL-basic-entry.md) -- [手册文档](awesome-mysql.md#手册文档) - 一些非官方的手册文档搜集 -- [分析工具](awesome-mysql.md#分析工具) - 性能,结构和数据分析工具 -- [GUI](awesome-mysql.md#gui) - 搜集的一些 MySQL 的客户端,也有命令行客户端 -- [服务器](awesome-mysql.md#服务器) - MySQL服务器的衍生品 -- [备份](awesome-mysql.md#备份) - 备份/存储/恢复 工具 -- [官方资料](awesome-mysql.md#官方资料) - 官方的一些网站和文章 -- [优秀文章](awesome-mysql.md#优秀文章) - 一些优秀的文章 +- [21分钟MySQL基础入门](./docs/21-minutes-MySQL-basic-entry.md) +- [手册文档](./docs/awesome-mysql.md#手册文档) - 一些非官方的手册文档搜集 +- [分析工具](./docs/awesome-mysql.md#分析工具) - 性能,结构和数据分析工具 +- [GUI](./docs/awesome-mysql.md#gui) - 搜集的一些 MySQL 的客户端,也有命令行客户端 +- [服务器](./docs/awesome-mysql.md#服务器) - MySQL服务器的衍生品 +- [备份](./docs/awesome-mysql.md#备份) - 备份/存储/恢复 工具 +- [官方资料](./docs/awesome-mysql.md#官方资料) - 官方的一些网站和文章 +- [优秀文章](./docs/awesome-mysql.md#优秀文章) - 一些优秀的文章 #### 第1章 初识MySQL -- 1.1 [数据库基础](chapter1/1.1.md) - - [什么是数据库](chapter1/1.1.md#什么是数据库) - - [数据库分类](chapter1/1.1.md#数据库分类) - - [数据库模型](chapter1/1.1.md#数据库模型) - - [数据表](chapter1/1.1.md#数据表) - - [关系键](chapter1/1.1.md#关系键) -- 1.2 [数据库技术构成](chapter1/1.2.md) - - [数据库系统](chapter1/1.2.md#数据库系统) - - [关系数据库基本概念](chapter1/1.2.md#关系数据库基本概念) - - [SQL语言](chapter1/1.2.md#sql语言) - - [数据库访问技术](chapter1/1.2.md#数据库访问技术) -- 1.3 [什么是MySQL](chapter1/1.3.md) - - [MySQL介绍](chapter1/1.3.md#mysql-介绍) - - [MySQL发展历史](chapter1/1.3.md#mysql-发展历史) - - [MySQL版本](chapter1/1.3.md#mysql-版本) - - [MySQL的优势](chapter1/1.3.md#mysql-的优势) -- 1.4 [如何学习MySQL](chapter1/1.4.md) +- 1.1 [数据库基础](./docs/chapter1/1.1.md) + - [什么是数据库](./docs/chapter1/1.1.md#什么是数据库) + - [数据库分类](./docs/chapter1/1.1.md#数据库分类) + - [数据库模型](./docs/chapter1/1.1.md#数据库模型) + - [数据表](./docs/chapter1/1.1.md#数据表) + - [关系键](./docs/chapter1/1.1.md#关系键) +- 1.2 [数据库技术构成](./docs/chapter1/1.2.md) + - [数据库系统](./docs/chapter1/1.2.md#数据库系统) + - [关系数据库基本概念](./docs/chapter1/1.2.md#关系数据库基本概念) + - [SQL语言](./docs/chapter1/1.2.md#sql语言) + - [数据库访问技术](./docs/chapter1/1.2.md#数据库访问技术) +- 1.3 [什么是MySQL](./docs/chapter1/1.3.md) + - [MySQL介绍](./docs/chapter1/1.3.md#mysql-介绍) + - [MySQL发展历史](./docs/chapter1/1.3.md#mysql-发展历史) + - [MySQL版本](./docs/chapter1/1.3.md#mysql-版本) + - [MySQL的优势](./docs/chapter1/1.3.md#mysql-的优势) +- 1.4 [如何学习MySQL](./docs/chapter1/1.4.md) #### 第2章 MySQL的安装与配置 -- 2.1 [Mac平台下安装与配置MySQL](chapter2/2.1.md) - - [Mac上安装MySQL](chapter2/2.1.md#mac-安装mysql) - - [Mac上卸载MySQL](chapter2/2.1.md#mac-卸载mysql) -- 2.2 [Centos 平台安装与卸载MySQL](chapter2/2.2.md) - - [检查是否已安装](chapter2/2.2.md#检查是否已安装) - - [更新安装源](chapter2/2.2.md#更新安装源) - - [检查是否下载成功](chapter2/2.2.md#检查是否下载成功) - - [查看版本](chapter2/2.2.md#查看版本) - - [启动指定版本](chapter2/2.2.md#启动指定版本) - - [安装MySQL](chapter2/2.2.md#安装mysql) - - [查看安装目录](chapter2/2.2.md#查看安装目录) - - [MariaDB切换MySQL](chapter2/2.2.md#mariadb切换mysql) - - [卸载 MySQL 软件](chapter2/2.2.md#卸载-mysql-软件) -- 2.3 [Docker 安装 MySQL](chapter2/2.3.md) - - [快速启动一个 MySQL 服务器实例](chapter2/2.3.md#快速启动一个-mysql-服务器实例) +- 2.1 [Mac平台下安装与配置MySQL](./docs/chapter2/2.1.md) + - [Mac上安装MySQL](./docs/chapter2/2.1.md#mac-安装mysql) + - [Mac上卸载MySQL](./docs/chapter2/2.1.md#mac-卸载mysql) +- 2.2 [Centos 平台安装与卸载MySQL](./docs/chapter2/2.2.md) + - [检查是否已安装](./docs/chapter2/2.2.md#检查是否已安装) + - [更新安装源](./docs/chapter2/2.2.md#更新安装源) + - [检查是否下载成功](./docs/chapter2/2.2.md#检查是否下载成功) + - [查看版本](./docs/chapter2/2.2.md#查看版本) + - [启动指定版本](./docs/chapter2/2.2.md#启动指定版本) + - [安装MySQL](./docs/chapter2/2.2.md#安装mysql) + - [查看安装目录](./docs/chapter2/2.2.md#查看安装目录) + - [MariaDB切换MySQL](./docs/chapter2/2.2.md#mariadb切换mysql) + - [卸载 MySQL 软件](./docs/chapter2/2.2.md#卸载-mysql-软件) +- 2.3 [Docker 安装 MySQL](./docs/chapter2/2.3.md) + - [快速启动一个 MySQL 服务器实例](./docs/chapter2/2.3.md#快速启动一个-mysql-服务器实例) - [通过命令行访问 MySQL 容器](#通过命令行访问-mysql-容器) - [使用 MySQL 自定义配置文件](#使用-mysql-自定义配置文件) - [使用 stack 部署 MySQL](#使用-stack-部署-mysql) -- 2.4 [启动数据库设置初始密码](chapter2/2.4.md) - - [命令行启动关闭重启MySQL服务](chapter2/2.4.md#命令行启动关闭重启mysql服务) - - [图像界面启动关闭重启MySQL服务](chapter2/2.4.md#图像界面启动关闭重启mysql服务) - - [查看初始密码](chapter2/2.4.md#查看初始密码) - - [设置初始化密码](chapter2/2.4.md#设置初始化密码) - - [启动报错处理](chapter2/2.4.md#启动报错处理) -- 2.5 [MySQL工具](chapter2/2.5.md) - - [命令行使用程序](chapter2/2.5.md#命令行使用程序) - - [MySQL Workbench客户端](chapter2/2.5.md#mysql-workbench客户端) - - [常用图形管理工具](chapter2/2.5.md#常用图形管理工具) - - [MyCli替代MySQL的mysql命令行工具](chapter2/2.5.md#mycli替代mysql的mysql命令行工具) -- 2.6 [MySQL配置修改](chapter2/2.6.md) - - [MySQL安装目录说明](chapter2/2.6.md#mysql安装目录说明) - - [配置文件的位置](chapter2/2.6.md#配置文件的位置) - - [Windows系统配置文件读取](chapter2/2.6.md#windows系统配置文件读取) - - [Linux系统配置文件读取](chapter2/2.6.md#linux系统配置文件读取) - - [配置文件内容](chapter2/2.6.md#配置文件内容) +- 2.4 [启动数据库设置初始密码](./docs/chapter2/2.4.md) + - [命令行启动关闭重启MySQL服务](./docs/chapter2/2.4.md#命令行启动关闭重启mysql服务) + - [图像界面启动关闭重启MySQL服务](./docs/chapter2/2.4.md#图像界面启动关闭重启mysql服务) + - [查看初始密码](./docs/chapter2/2.4.md#查看初始密码) + - [设置初始化密码](./docs/chapter2/2.4.md#设置初始化密码) + - [启动报错处理](./docs/chapter2/2.4.md#启动报错处理) +- 2.5 [MySQL工具](./docs/chapter2/2.5.md) + - [命令行使用程序](./docs/chapter2/2.5.md#命令行使用程序) + - [MySQL Workbench客户端](./docs/chapter2/2.5.md#mysql-workbench客户端) + - [常用图形管理工具](./docs/chapter2/2.5.md#常用图形管理工具) + - [MyCli替代MySQL的mysql命令行工具](./docs/chapter2/2.5.md#mycli替代mysql的mysql命令行工具) +- 2.6 [MySQL配置修改](./docs/chapter2/2.6.md) + - [MySQL安装目录说明](./docs/chapter2/2.6.md#mysql安装目录说明) + - [配置文件的位置](./docs/chapter2/2.6.md#配置文件的位置) + - [Windows系统配置文件读取](./docs/chapter2/2.6.md#windows系统配置文件读取) + - [Linux系统配置文件读取](./docs/chapter2/2.6.md#linux系统配置文件读取) + - [配置文件内容](./docs/chapter2/2.6.md#配置文件内容) #### 第3章 数据库的基本操作 -- 3.1 [连接数据库](chapter3/3.1.md) - - [MySQL命令语法](chapter3/3.1.md#mysql命令语法) - - [MySQL命令连接数据库](chapter3/3.1.md#mysql命令连接数据库) - - [开启MySQL的远程帐号](chapter3/3.1.md#开启mysql的远程帐号) - - [MySQL修改密码](chapter3/3.1.md#mysql修改密码) -- 3.2 [查看选择数据库](chapter3/3.2.md) - - [查看数据库](chapter3/3.2.md#查看数据库) - - [选择数据库](chapter3/3.2.md#选择数据库) -- 3.3 [创建数据库](chapter3/3.3.md) - - [SQL语句创建数据库](chapter3/3.4.md#sql语句创建数据库) - - [管理工具创建数据库](chapter3/3.4.md#管理工具创建数据库) -- 3.4 [删除数据库](chapter3/3.4.md) - - [SQL语句删除数据库](chapter3/3.4.md#sql语句删除数据库) - - [管理工具删除数据库](chapter3/3.4.md#管理工具删除数据库) -- 3.5 [数据库存储引擎](chapter3/3.5.md#) - - [存储引擎简介](chapter3/3.5.md#存储引擎简介) - - [常用引擎对比](chapter3/3.5.md#常用引擎对比) - - [查看存储引擎](chapter3/3.5.md#查看存储引擎) - - [设置存储引擎](chapter3/3.5.md#设置存储引擎) - - [如何选择合适的存储引擎](chapter3/3.5.md#如何选择合适的存储引擎) +- 3.1 [连接数据库](./docs/chapter3/3.1.md) + - [MySQL命令语法](./docs/chapter3/3.1.md#mysql命令语法) + - [MySQL命令连接数据库](./docs/chapter3/3.1.md#mysql命令连接数据库) + - [开启MySQL的远程帐号](./docs/chapter3/3.1.md#开启mysql的远程帐号) + - [MySQL修改密码](./docs/chapter3/3.1.md#mysql修改密码) +- 3.2 [查看选择数据库](./docs/chapter3/3.2.md) + - [查看数据库](./docs/chapter3/3.2.md#查看数据库) + - [选择数据库](./docs/chapter3/3.2.md#选择数据库) +- 3.3 [创建数据库](./docs/chapter3/3.3.md) + - [SQL语句创建数据库](./docs/chapter3/3.4.md#sql语句创建数据库) + - [管理工具创建数据库](./docs/chapter3/3.4.md#管理工具创建数据库) +- 3.4 [删除数据库](./docs/chapter3/3.4.md) + - [SQL语句删除数据库](./docs/chapter3/3.4.md#sql语句删除数据库) + - [管理工具删除数据库](./docs/chapter3/3.4.md#管理工具删除数据库) +- 3.5 [数据库存储引擎](./docs/chapter3/3.5.md#) + - [存储引擎简介](./docs/chapter3/3.5.md#存储引擎简介) + - [常用引擎对比](./docs/chapter3/3.5.md#常用引擎对比) + - [查看存储引擎](./docs/chapter3/3.5.md#查看存储引擎) + - [设置存储引擎](./docs/chapter3/3.5.md#设置存储引擎) + - [如何选择合适的存储引擎](./docs/chapter3/3.5.md#如何选择合适的存储引擎) #### 第4章 数据表的基本操作 @@ -138,17 +138,17 @@ MariaDB,是 MySQL server 的一个由社区开发的分支,MariaDB大部分 #### 第17章 各种问题解决 -- [让MySQL支持emoji图标存储](chapter17/17.1.md) -- [Centos6下升级MySQL数据库](chapter17/17.2.md) -- [MySQL修改密码](chapter17/17.3.md) - - [mysqld_safe不存在修改密码](chapter17/17.3.md#mysqld_safe不存在修改密码) - - [启动修改丢失的mysql单实例root密码方法](chapter17/17.3.md#启动修改丢失的mysql单实例root密码方法) - - [Mac下重置MySQL的root密码](chapter17/17.3.md#Mac下重置MySQL的root密码) - - [不重启mysqld修改密码的方法](chapter17/17.3.md#不重启mysqld的方法) -- [Centos7 默认为MariaDB导致mysql安装不上](chapter2/2.2.md#centos7安装mysql) -- [mysql命令不存在](chapter2/2.1.md#mysql命令不存在) -- [MySQL服务启动失败解决方案](chapter2/2.3.md#linux-下命令操作) -- [密码不满足当前的策略要求导致无法开启远程帐号](chapter3/3.1.md#开启mysql的远程帐号) +- [让MySQL支持emoji图标存储](./docs/chapter17/17.1.md) +- [Centos6下升级MySQL数据库](./docs/chapter17/17.2.md) +- [MySQL修改密码](./docs/chapter17/17.3.md) + - [mysqld_safe不存在修改密码](./docs/chapter17/17.3.md#mysqld_safe不存在修改密码) + - [启动修改丢失的mysql单实例root密码方法](./docs/chapter17/17.3.md#启动修改丢失的mysql单实例root密码方法) + - [Mac下重置MySQL的root密码](./docs/chapter17/17.3.md#Mac下重置MySQL的root密码) + - [不重启mysqld修改密码的方法](./docs/chapter17/17.3.md#不重启mysqld的方法) +- [Centos7 默认为MariaDB导致mysql安装不上](./docs/chapter2/2.2.md#centos7安装mysql) +- [mysql命令不存在](./docs/chapter2/2.1.md#mysql命令不存在) +- [MySQL服务启动失败解决方案](./docs/chapter2/2.3.md#linux-下命令操作) +- [密码不满足当前的策略要求导致无法开启远程帐号](./docs/chapter3/3.1.md#开启mysql的远程帐号) ## 读者对象 @@ -162,4 +162,10 @@ MariaDB,是 MySQL server 的一个由社区开发的分支,MariaDB大部分 从目录来看,看上去内容丰富,比较完整的介绍了 MySQL 数据库技术的教程,我不是`DBA`,我不是,正在看这篇文章的你,很可能也不是,不想误人子弟,在项目中应用了一段时间 MySQL,如果你是`DBA`请多多指教,文采不佳还望高抬贵手,不甚感激,小弟在这里给您鞠躬,欢迎给我纠错。 -我想念一个女孩儿,实属无奈我得继续努力,好好读书做个有趣的人,完成我的“著作”,待我著作完成可否跟我约个会? +~~我想念一个女孩儿,实属无奈我得继续努力,好好读书做个有趣的人,完成我的“著作”,待我著作完成可否跟我约个会?~~ + +还没有写完就结婚了,欢迎大家 PR 补充完善 :)。 + +## License + +Licensed under the MIT License. diff --git a/21-minutes-MySQL-basic-entry.md b/docs/21-minutes-MySQL-basic-entry.md similarity index 100% rename from 21-minutes-MySQL-basic-entry.md rename to docs/21-minutes-MySQL-basic-entry.md diff --git a/awesome-mysql.md b/docs/awesome-mysql.md similarity index 100% rename from awesome-mysql.md rename to docs/awesome-mysql.md diff --git a/chapter1/1.1.md b/docs/chapter1/1.1.md similarity index 100% rename from chapter1/1.1.md rename to docs/chapter1/1.1.md diff --git a/chapter1/1.2.md b/docs/chapter1/1.2.md similarity index 100% rename from chapter1/1.2.md rename to docs/chapter1/1.2.md diff --git a/chapter1/1.3.md b/docs/chapter1/1.3.md similarity index 100% rename from chapter1/1.3.md rename to docs/chapter1/1.3.md diff --git a/chapter1/1.4.md b/docs/chapter1/1.4.md similarity index 100% rename from chapter1/1.4.md rename to docs/chapter1/1.4.md diff --git a/chapter1/1.md b/docs/chapter1/1.md similarity index 100% rename from chapter1/1.md rename to docs/chapter1/1.md diff --git a/chapter17/17.1.md b/docs/chapter17/17.1.md similarity index 100% rename from chapter17/17.1.md rename to docs/chapter17/17.1.md diff --git a/chapter17/17.2.md b/docs/chapter17/17.2.md similarity index 100% rename from chapter17/17.2.md rename to docs/chapter17/17.2.md diff --git a/chapter17/17.3.md b/docs/chapter17/17.3.md similarity index 100% rename from chapter17/17.3.md rename to docs/chapter17/17.3.md diff --git a/chapter2/2.1.md b/docs/chapter2/2.1.md similarity index 100% rename from chapter2/2.1.md rename to docs/chapter2/2.1.md diff --git a/chapter2/2.2.md b/docs/chapter2/2.2.md similarity index 100% rename from chapter2/2.2.md rename to docs/chapter2/2.2.md diff --git a/chapter2/2.3.md b/docs/chapter2/2.3.md similarity index 100% rename from chapter2/2.3.md rename to docs/chapter2/2.3.md diff --git a/chapter2/2.4.md b/docs/chapter2/2.4.md similarity index 100% rename from chapter2/2.4.md rename to docs/chapter2/2.4.md diff --git a/chapter2/2.5.md b/docs/chapter2/2.5.md similarity index 100% rename from chapter2/2.5.md rename to docs/chapter2/2.5.md diff --git a/chapter2/2.6.md b/docs/chapter2/2.6.md similarity index 100% rename from chapter2/2.6.md rename to docs/chapter2/2.6.md diff --git a/chapter3/3.1.md b/docs/chapter3/3.1.md similarity index 100% rename from chapter3/3.1.md rename to docs/chapter3/3.1.md diff --git a/chapter3/3.2.md b/docs/chapter3/3.2.md similarity index 100% rename from chapter3/3.2.md rename to docs/chapter3/3.2.md diff --git a/chapter3/3.3.md b/docs/chapter3/3.3.md similarity index 100% rename from chapter3/3.3.md rename to docs/chapter3/3.3.md diff --git a/chapter3/3.4.md b/docs/chapter3/3.4.md similarity index 100% rename from chapter3/3.4.md rename to docs/chapter3/3.4.md diff --git a/chapter3/3.5.md b/docs/chapter3/3.5.md similarity index 100% rename from chapter3/3.5.md rename to docs/chapter3/3.5.md diff --git a/chapter3/3.md b/docs/chapter3/3.md similarity index 100% rename from chapter3/3.md rename to docs/chapter3/3.md diff --git a/package.json b/package.json index 180611f..4542dff 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mysql-tutorial", - "version": "1.0.0", + "version": "0.0.1", "description": "从零开始学习MySQL,主要是面向MySQL数据库管理系统初学者。", "homepage": "https://jaywcjlove.github.io/mysql-tutorial", "author": "jaywcjlove", From ba35eb17125dbce173a98d1a34b9cf2c3a414ff0 Mon Sep 17 00:00:00 2001 From: jaywcjlove <398188662@qq.com> Date: Sat, 23 Apr 2022 01:20:49 +0800 Subject: [PATCH 22/41] chore: update workflows config. --- .github/workflows/ci.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5209163..9da1fda 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,4 +1,4 @@ -name: Build Website +name: CI on: push: branches: @@ -16,6 +16,13 @@ jobs: - run: npm install - run: node scripts/build.mjs + - name: Generate Contributors Images + uses: jaywcjlove/github-action-contributors@main + with: + filter-author: (renovate\[bot\]|renovate-bot|dependabot\[bot\]) + output: build/CONTRIBUTORS.svg + avatarSize: 42 + - name: Deploy uses: peaceiris/actions-gh-pages@v3 with: From bb3620ae1f13c8a950a244c87b14436376b44955 Mon Sep 17 00:00:00 2001 From: jaywcjlove <398188662@qq.com> Date: Sat, 23 Apr 2022 01:24:24 +0800 Subject: [PATCH 23/41] chore: fix import images error. --- docs/chapter1/1.1.md | 2 +- docs/chapter2/2.1.md | 2 +- docs/chapter2/2.4.md | 2 +- docs/chapter2/2.5.md | 10 +++++----- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/chapter1/1.1.md b/docs/chapter1/1.1.md index 329bffc..007165b 100644 --- a/docs/chapter1/1.1.md +++ b/docs/chapter1/1.1.md @@ -110,7 +110,7 @@ _数据库的架构可以大致区分为三个概括层次:内层、概念层 关系数据库没有数据表,关键字、主键、索引等也就无从谈起,数据表是关系数据库中一个非常重要的对象,是其它对象的基础,也是一系列二维数组的集合,用来存储、操作数据的逻辑结构。根据信息的分类情况。一个数据库中可能包含若干个数据表,每张表是由行和列组成,记录一条数据数据表就增加一行,每一列是由字段名和字段数据集合组成,列被称之为字段,每一列还有自己的多个属性,例如是否允许为空、默认值、长度、类型、存储编码、注释等 -![MySQL](../img/data.jpg) +![MySQL](../../img/data.jpg) **数据类型** diff --git a/docs/chapter2/2.1.md b/docs/chapter2/2.1.md index 78a8637..3ebc5fc 100644 --- a/docs/chapter2/2.1.md +++ b/docs/chapter2/2.1.md @@ -8,7 +8,7 @@ Mac平台下安装与配置MySQL DMG 文件点开默认安装完成之后(新版需要重启操作系统),就可以在系统偏好设置里面看到 MySQL 的偏好设置面板。 -![MySQL](../img/2.1_1.jpg) +![MySQL](../../img/2.1_1.jpg) ## Mac 卸载MySQL diff --git a/docs/chapter2/2.4.md b/docs/chapter2/2.4.md index 449c72f..061fdef 100644 --- a/docs/chapter2/2.4.md +++ b/docs/chapter2/2.4.md @@ -147,7 +147,7 @@ net stop mysql 在 Mac 系统下如果你官方下载安装就可以在`系统偏好设置` > `MySQL` 里面点击 `Stop MySQL Server` 按钮进行启动关闭。 -![MySQL](../img/2.3.1.png) +![MySQL](../../img/2.3.1.png) 通过 [XAMMPP](https://www.apachefriends.org/zh_cn/index.html) 安装的 MySQL ,这个软件安装之后会自动安装 Apache + MySQL + PHP 对于初学者特别方便,新版本是默认安装`Apache + MariaDB + PHP + Perl`。 diff --git a/docs/chapter2/2.5.md b/docs/chapter2/2.5.md index e583c93..751ce61 100644 --- a/docs/chapter2/2.5.md +++ b/docs/chapter2/2.5.md @@ -69,7 +69,7 @@ MySQL 命令行实用程序是使用最多的实用程序之一,它对于快 对于命令行客户端软件,想熟悉使用,必需对每一个相关命令需要非常熟悉,这对于现在初级 MySQL 用户来说,还得玩儿上好长一段时间。于是官方专卖开发了图形化客户端软件 [MySQL Workbench](http://dev.mysql.com/downloads/workbench/),进入 [MySQL Workbench](http://dev.mysql.com/downloads/workbench/) 进行下载安装程序,这里安装我是按照默认选项安装,直接不停的下一步。 -![MySQL](../img/1.4.1.jpg) +![MySQL](../../img/1.4.1.jpg) MySQL Workbench 主要是为数据库管理员和开发人员提供了一整套可视化数据看操作环境,主要有以下功能: @@ -85,9 +85,9 @@ MySQL Workbench 功能繁缛,操作复杂,而且在 Mac 上面启动慢操 Sequel Pro 安装也特别简单,有着 Mac 安装应用的风范,下载之后打开 dmg 拖拽 APP 到你的应用程序文件夹即可安装成功,下面是它漂亮的界面: -![MySQL](../img/1.4.2.jpg) -![MySQL](../img/1.4.3.jpg) -![MySQL](../img/1.4.4.jpg) +![MySQL](../../img/1.4.2.jpg) +![MySQL](../../img/1.4.3.jpg) +![MySQL](../../img/1.4.4.jpg) 我在开发过程中一直使用它来配合命令行终端来使用。在这个过程中熟悉了不少命令,为今后在 Linux 服务器中也玩儿得如鱼得水,非常happy!个人小建议,终归是要熟悉一些命令行的,因为部署到生产环境,极为可能连操作系统都没有图形界面。 @@ -97,7 +97,7 @@ Sequel Pro 安装也特别简单,有着 Mac 安装应用的风范,下载之 [MyCli](http://mycli.net/) 是一个 MySQL 命令行工具,支持自动补全和语法高亮。也可用于 MariaDB 和 Percona。推荐好用的图形界面也得推荐好用的命令行工具,这个工具也是免费开源的,[源码在这里](https://github.com/dbcli/mycli) -![MySQL](../img/1.4.5.gif) +![MySQL](../../img/1.4.5.gif) 看上图就已经高潮了吧,它的安装也毫无压力,不费吹灰之力就搞定安装,没有复杂的配置,[MyCli](http://mycli.net/)实在太厉害了,不得不推荐它。安装方法如下: From 369394ca582d4108ce681ee0560c686726b3e57f Mon Sep 17 00:00:00 2001 From: jaywcjlove <398188662@qq.com> Date: Sat, 23 Apr 2022 01:29:36 +0800 Subject: [PATCH 24/41] chore: update renovate.json --- renovate.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/renovate.json b/renovate.json index f45d8f1..5fe6b17 100644 --- a/renovate.json +++ b/renovate.json @@ -1,5 +1,11 @@ { "extends": [ "config:base" + ], + "packageRules": [ + { + "matchPackagePatterns": ["*"], + "rangeStrategy": "replace" + } ] } From 6d47e8617e863db4ca119a1a642057459b6435ec Mon Sep 17 00:00:00 2001 From: jaywcjlove <398188662@qq.com> Date: Sat, 23 Apr 2022 01:56:33 +0800 Subject: [PATCH 25/41] chore: use idoc build website. --- .github/workflows/ci.yml | 40 +++++++++++++++++++++++----- .gitignore | 1 + README.md | 6 ++--- docs/21-minutes-MySQL-basic-entry.md | 3 +++ docs/awesome-mysql.md | 5 +++- idoc.chapters.yml | 29 ++++++++++++++++++++ idoc.yml | 17 ++++++++++++ mysql.svg | 4 +++ package.json | 8 +++--- 9 files changed, 99 insertions(+), 14 deletions(-) create mode 100644 idoc.chapters.yml create mode 100644 idoc.yml create mode 100644 mysql.svg diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9da1fda..7711ceb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,19 +14,47 @@ jobs: node-version: 14 - run: npm install - - run: node scripts/build.mjs + - run: npm run build - name: Generate Contributors Images uses: jaywcjlove/github-action-contributors@main with: filter-author: (renovate\[bot\]|renovate-bot|dependabot\[bot\]) - output: build/CONTRIBUTORS.svg + output: dist/CONTRIBUTORS.svg avatarSize: 42 - - name: Deploy + - name: Create Tag + id: create_tag + uses: jaywcjlove/create-tag-action@v1.3.6 + with: + package-path: ./package.json + + - name: Deploy Website uses: peaceiris/actions-gh-pages@v3 with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./build user_name: 'github-actions[bot]' - user_email: 'github-actions[bot]@users.noreply.github.com' \ No newline at end of file + user_email: 'github-actions[bot]@users.noreply.github.com' + commit_message: ${{steps.tag_version.outputs.tag}} ${{ github.event.head_commit.message }} + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./dist + + - name: Generate Changelog + id: changelog + uses: jaywcjlove/changelog-generator@v1.5.3 + with: + token: ${{ secrets.GITHUB_TOKEN }} + filter-author: (jaywcjlove|小弟调调™|dependabot\[bot\]|Renovate Bot) + filter: (^[\s]+?[R|r]elease)|(^[R|r]elease) + + - name: Create Release + uses: ncipollo/release-action@v1 + if: steps.create_tag.outputs.successful + with: + token: ${{ secrets.GITHUB_TOKEN }} + name: ${{ steps.create_tag.outputs.version }} + tag: ${{ steps.create_tag.outputs.version }} + body: | + Documentation ${{ steps.changelog.outputs.tag }}: https://raw.githack.com/jaywcjlove/mysql-tutorial/${{ steps.changelog.outputs.gh-pages-short-hash }}/index.html + Comparing Changes: ${{ steps.changelog.outputs.compareurl }} + + ${{ steps.changelog.outputs.changelog }} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 2531707..ae7ca9c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ # .DS_Store +dist build node_modules npm-debug.log diff --git a/README.md b/README.md index 6115988..6d868bc 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,10 @@ + MySQL入门教程 === + [![](https://jaywcjlove.github.io/sb/ico/mysql.svg)](http://www.mysql.com/) [![](https://jaywcjlove.github.io/sb/ico/awesome.svg)](awesome-mysql.md) [![](https://jaywcjlove.github.io/sb/license/mit.svg)](#) @@ -162,9 +164,7 @@ MariaDB,是 MySQL server 的一个由社区开发的分支,MariaDB大部分 从目录来看,看上去内容丰富,比较完整的介绍了 MySQL 数据库技术的教程,我不是`DBA`,我不是,正在看这篇文章的你,很可能也不是,不想误人子弟,在项目中应用了一段时间 MySQL,如果你是`DBA`请多多指教,文采不佳还望高抬贵手,不甚感激,小弟在这里给您鞠躬,欢迎给我纠错。 -~~我想念一个女孩儿,实属无奈我得继续努力,好好读书做个有趣的人,完成我的“著作”,待我著作完成可否跟我约个会?~~ - -还没有写完就结婚了,欢迎大家 PR 补充完善 :)。 +~~我想念一个女孩儿,实属无奈我得继续努力,好好读书做个有趣的人,完成我的“著作”,待我著作完成可否跟我约个会?~~ 还没有写完就结婚了,欢迎大家 PR 补充完善 :)。 ## License diff --git a/docs/21-minutes-MySQL-basic-entry.md b/docs/21-minutes-MySQL-basic-entry.md index 9e8ead3..1bb2449 100644 --- a/docs/21-minutes-MySQL-basic-entry.md +++ b/docs/21-minutes-MySQL-basic-entry.md @@ -3,6 +3,8 @@ 为什么只需要21分钟呢?因为在我们大天朝有句话叫做三七二十一,你可以不管三七二十一开始使用 `MySQL` 及快速的方式入门 `MySQL`。其实21分钟把下面语句执行一遍是没有问题的,要理解的话估计不止21分钟,对于初学者来说只需满足自己需求可以增删改查等简易的维护即可。 + + 目录 --- @@ -51,6 +53,7 @@ - [参考手册](#参考手册) + ## 开始使用 diff --git a/docs/awesome-mysql.md b/docs/awesome-mysql.md index c69949b..e1a0a8a 100644 --- a/docs/awesome-mysql.md +++ b/docs/awesome-mysql.md @@ -12,6 +12,8 @@ Awesome MySQL ![必备][bibei Icon] 表示**必备**资源标示; ![1 star][red Icon] 表示强烈推荐的,星星的数量来表达强烈的程度; + + ## 目录 - [手册文档](#手册文档) @@ -22,6 +24,7 @@ Awesome MySQL - [官方资料](#官方资料) - [优秀文章](#优秀文章) + ## 手册文档 @@ -102,7 +105,7 @@ _一些优秀的文章_ * [一个不可思议的MySQL慢查分析与解决](http://fordba.com/optimize-an-amazing-mysql-slowlog.html) -**[⬆ 返回顶部](#目录)** +**[⬆ 返回顶部](#awesome-mysql)** [OSS Icon]: https://jaywcjlove.github.io/sb/ico/min-oss.svg diff --git a/idoc.chapters.yml b/idoc.chapters.yml new file mode 100644 index 0000000..0b7e63f --- /dev/null +++ b/idoc.chapters.yml @@ -0,0 +1,29 @@ + +#### 第1章 初识 MySQL + +- chapter1/: 第1章 初识 MySQL +- chapter1/1.1.md: 数据库基础 +- chapter1/1.2.md: 数据库技术构成 +- chapter1/1.3.md: 什么是MySQL +- chapter1/1.4.md: 如何学习MySQL + + +#### 第2章 MySQL的安装与配置 + +- chapter2/: 第2章 MySQL 的安装与配置 +- chapter2/2.1.md: Mac平台下安装与配置MySQL +- chapter2/2.2.md: Centos 平台安装与卸载MySQL +- chapter2/2.3.md: Docker 安装 MySQL +- chapter2/2.4.md: 启动数据库设置初始密码 +- chapter2/2.5.md: MySQL工具 +- chapter2/2.6.md: MySQL配置修改 + + +#### 第3章 数据库的基本操作 + +- chapter3/: 第3章 数据库的基本操作 +- chapter3/3.1.md: 连接数据库 +- chapter3/3.2.md: 查看选择数据库 +- chapter3/3.3.md: 创建数据库 +- chapter3/3.4.md: 删除数据库 +- chapter3/3.5.md: 数据库存储引擎 diff --git a/idoc.yml b/idoc.yml new file mode 100644 index 0000000..a2d74a8 --- /dev/null +++ b/idoc.yml @@ -0,0 +1,17 @@ + + +logo: ./mysql.svg +favicon: ./mysql.svg + +menus: + Home: index.html + Cheat Sheet: 21-minutes-MySQL-basic-entry.html + Awesome: awesome-mysql.html + +editButton: + label: Edit this page on GitHub + url: https://github.com/jaywcjlove/mysql-tutorial/blob/master/ + +footer: | + Released under the MIT License. Copyright © 2022 Kenny Wong
+ Generated by idoc v{{idocVersion}} \ No newline at end of file diff --git a/mysql.svg b/mysql.svg new file mode 100644 index 0000000..d869c57 --- /dev/null +++ b/mysql.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/package.json b/package.json index 4542dff..3e5a416 100644 --- a/package.json +++ b/package.json @@ -1,21 +1,21 @@ { "name": "mysql-tutorial", "version": "0.0.1", + "title": "MySQL 入门教程", "description": "从零开始学习MySQL,主要是面向MySQL数据库管理系统初学者。", "homepage": "https://jaywcjlove.github.io/mysql-tutorial", "author": "jaywcjlove", "license": "MIT", "private": true, "scripts": { - "start": "node scripts/build.mjs" + "start": "idoc --watch", + "build": "idoc" }, "repository": { "type": "git", "url": "git+https://github.com/jaywcjlove/mysql-tutorial.git" }, "devDependencies": { - "fs-extra": "^10.0.0", - "markdown-to-html-cli": "^3.2.4", - "recursive-readdir-files": "^2.0.7" + "idoc": "^1.13.1" } } From 56c977e84df16683d737e4ba48d271291586f7dc Mon Sep 17 00:00:00 2001 From: jaywcjlove <398188662@qq.com> Date: Sat, 23 Apr 2022 01:58:24 +0800 Subject: [PATCH 26/41] doc: Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6d868bc..adf4834 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ MySQL入门教程 === -[![](https://jaywcjlove.github.io/sb/ico/mysql.svg)](http://www.mysql.com/) [![](https://jaywcjlove.github.io/sb/ico/awesome.svg)](awesome-mysql.md) [![](https://jaywcjlove.github.io/sb/license/mit.svg)](#) +[![](https://jaywcjlove.github.io/sb/ico/mysql.svg)](http://www.mysql.com/) [![](https://jaywcjlove.github.io/sb/ico/awesome.svg)](./docs/awesome-mysql.md) [![](https://jaywcjlove.github.io/sb/license/mit.svg)](#) 从零开始学习MySQL,主要是面向MySQL数据库管理系统初学者。前端开发工程师为什么写这个入门教程呢?最近项目强迫我这个前端老司机使用MySQL,虽然我在项目中已经使用过一段时间,为了写出高质量的SQL语句,能快速定位解决数据库引发的问题,系统的过一遍基础,你也可以当做是我的笔记。有幸也认识一些 MySQL 的 DBA,这让我学习起来比较快,能快速入门,进入实战开发阶段。 From 0aa6dc447a40d85810af98a7ec34c1189113a595 Mon Sep 17 00:00:00 2001 From: jaywcjlove <398188662@qq.com> Date: Sat, 23 Apr 2022 02:04:27 +0800 Subject: [PATCH 27/41] chore: update mysql.svg --- mysql.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mysql.svg b/mysql.svg index d869c57..6d4d02e 100644 --- a/mysql.svg +++ b/mysql.svg @@ -1,4 +1,4 @@ - + \ No newline at end of file From 3ec608e2c2cd4aca72311e409c0f6c0467be7afc Mon Sep 17 00:00:00 2001 From: jaywcjlove <398188662@qq.com> Date: Sat, 23 Apr 2022 02:05:24 +0800 Subject: [PATCH 28/41] clean: clean scripts. --- scripts/build.mjs | 73 ---------------------------------------- scripts/node/favicon.mjs | 1 - scripts/node/footer.mjs | 60 --------------------------------- scripts/node/header.mjs | 55 ------------------------------ scripts/style.css | 67 ------------------------------------ 5 files changed, 256 deletions(-) delete mode 100644 scripts/build.mjs delete mode 100644 scripts/node/favicon.mjs delete mode 100644 scripts/node/footer.mjs delete mode 100644 scripts/node/header.mjs delete mode 100644 scripts/style.css diff --git a/scripts/build.mjs b/scripts/build.mjs deleted file mode 100644 index a5af8b8..0000000 --- a/scripts/build.mjs +++ /dev/null @@ -1,73 +0,0 @@ -import path from 'path'; -import fs from 'fs-extra'; -import getFiles from 'recursive-readdir-files'; -import { create } from 'markdown-to-html-cli'; -import { favicon } from './node/favicon.mjs'; -import { header } from './node/header.mjs'; -import { footer } from './node/footer.mjs'; - -const styleStr = fs.readFileSync(path.relative(process.cwd(), 'scripts/style.css')); -function createOption(editPath) { - const href = path.relative(process.cwd(), editPath); - return { - 'github-corners': 'https://github.com/jaywcjlove/handbook.git', - document: { - style: [styleStr.toString()], - link: [ - { rel: 'icon', href: favicon, type: 'image/x-icon' } - // { rel: 'shortcut icon', href: './favicon.ico' }, - ] - }, - rewrite: (node) => { - if (node.type === 'element' && node.properties.href && !node.properties['data-edit'] && /\.md(.*?)$/.test(node.properties.href)) { - if (/(readme).md$/.test(node.properties.href.toLocaleLowerCase())) { - node.properties.href = node.properties.href.replace(/(readme|README).md$/, 'index.html'); - } else if (/.md$/.test(node.properties.href.toLocaleLowerCase())) { - node.properties.href = node.properties.href.replace(/.md$/, '.html'); - } else { - node.properties.href = node.properties.href.replace(/.md(.*?)$/, '.html$1');; - } - } - if (node.type === 'element' && node.tagName === 'body') { - node.properties = { ...node.properties, id: 'totop' }; - const homeUrl = path.relative(`${href}/..`, './index.html'); - node.children = [header(homeUrl), ...node.children, footer(href)]; - } - } - } -} - -;(async () => { - await fs.ensureDir('build'); - const files = await getFiles(process.cwd(), { - ignored: /\/(node_modules|\.git|build)/, - filter: (item) => /(.md|.svg|.jpg|.png|.mp4)$/.test(item.path) - }); - await Promise.all(files.map(async (item) => { - const markdown = await fs.readFile(item.path); - const outputPath = path.join('build', path.relative(process.cwd(), item.path).replace(/(README|readme).md$/, 'index.html').replace(/.md$/, '.html')); - await fs.ensureDir(path.dirname(outputPath)); - if (/.md$/.test(item.path)) { - const options = createOption(item.path); - let title = markdown.toString().match(/^([\s\S]*?)===/) - title = title ? title[1].replace(/\n/, '') : ''; - const html = create({ - markdown, ...options, - document: { - title: `${title ? `${title} - ` : ''}mysql-tutorial`, - ...options.document, - meta: [ - { description: `${title ? `${title}。`: '' }从零开始学习MySQL,主要是面向MySQL数据库管理系统初学者。- mysql-tutorial` }, - { keywords: 'example,mysql-tutorial,mysql,tutorial' } - ] - } - }); - await fs.writeFile(outputPath, html); - console.log(`♻️ create file: \x1b[32;1m ${outputPath} \x1b[0m`); - } else { - await fs.copyFile(item.path, outputPath); - console.log(`🏞 copied file: \x1b[32;1m ${outputPath} \x1b[0m`); - } - - })); -})(); \ No newline at end of file diff --git a/scripts/node/favicon.mjs b/scripts/node/favicon.mjs deleted file mode 100644 index 8e4effd..0000000 --- a/scripts/node/favicon.mjs +++ /dev/null @@ -1 +0,0 @@ -export const favicon = 'data:image/png;base64,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' \ No newline at end of file diff --git a/scripts/node/footer.mjs b/scripts/node/footer.mjs deleted file mode 100644 index 89a1e70..0000000 --- a/scripts/node/footer.mjs +++ /dev/null @@ -1,60 +0,0 @@ - -export const footer = (editPath) => { - return { - type: 'element', - tagName: 'div', - properties: { - className: 'footer', - }, - children: [ - { - type: 'element', - tagName: 'a', - properties: { - 'data-edit': true, - target: '__blank', - title: `https://github.com/jaywcjlove/mysql-tutorial/edit/master/${editPath}`, - href: `https://github.com/jaywcjlove/mysql-tutorial/edit/master/${editPath}`, - }, - children: [ { type: 'text', value: '编辑当前页面' } ] - }, - { - type: 'element', - tagName: 'a', - properties: { - target: '__blank', - href: 'https://jaywcjlove.gitee.io/mysql-tutorial/', - }, - children: [ { type: 'text', value: '国内镜像站点 🇨🇳' } ] - }, - { - type: 'element', - tagName: 'a', - properties: { - target: '__blank', - href: 'https://github.com/jaywcjlove/mysql-tutorial', - }, - children: [ { type: 'text', value: 'Github' } ] - }, - { - type: 'element', - tagName: 'a', - properties: { - target: '__blank', - href: 'https://gitee.com/jaywcjlove/mysql-tutorial', - }, - children: [ { type: 'text', value: 'Gitee' } ] - }, - { - type: 'element', - tagName: 'div', - properties: { - className: 'copyright', - }, - children: [ - { type: 'text', value: 'Copyright © 2021. All rights reserved.' } - ] - } - ] - } -} \ No newline at end of file diff --git a/scripts/node/header.mjs b/scripts/node/header.mjs deleted file mode 100644 index 3395366..0000000 --- a/scripts/node/header.mjs +++ /dev/null @@ -1,55 +0,0 @@ -import { favicon } from './favicon.mjs'; - -export const header = (homeUrl) => { - return { - type: 'element', - tagName: 'header', - properties: { className: 'header', }, - children: [ - { - type: 'element', - tagName: 'article', - properties: { className: 'inner', }, - children: [ - { - type: 'element', - tagName: 'a', - properties: { - className: 'logo', - href: homeUrl || 'https://jaywcjlove.github.io/mysql-tutorial', - }, - children: [ - { - type: 'element', - tagName: 'img', - properties: { - src: favicon, - alt: 'mysql-tutorial logo', - }, - children: [] - } - ] - }, { - type: 'element', - tagName: 'div', - properties: { - className: 'title', - }, - children: [ - { type: 'text', value: 'mysql-tutorial' } - ] - }, { - type: 'element', - tagName: 'nav', - properties: { - className: 'nav', - }, - children: [ - - ] - } - ] - } - ] - } -} \ No newline at end of file diff --git a/scripts/style.css b/scripts/style.css deleted file mode 100644 index b590252..0000000 --- a/scripts/style.css +++ /dev/null @@ -1,67 +0,0 @@ -.header { - position: fixed; - width: 100%; - background: #fff; - backdrop-filter: saturate(180%) blur(0.4rem); - background-color: rgba(255,255,255,0.55); - border-bottom: 1px solid #00000014; - z-index: 99; - top: 0; -} - -.header .inner { - max-width: 960px; - margin: 0 auto; - display: flex; - justify-content: space-between; - padding: 5px 0; -} - -.header .logo { - margin-right: 10px; -} -.header .title { - display: flex; - align-items: center; - font-size: 16px; - font-weight: bold; - color: #333; -} -.header .logo img { - height: 26px; - display: block; -} - -.markdown-body { - margin-top: 78px; -} - -.footer { - max-width: 960px; - margin: 0 auto; - text-align: center; - padding: 0 0 110px 0; - border-top: 1px solid hsla(210,18%,87%,1); - padding-top: 18px; -} - -.footer a { - font-size: 14px; - text-decoration: initial; - color: #3f51b5; -} - -.footer a:hover { - color:#009688; - text-decoration: underline; -} - -.footer a + a { - margin-left: 10px; -} - -.footer .copyright { - color: #596068; - font-size: 14px; - padding-top: 5px; -} \ No newline at end of file From f01a8757b70932629d0bdc57669b98f77996e7b2 Mon Sep 17 00:00:00 2001 From: jaywcjlove <398188662@qq.com> Date: Sat, 23 Apr 2022 02:06:55 +0800 Subject: [PATCH 29/41] doc: Update README.md --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index adf4834..01cc559 100644 --- a/README.md +++ b/README.md @@ -166,6 +166,16 @@ MariaDB,是 MySQL server 的一个由社区开发的分支,MariaDB大部分 ~~我想念一个女孩儿,实属无奈我得继续努力,好好读书做个有趣的人,完成我的“著作”,待我著作完成可否跟我约个会?~~ 还没有写完就结婚了,欢迎大家 PR 补充完善 :)。 +## Contributors + +As always, thanks to our amazing contributors! + + + + + +Made with [action-contributors](https://github.com/jaywcjlove/github-action-contributors). + ## License Licensed under the MIT License. From 0fc03dc3ecda3ea52e8631f7d2dbe84366ab0be5 Mon Sep 17 00:00:00 2001 From: jaywcjlove <398188662@qq.com> Date: Sun, 1 May 2022 02:53:33 +0800 Subject: [PATCH 30/41] doc: update docs/21-minutes-MySQL-basic-entry.md --- docs/21-minutes-MySQL-basic-entry.md | 382 +++++++++++++++++++++------ 1 file changed, 297 insertions(+), 85 deletions(-) diff --git a/docs/21-minutes-MySQL-basic-entry.md b/docs/21-minutes-MySQL-basic-entry.md index 1bb2449..8be092e 100644 --- a/docs/21-minutes-MySQL-basic-entry.md +++ b/docs/21-minutes-MySQL-basic-entry.md @@ -20,18 +20,28 @@ - [INSERT](#insert) - [DELETE](#delete) - [WHERE](#where) -- [AND 和 OR](#and-和-or) +- [AND, OR 和 NOT](#and-or-和-not) - [AND](#and) - [OR](#or) + - [NOT](#not) + - [AND & OR & NOT](#and--or--not) - [ORDER BY](#order-by) +- [GROUP BY](#group-by) - [IN](#in) -- [NOT](#not) - [UNION](#union) +- [BETWEEN](#between) - [AS](#as) - [JOIN](#join) + - [INNER JOIN](#inner-join) + - [LEFT JOIN](#left-join) + - [RIGHT JOIN](#right-join) + - [FULL OUTER JOIN](#full-outer-join) - [SQL 函数](#sql-函数) - [COUNT](#count) + - [AVG](#avg) + - [SUM](#sum) - [MAX](#max) + - [MIN](#min) - [触发器](#触发器) - [添加索引](#添加索引) - [普通索引(INDEX)](#普通索引index) @@ -87,18 +97,25 @@ mysql> show global variables like 'port'; # 查看MySQL端口号 ```sql -- 创建一个名为 samp_db 的数据库,数据库字符编码指定为 gbk create database samp_db character set gbk; -drop database samp_db; -- 删除 库名为samp_db的库 +drop database samp_db; -- 删除 库名为 samp_db 的库 show databases; -- 显示数据库列表。 -use samp_db; -- 选择创建的数据库samp_db -show tables; -- 显示samp_db下面所有的表名字 -describe 表名; -- 显示数据表的结构 -delete from 表名; -- 清空表中记录 +use samp_db; -- 选择创建的数据库 samp_db +show tables; -- 显示 samp_db 下面所有的表名字 +describe 表名; -- 显示数据表的结构 +delete from 表名; -- 清空表中记录 ``` ### 创建数据库表 -> 使用 create table 语句可完成对表的创建, create table 的常见形式: -> 语法:create table 表名称(列声明); +> `CREATE TABLE 语法` 语句用于从表中选取数据。 +> ```sql +> CREATE TABLE 表名称 ( +> 列名称1 数据类型, +> 列名称2 数据类型, +> 列名称3 数据类型, +> .... +> ); +> ``` ```sql -- 如果数据库中存在user_accounts表,就把它从数据库中drop掉 @@ -128,29 +145,45 @@ COMMENT='用户表信息'; - `CHARACTER SET name`:指定一个字符集; - `COMMENT`:对表或者字段说明; +### 删除数据库表 + +> `DROP/TRUNCATE TABLE 语法` 语句用于删除数据库中的现有表。 +> ```sql +> DROP TABLE 表名称; -- 用于删除数据库中的现有表。 +> TRUNCATE TABLE 表名称; -- 用于删除表内的数据,但不删除表本身。 +> ``` + +```sql +-- 删除现有表 Shippers: +DROP TABLE Shippers; +-- 删除现有表 Shippers 表内的数据,不删除表: +TRUNCATE TABLE Shippers; +``` + ## 增删改查 ### SELECT - -> SELECT 语句用于从表中选取数据。 -> 语法:`SELECT 列名称 FROM 表名称` -> 语法:`SELECT * FROM 表名称` + +> `SELECT 语法` 语句用于从表中选取数据。 +> ```sql +> SELECT 列名称1, 列名称2, ... FROM 表名称; +> SELECT * FROM 表名称; +> ``` ```sql --- 表station取个别名叫s,表station中不包含 字段id=13或者14 的,并且id不等于4的 查询出来,只显示id +-- 从 Customers 表中选择 CustomerName 和 City 列: +SELECT CustomerName, City FROM Customers; +-- 从 Customers 表中选择所有列: +SELECT * FROM Customers; +-- 表 station 取个别名叫 s,表 station 中不包含 字段 id=13 或者 14 的,并且 id 不等于 4 的 查询出来,只显示 id SELECT s.id from station s WHERE id in (13,14) and id not in (4); - --- 从表 Persons 选取 LastName 列的数据 -SELECT LastName FROM Persons - -- 从表 users 选取 id=3 的数据,并只拉一条数据(据说能优化性能) SELECT * FROM users where id=3 limit 1 - -- 结果集中会自动去重复数据 SELECT DISTINCT Company FROM Orders -- 表 Persons 字段 Id_P 等于 Orders 字段 Id_P 的值, -- 结果集显示 Persons表的 LastName、FirstName字段,Orders表的OrderNo字段 -SELECT p.LastName, p.FirstName, o.OrderNo FROM Persons p, Orders o WHERE p.Id_P = o.Id_P +SELECT p.LastName, p.FirstName, o.OrderNo FROM Persons p, Orders o WHERE p.Id_P = o.Id_P -- gbk 和 utf8 中英文混合排序最简单的办法 -- ci是 case insensitive, 即 “大小写不敏感” @@ -159,24 +192,28 @@ SELECT tag, COUNT(tag) from news GROUP BY tag order by convert(tag using utf8) c ``` ### UPDATE - -> Update 语句用于修改表中的数据。 -> 语法:`UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值` + +> `Update 语法` 语句用于修改表中的数据。 +> ```sql +> UPDATE 表名称 SET 列名称1 = 值1, 列名称2 = 值2, ... WHERE 条件; +> ``` ```sql -- update语句设置字段值为另一个结果取出来的字段 -update user set name = (select name from user1 where user1 .id = 1 ) -where id = (select id from user2 where user2 .name='小苏'); +UPDATE user set name = (SELECT name from user1 WHERE user1 .id = 1 ) +WHERE id = (SELECT id from user2 WHERE user2 .name='小苏'); -- 更新表 orders 中 id=1 的那一行数据更新它的 title 字段 UPDATE `orders` set title='这里是标题' WHERE id=1; ``` ### INSERT - -> INSERT INTO 语句用于向表格中插入新的行。 -> 语法:`INSERT INTO 表名称 VALUES (值1, 值2,....)` -> 语法:`INSERT INTO 表名称 (列1, 列2,...) VALUES (值1, 值2,....)` + +> `INSERT 语法` 用于向表格中插入新的行。 +> ```sql +> INSERT INTO 表名称 (列名称1, 列名称2, 列名称3, ...) VALUES (值1, 值2, 值3, ...); +> INSERT INTO 表名称 VALUES (值1, 值2, 值3, ...); +> ``` ```sql -- 向表 Persons 插入一条字段 LastName = JSLite 字段 Address = shanghai @@ -194,16 +231,19 @@ INSERT INTO `charger` (`id`,`type`,`create_at`,`update_at`) VALUES (3,2,'2017-05 ``` ### DELETE - -> DELETE 语句用于删除表中的行。 -> 语法:`DELETE FROM 表名称 WHERE 列名称 = 值` + +> `DELETE 语法` 语句用于删除表中的现有记录。 +> ```sql +> DELETE FROM 表名称 WHERE 条件; +> ``` + ```sql -- 在不删除table_name表的情况下删除所有的行,清空表。 DELETE FROM table_name -- 或者 DELETE * FROM table_name --- 删除 Person表字段 LastName = 'JSLite' +-- 删除 Person 表字段 LastName = 'JSLite' DELETE FROM Person WHERE LastName = 'JSLite' -- 删除 表meeting id 为2和3的两条数据 DELETE from meeting where id in (2,3); @@ -211,21 +251,38 @@ DELETE from meeting where id in (2,3); ## WHERE -> WHERE 子句用于规定选择的标准。 -> 语法:`SELECT 列名称 FROM 表名称 WHERE 列 运算符 值` +> `WHERE 语法` 用于仅提取满足指定条件的记录 +> ```sql +> SELECT 列名称, 列名称, ... FROM 表名称 WHERE 条件1; +> ``` ```sql -- 从表 Persons 中选出 Year 字段大于 1965 的数据 SELECT * FROM Persons WHERE Year>1965 +-- 从 Customers 表中选择 Country = Mexico 的所有数据: +SELECT * FROM Customers WHERE Country='Mexico'; +-- 从 Customers 表中选择 CustomerID = 1 的所有数据: +SELECT * FROM Customers WHERE CustomerID=1; ``` -## AND 和 OR +## AND, OR 和 NOT + +`WHERE` 子句可以与 `AND`、`OR` 和 `NOT` 运算符组合使用。 -> AND - 如果第一个条件和第二个条件都成立; -> OR - 如果第一个条件和第二个条件中只要有一个成立; +`AND` 和 `OR` 运算符用于根据多个条件过滤记录: + +- 如果由 `AND` 分隔的所有条件都为 `TRUE`,则 `AND` 运算符将显示一条记录。 +- 如果由 `OR` 分隔的任何条件为 `TRUE`,则 `OR` 运算符将显示一条记录。 + +如果条件不为真,`NOT` 运算符将显示一条记录。 ### AND +> `AND 语法` +> ```sql +> SELECT 列名称, 列名称, ... FROM 表名称 WHERE 条件1 AND 条件2 AND 条件3 ...; +> ``` + ```sql -- 删除 meeting 表字段 -- id=2 并且 user_id=5 的数据 和 @@ -238,53 +295,101 @@ SELECT * FROM Persons WHERE FirstName='Thomas' AND LastName='Carter'; ### OR +> `OR 语法` +> ```sql +> SELECT 列名称1, 列名称2, ... FROM 表名称 WHERE 条件1 OR 条件2 OR 条件3 ...; +> ``` + ```sql -- 使用 OR 来显示所有姓为 "Carter" 或者名为 "Thomas" 的人: SELECT * FROM Persons WHERE firstname='Thomas' OR lastname='Carter' ``` -## ORDER BY +### NOT -> 语句默认按照升序对记录进行排序。 -> `ORDER BY` - 语句用于根据指定的列对结果集进行排序。 -> `DESC` - 按照降序对记录进行排序。 -> `ASC` - 按照顺序对记录进行排序。 +> `NOT 语法` +> ```sql +> SELECT 列名称1, 列名称2, ... FROM 表名称 WHERE NOT 条件2; +> ``` ```sql --- Company在表Orders中为字母,则会以字母顺序显示公司名称 -SELECT Company, OrderNumber FROM Orders ORDER BY Company +-- 从 Customers 表中选择 Country 不是 Germany 的所有字段: +SELECT * FROM Customers WHERE NOT Country='Germany'; +``` --- 后面跟上 DESC 则为降序显示 -SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC +### AND & OR & NOT --- Company以降序显示公司名称,并OrderNumber以顺序显示 -SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC +```sql +-- 从 Customers 表中选择所有字段,其中 Country 为 Germany 且城市必须为 Berlin 或 München(使用括号构成复杂表达式): +SELECT * FROM Customers WHERE Country='Germany' AND (City='Berlin' OR City='München'); +-- 从 Customers 表中选择 Country 不是 Germany 和 NOT "USA" 的所有字段: +SELECT * FROM Customers WHERE NOT Country='Germany' AND NOT Country='USA'; ``` -## IN +## ORDER BY -> IN - 操作符允许我们在 WHERE 子句中规定多个值。 -> IN - 操作符用来指定范围,范围中的每一条,都进行匹配。IN取值规律,由逗号分割,全部放置括号中。 -> 语法:`SELECT "字段名"FROM "表格名"WHERE "字段名" IN ('值一', '值二', ...);` +> `ORDER BY 语法` 用于按升序或降序对结果集进行排序。 +> ```sql +> SELECT 列名称1, 列名称2, ... FROM 表名称 ORDER BY 列名称1, 列名称2, ... ASC|DESC; +> ``` +> 默认按 `ASC` 升序对记录进行排序。要按降序对记录进行排序,请使用 `DESC` 关键字。 -```sql --- 从表 Persons 选取 字段 LastName 等于 Adams、Carter -SELECT * FROM Persons WHERE LastName IN ('Adams','Carter') +```sql +-- 从 Customers 表中选择所有字段,按 Country 列排序: +SELECT * FROM Customers ORDER BY Country; +-- 从 Orders 表中选择 Company, OrderNumber 字段,按 Company 列排序: +SELECT Company, OrderNumber FROM Orders ORDER BY Company +-- 从 Orders 表中选择 Company, OrderNumber 字段,按 Company 列降序排序: +SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC +-- 从 Orders 表中选择 Company, OrderNumber 字段,按 Company 列降序排序,并 OrderNumber 以顺序显示: +SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC ``` -## NOT +## GROUP BY -> NOT - 操作符总是与其他操作符一起使用,用在要过滤的前面。 +> `GROUP BY 语法` 将具有相同值的行分组到汇总行中 +> ```sql +> SELECT 列名称(s) +> FROM 表名称 +> WHERE 条件 +> GROUP BY 列名称(s) +> ORDER BY 列名称(s); +> ``` ```sql -SELECT vend_id, prod_name FROM Products WHERE NOT vend_id = 'DLL01' ORDER BY prod_name; +-- 列出了 Orders 每个发货人 Shippers 发送的订单 Orders 数量 +SELECT Shippers.ShipperName, COUNT(Orders.OrderID) AS NumberOfOrders FROM Orders +LEFT JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID +GROUP BY ShipperName; ``` +## IN + +> `IN 语法` 运算符允许您在 WHERE 子句中指定多个值。运算符是多个 OR 条件的简写。 +> ```sql +> SELECT 列名称(s) FROM 表名称 WHERE 列名称 IN (值1, 值2, ...); +> SELECT 列名称(s) FROM 表名称 WHERE 列名称 IN (SELECT STATEMENT); +> ``` -## UNION +```sql +-- 从表 Persons 选取 字段 LastName 等于 Adams、Carter +SELECT * FROM Persons WHERE LastName IN ('Adams','Carter') +-- 从表 Customers 选取 Country 值为 'Germany', 'France', 'UK' 的所有数据 +SELECT * FROM Customers WHERE Country IN ('Germany', 'France', 'UK'); +-- 从表 Customers 选取 Country 值不为 'Germany', 'France', 'UK' 的所有数据 +SELECT * FROM Customers WHERE Country NOT IN ('Germany', 'France', 'UK'); +-- 从表 Customers 选取与 Suppliers 表 Country 字段相同的所有数据: +SELECT * FROM Customers WHERE Country IN (SELECT Country FROM Suppliers); +``` -> UNION - 操作符用于合并两个或多个 SELECT 语句的结果集。 +## UNION +> `UNION 语法` 操作符用于合并两个或多个 SELECT 语句的结果集 +> ```sql +> SELECT 列名称(s) FROM 表名称1 +> UNION +> SELECT 列名称(s) FROM 表名称2; +> ``` ```sql -- 列出所有在中国表(Employees_China)和美国(Employees_USA)的不同的雇员名 @@ -298,22 +403,38 @@ SELECT id,pic_url FROM meeting UNION ALL SELECT id,number_station AS pic_url FRO SELECT 'product' AS type, count(*) as count FROM `products` union select 'comment' as type, count(*) as count FROM `comments` order by count; ``` +## BETWEEN -## AS +> `BETWEEN 语法` 运算符选择给定范围内的值 +> ```sql +> SELECT 列名称(s) FROM 表名称 WHERE 列名称 BETWEEN 值1 AND 值2; +> ``` -> as - 可理解为:用作、当成,作为;别名 -> 一般是重命名列名或者表名。 -> 语法:`select column_1 as 列1,column_2 as 列2 from table as 表` +```sql +-- 选择 Products 表中 Price 字段在 10 到 20 之间的所有: +SELECT * FROM Products WHERE Price BETWEEN 10 AND 20; +``` -```sql -SELECT * FROM Employee AS emp --- 这句意思是查找所有Employee 表里面的数据,并把Employee表格命名为 emp。 +## AS + +> `AS 语法` 用于为表或表中的列(字段)提供临时名称(别名)。 +> ```sql +> SELECT 列名称 AS 别名 FROM 表名称; +> SELECT 列名称(s) FROM 表名称 AS 别名; +> ``` + +```sql +-- 创建两个别名,一个用于 CustomerID 的 ID 别名列,一个用于 CustomerName 的 Customer 别名列: +SELECT CustomerID AS ID, CustomerName AS Customer FROM Customers; + +-- 这句意思是查找所有 Employee 表里面的数据,并把 Employee 表格命名为 emp。 -- 当你命名一个表之后,你可以在下面用 emp 代替 Employee. -- 例如 SELECT * FROM emp. +SELECT * FROM Employee AS emp -SELECT MAX(OrderPrice) AS LargestOrderPrice FROM Orders -- 列出表 Orders 字段 OrderPrice 列最大值, -- 结果集列不显示 OrderPrice 显示 LargestOrderPrice +SELECT MAX(OrderPrice) AS LargestOrderPrice FROM Orders -- 显示表 users_profile 中的 name 列 SELECT t.name from (SELECT * from users_profile a) AS t; @@ -324,30 +445,83 @@ SELECT t.name from (SELECT * from users_profile a) AS t; SELECT ua.mobile,up.name FROM user_accounts as ua INNER JOIN users_profile as up ON ua.id = up.user_id; ``` -## JOIN +## JOIN -> 用于根据两个或多个表中的列之间的关系,从这些表中查询数据。 +JOIN 子句用于根据两个或多个表之间的相关列组合来自两个或多个表的行。 - `JOIN`: 如果表中有至少一个匹配,则返回行 - `INNER JOIN`:在表中存在至少一个匹配时,INNER JOIN 关键字返回行。 - `LEFT JOIN`: 即使右表中没有匹配,也从左表返回所有的行 - `RIGHT JOIN`: 即使左表中没有匹配,也从右表返回所有的行 - `FULL JOIN`: 只要其中一个表中存在匹配,就返回行(MySQL 是不支持的,通过 `LEFT JOIN + UNION + RIGHT JOIN` 的方式 来实现) +### INNER JOIN + +> `INNER JOIN 语法` 选择在两个表中具有匹配值的记录。 +> ```sql +> SELECT 列名称(s) +> FROM 表1 +> INNER JOIN 表2 +> ON 表1.列名称 = 表2.列名称; +> ``` ```sql -SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo -FROM Persons -INNER JOIN Orders -ON Persons.Id_P = Orders.Id_P -ORDER BY Persons.LastName; +-- 选择包含 Customers 的所有 Orders: +SELECT Orders.OrderID, Customers.CustomerName FROM Orders INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID; + +-- [JOIN 三张表] 选择包含 Customers 和 Shippers 的所有 Orders: +SELECT Orders.OrderID, Customers.CustomerName, Shippers.ShipperName +FROM ((Orders +INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID) +INNER JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID); ``` +### LEFT JOIN + +> `LEFT JOIN 语法` 返回左表 (表1) 中的所有记录,以及右表 (表2) 中的匹配记录 +> ```sql +> SELECT 列名称(s) +> FROM 表1 +> LEFT JOIN 表2 +> ON 表1.列名称 = 表2.列名称; +> ``` + +```sql +-- 将选择所有 Customers 以及他们可能拥有的任何 Orders: +SELECT Customers.CustomerName, Orders.OrderID +FROM Customers +LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID +ORDER BY Customers.CustomerName; +``` + +### RIGHT JOIN + +> `RIGHT JOIN 语法` 返回右表 (表2) 中的所有记录,以及左表 (表1) 中的匹配记录 +> ```sql +> SELECT 列名称(s) +> FROM 表1 +> RIGHT JOIN 表2 +> ON 表1.列名称 = 表2.列名称; +> ``` + +### FULL OUTER JOIN + +> `FULL OUTER JOIN 语法` 当左(表1)或右(表2)表记录中存在匹配时,关键字返回所有记录 +> ```sql +> SELECT 列名称(s) +> FROM 表1 +> FULL OUTER JOIN 表2 +> ON 表1.列名称 = 表2.列名称 +> WHERE 条件; +> ``` + ## SQL 函数 ### COUNT -> COUNT 让我们能够数出在表格中有多少笔资料被选出来。 -> 语法:`SELECT COUNT("字段名") FROM "表格名";` +> `COUNT 语法` 返回与指定条件匹配的行数 +> ```sql +> SELECT COUNT(列名称) FROM 表名称 WHERE 条件; +> ``` ```sql -- 表 Store_Information 有几笔 store_name 栏不是空白的资料。 @@ -359,10 +533,36 @@ SELECT COUNT(1) AS totals FROM Persons; select user_id, count(*) as totals from station group by user_id; ``` +### AVG + +> `AVG 语法` 返回数值列的平均值 +> ```sql +> SELECT AVG(列名称) FROM 表名称 WHERE 条件; +> ``` + +```sql +-- 查找 Products 表中所的 Price 平均值: +SELECT AVG(Price) FROM Products; +``` + +### SUM + +> `SUM 语法` 返回数值列的总和 +> ```sql +> SELECT SUM(列名称) FROM 表名称 WHERE 条件; +> ``` + +```sql +-- 查找 OrderDetails 表中 Quantity 字段的总和: +SELECT SUM(Quantity) FROM OrderDetails; +``` + ### MAX -> MAX 函数返回一列中的最大值。NULL 值不包括在计算中。 -> 语法:`SELECT MAX("字段名") FROM "表格名"` +> `MAX 语法` 返回所选列的最大值 +> ```sql +> SELECT MIN(列名称) FROM 表名称 WHERE 条件; +> ``` ```sql -- 列出表 Orders 字段 OrderPrice 列最大值, @@ -370,15 +570,27 @@ select user_id, count(*) as totals from station group by user_id; SELECT MAX(OrderPrice) AS LargestOrderPrice FROM Orders ``` +### MIN + +> `MIN 语法` 返回所选列的最小值 +> ```sql +> SELECT MIN(列名称) FROM 表名称 WHERE 条件; +> ``` + +```sql +-- 查找 Products 表中 Price 字段最小值,并命名 SmallestPrice 别名: +SELECT MIN(Price) AS SmallestPrice FROM Products; +``` + ## 触发器 > 语法: -> ``` +> ```sql > create trigger <触发器名称> -> { before | after} # 之前或者之后出发 -> insert | update | delete # 指明了激活触发程序的语句的类型 -> on <表名> # 操作哪张表 -> for each row # 触发器的执行间隔,for each row 通知触发器每隔一行执行一次动作,而不是对整个表执行一次。 +> { before | after} -- 之前或者之后出发 +> insert | update | delete -- 指明了激活触发程序的语句的类型 +> on <表名> -- 操作哪张表 +> for each row -- 触发器的执行间隔,for each row 通知触发器每隔一行执行一次动作,而不是对整个表执行一次。 > <触发器SQL语句> > ``` From 137b2da87686715d1c80322f8f5cb427928adeb3 Mon Sep 17 00:00:00 2001 From: jaywcjlove <398188662@qq.com> Date: Sun, 1 May 2022 03:00:50 +0800 Subject: [PATCH 31/41] chore(deps): update dependency idoc to 1.17.7 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3e5a416..c4519d2 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,6 @@ "url": "git+https://github.com/jaywcjlove/mysql-tutorial.git" }, "devDependencies": { - "idoc": "^1.13.1" + "idoc": "^1.17.7" } } From 060dc36835a7d6c2328b31ab1183279702a72e90 Mon Sep 17 00:00:00 2001 From: jaywcjlove <398188662@qq.com> Date: Sun, 1 May 2022 10:16:51 +0800 Subject: [PATCH 32/41] doc: update docs/21-minutes-MySQL-basic-entry.md --- docs/21-minutes-MySQL-basic-entry.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/docs/21-minutes-MySQL-basic-entry.md b/docs/21-minutes-MySQL-basic-entry.md index 8be092e..629b786 100644 --- a/docs/21-minutes-MySQL-basic-entry.md +++ b/docs/21-minutes-MySQL-basic-entry.md @@ -487,8 +487,7 @@ INNER JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID); ```sql -- 将选择所有 Customers 以及他们可能拥有的任何 Orders: -SELECT Customers.CustomerName, Orders.OrderID -FROM Customers +SELECT Customers.CustomerName, Orders.OrderID FROM Customers LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID ORDER BY Customers.CustomerName; ``` @@ -503,6 +502,13 @@ ORDER BY Customers.CustomerName; > ON 表1.列名称 = 表2.列名称; > ``` +```sql +-- 返回所有 Employees 以及他们可能下的任何 Orders: +SELECT Orders.OrderID, Employees.LastName, Employees.FirstName FROM Orders +RIGHT JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID +ORDER BY Orders.OrderID; +``` + ### FULL OUTER JOIN > `FULL OUTER JOIN 语法` 当左(表1)或右(表2)表记录中存在匹配时,关键字返回所有记录 From 2bc79688515a11777b5c81e51134368a96b3b367 Mon Sep 17 00:00:00 2001 From: jaywcjlove <398188662@qq.com> Date: Sat, 14 May 2022 20:11:13 +0800 Subject: [PATCH 33/41] chore: add cacheFileStat/homepage in idoc.yml --- .idoc/.filesStat.json | 134 ++++++++++++++++++++++++++++++++++++++++++ idoc.yml | 6 +- package.json | 2 +- 3 files changed, 139 insertions(+), 3 deletions(-) create mode 100644 .idoc/.filesStat.json diff --git a/.idoc/.filesStat.json b/.idoc/.filesStat.json new file mode 100644 index 0000000..7ca0d8a --- /dev/null +++ b/.idoc/.filesStat.json @@ -0,0 +1,134 @@ +{ + "docs/chapter17/17.1.md": { + "atime": "2021-10-03T17:41:23.112Z", + "mtime": "2021-10-03T17:41:22.949Z", + "ctime": "2021-10-03T17:41:22.949Z", + "birthtime": "2021-10-03T17:41:22.949Z" + }, + "docs/chapter17/17.2.md": { + "atime": "2021-10-03T17:41:23.075Z", + "mtime": "2021-10-03T17:41:22.949Z", + "ctime": "2021-10-03T17:41:22.949Z", + "birthtime": "2021-10-03T17:41:22.949Z" + }, + "docs/chapter17/17.3.md": { + "atime": "2021-10-03T17:41:23.123Z", + "mtime": "2021-10-03T17:41:22.950Z", + "ctime": "2021-10-03T17:41:22.950Z", + "birthtime": "2021-10-03T17:41:22.949Z" + }, + "docs/chapter1/1.1.md": { + "atime": "2022-04-22T17:23:39.796Z", + "mtime": "2022-04-22T17:23:38.152Z", + "ctime": "2022-04-22T17:23:38.152Z", + "birthtime": "2021-10-03T17:41:22.948Z" + }, + "docs/chapter1/1.2.md": { + "atime": "2021-10-03T17:41:23.091Z", + "mtime": "2021-10-03T17:41:22.949Z", + "ctime": "2021-10-03T17:41:22.949Z", + "birthtime": "2021-10-03T17:41:22.948Z" + }, + "docs/chapter1/1.3.md": { + "atime": "2021-10-03T17:41:23.067Z", + "mtime": "2021-10-03T17:41:22.949Z", + "ctime": "2021-10-03T17:41:22.949Z", + "birthtime": "2021-10-03T17:41:22.949Z" + }, + "docs/chapter1/1.4.md": { + "atime": "2021-10-03T17:41:23.648Z", + "mtime": "2021-10-03T17:41:22.949Z", + "ctime": "2021-10-03T17:41:22.949Z", + "birthtime": "2021-10-03T17:41:22.949Z" + }, + "docs/chapter1/1.md": { + "atime": "2021-10-03T17:41:23.644Z", + "mtime": "2021-10-03T17:41:22.949Z", + "ctime": "2021-10-03T17:41:22.949Z", + "birthtime": "2021-10-03T17:41:22.949Z" + }, + "docs/chapter2/2.2.md": { + "atime": "2021-10-03T17:41:23.125Z", + "mtime": "2021-10-03T17:41:22.950Z", + "ctime": "2021-10-03T17:41:22.950Z", + "birthtime": "2021-10-03T17:41:22.950Z" + }, + "docs/chapter2/2.3.md": { + "atime": "2021-10-03T17:41:23.102Z", + "mtime": "2021-10-03T17:41:22.950Z", + "ctime": "2021-10-03T17:41:22.950Z", + "birthtime": "2021-10-03T17:41:22.950Z" + }, + "docs/chapter2/2.1.md": { + "atime": "2022-04-22T17:22:44.701Z", + "mtime": "2022-04-22T17:22:42.347Z", + "ctime": "2022-04-22T17:22:42.347Z", + "birthtime": "2021-10-03T17:41:22.950Z" + }, + "docs/chapter2/2.4.md": { + "atime": "2022-04-22T17:23:23.125Z", + "mtime": "2022-04-22T17:23:21.227Z", + "ctime": "2022-04-22T17:23:21.227Z", + "birthtime": "2021-10-03T17:41:22.950Z" + }, + "docs/chapter2/2.6.md": { + "atime": "2021-10-03T17:41:23.127Z", + "mtime": "2021-10-03T17:41:22.951Z", + "ctime": "2021-10-03T17:41:22.951Z", + "birthtime": "2021-10-03T17:41:22.950Z" + }, + "docs/chapter2/2.5.md": { + "atime": "2022-04-22T17:23:01.447Z", + "mtime": "2022-04-22T17:22:15.378Z", + "ctime": "2022-04-22T17:22:15.378Z", + "birthtime": "2021-10-03T17:41:22.950Z" + }, + "docs/chapter3/3.2.md": { + "atime": "2021-10-03T17:41:23.117Z", + "mtime": "2021-10-03T17:41:22.951Z", + "ctime": "2021-10-03T17:41:22.951Z", + "birthtime": "2021-10-03T17:41:22.951Z" + }, + "docs/chapter3/3.1.md": { + "atime": "2021-10-03T17:41:23.130Z", + "mtime": "2021-10-03T17:41:22.951Z", + "ctime": "2021-10-03T17:41:22.951Z", + "birthtime": "2021-10-03T17:41:22.951Z" + }, + "docs/chapter3/3.3.md": { + "atime": "2021-10-03T17:41:23.122Z", + "mtime": "2021-10-03T17:41:22.951Z", + "ctime": "2021-10-03T17:41:22.951Z", + "birthtime": "2021-10-03T17:41:22.951Z" + }, + "docs/chapter3/3.5.md": { + "atime": "2021-10-03T17:41:24.311Z", + "mtime": "2021-10-03T17:41:22.951Z", + "ctime": "2021-10-03T17:41:22.951Z", + "birthtime": "2021-10-03T17:41:22.951Z" + }, + "docs/chapter3/3.md": { + "atime": "2021-10-03T17:41:24.318Z", + "mtime": "2021-10-03T17:41:22.952Z", + "ctime": "2021-10-03T17:41:22.952Z", + "birthtime": "2021-10-03T17:41:22.952Z" + }, + "docs/chapter3/3.4.md": { + "atime": "2021-10-03T17:41:24.224Z", + "mtime": "2021-10-03T17:41:22.951Z", + "ctime": "2021-10-03T17:41:22.951Z", + "birthtime": "2021-10-03T17:41:22.951Z" + }, + "docs/21-minutes-MySQL-basic-entry.md": { + "atime": "2022-05-01T02:14:36.740Z", + "mtime": "2022-05-01T02:13:51.091Z", + "ctime": "2022-05-01T02:13:51.091Z", + "birthtime": "2022-04-22T17:10:02.997Z" + }, + "docs/awesome-mysql.md": { + "atime": "2022-04-22T17:35:36.660Z", + "mtime": "2022-04-22T17:35:35.063Z", + "ctime": "2022-04-22T17:35:35.063Z", + "birthtime": "2021-10-03T17:41:22.948Z" + } +} \ No newline at end of file diff --git a/idoc.yml b/idoc.yml index a2d74a8..2b86440 100644 --- a/idoc.yml +++ b/idoc.yml @@ -1,8 +1,10 @@ - - logo: ./mysql.svg favicon: ./mysql.svg +cacheFileStat: true + +homepage: https://wangchujiang.com/swiftui-example/ + menus: Home: index.html Cheat Sheet: 21-minutes-MySQL-basic-entry.html diff --git a/package.json b/package.json index c4519d2..b8b656a 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,6 @@ "url": "git+https://github.com/jaywcjlove/mysql-tutorial.git" }, "devDependencies": { - "idoc": "^1.17.7" + "idoc": "^1.21.1" } } From 0377b563a422ef858fbe1dc3f984691f1975d16f Mon Sep 17 00:00:00 2001 From: jackiexiao <707610215@qq.com> Date: Fri, 12 May 2023 12:55:55 +0800 Subject: [PATCH 34/41] doc: Update 1.1.md (#39) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 补上学号的例子让它容易懂一些 --- docs/chapter1/1.1.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/chapter1/1.1.md b/docs/chapter1/1.1.md index 007165b..2a7dc6f 100644 --- a/docs/chapter1/1.1.md +++ b/docs/chapter1/1.1.md @@ -146,6 +146,8 @@ _关系键是关系数据库的重要组成部分。关系键是一个表中的 超键(superkey),有的文献称“超码”,是在数据库关系模式设计中能够唯一标示多元组(即“行”)的属性集。包含所有属性的集叫做明显(平凡)超键。 +超键指的是可以唯一标识一条记录的属性集合,不一定是最小的。超键的属性集合可能还包括其他属性,但是其中必须包含唯一标识记录的属性集合。例如,一个学生信息表中,学号和班级可以作为超键,因为这两个属性集合可以唯一标识一条学生记录,但是其中班级属性可以不包括,仍然是超键。 + ### 候选键 在关系模型中,候选键或候选码(candidate key)是某个关系变量的一组属性所组成的集合,它需要同时满足下列两个条件: @@ -155,6 +157,8 @@ _关系键是关系数据库的重要组成部分。关系键是一个表中的 满足第一个条件的属性集合称为超键,因此我们也可以把候选键定义为“最小超键”,也就是不含有多余属性的超键。 +候选键指的是可以唯一标识一条记录的最小属性集合(最小超键),即在该关系中,候选键的属性集合不可再被减少,否则将无法保证唯一标识一条记录。例如,一个学生信息表中,可以将学号作为候选键,因为学号可以唯一标识一条学生记录。 + 候选键的重要性是它们能够在关系中唯一标识出不同的元组,因此超键也是在设计数据库模式时需要指定的最重要的约束之一。由于在关系模型中,每个关系都是一个集合(没有重复的元素),所以每个关系都至少有一个候选键(因为所有属性组合必然是个超键)。但是在某些关系型数据库中表也能代表多重集,所以在每个关系中都显式地定义至少一个候选键是一条很重要的设计原则。数据库管理系统通常都需要将每个关系中的某个候选键定义为主键,亦即这个候选键是区分不同元组时首选的识别方式,例如外键通常就是引用主键而非其他候选键。 ### 外键 From 6d79c30647213b643620bbc71f1fb512c25ebd74 Mon Sep 17 00:00:00 2001 From: jaywcjlove <398188662@qq.com> Date: Fri, 12 May 2023 12:58:26 +0800 Subject: [PATCH 35/41] ci: update workflows config. --- .github/workflows/ci.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7711ceb..5c7c9d2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,12 +6,13 @@ on: jobs: Build: - runs-on: ubuntu-18.04 + runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v2 + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 with: - node-version: 14 + node-version: 16 + registry-url: 'https://registry.npmjs.org' - run: npm install - run: npm run build @@ -25,7 +26,7 @@ jobs: - name: Create Tag id: create_tag - uses: jaywcjlove/create-tag-action@v1.3.6 + uses: jaywcjlove/create-tag-action@main with: package-path: ./package.json @@ -40,7 +41,7 @@ jobs: - name: Generate Changelog id: changelog - uses: jaywcjlove/changelog-generator@v1.5.3 + uses: jaywcjlove/changelog-generator@main with: token: ${{ secrets.GITHUB_TOKEN }} filter-author: (jaywcjlove|小弟调调™|dependabot\[bot\]|Renovate Bot) From ac41d4cb79133a51cb3526d69d3a0aecc0ed2b93 Mon Sep 17 00:00:00 2001 From: jaywcjlove <398188662@qq.com> Date: Wed, 29 Nov 2023 21:32:39 +0800 Subject: [PATCH 36/41] chore: add sponsor badge. --- .github/FUNDING.yml | 14 +++++++------- .github/workflows/ci.yml | 4 +++- README.md | 5 ++++- idoc.yml | 1 + 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 3d336b4..021de74 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,9 +1,9 @@ # These are supported funding model platforms -github: [jaywcjlove] -patreon: # Replace with a single Patreon username -open_collective: # Replace with a single Open Collective username -ko_fi: # Replace with a single Ko-fi username -tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel -community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry -custom: https://jaywcjlove.github.io/sponsor.html +# github: [jaywcjlove] +# patreon: # Replace with a single Patreon username +# open_collective: # Replace with a single Open Collective username +# ko_fi: # Replace with a single Ko-fi username +# tidelift: #npm/xxxx +# community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +custom: https://jaywcjlove.github.io/#/sponsor diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5c7c9d2..302b0ba 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,7 +11,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: - node-version: 16 + node-version: 18 registry-url: 'https://registry.npmjs.org' - run: npm install @@ -55,6 +55,8 @@ jobs: name: ${{ steps.create_tag.outputs.version }} tag: ${{ steps.create_tag.outputs.version }} body: | + [![Buy me a coffee](https://img.shields.io/badge/Buy%20me%20a%20coffee-048754?logo=buymeacoffee)](https://jaywcjlove.github.io/#/sponsor) + Documentation ${{ steps.changelog.outputs.tag }}: https://raw.githack.com/jaywcjlove/mysql-tutorial/${{ steps.changelog.outputs.gh-pages-short-hash }}/index.html Comparing Changes: ${{ steps.changelog.outputs.compareurl }} diff --git a/README.md b/README.md index 01cc559..89f8e29 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,10 @@ MySQL入门教程 === -[![](https://jaywcjlove.github.io/sb/ico/mysql.svg)](http://www.mysql.com/) [![](https://jaywcjlove.github.io/sb/ico/awesome.svg)](./docs/awesome-mysql.md) [![](https://jaywcjlove.github.io/sb/license/mit.svg)](#) +[![Buy me a coffee](https://img.shields.io/badge/Buy%20me%20a%20coffee-048754?logo=buymeacoffee)](https://jaywcjlove.github.io/#/sponsor) +[![](https://jaywcjlove.github.io/sb/ico/mysql.svg)](http://www.mysql.com/) +[![](https://jaywcjlove.github.io/sb/ico/awesome.svg)](./docs/awesome-mysql.md) +![](https://jaywcjlove.github.io/sb/license/mit.svg) 从零开始学习MySQL,主要是面向MySQL数据库管理系统初学者。前端开发工程师为什么写这个入门教程呢?最近项目强迫我这个前端老司机使用MySQL,虽然我在项目中已经使用过一段时间,为了写出高质量的SQL语句,能快速定位解决数据库引发的问题,系统的过一遍基础,你也可以当做是我的笔记。有幸也认识一些 MySQL 的 DBA,这让我学习起来比较快,能快速入门,进入实战开发阶段。 diff --git a/idoc.yml b/idoc.yml index 2b86440..1eb9f7a 100644 --- a/idoc.yml +++ b/idoc.yml @@ -9,6 +9,7 @@ menus: Home: index.html Cheat Sheet: 21-minutes-MySQL-basic-entry.html Awesome: awesome-mysql.html + Sponsor: https://jaywcjlove.github.io/#/sponsor editButton: label: Edit this page on GitHub From d59fd7be2abb2931b122e11536b9a0617e178deb Mon Sep 17 00:00:00 2001 From: jaywcjlove <398188662@qq.com> Date: Sun, 17 Mar 2024 02:05:44 +0800 Subject: [PATCH 37/41] ci: update workflow config. --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 302b0ba..587711f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,10 +8,10 @@ jobs: Build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 with: - node-version: 18 + node-version: 20 registry-url: 'https://registry.npmjs.org' - run: npm install From 528e555fd715e7199f90d880b66bf9068c0edaaf Mon Sep 17 00:00:00 2001 From: jaywcjlove <398188662@qq.com> Date: Sun, 17 Mar 2024 02:05:56 +0800 Subject: [PATCH 38/41] doc: update docs/awesome-mysql.md --- docs/awesome-mysql.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/awesome-mysql.md b/docs/awesome-mysql.md index e1a0a8a..8d9eec6 100644 --- a/docs/awesome-mysql.md +++ b/docs/awesome-mysql.md @@ -3,7 +3,7 @@ Awesome MySQL 这是一个MySQL软件库和资源列表清单。部分资源搜集来源于[shlomi-noach/awesome-mysql](https://github.com/shlomi-noach/awesome-mysql),它的[中文翻译](https://github.com/jobbole/awesome-mysql-cn)在这里,没有完全fork过来,没有完全拷贝,是因为部分排版比较丑陋,部分工具慢慢搜集理解。 -### 说明 +## 说明 ![Open-Source Software][OSS Icon] 表示**开源**标示,点击进入**开源**仓库; ![Freeware][Freeware Icon] 表示**免费**标示,或者个人**免费**; From 495b88d05896010bd34835d91cffc77737962a2f Mon Sep 17 00:00:00 2001 From: jaywcjlove <398188662@qq.com> Date: Sun, 17 Mar 2024 02:06:06 +0800 Subject: [PATCH 39/41] chore: update idoc config. --- idoc.yml | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/idoc.yml b/idoc.yml index 1eb9f7a..8696491 100644 --- a/idoc.yml +++ b/idoc.yml @@ -7,14 +7,20 @@ homepage: https://wangchujiang.com/swiftui-example/ menus: Home: index.html - Cheat Sheet: 21-minutes-MySQL-basic-entry.html + CheatSheet: 21-minutes-MySQL-basic-entry.html Awesome: awesome-mysql.html - Sponsor: https://jaywcjlove.github.io/#/sponsor + Sponsor: + url: https://wangchujiang.com/#/sponsor + target: __blank editButton: label: Edit this page on GitHub url: https://github.com/jaywcjlove/mysql-tutorial/blob/master/ footer: | - Released under the MIT License. Copyright © 2022 Kenny Wong
- Generated by idoc v{{idocVersion}} \ No newline at end of file + App • + Projects • + Sponsor • + More Apps

+ Released under the MIT License. Copyright © 2024 Kenny Wong
+ Generated by idoc v{{idocVersion}} \ No newline at end of file From 78540c250f44e24b28e65c636b5e1aa6462ca718 Mon Sep 17 00:00:00 2001 From: jaywcjlove <398188662@qq.com> Date: Sun, 17 Mar 2024 02:06:32 +0800 Subject: [PATCH 40/41] chore: update dependency idoc to v1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b8b656a..8235168 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,6 @@ "url": "git+https://github.com/jaywcjlove/mysql-tutorial.git" }, "devDependencies": { - "idoc": "^1.21.1" + "idoc": "^1" } } From 41e338408f5a622f3255ccfa8d86c50c27111235 Mon Sep 17 00:00:00 2001 From: jaywcjlove <398188662@qq.com> Date: Sun, 23 Jun 2024 15:59:51 +0800 Subject: [PATCH 41/41] ci: update workflows config. --- .github/FUNDING.yml | 12 +++--------- .github/workflows/ci.yml | 5 +++-- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 021de74..abe8b76 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,9 +1,3 @@ -# These are supported funding model platforms - -# github: [jaywcjlove] -# patreon: # Replace with a single Patreon username -# open_collective: # Replace with a single Open Collective username -# ko_fi: # Replace with a single Ko-fi username -# tidelift: #npm/xxxx -# community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry -custom: https://jaywcjlove.github.io/#/sponsor +ko_fi: jaywcjlove +buy_me_a_coffee: jaywcjlove +custom: ["https://www.paypal.me/kennyiseeyou", "https://jaywcjlove.github.io/#/sponsor"] diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 587711f..d680f86 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -31,11 +31,11 @@ jobs: package-path: ./package.json - name: Deploy Website - uses: peaceiris/actions-gh-pages@v3 + uses: peaceiris/actions-gh-pages@v4 with: user_name: 'github-actions[bot]' user_email: 'github-actions[bot]@users.noreply.github.com' - commit_message: ${{steps.tag_version.outputs.tag}} ${{ github.event.head_commit.message }} + commit_message: ${{ github.event.head_commit.message }} github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: ./dist @@ -51,6 +51,7 @@ jobs: uses: ncipollo/release-action@v1 if: steps.create_tag.outputs.successful with: + allowUpdates: true token: ${{ secrets.GITHUB_TOKEN }} name: ${{ steps.create_tag.outputs.version }} tag: ${{ steps.create_tag.outputs.version }}