├── .gitattributes ├── .github ├── FUNDING.yml └── workflows │ └── ci.yml ├── .gitignore ├── .idoc └── .filesStat.json ├── LICENSE ├── README.md ├── docs ├── 21-minutes-MySQL-basic-entry.md ├── awesome-mysql.md ├── chapter1 │ ├── 1.1.md │ ├── 1.2.md │ ├── 1.3.md │ ├── 1.4.md │ └── 1.md ├── chapter17 │ ├── 17.1.md │ ├── 17.2.md │ └── 17.3.md ├── chapter2 │ ├── 2.1.md │ ├── 2.2.md │ ├── 2.3.md │ ├── 2.4.md │ ├── 2.5.md │ └── 2.6.md └── chapter3 │ ├── 3.1.md │ ├── 3.2.md │ ├── 3.3.md │ ├── 3.4.md │ ├── 3.5.md │ └── 3.md ├── examples └── create-table.sql ├── idoc.chapters.yml ├── idoc.yml ├── img ├── 1.4.1.jpg ├── 1.4.2.jpg ├── 1.4.3.jpg ├── 1.4.4.jpg ├── 1.4.5.gif ├── 2.1_1.jpg ├── 2.3.1.png ├── data.jpg ├── mysql-logo.png └── mysql-logo.svg ├── mysql.svg ├── package.json └── renovate.json /.gitattributes: -------------------------------------------------------------------------------- 1 | *.md linguist-detectable=true 2 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | ko_fi: jaywcjlove 2 | buy_me_a_coffee: jaywcjlove 3 | custom: ["https://www.paypal.me/kennyiseeyou", "https://jaywcjlove.github.io/#/sponsor"] 4 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | on: 3 | push: 4 | branches: 5 | - master 6 | 7 | jobs: 8 | Build: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@v4 12 | - uses: actions/setup-node@v4 13 | with: 14 | node-version: 20 15 | registry-url: 'https://registry.npmjs.org' 16 | 17 | - run: npm install 18 | - run: npm run build 19 | 20 | - name: Generate Contributors Images 21 | uses: jaywcjlove/github-action-contributors@main 22 | with: 23 | filter-author: (renovate\[bot\]|renovate-bot|dependabot\[bot\]) 24 | output: dist/CONTRIBUTORS.svg 25 | avatarSize: 42 26 | 27 | - name: Create Tag 28 | id: create_tag 29 | uses: jaywcjlove/create-tag-action@main 30 | with: 31 | package-path: ./package.json 32 | 33 | - name: Deploy Website 34 | uses: peaceiris/actions-gh-pages@v4 35 | with: 36 | user_name: 'github-actions[bot]' 37 | user_email: 'github-actions[bot]@users.noreply.github.com' 38 | commit_message: ${{ github.event.head_commit.message }} 39 | github_token: ${{ secrets.GITHUB_TOKEN }} 40 | publish_dir: ./dist 41 | 42 | - name: Generate Changelog 43 | id: changelog 44 | uses: jaywcjlove/changelog-generator@main 45 | with: 46 | token: ${{ secrets.GITHUB_TOKEN }} 47 | filter-author: (jaywcjlove|小弟调调™|dependabot\[bot\]|Renovate Bot) 48 | filter: (^[\s]+?[R|r]elease)|(^[R|r]elease) 49 | 50 | - name: Create Release 51 | uses: ncipollo/release-action@v1 52 | if: steps.create_tag.outputs.successful 53 | with: 54 | allowUpdates: true 55 | token: ${{ secrets.GITHUB_TOKEN }} 56 | name: ${{ steps.create_tag.outputs.version }} 57 | tag: ${{ steps.create_tag.outputs.version }} 58 | body: | 59 | [![Buy me a coffee](https://img.shields.io/badge/Buy%20me%20a%20coffee-048754?logo=buymeacoffee)](https://jaywcjlove.github.io/#/sponsor) 60 | 61 | Documentation ${{ steps.changelog.outputs.tag }}: https://raw.githack.com/jaywcjlove/mysql-tutorial/${{ steps.changelog.outputs.gh-pages-short-hash }}/index.html 62 | Comparing Changes: ${{ steps.changelog.outputs.compareurl }} 63 | 64 | ${{ steps.changelog.outputs.changelog }} -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # MacOS 2 | # 3 | .DS_Store 4 | 5 | dist 6 | build 7 | node_modules 8 | npm-debug.log 9 | package-lock.json 10 | 11 | .DS_Store 12 | .cache 13 | .vscode 14 | .idea 15 | .snap 16 | .env 17 | 18 | *.bak 19 | *.tem 20 | *.temp 21 | #.swp 22 | *.*~ 23 | ~*.* 24 | 25 | # IDEA 26 | *.iml 27 | *.ipr 28 | *.iws -------------------------------------------------------------------------------- /.idoc/.filesStat.json: -------------------------------------------------------------------------------- 1 | { 2 | "docs/chapter17/17.1.md": { 3 | "atime": "2021-10-03T17:41:23.112Z", 4 | "mtime": "2021-10-03T17:41:22.949Z", 5 | "ctime": "2021-10-03T17:41:22.949Z", 6 | "birthtime": "2021-10-03T17:41:22.949Z" 7 | }, 8 | "docs/chapter17/17.2.md": { 9 | "atime": "2021-10-03T17:41:23.075Z", 10 | "mtime": "2021-10-03T17:41:22.949Z", 11 | "ctime": "2021-10-03T17:41:22.949Z", 12 | "birthtime": "2021-10-03T17:41:22.949Z" 13 | }, 14 | "docs/chapter17/17.3.md": { 15 | "atime": "2021-10-03T17:41:23.123Z", 16 | "mtime": "2021-10-03T17:41:22.950Z", 17 | "ctime": "2021-10-03T17:41:22.950Z", 18 | "birthtime": "2021-10-03T17:41:22.949Z" 19 | }, 20 | "docs/chapter1/1.1.md": { 21 | "atime": "2022-04-22T17:23:39.796Z", 22 | "mtime": "2022-04-22T17:23:38.152Z", 23 | "ctime": "2022-04-22T17:23:38.152Z", 24 | "birthtime": "2021-10-03T17:41:22.948Z" 25 | }, 26 | "docs/chapter1/1.2.md": { 27 | "atime": "2021-10-03T17:41:23.091Z", 28 | "mtime": "2021-10-03T17:41:22.949Z", 29 | "ctime": "2021-10-03T17:41:22.949Z", 30 | "birthtime": "2021-10-03T17:41:22.948Z" 31 | }, 32 | "docs/chapter1/1.3.md": { 33 | "atime": "2021-10-03T17:41:23.067Z", 34 | "mtime": "2021-10-03T17:41:22.949Z", 35 | "ctime": "2021-10-03T17:41:22.949Z", 36 | "birthtime": "2021-10-03T17:41:22.949Z" 37 | }, 38 | "docs/chapter1/1.4.md": { 39 | "atime": "2021-10-03T17:41:23.648Z", 40 | "mtime": "2021-10-03T17:41:22.949Z", 41 | "ctime": "2021-10-03T17:41:22.949Z", 42 | "birthtime": "2021-10-03T17:41:22.949Z" 43 | }, 44 | "docs/chapter1/1.md": { 45 | "atime": "2021-10-03T17:41:23.644Z", 46 | "mtime": "2021-10-03T17:41:22.949Z", 47 | "ctime": "2021-10-03T17:41:22.949Z", 48 | "birthtime": "2021-10-03T17:41:22.949Z" 49 | }, 50 | "docs/chapter2/2.2.md": { 51 | "atime": "2021-10-03T17:41:23.125Z", 52 | "mtime": "2021-10-03T17:41:22.950Z", 53 | "ctime": "2021-10-03T17:41:22.950Z", 54 | "birthtime": "2021-10-03T17:41:22.950Z" 55 | }, 56 | "docs/chapter2/2.3.md": { 57 | "atime": "2021-10-03T17:41:23.102Z", 58 | "mtime": "2021-10-03T17:41:22.950Z", 59 | "ctime": "2021-10-03T17:41:22.950Z", 60 | "birthtime": "2021-10-03T17:41:22.950Z" 61 | }, 62 | "docs/chapter2/2.1.md": { 63 | "atime": "2022-04-22T17:22:44.701Z", 64 | "mtime": "2022-04-22T17:22:42.347Z", 65 | "ctime": "2022-04-22T17:22:42.347Z", 66 | "birthtime": "2021-10-03T17:41:22.950Z" 67 | }, 68 | "docs/chapter2/2.4.md": { 69 | "atime": "2022-04-22T17:23:23.125Z", 70 | "mtime": "2022-04-22T17:23:21.227Z", 71 | "ctime": "2022-04-22T17:23:21.227Z", 72 | "birthtime": "2021-10-03T17:41:22.950Z" 73 | }, 74 | "docs/chapter2/2.6.md": { 75 | "atime": "2021-10-03T17:41:23.127Z", 76 | "mtime": "2021-10-03T17:41:22.951Z", 77 | "ctime": "2021-10-03T17:41:22.951Z", 78 | "birthtime": "2021-10-03T17:41:22.950Z" 79 | }, 80 | "docs/chapter2/2.5.md": { 81 | "atime": "2022-04-22T17:23:01.447Z", 82 | "mtime": "2022-04-22T17:22:15.378Z", 83 | "ctime": "2022-04-22T17:22:15.378Z", 84 | "birthtime": "2021-10-03T17:41:22.950Z" 85 | }, 86 | "docs/chapter3/3.2.md": { 87 | "atime": "2021-10-03T17:41:23.117Z", 88 | "mtime": "2021-10-03T17:41:22.951Z", 89 | "ctime": "2021-10-03T17:41:22.951Z", 90 | "birthtime": "2021-10-03T17:41:22.951Z" 91 | }, 92 | "docs/chapter3/3.1.md": { 93 | "atime": "2021-10-03T17:41:23.130Z", 94 | "mtime": "2021-10-03T17:41:22.951Z", 95 | "ctime": "2021-10-03T17:41:22.951Z", 96 | "birthtime": "2021-10-03T17:41:22.951Z" 97 | }, 98 | "docs/chapter3/3.3.md": { 99 | "atime": "2021-10-03T17:41:23.122Z", 100 | "mtime": "2021-10-03T17:41:22.951Z", 101 | "ctime": "2021-10-03T17:41:22.951Z", 102 | "birthtime": "2021-10-03T17:41:22.951Z" 103 | }, 104 | "docs/chapter3/3.5.md": { 105 | "atime": "2021-10-03T17:41:24.311Z", 106 | "mtime": "2021-10-03T17:41:22.951Z", 107 | "ctime": "2021-10-03T17:41:22.951Z", 108 | "birthtime": "2021-10-03T17:41:22.951Z" 109 | }, 110 | "docs/chapter3/3.md": { 111 | "atime": "2021-10-03T17:41:24.318Z", 112 | "mtime": "2021-10-03T17:41:22.952Z", 113 | "ctime": "2021-10-03T17:41:22.952Z", 114 | "birthtime": "2021-10-03T17:41:22.952Z" 115 | }, 116 | "docs/chapter3/3.4.md": { 117 | "atime": "2021-10-03T17:41:24.224Z", 118 | "mtime": "2021-10-03T17:41:22.951Z", 119 | "ctime": "2021-10-03T17:41:22.951Z", 120 | "birthtime": "2021-10-03T17:41:22.951Z" 121 | }, 122 | "docs/21-minutes-MySQL-basic-entry.md": { 123 | "atime": "2022-05-01T02:14:36.740Z", 124 | "mtime": "2022-05-01T02:13:51.091Z", 125 | "ctime": "2022-05-01T02:13:51.091Z", 126 | "birthtime": "2022-04-22T17:10:02.997Z" 127 | }, 128 | "docs/awesome-mysql.md": { 129 | "atime": "2022-04-22T17:35:36.660Z", 130 | "mtime": "2022-04-22T17:35:35.063Z", 131 | "ctime": "2022-04-22T17:35:35.063Z", 132 | "birthtime": "2021-10-03T17:41:22.948Z" 133 | } 134 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 小弟调调™ 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | MySQL入门教程 6 | === 7 | 8 | 9 | [![Buy me a coffee](https://img.shields.io/badge/Buy%20me%20a%20coffee-048754?logo=buymeacoffee)](https://jaywcjlove.github.io/#/sponsor) 10 | [![](https://jaywcjlove.github.io/sb/ico/mysql.svg)](http://www.mysql.com/) 11 | [![](https://jaywcjlove.github.io/sb/ico/awesome.svg)](./docs/awesome-mysql.md) 12 | ![](https://jaywcjlove.github.io/sb/license/mit.svg) 13 | 14 | 从零开始学习MySQL,主要是面向MySQL数据库管理系统初学者。前端开发工程师为什么写这个入门教程呢?最近项目强迫我这个前端老司机使用MySQL,虽然我在项目中已经使用过一段时间,为了写出高质量的SQL语句,能快速定位解决数据库引发的问题,系统的过一遍基础,你也可以当做是我的笔记。有幸也认识一些 MySQL 的 DBA,这让我学习起来比较快,能快速入门,进入实战开发阶段。 15 | 16 | 原本我是使用 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语句。 17 | 18 | 在本书中所搜集到得各种资源,我把它将放到这里 **[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)。如果实在看不下去你可以🔫。 19 | 20 | MariaDB,是 MySQL server 的一个由社区开发的分支,MariaDB大部分跟 MySQL 5.5 以前版本使用差不多。自己电脑上是 MySQL 5.7.14,公司服务器上面是 MariaDB 最新版本,生产上 MySQL 5.7.16,所以很尴尬,偶尔提及MariaDB也是很正常的吧。 21 | 22 | ## 目录 23 | 24 | #### Awesome MySQL 25 | 26 | - [21分钟MySQL基础入门](./docs/21-minutes-MySQL-basic-entry.md) 27 | - [手册文档](./docs/awesome-mysql.md#手册文档) - 一些非官方的手册文档搜集 28 | - [分析工具](./docs/awesome-mysql.md#分析工具) - 性能,结构和数据分析工具 29 | - [GUI](./docs/awesome-mysql.md#gui) - 搜集的一些 MySQL 的客户端,也有命令行客户端 30 | - [服务器](./docs/awesome-mysql.md#服务器) - MySQL服务器的衍生品 31 | - [备份](./docs/awesome-mysql.md#备份) - 备份/存储/恢复 工具 32 | - [官方资料](./docs/awesome-mysql.md#官方资料) - 官方的一些网站和文章 33 | - [优秀文章](./docs/awesome-mysql.md#优秀文章) - 一些优秀的文章 34 | 35 | #### 第1章 初识MySQL 36 | 37 | - 1.1 [数据库基础](./docs/chapter1/1.1.md) 38 | - [什么是数据库](./docs/chapter1/1.1.md#什么是数据库) 39 | - [数据库分类](./docs/chapter1/1.1.md#数据库分类) 40 | - [数据库模型](./docs/chapter1/1.1.md#数据库模型) 41 | - [数据表](./docs/chapter1/1.1.md#数据表) 42 | - [关系键](./docs/chapter1/1.1.md#关系键) 43 | - 1.2 [数据库技术构成](./docs/chapter1/1.2.md) 44 | - [数据库系统](./docs/chapter1/1.2.md#数据库系统) 45 | - [关系数据库基本概念](./docs/chapter1/1.2.md#关系数据库基本概念) 46 | - [SQL语言](./docs/chapter1/1.2.md#sql语言) 47 | - [数据库访问技术](./docs/chapter1/1.2.md#数据库访问技术) 48 | - 1.3 [什么是MySQL](./docs/chapter1/1.3.md) 49 | - [MySQL介绍](./docs/chapter1/1.3.md#mysql-介绍) 50 | - [MySQL发展历史](./docs/chapter1/1.3.md#mysql-发展历史) 51 | - [MySQL版本](./docs/chapter1/1.3.md#mysql-版本) 52 | - [MySQL的优势](./docs/chapter1/1.3.md#mysql-的优势) 53 | - 1.4 [如何学习MySQL](./docs/chapter1/1.4.md) 54 | 55 | #### 第2章 MySQL的安装与配置 56 | 57 | - 2.1 [Mac平台下安装与配置MySQL](./docs/chapter2/2.1.md) 58 | - [Mac上安装MySQL](./docs/chapter2/2.1.md#mac-安装mysql) 59 | - [Mac上卸载MySQL](./docs/chapter2/2.1.md#mac-卸载mysql) 60 | - 2.2 [Centos 平台安装与卸载MySQL](./docs/chapter2/2.2.md) 61 | - [检查是否已安装](./docs/chapter2/2.2.md#检查是否已安装) 62 | - [更新安装源](./docs/chapter2/2.2.md#更新安装源) 63 | - [检查是否下载成功](./docs/chapter2/2.2.md#检查是否下载成功) 64 | - [查看版本](./docs/chapter2/2.2.md#查看版本) 65 | - [启动指定版本](./docs/chapter2/2.2.md#启动指定版本) 66 | - [安装MySQL](./docs/chapter2/2.2.md#安装mysql) 67 | - [查看安装目录](./docs/chapter2/2.2.md#查看安装目录) 68 | - [MariaDB切换MySQL](./docs/chapter2/2.2.md#mariadb切换mysql) 69 | - [卸载 MySQL 软件](./docs/chapter2/2.2.md#卸载-mysql-软件) 70 | - 2.3 [Docker 安装 MySQL](./docs/chapter2/2.3.md) 71 | - [快速启动一个 MySQL 服务器实例](./docs/chapter2/2.3.md#快速启动一个-mysql-服务器实例) 72 | - [通过命令行访问 MySQL 容器](#通过命令行访问-mysql-容器) 73 | - [使用 MySQL 自定义配置文件](#使用-mysql-自定义配置文件) 74 | - [使用 stack 部署 MySQL](#使用-stack-部署-mysql) 75 | - 2.4 [启动数据库设置初始密码](./docs/chapter2/2.4.md) 76 | - [命令行启动关闭重启MySQL服务](./docs/chapter2/2.4.md#命令行启动关闭重启mysql服务) 77 | - [图像界面启动关闭重启MySQL服务](./docs/chapter2/2.4.md#图像界面启动关闭重启mysql服务) 78 | - [查看初始密码](./docs/chapter2/2.4.md#查看初始密码) 79 | - [设置初始化密码](./docs/chapter2/2.4.md#设置初始化密码) 80 | - [启动报错处理](./docs/chapter2/2.4.md#启动报错处理) 81 | - 2.5 [MySQL工具](./docs/chapter2/2.5.md) 82 | - [命令行使用程序](./docs/chapter2/2.5.md#命令行使用程序) 83 | - [MySQL Workbench客户端](./docs/chapter2/2.5.md#mysql-workbench客户端) 84 | - [常用图形管理工具](./docs/chapter2/2.5.md#常用图形管理工具) 85 | - [MyCli替代MySQL的mysql命令行工具](./docs/chapter2/2.5.md#mycli替代mysql的mysql命令行工具) 86 | - 2.6 [MySQL配置修改](./docs/chapter2/2.6.md) 87 | - [MySQL安装目录说明](./docs/chapter2/2.6.md#mysql安装目录说明) 88 | - [配置文件的位置](./docs/chapter2/2.6.md#配置文件的位置) 89 | - [Windows系统配置文件读取](./docs/chapter2/2.6.md#windows系统配置文件读取) 90 | - [Linux系统配置文件读取](./docs/chapter2/2.6.md#linux系统配置文件读取) 91 | - [配置文件内容](./docs/chapter2/2.6.md#配置文件内容) 92 | 93 | #### 第3章 数据库的基本操作 94 | 95 | - 3.1 [连接数据库](./docs/chapter3/3.1.md) 96 | - [MySQL命令语法](./docs/chapter3/3.1.md#mysql命令语法) 97 | - [MySQL命令连接数据库](./docs/chapter3/3.1.md#mysql命令连接数据库) 98 | - [开启MySQL的远程帐号](./docs/chapter3/3.1.md#开启mysql的远程帐号) 99 | - [MySQL修改密码](./docs/chapter3/3.1.md#mysql修改密码) 100 | - 3.2 [查看选择数据库](./docs/chapter3/3.2.md) 101 | - [查看数据库](./docs/chapter3/3.2.md#查看数据库) 102 | - [选择数据库](./docs/chapter3/3.2.md#选择数据库) 103 | - 3.3 [创建数据库](./docs/chapter3/3.3.md) 104 | - [SQL语句创建数据库](./docs/chapter3/3.4.md#sql语句创建数据库) 105 | - [管理工具创建数据库](./docs/chapter3/3.4.md#管理工具创建数据库) 106 | - 3.4 [删除数据库](./docs/chapter3/3.4.md) 107 | - [SQL语句删除数据库](./docs/chapter3/3.4.md#sql语句删除数据库) 108 | - [管理工具删除数据库](./docs/chapter3/3.4.md#管理工具删除数据库) 109 | - 3.5 [数据库存储引擎](./docs/chapter3/3.5.md#) 110 | - [存储引擎简介](./docs/chapter3/3.5.md#存储引擎简介) 111 | - [常用引擎对比](./docs/chapter3/3.5.md#常用引擎对比) 112 | - [查看存储引擎](./docs/chapter3/3.5.md#查看存储引擎) 113 | - [设置存储引擎](./docs/chapter3/3.5.md#设置存储引擎) 114 | - [如何选择合适的存储引擎](./docs/chapter3/3.5.md#如何选择合适的存储引擎) 115 | 116 | #### 第4章 数据表的基本操作 117 | 118 | - 4.1 创建数据表 119 | 120 | #### 第5章 数据类型和运算符 121 | 122 | #### 第6章 MySQL函数 123 | 124 | #### 第7章 查询数据 125 | 126 | #### 第8章 插入、更新与删除数据 127 | 128 | #### 第9章 索引 129 | 130 | #### 第10章 存储过程和函数 131 | 132 | #### 第11章 视图 133 | 134 | #### 第12章 MySQL函数 135 | 136 | #### 第13章 MySQL用户管理 137 | 138 | #### 第14章 数据备份与还原 139 | 140 | #### 第15章 MySQL日志 141 | 142 | #### 第16章 性能优化 143 | 144 | #### 第17章 各种问题解决 145 | 146 | - [让MySQL支持emoji图标存储](./docs/chapter17/17.1.md) 147 | - [Centos6下升级MySQL数据库](./docs/chapter17/17.2.md) 148 | - [MySQL修改密码](./docs/chapter17/17.3.md) 149 | - [mysqld_safe不存在修改密码](./docs/chapter17/17.3.md#mysqld_safe不存在修改密码) 150 | - [启动修改丢失的mysql单实例root密码方法](./docs/chapter17/17.3.md#启动修改丢失的mysql单实例root密码方法) 151 | - [Mac下重置MySQL的root密码](./docs/chapter17/17.3.md#Mac下重置MySQL的root密码) 152 | - [不重启mysqld修改密码的方法](./docs/chapter17/17.3.md#不重启mysqld的方法) 153 | - [Centos7 默认为MariaDB导致mysql安装不上](./docs/chapter2/2.2.md#centos7安装mysql) 154 | - [mysql命令不存在](./docs/chapter2/2.1.md#mysql命令不存在) 155 | - [MySQL服务启动失败解决方案](./docs/chapter2/2.3.md#linux-下命令操作) 156 | - [密码不满足当前的策略要求导致无法开启远程帐号](./docs/chapter3/3.1.md#开启mysql的远程帐号) 157 | 158 | 159 | ## 读者对象 160 | 161 | 整本书目录规划参考了其它几本 MySQL 书籍目录规划的,在我边学习边整理的过程可能有修改,这个过程有点慢,希望能完成,所以教程适合以下读者学习阅读使用: 162 | 163 | - MySQL 数据库初学者。 164 | - 对数据库开发感兴趣,希望快速、全面掌握 MySQL 的人员。 165 | - 对其他数据库有一定的了解,想转到 MySQL 平台使用它的开发者。 166 | - 像我一样被逼无奈使用 MySQL 数据库的人。 167 | 168 | 从目录来看,看上去内容丰富,比较完整的介绍了 MySQL 数据库技术的教程,我不是`DBA`,我不是,正在看这篇文章的你,很可能也不是,不想误人子弟,在项目中应用了一段时间 MySQL,如果你是`DBA`请多多指教,文采不佳还望高抬贵手,不甚感激,小弟在这里给您鞠躬,欢迎给我纠错。 169 | 170 | ~~我想念一个女孩儿,实属无奈我得继续努力,好好读书做个有趣的人,完成我的“著作”,待我著作完成可否跟我约个会?~~ 还没有写完就结婚了,欢迎大家 PR 补充完善 :)。 171 | 172 | ## Contributors 173 | 174 | As always, thanks to our amazing contributors! 175 | 176 | 177 | 178 | 179 | 180 | Made with [action-contributors](https://github.com/jaywcjlove/github-action-contributors). 181 | 182 | ## License 183 | 184 | Licensed under the MIT License. 185 | -------------------------------------------------------------------------------- /docs/21-minutes-MySQL-basic-entry.md: -------------------------------------------------------------------------------- 1 | 21分钟MySQL基础入门 2 | === 3 | 4 | 为什么只需要21分钟呢?因为在我们大天朝有句话叫做三七二十一,你可以不管三七二十一开始使用 `MySQL` 及快速的方式入门 `MySQL`。其实21分钟把下面语句执行一遍是没有问题的,要理解的话估计不止21分钟,对于初学者来说只需满足自己需求可以增删改查等简易的维护即可。 5 | 6 | 7 | 8 | 目录 9 | --- 10 | 11 | 12 | 13 | - [开始使用](#开始使用) 14 | - [登录MySQL](#登录mysql) 15 | - [创建数据库](#创建数据库) 16 | - [创建数据库表](#创建数据库表) 17 | - [增删改查](#增删改查) 18 | - [SELECT](#select) 19 | - [UPDATE](#update) 20 | - [INSERT](#insert) 21 | - [DELETE](#delete) 22 | - [WHERE](#where) 23 | - [AND, OR 和 NOT](#and-or-和-not) 24 | - [AND](#and) 25 | - [OR](#or) 26 | - [NOT](#not) 27 | - [AND & OR & NOT](#and--or--not) 28 | - [ORDER BY](#order-by) 29 | - [GROUP BY](#group-by) 30 | - [IN](#in) 31 | - [UNION](#union) 32 | - [BETWEEN](#between) 33 | - [AS](#as) 34 | - [JOIN](#join) 35 | - [INNER JOIN](#inner-join) 36 | - [LEFT JOIN](#left-join) 37 | - [RIGHT JOIN](#right-join) 38 | - [FULL OUTER JOIN](#full-outer-join) 39 | - [SQL 函数](#sql-函数) 40 | - [COUNT](#count) 41 | - [AVG](#avg) 42 | - [SUM](#sum) 43 | - [MAX](#max) 44 | - [MIN](#min) 45 | - [触发器](#触发器) 46 | - [添加索引](#添加索引) 47 | - [普通索引(INDEX)](#普通索引index) 48 | - [主键索引(PRIMARY key)](#主键索引primary-key) 49 | - [唯一索引(UNIQUE)](#唯一索引unique) 50 | - [全文索引(FULLTEXT)](#全文索引fulltext) 51 | - [添加多列索引](#添加多列索引) 52 | - [建立索引的时机](#建立索引的时机) 53 | - [创建后表的修改](#创建后表的修改) 54 | - [添加列](#添加列) 55 | - [修改列](#修改列) 56 | - [删除列](#删除列) 57 | - [重命名表](#重命名表) 58 | - [清空表数据](#清空表数据) 59 | - [删除整张表](#删除整张表) 60 | - [删除整个数据库](#删除整个数据库) 61 | - [其它实例](#其它实例) 62 | - [SQL删除重复记录](#sql删除重复记录) 63 | - [参考手册](#参考手册) 64 | 65 | 66 | 67 | 68 | ## 开始使用 69 | 70 | 我下面所有的SQL语句是基于MySQL 5.6+运行。 71 | 72 | MySQL 为关系型数据库(Relational Database Management System),一个关系型数据库由一个或数个表格组成, 如图所示的一个表格: 73 | 74 | 21分钟MySQL基础入门 75 | 76 | - `表头(header)`: 每一列的名称; 77 | - `列(col)`: 具有相同数据类型的数据的集合; 78 | - `行(row)`: 每一行用来描述某个人/物的具体信息; 79 | - `值(value)`: 行的具体信息, 每个值必须与该列的数据类型相同; 80 | - `键(key)`: 表中用来识别某个特定的人\物的方法, 键的值在当前列中具有唯一性。 81 | 82 | ### 登录MySQL 83 | 84 | ```shell 85 | mysql -h 127.0.0.1 -u <用户名> -p<密码>. # 默认用户名,-p 是密码,⚠️参数后面不需要空格 86 | mysql -D 所选择的数据库名 -h 主机名 -u 用户名 -p 87 | mysql> exit # 退出 使用 “quit;” 或 “\q;” 一样的效果 88 | mysql> status; # 显示当前mysql的version的各种信息 89 | mysql> select version(); # 显示当前mysql的version信息 90 | mysql> show global variables like 'port'; # 查看MySQL端口号 91 | ``` 92 | 93 | ### 创建数据库 94 | 95 | 对于表的操作需要先进入库`use 库名;` 96 | 97 | ```sql 98 | -- 创建一个名为 samp_db 的数据库,数据库字符编码指定为 gbk 99 | create database samp_db character set gbk; 100 | drop database samp_db; -- 删除 库名为 samp_db 的库 101 | show databases; -- 显示数据库列表。 102 | use samp_db; -- 选择创建的数据库 samp_db 103 | show tables; -- 显示 samp_db 下面所有的表名字 104 | describe 表名; -- 显示数据表的结构 105 | delete from 表名; -- 清空表中记录 106 | ``` 107 | 108 | ### 创建数据库表 109 | 110 | > `CREATE TABLE 语法` 语句用于从表中选取数据。 111 | > ```sql 112 | > CREATE TABLE 表名称 ( 113 | > 列名称1 数据类型, 114 | > 列名称2 数据类型, 115 | > 列名称3 数据类型, 116 | > .... 117 | > ); 118 | > ``` 119 | 120 | ```sql 121 | -- 如果数据库中存在user_accounts表,就把它从数据库中drop掉 122 | DROP TABLE IF EXISTS `user_accounts`; 123 | CREATE TABLE `user_accounts` ( 124 | `id` int(100) unsigned NOT NULL AUTO_INCREMENT primary key, 125 | `password` varchar(32) NOT NULL DEFAULT '' COMMENT '用户密码', 126 | `reset_password` tinyint(32) NOT NULL DEFAULT 0 COMMENT '用户类型:0-不需要重置密码;1-需要重置密码', 127 | `mobile` varchar(20) NOT NULL DEFAULT '' COMMENT '手机', 128 | `create_at` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), 129 | `update_at` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), 130 | -- 创建唯一索引,不允许重复 131 | UNIQUE INDEX idx_user_mobile(`mobile`) 132 | ) 133 | ENGINE=InnoDB DEFAULT CHARSET=utf8 134 | COMMENT='用户表信息'; 135 | ``` 136 | 137 | 数据类型的属性解释 138 | 139 | - `NULL`:数据列可包含NULL值; 140 | - `NOT NULL`:数据列不允许包含NULL值; 141 | - `DEFAULT`:默认值; 142 | - `PRIMARY KEY`:主键; 143 | - `AUTO_INCREMENT`:自动递增,适用于整数类型; 144 | - `UNSIGNED`:是指数值类型只能为正数; 145 | - `CHARACTER SET name`:指定一个字符集; 146 | - `COMMENT`:对表或者字段说明; 147 | 148 | ### 删除数据库表 149 | 150 | > `DROP/TRUNCATE TABLE 语法` 语句用于删除数据库中的现有表。 151 | > ```sql 152 | > DROP TABLE 表名称; -- 用于删除数据库中的现有表。 153 | > TRUNCATE TABLE 表名称; -- 用于删除表内的数据,但不删除表本身。 154 | > ``` 155 | 156 | ```sql 157 | -- 删除现有表 Shippers: 158 | DROP TABLE Shippers; 159 | -- 删除现有表 Shippers 表内的数据,不删除表: 160 | TRUNCATE TABLE Shippers; 161 | ``` 162 | 163 | ## 增删改查 164 | 165 | ### SELECT 166 | 167 | > `SELECT 语法` 语句用于从表中选取数据。 168 | > ```sql 169 | > SELECT 列名称1, 列名称2, ... FROM 表名称; 170 | > SELECT * FROM 表名称; 171 | > ``` 172 | 173 | ```sql 174 | -- 从 Customers 表中选择 CustomerName 和 City 列: 175 | SELECT CustomerName, City FROM Customers; 176 | -- 从 Customers 表中选择所有列: 177 | SELECT * FROM Customers; 178 | -- 表 station 取个别名叫 s,表 station 中不包含 字段 id=13 或者 14 的,并且 id 不等于 4 的 查询出来,只显示 id 179 | SELECT s.id from station s WHERE id in (13,14) and id not in (4); 180 | -- 从表 users 选取 id=3 的数据,并只拉一条数据(据说能优化性能) 181 | SELECT * FROM users where id=3 limit 1 182 | -- 结果集中会自动去重复数据 183 | SELECT DISTINCT Company FROM Orders 184 | -- 表 Persons 字段 Id_P 等于 Orders 字段 Id_P 的值, 185 | -- 结果集显示 Persons表的 LastName、FirstName字段,Orders表的OrderNo字段 186 | SELECT p.LastName, p.FirstName, o.OrderNo FROM Persons p, Orders o WHERE p.Id_P = o.Id_P 187 | 188 | -- gbk 和 utf8 中英文混合排序最简单的办法 189 | -- ci是 case insensitive, 即 “大小写不敏感” 190 | SELECT tag, COUNT(tag) from news GROUP BY tag order by convert(tag using gbk) collate gbk_chinese_ci; 191 | SELECT tag, COUNT(tag) from news GROUP BY tag order by convert(tag using utf8) collate utf8_unicode_ci; 192 | ``` 193 | 194 | ### UPDATE 195 | 196 | > `Update 语法` 语句用于修改表中的数据。 197 | > ```sql 198 | > UPDATE 表名称 SET 列名称1 = 值1, 列名称2 = 值2, ... WHERE 条件; 199 | > ``` 200 | 201 | ```sql 202 | -- update语句设置字段值为另一个结果取出来的字段 203 | UPDATE user set name = (SELECT name from user1 WHERE user1 .id = 1 ) 204 | WHERE id = (SELECT id from user2 WHERE user2 .name='小苏'); 205 | -- 更新表 orders 中 id=1 的那一行数据更新它的 title 字段 206 | UPDATE `orders` set title='这里是标题' WHERE id=1; 207 | ``` 208 | 209 | 210 | ### INSERT 211 | 212 | > `INSERT 语法` 用于向表格中插入新的行。 213 | > ```sql 214 | > INSERT INTO 表名称 (列名称1, 列名称2, 列名称3, ...) VALUES (值1, 值2, 值3, ...); 215 | > INSERT INTO 表名称 VALUES (值1, 值2, 值3, ...); 216 | > ``` 217 | 218 | ```sql 219 | -- 向表 Persons 插入一条字段 LastName = JSLite 字段 Address = shanghai 220 | INSERT INTO Persons (LastName, Address) VALUES ('JSLite', 'shanghai'); 221 | -- 向表 meeting 插入 字段 a=1 和字段 b=2 222 | INSERT INTO meeting SET a=1,b=2; 223 | -- 224 | -- SQL实现将一个表的数据插入到另外一个表的代码 225 | -- 如果只希望导入指定字段,可以用这种方法: 226 | -- INSERT INTO 目标表 (字段1, 字段2, ...) SELECT 字段1, 字段2, ... FROM 来源表; 227 | INSERT INTO orders (user_account_id, title) SELECT m.user_id, m.title FROM meeting m where m.id=1; 228 | 229 | -- 向表 charger 插入一条数据,已存在就对表 charger 更新 `type`,`update_at` 字段; 230 | INSERT INTO `charger` (`id`,`type`,`create_at`,`update_at`) VALUES (3,2,'2017-05-18 11:06:17','2017-05-18 11:06:17') ON DUPLICATE KEY UPDATE `id`=VALUES(`id`), `type`=VALUES(`type`), `update_at`=VALUES(`update_at`); 231 | ``` 232 | 233 | ### DELETE 234 | 235 | > `DELETE 语法` 语句用于删除表中的现有记录。 236 | > ```sql 237 | > DELETE FROM 表名称 WHERE 条件; 238 | > ``` 239 | 240 | 241 | ```sql 242 | -- 在不删除table_name表的情况下删除所有的行,清空表。 243 | DELETE FROM table_name 244 | -- 或者 245 | DELETE * FROM table_name 246 | -- 删除 Person 表字段 LastName = 'JSLite' 247 | DELETE FROM Person WHERE LastName = 'JSLite' 248 | -- 删除 表meeting id 为2和3的两条数据 249 | DELETE from meeting where id in (2,3); 250 | ``` 251 | 252 | ## WHERE 253 | 254 | > `WHERE 语法` 用于仅提取满足指定条件的记录 255 | > ```sql 256 | > SELECT 列名称, 列名称, ... FROM 表名称 WHERE 条件1; 257 | > ``` 258 | 259 | ```sql 260 | -- 从表 Persons 中选出 Year 字段大于 1965 的数据 261 | SELECT * FROM Persons WHERE Year>1965 262 | -- 从 Customers 表中选择 Country = Mexico 的所有数据: 263 | SELECT * FROM Customers WHERE Country='Mexico'; 264 | -- 从 Customers 表中选择 CustomerID = 1 的所有数据: 265 | SELECT * FROM Customers WHERE CustomerID=1; 266 | ``` 267 | 268 | ## AND, OR 和 NOT 269 | 270 | `WHERE` 子句可以与 `AND`、`OR` 和 `NOT` 运算符组合使用。 271 | 272 | `AND` 和 `OR` 运算符用于根据多个条件过滤记录: 273 | 274 | - 如果由 `AND` 分隔的所有条件都为 `TRUE`,则 `AND` 运算符将显示一条记录。 275 | - 如果由 `OR` 分隔的任何条件为 `TRUE`,则 `OR` 运算符将显示一条记录。 276 | 277 | 如果条件不为真,`NOT` 运算符将显示一条记录。 278 | 279 | ### AND 280 | 281 | > `AND 语法` 282 | > ```sql 283 | > SELECT 列名称, 列名称, ... FROM 表名称 WHERE 条件1 AND 条件2 AND 条件3 ...; 284 | > ``` 285 | 286 | ```sql 287 | -- 删除 meeting 表字段 288 | -- id=2 并且 user_id=5 的数据 和 289 | -- id=3 并且 user_id=6 的数据 290 | DELETE from meeting where id in (2,3) and user_id in (5,6); 291 | 292 | -- 使用 AND 来显示所有姓为 "Carter" 并且名为 "Thomas" 的人: 293 | SELECT * FROM Persons WHERE FirstName='Thomas' AND LastName='Carter'; 294 | ``` 295 | 296 | ### OR 297 | 298 | > `OR 语法` 299 | > ```sql 300 | > SELECT 列名称1, 列名称2, ... FROM 表名称 WHERE 条件1 OR 条件2 OR 条件3 ...; 301 | > ``` 302 | 303 | ```sql 304 | -- 使用 OR 来显示所有姓为 "Carter" 或者名为 "Thomas" 的人: 305 | SELECT * FROM Persons WHERE firstname='Thomas' OR lastname='Carter' 306 | ``` 307 | 308 | ### NOT 309 | 310 | > `NOT 语法` 311 | > ```sql 312 | > SELECT 列名称1, 列名称2, ... FROM 表名称 WHERE NOT 条件2; 313 | > ``` 314 | 315 | ```sql 316 | -- 从 Customers 表中选择 Country 不是 Germany 的所有字段: 317 | SELECT * FROM Customers WHERE NOT Country='Germany'; 318 | ``` 319 | 320 | ### AND & OR & NOT 321 | 322 | ```sql 323 | -- 从 Customers 表中选择所有字段,其中 Country 为 Germany 且城市必须为 Berlin 或 München(使用括号构成复杂表达式): 324 | SELECT * FROM Customers WHERE Country='Germany' AND (City='Berlin' OR City='München'); 325 | -- 从 Customers 表中选择 Country 不是 Germany 和 NOT "USA" 的所有字段: 326 | SELECT * FROM Customers WHERE NOT Country='Germany' AND NOT Country='USA'; 327 | ``` 328 | 329 | ## ORDER BY 330 | 331 | > `ORDER BY 语法` 用于按升序或降序对结果集进行排序。 332 | > ```sql 333 | > SELECT 列名称1, 列名称2, ... FROM 表名称 ORDER BY 列名称1, 列名称2, ... ASC|DESC; 334 | > ``` 335 | > 默认按 `ASC` 升序对记录进行排序。要按降序对记录进行排序,请使用 `DESC` 关键字。 336 | 337 | ```sql 338 | -- 从 Customers 表中选择所有字段,按 Country 列排序: 339 | SELECT * FROM Customers ORDER BY Country; 340 | -- 从 Orders 表中选择 Company, OrderNumber 字段,按 Company 列排序: 341 | SELECT Company, OrderNumber FROM Orders ORDER BY Company 342 | -- 从 Orders 表中选择 Company, OrderNumber 字段,按 Company 列降序排序: 343 | SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC 344 | -- 从 Orders 表中选择 Company, OrderNumber 字段,按 Company 列降序排序,并 OrderNumber 以顺序显示: 345 | SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC 346 | ``` 347 | 348 | ## GROUP BY 349 | 350 | > `GROUP BY 语法` 将具有相同值的行分组到汇总行中 351 | > ```sql 352 | > SELECT 列名称(s) 353 | > FROM 表名称 354 | > WHERE 条件 355 | > GROUP BY 列名称(s) 356 | > ORDER BY 列名称(s); 357 | > ``` 358 | 359 | ```sql 360 | -- 列出了 Orders 每个发货人 Shippers 发送的订单 Orders 数量 361 | SELECT Shippers.ShipperName, COUNT(Orders.OrderID) AS NumberOfOrders FROM Orders 362 | LEFT JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID 363 | GROUP BY ShipperName; 364 | ``` 365 | 366 | ## IN 367 | 368 | > `IN 语法` 运算符允许您在 WHERE 子句中指定多个值。运算符是多个 OR 条件的简写。 369 | > ```sql 370 | > SELECT 列名称(s) FROM 表名称 WHERE 列名称 IN (值1, 值2, ...); 371 | > SELECT 列名称(s) FROM 表名称 WHERE 列名称 IN (SELECT STATEMENT); 372 | > ``` 373 | 374 | ```sql 375 | -- 从表 Persons 选取 字段 LastName 等于 Adams、Carter 376 | SELECT * FROM Persons WHERE LastName IN ('Adams','Carter') 377 | -- 从表 Customers 选取 Country 值为 'Germany', 'France', 'UK' 的所有数据 378 | SELECT * FROM Customers WHERE Country IN ('Germany', 'France', 'UK'); 379 | -- 从表 Customers 选取 Country 值不为 'Germany', 'France', 'UK' 的所有数据 380 | SELECT * FROM Customers WHERE Country NOT IN ('Germany', 'France', 'UK'); 381 | -- 从表 Customers 选取与 Suppliers 表 Country 字段相同的所有数据: 382 | SELECT * FROM Customers WHERE Country IN (SELECT Country FROM Suppliers); 383 | ``` 384 | 385 | ## UNION 386 | 387 | > `UNION 语法` 操作符用于合并两个或多个 SELECT 语句的结果集 388 | > ```sql 389 | > SELECT 列名称(s) FROM 表名称1 390 | > UNION 391 | > SELECT 列名称(s) FROM 表名称2; 392 | > ``` 393 | 394 | ```sql 395 | -- 列出所有在中国表(Employees_China)和美国(Employees_USA)的不同的雇员名 396 | SELECT E_Name FROM Employees_China UNION SELECT E_Name FROM Employees_USA 397 | 398 | -- 列出 meeting 表中的 pic_url, 399 | -- station 表中的 number_station 别名设置成 pic_url 避免字段不一样报错 400 | -- 按更新时间排序 401 | SELECT id,pic_url FROM meeting UNION ALL SELECT id,number_station AS pic_url FROM station ORDER BY update_at; 402 | -- 通过 UNION 语法同时查询了 products 表 和 comments 表的总记录数,并且按照 count 排序 403 | SELECT 'product' AS type, count(*) as count FROM `products` union select 'comment' as type, count(*) as count FROM `comments` order by count; 404 | ``` 405 | 406 | ## BETWEEN 407 | 408 | > `BETWEEN 语法` 运算符选择给定范围内的值 409 | > ```sql 410 | > SELECT 列名称(s) FROM 表名称 WHERE 列名称 BETWEEN 值1 AND 值2; 411 | > ``` 412 | 413 | ```sql 414 | -- 选择 Products 表中 Price 字段在 10 到 20 之间的所有: 415 | SELECT * FROM Products WHERE Price BETWEEN 10 AND 20; 416 | ``` 417 | 418 | ## AS 419 | 420 | > `AS 语法` 用于为表或表中的列(字段)提供临时名称(别名)。 421 | > ```sql 422 | > SELECT 列名称 AS 别名 FROM 表名称; 423 | > SELECT 列名称(s) FROM 表名称 AS 别名; 424 | > ``` 425 | 426 | ```sql 427 | -- 创建两个别名,一个用于 CustomerID 的 ID 别名列,一个用于 CustomerName 的 Customer 别名列: 428 | SELECT CustomerID AS ID, CustomerName AS Customer FROM Customers; 429 | 430 | -- 这句意思是查找所有 Employee 表里面的数据,并把 Employee 表格命名为 emp。 431 | -- 当你命名一个表之后,你可以在下面用 emp 代替 Employee. 432 | -- 例如 SELECT * FROM emp. 433 | SELECT * FROM Employee AS emp 434 | 435 | -- 列出表 Orders 字段 OrderPrice 列最大值, 436 | -- 结果集列不显示 OrderPrice 显示 LargestOrderPrice 437 | SELECT MAX(OrderPrice) AS LargestOrderPrice FROM Orders 438 | 439 | -- 显示表 users_profile 中的 name 列 440 | SELECT t.name from (SELECT * from users_profile a) AS t; 441 | 442 | -- 表 user_accounts 命名别名 ua,表 users_profile 命名别名 up 443 | -- 满足条件 表 user_accounts 字段 id 等于 表 users_profile 字段 user_id 444 | -- 结果集只显示mobile、name两列 445 | SELECT ua.mobile,up.name FROM user_accounts as ua INNER JOIN users_profile as up ON ua.id = up.user_id; 446 | ``` 447 | 448 | ## JOIN 449 | 450 | JOIN 子句用于根据两个或多个表之间的相关列组合来自两个或多个表的行。 451 | 452 | - `JOIN`: 如果表中有至少一个匹配,则返回行 453 | - `INNER JOIN`:在表中存在至少一个匹配时,INNER JOIN 关键字返回行。 454 | - `LEFT JOIN`: 即使右表中没有匹配,也从左表返回所有的行 455 | - `RIGHT JOIN`: 即使左表中没有匹配,也从右表返回所有的行 456 | - `FULL JOIN`: 只要其中一个表中存在匹配,就返回行(MySQL 是不支持的,通过 `LEFT JOIN + UNION + RIGHT JOIN` 的方式 来实现) 457 | ### INNER JOIN 458 | 459 | > `INNER JOIN 语法` 选择在两个表中具有匹配值的记录。 460 | > ```sql 461 | > SELECT 列名称(s) 462 | > FROM 表1 463 | > INNER JOIN 表2 464 | > ON 表1.列名称 = 表2.列名称; 465 | > ``` 466 | 467 | ```sql 468 | -- 选择包含 Customers 的所有 Orders: 469 | SELECT Orders.OrderID, Customers.CustomerName FROM Orders INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID; 470 | 471 | -- [JOIN 三张表] 选择包含 Customers 和 Shippers 的所有 Orders: 472 | SELECT Orders.OrderID, Customers.CustomerName, Shippers.ShipperName 473 | FROM ((Orders 474 | INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID) 475 | INNER JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID); 476 | ``` 477 | 478 | ### LEFT JOIN 479 | 480 | > `LEFT JOIN 语法` 返回左表 (表1) 中的所有记录,以及右表 (表2) 中的匹配记录 481 | > ```sql 482 | > SELECT 列名称(s) 483 | > FROM 表1 484 | > LEFT JOIN 表2 485 | > ON 表1.列名称 = 表2.列名称; 486 | > ``` 487 | 488 | ```sql 489 | -- 将选择所有 Customers 以及他们可能拥有的任何 Orders: 490 | SELECT Customers.CustomerName, Orders.OrderID FROM Customers 491 | LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID 492 | ORDER BY Customers.CustomerName; 493 | ``` 494 | 495 | ### RIGHT JOIN 496 | 497 | > `RIGHT JOIN 语法` 返回右表 (表2) 中的所有记录,以及左表 (表1) 中的匹配记录 498 | > ```sql 499 | > SELECT 列名称(s) 500 | > FROM 表1 501 | > RIGHT JOIN 表2 502 | > ON 表1.列名称 = 表2.列名称; 503 | > ``` 504 | 505 | ```sql 506 | -- 返回所有 Employees 以及他们可能下的任何 Orders: 507 | SELECT Orders.OrderID, Employees.LastName, Employees.FirstName FROM Orders 508 | RIGHT JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID 509 | ORDER BY Orders.OrderID; 510 | ``` 511 | 512 | ### FULL OUTER JOIN 513 | 514 | > `FULL OUTER JOIN 语法` 当左(表1)或右(表2)表记录中存在匹配时,关键字返回所有记录 515 | > ```sql 516 | > SELECT 列名称(s) 517 | > FROM 表1 518 | > FULL OUTER JOIN 表2 519 | > ON 表1.列名称 = 表2.列名称 520 | > WHERE 条件; 521 | > ``` 522 | 523 | ## SQL 函数 524 | 525 | ### COUNT 526 | 527 | > `COUNT 语法` 返回与指定条件匹配的行数 528 | > ```sql 529 | > SELECT COUNT(列名称) FROM 表名称 WHERE 条件; 530 | > ``` 531 | 532 | ```sql 533 | -- 表 Store_Information 有几笔 store_name 栏不是空白的资料。 534 | -- "IS NOT NULL" 是 "这个栏位不是空白" 的意思。 535 | SELECT COUNT (Store_Name) FROM Store_Information WHERE Store_Name IS NOT NULL; 536 | -- 获取 Persons 表的总数 537 | SELECT COUNT(1) AS totals FROM Persons; 538 | -- 获取表 station 字段 user_id 相同的总数 539 | select user_id, count(*) as totals from station group by user_id; 540 | ``` 541 | 542 | ### AVG 543 | 544 | > `AVG 语法` 返回数值列的平均值 545 | > ```sql 546 | > SELECT AVG(列名称) FROM 表名称 WHERE 条件; 547 | > ``` 548 | 549 | ```sql 550 | -- 查找 Products 表中所的 Price 平均值: 551 | SELECT AVG(Price) FROM Products; 552 | ``` 553 | 554 | ### SUM 555 | 556 | > `SUM 语法` 返回数值列的总和 557 | > ```sql 558 | > SELECT SUM(列名称) FROM 表名称 WHERE 条件; 559 | > ``` 560 | 561 | ```sql 562 | -- 查找 OrderDetails 表中 Quantity 字段的总和: 563 | SELECT SUM(Quantity) FROM OrderDetails; 564 | ``` 565 | 566 | ### MAX 567 | 568 | > `MAX 语法` 返回所选列的最大值 569 | > ```sql 570 | > SELECT MIN(列名称) FROM 表名称 WHERE 条件; 571 | > ``` 572 | 573 | ```sql 574 | -- 列出表 Orders 字段 OrderPrice 列最大值, 575 | -- 结果集列不显示 OrderPrice 显示 LargestOrderPrice 576 | SELECT MAX(OrderPrice) AS LargestOrderPrice FROM Orders 577 | ``` 578 | 579 | ### MIN 580 | 581 | > `MIN 语法` 返回所选列的最小值 582 | > ```sql 583 | > SELECT MIN(列名称) FROM 表名称 WHERE 条件; 584 | > ``` 585 | 586 | ```sql 587 | -- 查找 Products 表中 Price 字段最小值,并命名 SmallestPrice 别名: 588 | SELECT MIN(Price) AS SmallestPrice FROM Products; 589 | ``` 590 | 591 | ## 触发器 592 | 593 | > 语法: 594 | > ```sql 595 | > create trigger <触发器名称> 596 | > { before | after} -- 之前或者之后出发 597 | > insert | update | delete -- 指明了激活触发程序的语句的类型 598 | > on <表名> -- 操作哪张表 599 | > for each row -- 触发器的执行间隔,for each row 通知触发器每隔一行执行一次动作,而不是对整个表执行一次。 600 | > <触发器SQL语句> 601 | > ``` 602 | 603 | ```sql 604 | delimiter $ 605 | CREATE TRIGGER set_userdate BEFORE INSERT 606 | on `message` 607 | for EACH ROW 608 | BEGIN 609 | set @statu = new.status; -- 声明复制变量 statu 610 | if @statu = 0 then -- 判断 statu 是否等于 0 611 | UPDATE `user_accounts` SET status=1 WHERE openid=NEW.openid; 612 | end if; 613 | END 614 | $ 615 | DELIMITER ; -- 恢复结束符号 616 | ``` 617 | 618 | OLD和NEW不区分大小写 619 | - NEW 用NEW.col_name,没有旧行。在DELETE触发程序中,仅能使用OLD.col_name,没有新行。 620 | - OLD 用OLD.col_name来引用更新前的某一行的列 621 | 622 | ## 添加索引 623 | 624 | ### 普通索引(INDEX) 625 | 626 | > 语法:ALTER TABLE `表名字` ADD INDEX 索引名字 ( `字段名字` ) 627 | 628 | ```sql 629 | -- –直接创建索引 630 | CREATE INDEX index_user ON user(title) 631 | -- –修改表结构的方式添加索引 632 | ALTER TABLE table_name ADD INDEX index_name ON (column(length)) 633 | -- 给 user 表中的 name 字段 添加普通索引(INDEX) 634 | ALTER TABLE `user` ADD INDEX index_name (name) 635 | -- –创建表的时候同时创建索引 636 | CREATE TABLE `user` ( 637 | `id` int(11) NOT NULL AUTO_INCREMENT , 638 | `title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL , 639 | `content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL , 640 | `time` int(10) NULL DEFAULT NULL , 641 | PRIMARY KEY (`id`), 642 | INDEX index_name (title(length)) 643 | ) 644 | -- –删除索引 645 | DROP INDEX index_name ON table 646 | ``` 647 | 648 | ### 主键索引(PRIMARY key) 649 | 650 | > 语法:ALTER TABLE `表名字` ADD PRIMARY KEY ( `字段名字` ) 651 | 652 | ```sql 653 | -- 给 user 表中的 id字段 添加主键索引(PRIMARY key) 654 | ALTER TABLE `user` ADD PRIMARY key (id); 655 | ``` 656 | 657 | ### 唯一索引(UNIQUE) 658 | 659 | > 语法:ALTER TABLE `表名字` ADD UNIQUE (`字段名字`) 660 | 661 | ```sql 662 | -- 给 user 表中的 creattime 字段添加唯一索引(UNIQUE) 663 | ALTER TABLE `user` ADD UNIQUE (creattime); 664 | ``` 665 | 666 | ### 全文索引(FULLTEXT) 667 | 668 | > 语法:ALTER TABLE `表名字` ADD FULLTEXT (`字段名字`) 669 | 670 | ```sql 671 | -- 给 user 表中的 description 字段添加全文索引(FULLTEXT) 672 | ALTER TABLE `user` ADD FULLTEXT (description); 673 | ``` 674 | 675 | ### 添加多列索引 676 | 677 | > 语法: 678 | ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3`) 679 | 680 | ```sql 681 | -- 给 user 表中的 name、city、age 字段添加名字为name_city_age的普通索引(INDEX) 682 | ALTER TABLE user ADD INDEX name_city_age (name(10),city,age); 683 | ``` 684 | 685 | ### 建立索引的时机 686 | 687 | 在`WHERE`和`JOIN`中出现的列需要建立索引,但也不完全如此: 688 | 689 | - MySQL只对`<`,`<=`,`=`,`>`,`>=`,`BETWEEN`,`IN`使用索引 690 | - 某些时候的`LIKE`也会使用索引。 691 | - 在`LIKE`以通配符%和_开头作查询时,MySQL不会使用索引。 692 | 693 | ```sql 694 | -- 此时就需要对city和age建立索引, 695 | -- 由于mytable表的userame也出现在了JOIN子句中,也有对它建立索引的必要。 696 | SELECT t.Name 697 | FROM mytable t LEFT JOIN mytable m ON t.Name=m.username 698 | WHERE m.age=20 AND m.city='上海'; 699 | 700 | SELECT * FROM mytable WHERE username like'admin%'; -- 而下句就不会使用: 701 | SELECT * FROM mytable WHERE Name like'%admin'; -- 因此,在使用LIKE时应注意以上的区别。 702 | ``` 703 | 704 | 索引的注意事项 705 | 706 | - 索引不会包含有NULL值的列 707 | - 使用短索引 708 | - 不要在列上进行运算 索引会失效 709 | 710 | ## 创建后表的修改 711 | 712 | ### 添加列 713 | 714 | > 语法:`alter table 表名 add 列名 列数据类型 [after 插入位置];` 715 | 716 | 示例: 717 | 718 | ```sql 719 | -- 在表students的最后追加列 address: 720 | alter table students add address char(60); 721 | -- 在名为 age 的列后插入列 birthday: 722 | alter table students add birthday date after age; 723 | -- 在名为 number_people 的列后插入列 weeks: 724 | alter table students add column `weeks` varchar(5) not null default "" after `number_people`; 725 | ``` 726 | 727 | ### 修改列 728 | 729 | > 语法:`alter table 表名 change 列名称 列新名称 新数据类型;` 730 | 731 | ```sql 732 | -- 将表 tel 列改名为 telphone: 733 | alter table students change tel telphone char(13) default "-"; 734 | -- 将 name 列的数据类型改为 char(16): 735 | alter table students change name name char(16) not null; 736 | -- 修改 COMMENT 前面必须得有类型属性 737 | alter table students change name name char(16) COMMENT '这里是名字'; 738 | -- 修改列属性的时候 建议使用modify,不需要重建表 739 | -- change用于修改列名字,这个需要重建表 740 | alter table meeting modify `weeks` varchar(20) NOT NULL DEFAULT '' COMMENT '开放日期 周一到周日:0~6,间隔用英文逗号隔开'; 741 | -- `user`表的`id`列,修改成字符串类型长度50,不能为空,`FIRST`放在第一列的位置 742 | alter table `user` modify COLUMN `id` varchar(50) NOT NULL FIRST ; 743 | ``` 744 | 745 | ### 删除列 746 | 747 | > 语法:`alter table 表名 drop 列名称;` 748 | 749 | ```sql 750 | -- 删除表students中的 birthday 列: 751 | alter table students drop birthday; 752 | ``` 753 | 754 | ### 重命名表 755 | 756 | > 语法:`alter table 表名 rename 新表名;` 757 | 758 | ```sql 759 | -- 重命名 students 表为 workmates: 760 | alter table students rename workmates; 761 | ``` 762 | 763 | ### 清空表数据 764 | 765 | > 方法一:`delete from 表名;` 766 | > 方法二:`truncate table "表名";` 767 | 768 | - `DELETE:`1. DML语言;2. 可以回退;3. 可以有条件的删除; 769 | - `TRUNCATE:`1. DDL语言;2. 无法回退;3. 默认所有的表内容都删除;4. 删除速度比delete快。 770 | 771 | ```sql 772 | -- 清空表为 workmates 里面的数据,不删除表。 773 | delete from workmates; 774 | -- 删除workmates表中的所有数据,且无法恢复 775 | truncate table workmates; 776 | ``` 777 | 778 | ### 删除整张表 779 | 780 | > 语法:`drop table 表名;` 781 | 782 | ```sql 783 | -- 删除 workmates 表: 784 | drop table workmates; 785 | ``` 786 | 787 | ### 删除整个数据库 788 | 789 | > 语法:`drop database 数据库名;` 790 | 791 | ```sql 792 | -- 删除 samp_db 数据库: 793 | drop database samp_db; 794 | ``` 795 | 796 | ## 其它实例 797 | 798 | ### SQL删除重复记录 799 | 800 | [转载](http://www.xiangguo.li/sql_and_nosql/2015/01/01/sql) 801 | 802 | ```sql 803 | -- 查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 804 | select * from people where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1) 805 | -- 删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录 806 | delete from people 807 | where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1) 808 | and rowid not in (select min(rowid) from people group by peopleId having count(peopleId )>1) 809 | -- 查找表中多余的重复记录(多个字段) 810 | select * from vitae a 811 | where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1) 812 | -- 删除表中多余的重复记录(多个字段),只留有rowid最小的记录 813 | delete from vitae a 814 | where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1) and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1) 815 | -- 查找表中多余的重复记录(多个字段),不包含rowid最小的记录 816 | select * from vitae a 817 | where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1) and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1) 818 | ``` 819 | 820 | ## 参考手册 821 | 822 | - http://www.w3school.com.cn/sql/index.asp 823 | - http://www.1keydata.com/cn/sql/sql-count.php 824 | -------------------------------------------------------------------------------- /docs/awesome-mysql.md: -------------------------------------------------------------------------------- 1 | Awesome MySQL 2 | === 3 | 4 | 这是一个MySQL软件库和资源列表清单。部分资源搜集来源于[shlomi-noach/awesome-mysql](https://github.com/shlomi-noach/awesome-mysql),它的[中文翻译](https://github.com/jobbole/awesome-mysql-cn)在这里,没有完全fork过来,没有完全拷贝,是因为部分排版比较丑陋,部分工具慢慢搜集理解。 5 | 6 | ## 说明 7 | 8 | ![Open-Source Software][OSS Icon] 表示**开源**标示,点击进入**开源**仓库; 9 | ![Freeware][Freeware Icon] 表示**免费**标示,或者个人**免费**; 10 | ![hot][hot Icon] 表示**热门**的资源标示; 11 | ![tuijian][tuijian Icon] 表示**推荐**资源标示; 12 | ![必备][bibei Icon] 表示**必备**资源标示; 13 | ![1 star][red Icon] 表示强烈推荐的,星星的数量来表达强烈的程度; 14 | 15 | 16 | 17 | ## 目录 18 | 19 | - [手册文档](#手册文档) 20 | - [分析工具](#分析工具) 21 | - [GUI](#gui) 22 | - [服务器](#服务器) 23 | - [备份](#备份) 24 | - [官方资料](#官方资料) 25 | - [优秀文章](#优秀文章) 26 | 27 | 28 | 29 | ## 手册文档 30 | 31 | _这里是一些非官方的手册文档_ 32 | 33 | - http://www.w3school.com.cn/sql/index.asp 34 | - http://www.1keydata.com/cn/sql/sql-count.php 35 | - http://www.runoob.com/mysql/mysql-tutorial.html 36 | 37 | ## 分析工具 38 | 39 | _性能,结构和数据分析工具_ 40 | 41 | * [Anemometer](https://github.com/box/Anemometer) - 一个 SQL 慢查询监控器。 42 | * [innodb-ruby](https://github.com/jeremycole/innodb_ruby) - 一个对 InooDB 格式文件的解析器,用于 Ruby 语言。 43 | * [innotop](https://github.com/innotop/innotop) - 一个具备多种特性和可扩展性的 MySQL 版 'top' 工具。 44 | * [pstop](https://github.com/sjmudd/ps-top) - 一个针对 MySQL 的类 top 程序,用于收集,汇总以及展示来自 performance_schema 的信息。 45 | * [mysql-statsd](https://github.com/db-art/mysql-statsd) - 一个收集 MySQL 信息的 Python 守护进程,并通过 StatsD 发送到 Graphite。 46 | * [sql.ohrz.net](https://sql.ohrz.net) - SQL语句解读服务,支持高亮显示解析结果中表名、字段名、子查询语句等在原文中对应的位置。 47 | 48 | ## GUI 49 | 50 | _这里是搜集的一些 MySQL 的客户端,也有命令行客户端。_ 51 | 52 | * [TablePlus](https://tableplus.io/) - 支持PostgreSQL,MySQL,RedShift,MariaDB ...各种数据库的高颜值客户端。[![Open-Source Software][OSS Icon]](https://github.com/sequelpro/sequelpro) ![Freeware][Freeware Icon] ![hot][hot Icon] ![必备][bibei Icon] 53 | * [Sequel Pro](http://www.sequelpro.com/) - 一个MySQL数据库管理软件。[![Open-Source Software][OSS Icon]](https://github.com/sequelpro/sequelpro) ![Freeware][Freeware Icon] ![hot][hot Icon] 54 | * [MySQL Workbench](http://dev.mysql.com/downloads/workbench/) - MySQL数据库官方管理软件。提供给数据库管理员和开发人员进行数据库设计和建模的集成工具环境;SQL 开发;数据库管理。 55 | * [Navicat](https://www.navicat.com/products/navicat-for-mysql) - 同样跨平台,同时支持多个数据库系统(MySQL、SQL Server、Oracle)。 56 | * [ElectroCRUD](http://garrylachman.github.io/ElectroCRUD/) - MySQL数据库CRUD应用程序。[![Open-Source Software][OSS Icon]](https://github.com/garrylachman/ElectroCRUD) ![Freeware][Freeware Icon] 57 | * [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] 58 | * [Adminer](https://www.adminer.org/) - 一个 PHP 编写的数据库管理工具。[![Open-Source Software][OSS Icon]](https://github.com/vrana/adminer) ![Freeware][Freeware Icon] 59 | * [HeidiSQL](http://www.heidisql.com/) - Windows 下的 MySQL 图形化管理工具。[![Open-Source Software][OSS Icon]](https://github.com/HeidiSQL/HeidiSQL) ![Freeware][Freeware Icon] 60 | * [phpMyAdmin](https://www.phpmyadmin.net/) - 一个 PHP 写成的开源软件,意图对 web 上的 MySQL 进行管理。[![Open-Source Software][OSS Icon]](https://github.com/phpmyadmin/phpmyadmin) 61 | * [mycli](https://github.com/dbcli/mycli) - 为MySQL命令行客户端,提供语法高亮和提示功能的工具! 62 | [![Open-Source Software][OSS Icon]](https://github.com/dbcli/mycli) ![Freeware][Freeware Icon] ![tuijian][tuijian Icon] ![star 5][star5 Icon] 63 | * [dbdiagram](https://dbdiagram.io/) - 创建数据库的实体-关系图的工具。 64 | 65 | 66 | ## 服务器 67 | 68 | _MySQL服务器的衍生品_ 69 | 70 | * [MariaDB](https://github.com/MariaDB/server) - MySQL server 的一个由社区开发的分支。 71 | * [MySQL Server & MySQL Cluster](https://github.com/mysql/mysql-server) - Oracle 官方的 MySQL server 和 MySQL 集群分布。 72 | * [Percona Server](https://launchpad.net/percona-server) - 一个加强版的 MySQL 替代品 73 | * [WebScaleSQL](https://github.com/webscalesql/webscalesql-5.6) - WebScaleSQL,5.6 版本,基于 MySQL 5.6 社区版本。 74 | 75 | ## 备份 76 | 77 | _备份/存储/恢复 工具_ 78 | 79 | * [MyDumper](https://launchpad.net/mydumper) - 逻辑的,并行的 MySQL 备份/转储工具。 80 | * [MySQLDumper](http://www.mysqldumper.net/) - 基于 web 的开源备份工具-对于共享虚拟主机非常有用。 81 | * [mysqldump-secure](https://github.com/cytopia/mysqldump-secure) - 将加密,压缩,日志,黑名单和 Nagios 监控一体化的 mysqldump 安全脚本。 82 | * [Percona Xtrabackup](https://www.percona.com/doc/percona-xtrabackup) - 针对 MySQL 的一个开源热备份实用程序——在服务器的备份期间不会锁定你的数据库。 83 | 84 | 85 | ## 官方资料 86 | 87 | _官方的一些网站和文章_ 88 | 89 | * MySQL官网:http://www.mysql.com/ 90 | * MySQL开发者主页:http://dev.mysql.com/ 91 | * MySQL社区:http://www.mysqlpub.com/ 92 | * [What is MySQL?](http://dev.mysql.com/doc/refman/5.7/en/what-is-mysql.html) 93 | * [密码验证插件](http://dev.mysql.com/doc/refman/5.6/en/validate-password-plugin.html) 94 | 95 | ## 优秀文章 96 | 97 | _一些优秀的文章_ 98 | 99 | * [MySQL索引背后的数据结构及算法原理](http://blog.codinglabs.org/articles/theory-of-mysql-index.html) 100 | * [MySQL数据库引擎](http://www.cnblogs.com/0201zcr/p/5296843.html) 101 | * [Nodejs连接MySQL数据库](http://xieyufei.com/2016/11/15/Nodejs-Connect-Mysql.html) 102 | * [MySQL优化](http://blog.csdn.net/qq_22329521/article/details/54801950) 103 | * [10分钟让你明白MySQL是如何利用索引的](http://fordba.com/spend-10-min-to-understand-how-mysql-use-index.html) 104 | * [一个MySQL 5.7 分区表性能下降的案例分析](https://mp.weixin.qq.com/s/K3RpSBAIWFwGCIWyfF0QPA) 105 | * [一个不可思议的MySQL慢查分析与解决](http://fordba.com/optimize-an-amazing-mysql-slowlog.html) 106 | 107 | 108 | **[⬆ 返回顶部](#awesome-mysql)** 109 | 110 | 111 | [OSS Icon]: https://jaywcjlove.github.io/sb/ico/min-oss.svg 112 | [Freeware Icon]: https://jaywcjlove.github.io/sb/ico/min-free.svg 113 | [hot Icon]: https://jaywcjlove.github.io/sb/ico/min-hot.svg 114 | [tuijian Icon]: https://jaywcjlove.github.io/sb/ico/min-tuijian.svg 115 | [bibei Icon]: https://jaywcjlove.github.io/sb/ico/min-bibei.svg 116 | [red Icon]: https://jaywcjlove.github.io/sb/star/red.svg 117 | [star0 Icon]: https://jaywcjlove.github.io/sb/star/red0.svg 118 | [star1 Icon]: https://jaywcjlove.github.io/sb/star/red1.svg 119 | [star2 Icon]: https://jaywcjlove.github.io/sb/star/red2.svg 120 | [star3 Icon]: https://jaywcjlove.github.io/sb/star/red3.svg 121 | [star4 Icon]: https://jaywcjlove.github.io/sb/star/red4.svg 122 | [star5 Icon]: https://jaywcjlove.github.io/sb/star/red5.svg 123 | -------------------------------------------------------------------------------- /docs/chapter1/1.1.md: -------------------------------------------------------------------------------- 1 | 2 | 数据库基础 3 | === 4 | 5 | 数据库(Database,DB)是按照数据结构来组织、存储和管理数据的建立在计算机存储设备上的仓库。 6 | 7 | 简单来说是本身可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增、截取、更新、删除等操作。数据管理不再仅仅是存储和管理数据,而转变成用户所需要的各种数据管理的方式。数据库有很多种类型,从最简单的存储有各种数据的表格到能够进行海量数据存储的大型数据库系统都在各个方面得到了广泛的应用。 8 | 9 | ## 什么是数据库 10 | 11 | > 人们通常用数据库这个术语来代表他们使用的数据库软件。这是不正确的,它是引起混淆的根源。确切地说,数据库软件应称为`DBMS`(数据库管理系统)。数据库是通过 `DBMS` 创建和操纵的容器。数据库可以是保存在硬设备上的文件,但也可以不是。在很大程度上说,数据库究竟是文件还是别的什么东西并不重要,因为你并不直接访问数据库;你使用的是`DBMS`,它替你访问数据库。 12 | 13 | 数据库指的是以一定方式储存在一起、能为多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。简单来说可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据运行新增、截取、更新、删除等操作。 14 | 15 | RDBMS即关系数据库管理系统(Relational Database Management System)的特点: 16 | 17 | 1. 数据以表格的形式出现 18 | 2. 每行为各种记录名称 19 | 3. 每列为记录名称所对应的数据域 20 | 4. 许多的行和列组成一张表单 21 | 5. 若干的表单组成database 22 | 23 | ## 数据库分类 24 | 25 | 数据库的分类可多了去了,在维基百科上面有下面这些数据库,并粗略的分了个类别。一看这里面的学问大了去了,还是先搬一些代表性的吧,长长见识,要深入了解各种概念推荐看《数据库系统概论》。 26 | 27 | ### 关系数据库 28 | 29 | _(英语:Relational database),是创建在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。现实世界中的各种实体以及实体之间的各种联系均用关系模型来表示。关系模型是由埃德加·科德于1970年首先提出的,并配合“科德十二定律”。现如今虽然对此模型有一些批评意见,但它还是数据存储的传统标准。标准数据查询语言SQL就是一种基于关系数据库的语言,这种语言执行对关系数据库中数据的检索和操作。_ 30 | 31 | - MySQL 32 | - MariaDB(MySQL的代替品,英文维基百科从MySQL转向MariaDB) 33 | - Percona Server(MySQL的代替品) 34 | - PostgreSQL 35 | - Microsoft Access 36 | - Google Fusion Tables 37 | - SQL Server 38 | - FileMaker 39 | - Oracle 40 | - Sybase 41 | - dBASE 42 | - Clipper 43 | - FoxPro 44 | 45 | 几乎所有的数据库管理系统都配备了一个开放式数据库连接(ODBC)驱动程序,令各个数据库之间得以互相集成。 46 | 47 | ### 非关系型数据库(NoSQL) 48 | 49 | _NoSQL一词最早出现于1998年,是Carlo Strozzi开发的一个轻量、开源、不提供SQL功能的关系数据库。当代典型的关系数据库在一些数据敏感的应用中表现了糟糕的性能,例如为巨量文档创建索引、高流量网站的网页服务,以及发送流式媒体。关系型数据库的典型实现主要被调整用于执行规模小而读写频繁,或者大批量极少写访问的事务。_ 50 | 51 | #### Key/value最终一致性存储 52 | 53 | - Apache Cassandra(为Facebook所使用):高度可扩展 54 | - Dynamo 55 | - Hibari 56 | - Project Voldemort 57 | - Riak 58 | 59 | #### Key/value硬盘存储 60 | 61 | - LevelDB(Google) 62 | - BigTable 63 | - MemcacheDB 64 | - Tokyo Cabinet 65 | - Tuple space 66 | - TreapDB 67 | 68 | #### Key/value RAM存储 69 | 70 | - Oracle Coherence 71 | - memcached 72 | - Citrusleaf database 73 | - Velocity 74 | - **Redis** 75 | - Tuple space 76 | 77 | #### Key/value基于Paxos算法的存储 78 | 79 | - Keyspace 80 | 81 | ## 数据库模型 82 | 83 | 数据库模型描述了在数据库中结构化和操纵数据的方法,模型的结构部分规定了数据如何被描述(例如树、表等)。数据库模型的分类如下: 84 | 85 | - 对象模型 86 | - 层次模型(轻量级数据访问协议) 87 | - 网状模型(大型数据储存) 88 | - 关系模型 89 | - 面向对象模型 90 | - 半结构化模型 91 | - 平面模型(表格模型,一般在形式上是一个二维数组。如表格模型数据Excel) 92 | 93 | ### 架构 94 | 95 | _数据库的架构可以大致区分为三个概括层次:内层、概念层和外层。_ 96 | 97 | - 内层:最接近实际存储体,亦即有关数据的实际存储方式。 98 | - 外层:最接近用户,即有关个别用户观看数据的方式。 99 | - 概念层:介于两者之间的间接层。 100 | 101 | ### 数据库索引 102 | 103 | 数据索引的观念由来已久,像是一本书前面几页都有目录,目录也算是索引的一种,只是它的分类较广,例如车牌、身份证字号、条码等,都是一个索引的号码,当我们看到号码时,可以从号码中看出其中的端倪,若是要找的人、车或物品,也只要提供相关的号码,即可迅速查到正确的人事物。 104 | 105 | ### 数据库操作:事务 106 | 107 | 事务(transaction)是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分区的工作单位。 108 | 109 | ## 数据表 110 | 111 | 关系数据库没有数据表,关键字、主键、索引等也就无从谈起,数据表是关系数据库中一个非常重要的对象,是其它对象的基础,也是一系列二维数组的集合,用来存储、操作数据的逻辑结构。根据信息的分类情况。一个数据库中可能包含若干个数据表,每张表是由行和列组成,记录一条数据数据表就增加一行,每一列是由字段名和字段数据集合组成,列被称之为字段,每一列还有自己的多个属性,例如是否允许为空、默认值、长度、类型、存储编码、注释等 112 | 113 | ![MySQL](../../img/data.jpg) 114 | 115 | **数据类型** 116 | 117 | 在定义数据字段的类型对你的数据库的优化非常重要,数据类型决定了数据在计算机中的存储格式,代表不同的信息类型,大致可以分为:数值、日期/时间和字符串(字符)类型,字符串类型又包括二进制类型。 118 | 119 | 上图中每一列就是一个字段,每个字段都有自己的类型,例如`name`列为字符串类型,`level` 列为数字类型。 120 | 121 | ## 关系键 122 | 123 | _关系键是关系数据库的重要组成部分。关系键是一个表中的一个或几个属性,用来标识该表的每一行或与另一个表产生联系。一列(或一组列),其值能够唯一区分表中每个行。_ 124 | 125 | ### 主键 126 | 127 | 主键(primary key或unique key),又称主码,数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合。一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null)。unique 可空,可以在一个表里的一个或多个字段定义;primary key 不可空不可重复,在一个表里可以定义联合主键;unique索引和primary索引区别: 128 | 129 | 1. primary key = unique + not null 130 | 2. 唯一约束和主键一样都是约束的范畴,而且都可以作为外键的参考,不同的是,一张表只能有一个主键 131 | 3. 主键和唯一约束的创建需要依靠索引,如果在创建主键或唯一约束的时候没有已经建好的索引可以使用的话,Oracle会自动建立一个唯一的索引。 132 | 133 | 表中的任何列都可以作为主键,只要它满足以下条件: 134 | 135 | - unique 就是唯一,当你需要限定你的某个表字段每个值都唯一,没有重复值时使用。 136 | - 任意两行都不具有相同的主键值; 137 | - 每个行都必须具有一个主键值(主键列不允许NULL值)。 138 | 139 | 除MySQL强制实施的规则外,应该坚持的几个普遍认可的最好习惯为: 140 | 141 | - 不更新主键列中的值; 142 | - 不重用主键列的值; 143 | - 不在主键列中使用可能会更改的值。(例如,如果使用一个名字作为主键以标识某个供应商,当该供应商合并和更改其名字时,必须更改这个主键。) 144 | 145 | ### 超键 146 | 147 | 超键(superkey),有的文献称“超码”,是在数据库关系模式设计中能够唯一标示多元组(即“行”)的属性集。包含所有属性的集叫做明显(平凡)超键。 148 | 149 | 超键指的是可以唯一标识一条记录的属性集合,不一定是最小的。超键的属性集合可能还包括其他属性,但是其中必须包含唯一标识记录的属性集合。例如,一个学生信息表中,学号和班级可以作为超键,因为这两个属性集合可以唯一标识一条学生记录,但是其中班级属性可以不包括,仍然是超键。 150 | 151 | ### 候选键 152 | 153 | 在关系模型中,候选键或候选码(candidate key)是某个关系变量的一组属性所组成的集合,它需要同时满足下列两个条件: 154 | 155 | - 这个属性集合始终能够确保在关系中能唯一标识元组 156 | - 在这个属性集合中找不出真子集能够满足条件 157 | 158 | 满足第一个条件的属性集合称为超键,因此我们也可以把候选键定义为“最小超键”,也就是不含有多余属性的超键。 159 | 160 | 候选键指的是可以唯一标识一条记录的最小属性集合(最小超键),即在该关系中,候选键的属性集合不可再被减少,否则将无法保证唯一标识一条记录。例如,一个学生信息表中,可以将学号作为候选键,因为学号可以唯一标识一条学生记录。 161 | 162 | 候选键的重要性是它们能够在关系中唯一标识出不同的元组,因此超键也是在设计数据库模式时需要指定的最重要的约束之一。由于在关系模型中,每个关系都是一个集合(没有重复的元素),所以每个关系都至少有一个候选键(因为所有属性组合必然是个超键)。但是在某些关系型数据库中表也能代表多重集,所以在每个关系中都显式地定义至少一个候选键是一条很重要的设计原则。数据库管理系统通常都需要将每个关系中的某个候选键定义为主键,亦即这个候选键是区分不同元组时首选的识别方式,例如外键通常就是引用主键而非其他候选键。 163 | 164 | ### 外键 165 | 166 | 外键(foreign key,台湾译作外来键),又称外部键。其实在关系数据库中,每个数据表都是由关系来连系彼此的关系,父数据表(Parent Entity)的主键(primary key)会放在另一个数据表,当做属性以创建彼此的关系,而这个属性就是外键。 167 | 168 | 比如,学生跟老师之间是教学的关系,学生数据表会有个属性叫指导老师(FK),而这个值就是对应到老师数据表的老师代号(PK),学生的指导老师就是外键。 169 | 170 | ### 代理键 171 | 172 | 在关系型数据库设计中,代理键是在当数据表中的候选键都不适合当主键时,例如数据太长,或是意义层面太多,就会请一个无意义的但唯一的字段来代为作主键。 173 | 174 | 代理键是: 175 | 176 | - Surrogate (1) – Hall, Owlett and Codd (1976) 177 | 一个代理键值确定了外部世界的一个实体。代理键值是数据库生成的,从来不显示给用户或应用程序看。 178 | - Surrogate (2) – Wieringa and De Jonge (1991) 179 | 一个代理键值确定了数据库中的一个对象。代理键值是数据库生成的,用户或应用程序看不到它。 180 | 181 | 在实践中,代理键值通常是个自动递增的数字。在Sybase或SQL Server,用identity column标识代理键,PostgreSQL里用serial,Oracle里用SEQUENCE,在MySQL里用一个标记有AUTO_INCREMENT的字段。 182 | 183 | ### 自然键 184 | 185 | 自然键与代理键相反,它是在自然生活中唯一确定一个事物的标识。身份证号就是一个自然键,用于确定一个人。 186 | 187 | 188 | 189 | -------------------------------------------------------------------------------- /docs/chapter1/1.2.md: -------------------------------------------------------------------------------- 1 | 2 | 数据库技术构成 3 | === 4 | 5 | 数据库技术的出现是为了更加有效的管理和存取大量的数据资源。简单的来讲,数据库技术主要包括数据库系统,SQL语言,数据库访问技术。 6 | 7 | ## 数据库系统 8 | 9 | 数据库系统有3个主要的组成部分。 10 | 11 | ### 数据库 12 | 13 | _数据库(Database System):用于存储数据的地方。_ 14 | 15 | ### 数据库管理系统 16 | 17 | _数据库管理系统(Database Management System,DBMS):用户管理数据库的软件。_ 18 | 19 | ### 数据库应用程序 20 | 21 | _数据库应用程序(Database Application):为了提高数据库系统的处理能力所使用的管理数据库的软件补充。_ 22 | 23 | 24 | ## SQL语言 25 | 26 | SQL,(Structured Query Language)即结构化查询语言,数据库管理系统专门通过SQL语言来管理数据库中的数据,与数据库通信。 27 | 28 | ### SQL的优点: 29 | 30 | - SQL不是某个特定数据库供应商专有的语言。几乎所有重要的DBMS都支持SQL,所以,学习此语言使你几乎能与所有数据库打交道。 31 | - SQL简单易学。它的语句全都是由描述性很强的英语单词组成,而且这些单词的数目不多。 32 | - SQL尽管看上去很简单,但它实际上是一种强有力的语言,灵活使用其语言元素,可以进行非常复杂和高级的数据库操作。 33 | 34 | > **DBMS专用的SQL**:SQL不是一种专利语言,而且存在一个标准委员会,他们试图定义可供所有DBMS使用的SQL语法,但事实上任意两个DBMS实现的SQL都不完全相同。本书讲授的SQL是专门针对MySQL的,虽然书中所讲授的多数语法也适用于其他DBMS,但不要认为这些SQL语法是完全可移植的。 35 | 36 | ### SQL为数据库管理系统提供的功能 37 | 38 | SQL语言是一种数据库查询和程序设计语言,其主要用于存取数据、查询数据、更新数据和管理数据库系统。具体的,SQL分为4个部分,这里只是大概整理一下,详细的后面我会在SQL相关中仔细整理。 39 | 40 | - 数据定义语言(Data Definition Language,DDL):DROP、CREATE、ALTER等语句;数据库定义语言。主要用于定义数据库、表、视图、索引和触发器等。CREATE语句主要用于创建数据库、创建表、创建视图。ALTER语句主要用于修改表的定义,修改视图的定义。DROP语句主要用于删除数据库、删除表和删除视图等。 41 | 42 | - 数据操作语言(Data Manipulation Language,DML):INSERT、UPDATE、DELETE语句;数据库操作语言。主要用于插入数据,更新数据,删除数据。INSERT语句用于插入数据,UPDATE语句用于更新数据,DELETE语句用于删除数据。 43 | 44 | - 数据查询语言(Data Query Language,DQL):SELECT语句。主要用于查询数据。 45 | 46 | - 数据控制语言(Data Control Language,DCL):数据库控制语言。主要用于控制用户的访问权限。其中GRANT语句用于给用户增加权限,REVOKE语句用于收回用户的权限。 47 | 48 | 数据库管理系统通过这些SQL语句可以操作数据库中的数据,在应用程序中,也可以通过SQL语句来操作数据。来几个 SQL 语句的例子,这条语句声明创建一个叫 user 的表: 49 | 50 | ```sql 51 | CREATE TABLE `user` ( 52 | `id` int(100) unsigned NOT NULL AUTO_INCREMENT, 53 | `name` varchar(32) NOT NULL DEFAULT '' COMMENT '姓名', 54 | `sex` tinyint(32) NOT NULL DEFAULT 0 COMMENT '性别:0,保密;1,男;2,女', 55 | `mobile` varchar(20) NOT NULL DEFAULT '' COMMENT '手机', 56 | PRIMARY KEY (`id`) 57 | ); 58 | ``` 59 | 60 | 这张表包含 4 个字段,分别为 id、name、sex、mobile,其中 id 定义为表的主键,并且只能为正数的自增长字段。并且字段 sex 有默认值 0,每个 COMMENT 后面均为字段注释。 61 | 62 | 表定义好了,我们可以向这张表插入数据,下面这条语句是在 user 表中插入一条数据记录: 63 | 64 | ```sql 65 | INSERT INTO `user` SET name="张三",sex=1,mobile=13811772277; 66 | INSERT INTO `user` VALUES (18,'王小二',0,12322224); 67 | ``` 68 | 69 | 上面两条语句执行完之后,user 表中就会相对应增加一行新记录,第一条该记录中 id 是自增长的,部分字段有初始默认值,所以只需插入部分值也是可以插入成功的。第二条是必须按顺序填写对应的值,表中的id 字段比较特殊,所以插入 id 值的时候必须比表中最后一条数据的 id 值大,否则会报错。 70 | 71 | 插入数据之后我们再使用 SELECT 查询语句获取刚才插入的数据,如下: 72 | 73 | ```sql 74 | mysql> SELECT * FROM `user`; 75 | 76 | -- +----+-----------+-----+-------------+ 77 | -- | id | name | sex | mobile | 78 | -- +----+-----------+-----+-------------+ 79 | -- | 1 | 张三 | 1 | 13811772277 | 80 | -- | 19 | 王小二 | 0 | 12322224 | 81 | -- +----+-----------+-----+-------------+ 82 | ``` 83 | 84 | 上面几条 SQL 语句的例子,大家看了之后会有一个印象,知道 SQL 语句语法是什么样子,后面有大量的 SQL 语句知识帮助你学习 SQL 语法,玩好 MySQL。 85 | 86 | 87 | ## 数据库访问技术 88 | 89 | 这个`数据库访问技术` 小弟认为这个是一个学术性的研究词汇,我在维基百科各种百科对这个词汇要么没有,要么就一句话解释,不知道谁想出的这个词汇,在下甚是佩服,初步了解到这个是个什么技术呢? 90 | 91 | 不同的程序设计语言会有各自不同的数据库访问方法,这个访问方法称之为一种技术,程序语言通过这些技术,执行 SQL 语句,进行数据库的管理。下面搜集了一些主要的数据库访问技术 92 | 93 | ### ODBC 94 | 95 | Open Database Connectivity(ODBC,开放数据库互连),提供了一种标准的API(应用程序编程接口)方法来访问数据库管理系统(DBMS)。这些API利用SQL来完成其大部分任务。ODBC本身也提供了对SQL语言的支持,用户可以直接将SQL语句送给ODBC。ODBC的设计者们努力使它具有最大的独立性和开放性:与具体的编程语言无关,与具体的数据库系统无关,与具体的操作系统无关。 96 | 97 | ### ADO 98 | 99 | 微软公司的 ActiveX Data Objects(ADO)是一个用于访问数据源的COM组件,作为高层的编程界面层。ADO是在OLE DB之上,包含了很多层次化的COM对象与集合(Collections,也是一类对象,在其里面包含了其他层级对象)。允许开发人员编写访问数据的代码而不用关心数据源是如何实现与访问驱动的,而只用关心到数据库的连接。访问数据库的时候,关于SQL的知识不是必要的,但是特定数据库支持的SQL命令仍可以通过ADO中的命令对象(Command)来执行。 100 | 101 | ### MDAC 102 | 103 | Microsoft Data Access Components(MDAC)是微软专门为数据访问功能而发展的应用程序开发接口,做为微软的统一化数据访问(Universal Data Access; UDA)解决方案的核心组成,最初的版本在1996年8月发表。目前其组成组件有ODBC,OLE DB以及ADO,其中ADO是在Visual Basic上唯一的数据访问管道,而OLE DB则是基于COM之上,供C/C++访问与提供数据的接口,ODBC则是统一化的数据访问API。 104 | 105 | ### JDBC 106 | 107 | Java Database Connectivity(JDBC,Java数据库连接)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标。JDBC是面向关系型数据库的。 108 | -------------------------------------------------------------------------------- /docs/chapter1/1.3.md: -------------------------------------------------------------------------------- 1 | 2 | 什么是MySQL 3 | === 4 | 5 | MySQL(官方发音为英语发音:`/maɪ ˌɛskjuːˈɛl/` `My S-Q-L`,但也经常读作英语发音:`/maɪ ˈsiːkwəl/` `My Sequel`)原本是一个开放源代码的关系数据库管理系统(DBMS),原开发者为瑞典的`MySQL AB`公司,该公司于2008年被昇阳微系统(Sun Microsystems)收购。2009年,甲骨文公司(Oracle)收购昇阳微系统公司,MySQL成为Oracle旗下产品。在本教程中,会让大家快速掌握MySQL的基本知识,并轻松使用MySQL数据库。 6 | 7 | ### MySQL 介绍 8 | 9 | MySQL在过去由于性能高、成本低、可靠性好,已经成为最流行的开源数据库,因此被广泛地应用在Internet上的中小型网站中,是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。随着MySQL的不断成熟,它也逐渐用于更多大规模网站和应用,比如维基百科、Google和Facebook等网站。 10 | 11 | 但被甲骨文公司收购后,Oracle大幅调涨MySQL商业版的售价,且甲骨文公司不再支持另一个自由软件项目OpenSolaris的发展,因此导致自由软件社区们对于Oracle是否还会持续支持MySQL社区版(MySQL之中唯一的免费版本)有所隐忧,因此原先一些使用MySQL的开源软件逐渐转向其它的数据库。例如维基百科已于2013年正式宣布将从MySQL迁移到`MariaDB`数据库。MySQL的创始人麦克尔·维德纽斯以MySQL为基础,成立分支计划[MariaDB](https://github.com/MariaDB/server)。 12 | 13 | ### MySQL 发展历史 14 | 15 | 很多人以为MySQL是最近15年内才出现的数据库,其实MySQL数据库的历史可以追溯到1979年,那时 Bill Gates 退学没多久,微软公司也才刚刚起步,而Larry的Oracle公司也才成立不久。那时有一个天才程序员 Monty Widenius 用 BASIC 设计了一个报表工具,过了不久,又将此工具使用 C 语言重写,移植到 UNIX 平台,当时只是一个底层的面向报表存储引擎名叫Unireg。 16 | 17 | - 1985年,瑞典的几位志同道合小伙子(David Axmark、Allan Larsson 和Monty Widenius) 成立了一家公司,这就是MySQL AB 的前身。 18 | - 1990年,TcX公司的客户中开始有人要求为他的API提供SQL支持。当时有人提议直接使用商用数据库,但是Monty觉得商用数据库的速度难以令人满意。于是,他直接借助于mSQL的代码,将它集成到自己的存储引擎中。令人失望的是,效果并不太令人满意,于是,Monty雄心大起,决心自己重写一个SQL支持。 19 | - 1996年,MySQL 1.0发布,它只面向一小拨人,相当于内部发布。 20 | - 1996年10月,MySQL 3.11.1发布(MySQL没有2.x版本),最开始只提供Solaris下的二进制版本。一个月后,Linux版本出现了。 21 | - 1999~2000年,MySQL AB公司在瑞典成立。Monty雇了几个人与Sleepycat合作,开发出了Berkeley DB引擎,因为BDB支持事务处理,所以MySQL从此开始支持事务处理了。 22 | - 2003年12月,MySQL 5.0版本发布,提供了视图、存储过程等功能。 23 | - 2008年1月16日,Sun(太阳微系统)正式收购MySQL。 24 | - 2009年4月20日,甲骨文公司宣布以每股9.50美元,74亿美元的总额收购Sun电脑公司。 25 | - 2010年12月,MySQL 5.5发布,其主要新特性包括半同步的复制及对SIGNAL/RESIGNAL的异常处理功能的支持,最重要的是InnoDB存储引擎终于变为当前MySQL的默认存储引擎。 26 | - 2013年6月18日,甲骨文公司修改MySQL授权协议,移除了GPL。但随后有消息称这是一个bug。 27 | 28 | 29 | ### MySQL 版本 30 | 31 | `MySQL`针对不同的用户,分了`社区版`和`企业服务器版`,还提供一些其它版本,是属于`MySQL`相关工具。 32 | 33 | 1. MySQL Community Server 社区版本,开源免费,但不提供官方技术支持。 34 | 2. MySQL Enterprise Edition 企业版本,需付费,可以试用30天。 35 | 3. MySQL Cluster 集群版,开源免费。可将几个MySQL Server封装成一个Server。 36 | 4. MySQL Cluster CGE 高级集群版,需付费。 37 | 5. MySQL Workbench(GUI TOOL)一款专为MySQL设计的ER/数据库建模工具。 38 | 39 | > MySQL Workbench是著名的数据库设计工具DBDesigner4的继任者。MySQL Workbench又分为两个版本,分别是社区版(MySQL Workbench OSS)、商用版(MySQL Workbench SE)。 40 | 41 | MySQL 版本命命机制由三个数字组成,例如`mysql-5.6.33-osx10.11-x86_64.tar.gz` 42 | 43 | - 第一个数字(5)主版本号:当你做了不兼容的 API 修改, 44 | - 第二个数字(7)次版本号:当你做了向下兼容的功能性新增,合计,主要和次要的数字构成发布系列号。该系列号描述了稳定的特征集。 45 | - 第三个数字(1)修订号:当你做了向下兼容的问题修正。这是一个新的bugfix释放增加。在大多数情况下,在一系列最新版本是最好的选择。 46 | 47 | > Github 上面有[语义化版本标准](http://semver.org/lang/zh-CN/), 开源仓库[mojombo/semver](https://github.com/mojombo/semver),上面的版本命名大致是跟语义化版本标准差不多,你可以看语义化版本标准来学习版本名机制。通过语义化版本标准来理解MySQL版本命命机制。 48 | 49 | ### MySQL 的优势 50 | 51 | - 使用C和C++编写,并使用了多种编译器进行测试,保证源代码的可移植性。 52 | - 支持AIX、BSDi、FreeBSD、HP-UX、Linux、Mac OS、Novell NetWare、NetBSD、OpenBSD、OS/2 Wrap、Solaris、Windows等多种操作系统。 53 | - 为多种编程语言提供了API。这些编程语言包括C、C++、C#、VB.NET、Delphi、Eiffel、Java、Perl、PHP、Python、Ruby和Tcl等。 54 | - 支持多线程,充分利用CPU资源,支持多用户。 55 | - 优化的SQL查询算法,有效地提高查询速度。 56 | - 既能够作为一个单独的应用程序在客户端服务器网络环境中运行,也能够作为一个程序库而嵌入到其他的软件中。 57 | - 提供多语言支持,常见的编码如中文的GB 2312、BIG5、日文的Shift JIS等都可以用作数据表名和数据列名。 58 | - 提供TCP/IP、ODBC和JDBC等多种数据库连接途径。 59 | - 提供用于管理、检查、优化数据库操作的管理工具。 60 | - 可以处理拥有上千万条记录的大型数据库。 61 | -------------------------------------------------------------------------------- /docs/chapter1/1.4.md: -------------------------------------------------------------------------------- 1 | 2 | 如何学习MySQL 3 | === 4 | 5 | 如何学习 MySQL 这是一个伪命题,每个人都有适合自己的一套学习方法,各不相同,所以如何学习 MySQL 这个活儿,我没有办法告诉你,我的这个学习方法就是你最好的学习方法,所以在学习 MySQL 数据库之前,需要找准自己学习 MySQL 最舒服的姿势。 6 | 7 | 我来分享一下我的学习方法,你可以做个参考,只能做个参考,因为我零基础,非计算机专业,没有这方面的使用场景和工作经验(从前是做设计后面转前端再到后端),套路相当深吧。说到这里很多新手兴奋了,因为他在想这孙子比我差呢,我还他妈计算机专业毕业的呢,我学肯定更快入手。恭喜你!您这么想就对了,因为的确如此,我是大约,一天就在项目中应用 MySQL 数据库,并且第二天就做出不错的功能了。 8 | 9 | ### 培养兴趣和动力 10 | 11 | 首先得培养兴趣爱好,不论学什么技术和什么知识点,兴趣是可以极大的提高学习效率和提供持久的战斗力。当然还有一种兴趣是被逼出来的,比如我现在为何使用 MySQL? 我是被项目进度,老板要求,朋友推荐,这才是我使用学习MySQL的兴趣点之一。再比如,写这个书也是有姑娘嫌弃我读书少(其实我估计人家嫌弃我学历,论读书指不定我读书比她多呢,虽然我只喜欢读计算机类别的书,那也是书吧,嘿嘿),刚好赶上我这个学习 MySQL 的机会,我想表现一下,这个是我写此书的动力及兴趣之一。 12 | 13 | ### 了解基础知识 14 | 15 | 我在计算机领域经常被人鄙视,经常有科班出身的人告诉我,“你得学计算机技术,计算机领域的技术非常强调基础,回去大学混两年”,这话你听听就可以了,首先你是个新人,其次,你要搞定多少并发、访问、IO,你现在还没有机会,有的人一辈子没有这个机会应用高级MySQL技术,当然我希望你去争取这样的机会。并不是没有这个机会就不去深入 MySQL 技术应用。如果你想在 MySQL 技术的道路上走的更快、更远,你不光计算机基础要夯实,还要玩儿好 SQL 语句。 16 | 17 | ### 利用好工具 18 | 19 | 我在学习绘画的时候,老师第一天就告诉你要买绘画笔、水粉、纸、画板、支架子,让你有一个正确的绘画姿势。其实就是准备工具,所以学习前不光要安装好环境,还得安装好工具,推荐使用前一章节推荐的命令行工具 MyCli 配合GUI来操作数据,利用这些工具的特点来掌握SQL语句,操控数据。除了这些软件工具之外还要正确、有效地利用搜索引擎这个牛逼,刚开始使用百毒,后面使用谷歌(如果你有翻墙能力可以一开始使用Google),你可通过搜索引起搜到很多相关的知识点。 20 | 21 | ### 掌握SQL语句 22 | 23 | 在学习绘画准备完工具之后,绘画老师就让我们开始对着一本基础的绘画书,临摹基本的笔法各种绘画线条,临摹石膏几何体,这样就能快速的掌握感觉。这个过程其实就是掌握好SQL语句基础,为啥 MySQL 首先要掌握好SQL语句,如果你作为一个程序员,在应用中读取数据都是通过 SQL语句来完成的。如果你是一个数据库管理员(DBA)那就更不用说了,靠GUI来混饭吃,我还头一次听说有这样的DBA,作为DBA你还有帮助检查SQL语句的职责。这样看来,掌握SQL语句义不容辞,也是你使用MySQL走得更远的必经之路啊伙计。 24 | 25 | ### 多动手实践操作 26 | 27 | 我个人最不喜欢“纸上谈兵派”,在我学习后端PHP和Node的时候,动不动就让我看个算法,看个计算机基础,我只是写个应用而已,我肩负出活儿的使命,我的宗旨动手实践操作,对于数据库来说它的操作性特别强,如果你不动手操作,在实际应用过程中很难发现问题。你在实际操作中发现问题,并通过各种方法解决问题,这样才能提高实战应用操作能力。在你实战操作的过程中顺带补充基础知识。 28 | 29 | ### 记录笔记 30 | 31 | 你有了上面快速敏捷的学习能力,你还得附带一个技能,才能更好、更快的入门MySQL数据库。这个技能就是做笔记,做笔记在我这里起到三个作用:第一,避免遗忘知识点。知识点太多,知识点偏冷,不常用也容易忘记,[《21分钟入门MySQL》](../21-minutes-MySQL-basic-entry.md)其实就是我做的笔记;第二,知识点分阶段吃透。当你理解的知识点越来越多的时候,还有一些一知半解的知识点,你都需要做一些笔记,记录之后找个时间点好好把这些一知半解的知识点吃透,在每个阶段去看你的笔记你会有一些不同的理解。第三,总结沉淀,当你入门之后总结沉淀很重要,一次总结沉淀很有可能在某个技术上你直接上升一个台阶。 32 | 33 | ### 高级进阶 34 | 35 | 这里是入门,高级进阶暂时没有,😄。 -------------------------------------------------------------------------------- /docs/chapter1/1.md: -------------------------------------------------------------------------------- 1 | 2 | 初识MySQL 3 | === 4 | 5 | -------------------------------------------------------------------------------- /docs/chapter17/17.1.md: -------------------------------------------------------------------------------- 1 | 2 | 让MySQL支持emoji图标存储 3 | === 4 | 5 | 在`MySLQ`中 UPDATA 和 INSERT 数据的时候,如果数据上面带有`emoji`图标,例如:`💗`、`👽`、`💔`很容易更新或者插入不成功,导致报错。 6 | 7 | ```sql 8 | Error: ER_TRUNCATED_WRONG_VALUE_FOR_FIELD: 9 | Incorrect string value: '\xF0\x9F\x91\xBD\xF0\x9F...' for column 'name' at row 10 | ``` 11 | 12 | 都快崩溃了,但是还好终于解决了这种鬼问题。资料显示原因是,MYSQL 5.5 之前, UTF8 编码只支持1-3个字节,只支持[BMP](http://en.wikipedia.org/wiki/Mapping_of_Unicode_characters)这部分的unicode编码区,而 emoji 图标恰好是4个字节的编码进行存储。从MYSQL5.5开始,可支持4个字节UTF编码 utf8mb4 ,一个字符最多能有4字节,所以能支持更多的字符集。所以要解决问题,必需把数据库表字符编码全部改成 utf8mb4 。 13 | 14 | ### 常用字符集 15 | 16 | - ASCII:美国信息互换标准编码;英语和其他西欧语言;单字节编码,7位表示一个字符,共128字符。 17 | - GBK:双字节,汉字内码扩展规范;中日韩汉字、英文、数字;双字节编码;共收录了21003个汉字,GB2312的扩展。 18 | - UTF-8:Unicode标准的可变长度字符编码;Unicode标准(统一码),业界统一标准,包括世界上数十种文字的系统; 19 | - UTF-8:使用一至三个字节为每个字符编码。 20 | - utf8mb4:存储四个字节,应用场景用于存储`emoji`表情,因为可以`emoji`表情四个字节。 21 | - utf8mb4:MySQL版本 > 5.5.3 。 22 | - 其他常见字符集:`UTF-32`,`UTF-16`,`Big5`,`latin1` 23 | - 数据库中的字符集包含两层含义 24 | - 各种文字和符号的集合,包括各国家文字、标点符号、图形符号、数字等。 25 | - 字符的编码方式,即二进制数据与字符的映射规则。 26 | 27 | ### 确认版本 28 | 29 | ```bash 30 | mysql --version 31 | ``` 32 | 33 | ### 系统环境 34 | 35 | - MySQL 5.7.14 36 | - Mac OSX 10.11.6 37 | 38 | 39 | ### 首先备份 40 | 41 | 升级数据之前备份您服务器上的所有数据,保持良好习惯,安全第一! 42 | 43 | ### 升级您的MySQL 44 | 45 | 新的数据库可以在这里下载[Upgrade the MySQL server to v5.5.3+](https://dev.mysql.com/downloads/mysql/)。 46 | 47 | ### 修改您的数据库、表、字段 48 | 49 | ```bash 50 | # 对每一个数据库: 51 | ALTER DATABASE 这里数据库名字 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; 52 | # 对每一个表: 53 | ALTER TABLE 这里是表名字 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 54 | # 对每一个字段: 55 | ALTER TABLE 这里是表名字 CHANGE 字段名字 重复字段名字 VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 56 | # 上面一句或者使用modify来更改 57 | ALTER TABLE 这里是表名字 modify 字段名字 VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT ''; 58 | ``` 59 | utf8mb4完全向后兼容utf8,无乱码或其他数据丢失的形式出现。理论上是可以放心修改,如果您不放心修改,您可以拿备份恢复数据,然后让程序员处理这种兼容`emoji`存储问题,存的时候过滤一遍转成`base64`,然后取的时候转回来?... 还是修改数据库比较方便。 60 | 61 | ### 检查你的字段和索引 62 | 63 | 不要将所有的都设置成`utf8mb4`,这个冒得必要。我只在我某些字段类型为`VARCHAR`的时候才设置成`utf8mb4`。 64 | 65 | ### 修改MySQL配置文件 66 | 67 | 这个地方最坑,我在我Mac osx 系统上找不到`/etc/my.cnf` 它根本不存在,所以我们需要创建这样一个文件并修改它。 68 | 69 | ```bash 70 | # 进入这个目录, 71 | # 在这个目录下面有个后缀为`.cnf`的文件 72 | cd /usr/local/mysql/support-files/ 73 | 74 | # 将这个文件复制到`etc`目录中并将名字命名为`my.cnf` 75 | sudo cp my-default.cnf /etc/my.cnf 76 | 77 | # 然后编辑`my.cnf`文件,将下面内容复制到里面。 78 | sudo vim /etc/my.cnf 79 | ``` 80 | 81 | [MySQL configuration file (/etc/my.cnf):](https://dev.mysql.com/doc/refman/5.5/en/option-files.html) 82 | 83 | 84 | ```bash 85 | [client] 86 | default-character-set = utf8mb4 87 | 88 | [mysql] 89 | default-character-set = utf8mb4 90 | 91 | [mysqld] 92 | character-set-client-handshake = FALSE 93 | character-set-server = utf8mb4 94 | collation-server = utf8mb4_unicode_ci 95 | ``` 96 | 97 | ### 重启MySQL 98 | 99 | 重启步骤很重要,不然没有任何效果。下面是 Mac 系统下服务管理: 100 | 101 | 1. 启动:`sudo /usr/local/mysql/support-files/mysql.server start` 102 | 2. 停止:`sudo /usr/local/mysql/support-files/mysql.server stop` 103 | 3. 重启:`sudo /usr/local/mysql/support-files/mysql.server restart` 104 | 105 | 其实可以使用 `mysql.server start` 简单的方式启动服务。 106 | 107 | **Linux系统中可以以这种形式重启、停止或启动** 108 | 109 | ```bash 110 | service mysqld stop 111 | service mysqld start 112 | service mysqld restart 113 | ``` 114 | 115 | 116 | ### 查看是否设置成功 117 | 118 | 通过下面命令查询是否设置成功! 119 | 120 | ```bash 121 | # 登陆MySQL进行查询 122 | mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%'; 123 | 124 | # 运行上面代码显示下面结果 125 | # +--------------------------+--------------------+ 126 | # | Variable_name | Value | 127 | # +--------------------------+--------------------+ 128 | # | character_set_client | utf8mb4 | 129 | # | character_set_connection | utf8mb4 | 130 | # | character_set_database | utf8mb4 | 131 | # | character_set_filesystem | binary | 132 | # | character_set_results | utf8mb4 | 133 | # | character_set_server | utf8mb4 | 134 | # | character_set_system | utf8 | 135 | # | collation_connection | utf8mb4_unicode_ci | 136 | # | collation_database | utf8mb4_unicode_ci | 137 | # | collation_server | utf8mb4_unicode_ci | 138 | # +--------------------------+--------------------+ 139 | 140 | # 查看表的情况 141 | mysql> SHOW FULL COLUMNS FROM users_profile; 142 | ``` 143 | 144 | 到这一步表示你成功了!恭喜你!~ 145 | 146 | ### 修复和优化表 147 | 148 | 我跑到这一步其实没有任何必要修复和优化表,为了保险起见,我还是运行了这两条命令,虽然不知道它有什么卵用,放在这里做个笔记吧。 149 | 150 | ```bash 151 | REPAIR TABLE 表名字; 152 | OPTIMIZE TABLE 表名字; 153 | ``` 154 | 155 | ## 参考资料 156 | 157 | - [How to support full Unicode in MySQL databases](https://mathiasbynens.be/notes/mysql-utf8mb4#character-sets) 158 | - [my.cnf file does not exist on Mac OSX](http://forums.mysql.com/read.php?11,366143,376017#msg-376017) -------------------------------------------------------------------------------- /docs/chapter17/17.2.md: -------------------------------------------------------------------------------- 1 | 2 | Centos6下升级MySQL数据库 3 | === 4 | 5 | ### 备份数据 6 | 7 | ```bash 8 | $ mysqldump -u xxx -h xxx -P 3306 -p --all-databases > databases.sql 9 | ``` 10 | 11 | ### 查看版本 12 | 13 | ```bash 14 | rpm -qa | grep mysql 15 | ``` 16 | 17 | ### 文件和配置文件备份 18 | 19 | ```bash 20 | cp -R /data/mysql mysql-5.1-data 21 | cp /etc/my.cnf my.cnf-5.1 22 | ``` 23 | 24 | ### 停止服务 25 | 26 | ```bash 27 | service mysqld stop 28 | ``` 29 | 30 | ### 方法一 31 | 32 | 此方法下,我并未删除老的`MySQL`,然而我升级成功!不知有什么后遗症没有。 33 | 34 | ```bash 35 | wget http://dev.mysql.com/get/mysql57-community-release-el6-8.noarch.rpm 36 | yum localinstall mysql57-community-release-el6-8.noarch.rpm 37 | yum install mysql-server 38 | mysqld --initialize --user=mysql 39 | # 找到密码 vi /var/log/mysqld.log 40 | # 修改密码 mysqladmin -uroot -p password 41 | # 采用拷贝粘贴,输入旧密码,设定新密码 42 | chkconfig mysqld on 43 | # 重启 44 | reboot 45 | ``` 46 | 47 | 48 | ### 方法二 49 | 50 | ```bash 51 | # 卸载旧版本的Mysql 52 | yum remove mysql mysql-* 53 | 54 | # 执行之后再看看是不是残余一些mysql-libs之类的 55 | # 查看是否有残余 56 | yum list installed | grep mysql 57 | 58 | # 如果有,并确认没用之后也可以删除。 59 | yum remove mysql-libs 60 | 61 | # 安装 这个要更新源的前提 62 | yum install mysql-server 63 | ``` 64 | 65 | 66 | 67 | ### 启动 68 | 69 | ```bash 70 | service mysqld start 71 | ``` -------------------------------------------------------------------------------- /docs/chapter17/17.3.md: -------------------------------------------------------------------------------- 1 | MySQL修改密码 2 | === 3 | 4 | ## mysqld_safe不存在修改密码 5 | 6 | 1. 停止 MySQL: 7 | 8 | ```bash 9 | systemctl stop mysqld 10 | ``` 11 | 12 | 2. 设置MySQL环境选项 13 | 14 | ```bash 15 | systemctl set-environment MYSQLD_OPTS="--skip-grant-tables" 16 | ``` 17 | 18 | 3. 使用您刚才设置的选项启动MySQL 19 | 20 | ```bash 21 | systemctl start mysqld 22 | ``` 23 | 24 | 4. 以root身份登录 25 | 26 | ```bash 27 | mysql -u root 28 | ``` 29 | 30 | 5. 使用这些MySQL命令更新root用户密码 31 | 32 | ```bash 33 | mysql> UPDATE mysql.user SET authentication_string = PASSWORD('MyNewPassword') 34 | -> WHERE User = 'root' AND Host = 'localhost'; 35 | mysql> FLUSH PRIVILEGES; 36 | mysql> quit 37 | ``` 38 | 39 | 6. 停止mysql 40 | 41 | ```bash 42 | systemctl stop mysqld 43 | ``` 44 | 45 | 7. 取消设置MySQL环境选项,以便下次启动 46 | 47 | ```bash 48 | systemctl unset-environment MYSQLD_OPTS 49 | ``` 50 | 51 | 8. 正常启动MySQL: 52 | 53 | ```bash 54 | systemctl start mysqld 55 | ``` 56 | 57 | 9. 尝试使用您的新密码登录: 58 | 59 | ```bash 60 | mysql -u root -p 61 | ``` 62 | 63 | ## 启动修改丢失的mysql单实例root密码方法 64 | 65 | 1. 首先停止mysql 66 | 67 | ```bash 68 | sudo /etc/init.d/mysql stop 69 | 70 | # 或者下面 71 | sudo /usr/local/mysql/bin/mysql stop 72 | 73 | # 或者 74 | service mysqld stop 75 | ``` 76 | 77 | 2. 使用--skip-grant-tables启动mysql,忽略授权登录验证,服务不要停止,新开窗口做接下来的操作。 78 | 79 | ```bash 80 | sudo mysqld_safe --skip-grant-tables --user=mysql # 提示:在启动时加--skip-grant-tables 参数,表示忽略授权验证 81 | # 或者下面 82 | sudo /usr/local/mysql/bin/mysqld_safe --skip-grant-tables --user=mysql 83 | ``` 84 | 85 | 3. 进入数据库系统 86 | 87 | ```bash 88 | # 在终端中运行 89 | mysql 90 | ``` 91 | 92 | 4. 修改mysqlroot密码:update 93 | 94 | ```bash 95 | # 终端进入MySQL数据中运行 96 | mysql> update mysql.user set password=password("123456") where user='root' and host='localhost'; 97 | mysql> flush privileges; 98 | 99 | # 终端中运行 100 | mysqladmin -uroot -p123456 shutdown 101 | ``` 102 | 103 | 5. 重新启动mysql 104 | 105 | ```bash 106 | # 终端中运行 107 | /etc/init.d/mysql start 108 | mysql -uroot -p123456 109 | ``` 110 | 111 | 112 | ## Mac下重置MySQL的root密码 113 | 114 | 以前的老版本root的默认密码为空,Mysql 5.6及以后版本出处于安全考虑,root密码已经不为空了。 115 | 116 | ```bash 117 | # 表示没有生成root的临时密码 118 | ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) 119 | 120 | # 表示生成了root的临时密码 121 | ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 122 | ``` 123 | 124 | 使用 `mysql -uroot -p` 登录进去。 125 | 126 | 1、停止 mysql server 127 | 128 | 在 Mac 中可以使用GUI停止 MySQL 服务,步骤:`系统偏好设置` > `MySQL` > `Stop MySQL Server`。您也可以使用命令行来停止服务,命令如下: 129 | 130 | ```bash 131 | # Mac OS 里面可以这种方式 132 | sudo /usr/local/mysql/support-files/mysql.server stop 133 | 134 | # centos 停止mysql数据库 135 | sudo /etc/init.d/mysqld stop 136 | ``` 137 | 138 | 2、终端,输入进入安全模式,运行之后进程保持挂载。 139 | 140 | ```bash 141 | sudo /usr/local/mysql/bin/mysqld_safe --skip-grant-tables 142 | ``` 143 | 144 | 3、新开终端,输入 145 | 146 | 147 | ```bash 148 | sudo /usr/local/mysql/bin/mysql -u root 149 | # 输入 Mac 系统用户密码后, 150 | # 直接敲回车进入 mysql 终端,输入: 151 | mysql> FLUSH PRIVILEGES; 152 | mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass'; 153 | # 输入 \q 退出 mysql 终端 154 | \q 155 | ``` 156 | 157 | 4、重启MySQL. 158 | 159 | ```bash 160 | ps -ef | grep mysql 161 | ``` 162 | 163 | - 通过上面命令查看进程编号。 164 | - 通过`sudo kill 93`杀掉`mysql`进程 165 | - 启动服务`系统偏好设置` > `MySQL` > `Start MySQL Server` 166 | 167 | 命令行中更快捷的重启 168 | 169 | ```bash 170 | sudo /usr/local/mysql/support-files/mysql.server start 171 | ``` 172 | 173 | 174 | ## 不重启mysqld修改密码的方法 175 | 176 | 1、首先得有一个可以拥有修改权限的mysql数据库账号,当前的mysql实例账号(较低权限的账号,比如可以修改test数据库)或者其他相同版本实例的账号。把data/mysql目录下面的user表相关的文件复制到data/test目录下面。 177 | 178 | ``` 179 | [root@localhost mysql]# cp mysql/user.* test/ 180 | [root@localhost mysql]# chown mysql.mysql test/user.* 181 | ``` 182 | 183 | 2、使用另一个较低权限的账号链接数据库,设置test数据库中的user存储的密码数据。 184 | 185 | ``` 186 | [root@localhost mysql]# mysql -utest -p12345 187 | Welcome to the MySQL monitor. Commands end with ; or \g. 188 | Your MySQL connection id is 17 189 | Server version: 5.5.25a-log Source distribution 190 | 191 | Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. 192 | 193 | Oracle is a registered trademark of Oracle Corporation and/or its 194 | affiliates. Other names may be trademarks of their respective 195 | owners. 196 | 197 | Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 198 | 199 | mysql> use test 200 | Reading table information for completion of table and column names 201 | You can turn off this feature to get a quicker startup with -A 202 | 203 | Database changed 204 | mysql> update user set password=password('yayun') where user='root'; 205 | Query OK, 0 rows affected (0.00 sec) 206 | Rows matched: 5 Changed: 0 Warnings: 0 207 | 208 | mysql> 209 | ``` 210 | 211 | 3、把修改后的user.MYD和user.MYI复制到mysql目录下,记得备份之前的文件。 212 | 213 | ```bash 214 | mv mysql/user.MYD mysql/user.MYD.bak 215 | mv mysql/user.MYI mysql/user.MYI.bak 216 | cp test/user.MY* mysql/ 217 | chown mysql.mysql mysql/user.* 218 | ``` 219 | 220 | 4、查找mysql进程号,并且发送SIGHUP信号,重新加载权限表。 221 | 222 | ``` 223 | [root@localhost mysql]# pgrep -n mysql 224 | 2184 225 | [root@localhost mysql]# 226 | [root@localhost mysql]# kill -SIGHUP 2184 227 | ``` 228 | 229 | 5、登陆测试 230 | 231 | ```bash 232 | [root@localhost mysql]# mysql -uroot -pyayun 233 | Welcome to the MySQL monitor. Commands end with ; or \g. 234 | Your MySQL connection id is 20 235 | Server version: 5.5.25a-log Source distribution 236 | 237 | Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. 238 | 239 | Oracle is a registered trademark of Oracle Corporation and/or its 240 | affiliates. Other names may be trademarks of their respective 241 | owners. 242 | 243 | Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 244 | 245 | mysql> 246 | ``` 247 | 248 | ## 官网参考 249 | 250 | - [How to Reset the Root Password](http://dev.mysql.com/doc/refman/5.7/en/resetting-permissions.html) 251 | -------------------------------------------------------------------------------- /docs/chapter2/2.1.md: -------------------------------------------------------------------------------- 1 | 2 | Mac平台下安装与配置MySQL 3 | === 4 | 5 | ## Mac 安装MySQL 6 | 7 | 官网[下载安装包](http://downloads.mysql.com/archives/community/),选择相应的版本和格式,有 .dmg 和 tar压缩包两种。我选择了 Mac OS X 10.11 (x86, 64-bit), DMG Archive 的版本下载,目前网站下载需要你注册登录,这个完全免费注册登录进去,就可以下载了。 8 | 9 | DMG 文件点开默认安装完成之后(新版需要重启操作系统),就可以在系统偏好设置里面看到 MySQL 的偏好设置面板。 10 | 11 | ![MySQL](../../img/2.1_1.jpg) 12 | 13 | ## Mac 卸载MySQL 14 | 15 | 通过下面命令删除干净MySQL,同时在进入 **系统偏好设置** 里面删除 MySQL 的图标的设置项,点击右键会弹出 **移除MySQL偏好设置面板** 16 | 17 | ```bash 18 | sudo rm -rf /usr/local/mysql* 19 | sudo rm -rf /Library/StartupItems/MySQLCOM 20 | sudo rm -rf /Library/PreferencePanes/My* 21 | sudo rm -rf /Library/Receipts/mysql* 22 | sudo rm -rf /Library/Receipts/MySQL* 23 | sudo rm -rf /var/db/receipts/com.mysql.* 24 | vi /Library/Receipts/InstallHistory.plist # 进入搜素 mysql , “shif+:” 输入mysql 25 | 26 | find / -name mysql -print 2> /dev/null 27 | sudo find / | grep -i mysql 28 | ``` 29 | 30 | ## mysql命令不存在 31 | 32 | 有一个设置开机启动的勾选配置和一个服务启动和停止的按钮,管理MySQL服务。在命令行中就可以使用 MySQL 命令,新版 MySQL 如果没有mysql命令,提示 **-bash: mysql: command not found** 命令没有找到,你需要检测服务是否启动。 33 | 34 | ```bash 35 | $ mysql -uroot -p 36 | -bash: mysql: command not found 37 | ``` 38 | 39 | 两种方式可以查看到服务是否启动,进入 **系统偏好设置** 查看服务运行状态。也可通过命令 **ps -ef | grep mysql** 查看服务是否启动,如果有多条记录输出到命令行面板,说明服务启动了。在服务启动中,MySQL 命令找不到,需要配置环境变量。 40 | 41 | 编辑 `.bash_profile` ,如果你命令行安装了 oh-my-zsh 命令行工具,你需配置 `.zshrc` 。 42 | 43 | ```bash 44 | sudo vim ~/.bash_profile 45 | ``` 46 | 47 | 在 .bash_profile 文件中添加下面文本 48 | 49 | ```bash 50 | export PATH=${PATH}:/usr/local/mysql/bin 51 | ``` 52 | 53 | 让 .bash_profile 配置文件立即生效: 54 | 55 | ```bash 56 | source ~/.bash_profile 57 | ``` -------------------------------------------------------------------------------- /docs/chapter2/2.2.md: -------------------------------------------------------------------------------- 1 | 2 | Centos平台安装与卸载MySQL 3 | === 4 | 5 | 这里简单的介绍几种Linux平台(Centos)/Mac安装MySQL,基本上大同小异,通过一些平台的软件管理工具来快速安装MySQL。 6 | 7 | 在 Centos6 中直接使用 yum 命令去安装 mysql,极为简单,接下来介绍在Centos6中 通过 yum工具安装 mysql 的步骤。 8 | 9 | ### 检查是否已安装 10 | 11 | ```bash 12 | # 检查 MySQL 是否已安装 13 | yum list installed | grep mysql 14 | yum list installed mysql* 15 | 16 | # 查看当前 mysql 版本,看是否已安装 17 | mysql --version 18 | rpm -qa | grep mysql 19 | ``` 20 | 21 | ### 更新安装源 22 | 23 | 经过查看你可以开始安装了,直接使用 yum 命令去安装 mysql,按之前可以先看一下源的版本,如果源的版本过低,可以在[这里下载](http://dev.mysql.com/downloads/repo/yum/)开发版新的源,发布吧源[在这里](http://repo.mysql.com/yum/)更新,在安装的过程可以编辑`vim /etc/yum.repos.d/mysql-community.repo`选择发布系列版本,编辑如下,其中参数`enabled`的值为 0 的表示禁用,更改为 1 的时候你就可以默认安装 5.7,否则安装的将是 5.6 版。 24 | 25 | ```bash 26 | # 安装如果上面编辑前没有看到你想要的版本 27 | # 可以更新源 28 | # ===== CentOS6 ===== 29 | # wget http://dev.mysql.com/get/mysql57-community-release-el6-8.noarch.rpm 30 | # ===== CentOS7 ===== 31 | wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm 32 | yum localinstall mysql-community-release-el7-5.noarch.rpm 33 | 34 | # 卸载方法 35 | rpm -e mysql-community-common-5.7.16-1.el6.x86_64 36 | 37 | ``` 38 | 39 | ### 检查是否下载成功 40 | 41 | ```bash 42 | [root@localhost yum.repos.d]# yum repolist enabled | grep "mysql.*-community.*" 43 | mysql-connectors-community/x86_64 MySQL Connectors Community 36 44 | mysql-tools-community/x86_64 MySQL Tools Community 47 45 | mysql56-community/x86_64 MySQL 5.6 Community Server 327 46 | ``` 47 | 48 | ### 查看版本 49 | 50 | 选择要启用 MySQL 版本查看 MySQL 版本,执行 51 | 52 | ```bash 53 | yum repolist all | grep mysql 54 | ``` 55 | 56 | 可以看到 5.5, 5.7 版本是默认禁用的,因为现在最新的稳定版是 5.6 57 | 58 | ```bash 59 | [root@localhost yum.repos.d]# yum repolist all | grep mysql 60 | mysql-connectors-community/x86_64 MySQL Connectors Community enabled: 36 61 | mysql-connectors-community-source MySQL Connectors Community - So disabled 62 | mysql-tools-community/x86_64 MySQL Tools Community enabled: 47 63 | mysql-tools-community-source MySQL Tools Community - Source disabled 64 | mysql55-community/x86_64 MySQL 5.5 Community Server disabled 65 | mysql55-community-source MySQL 5.5 Community Server - So disabled 66 | mysql56-community/x86_64 MySQL 5.6 Community Server enabled: 327 67 | mysql56-community-source MySQL 5.6 Community Server - So disabled 68 | mysql57-community-dmr/x86_64 MySQL 5.7 Community Server Deve disabled 69 | mysql57-community-dmr-source MySQL 5.7 Community Server Deve disabled 70 | ``` 71 | 72 | ### 启动指定版本 73 | 74 | 可以通过类似下面的语句来启动某些版本 75 | 76 | ```bash 77 | yum-config-manager --disable mysql56-community 78 | yum-config-manager --enable mysql57-community-dmr 79 | ``` 80 | 81 | 或者通过修改 `/etc/yum.repos.d/mysql-community.repo` 文件。 82 | 83 | ```bash 84 | # Note: MySQL 5.7 is currently in development. For use at your own risk. 85 | # Please read with sub pages: https://dev.mysql.com/doc/relnotes/mysql/5.7/en/ 86 | [mysql57-community-dmr] 87 | name=MySQL 5.7 Community Server Development Milestone Release 88 | baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/ 89 | enabled=1 90 | gpgcheck=1 91 | gpgkey=file:/etc/pki/rpm-gpg/RPM-GPG-KEY-mysql 92 | ``` 93 | 94 | 其中 `enabled=0` 是指禁用,`enabled=1` 指启用。 95 | 注意: 任何时候,只能启用一个版本。 96 | 97 | 查看当前启用的版本 98 | 99 | ```bash 100 | [root@localhost yum.repos.d]# yum repolist enabled | grep mysql 101 | mysql-connectors-community/x86_64 MySQL Connectors Community 36 102 | mysql-tools-community/x86_64 MySQL Tools Community 47 103 | mysql57-community-dmr/x86_64 MySQL 5.7 Community Server Development 187 104 | ``` 105 | 106 | ### 安装MySQL 107 | 108 | ```bash 109 | yum install mysql-server 110 | 111 | Retrieving key from file:/etc/pki/rpm-gpg/RPM-GPG-KEY-mysql 112 | Importing GPG key 0x5072E1F5: 113 | Userid : "MySQL Release Engineering " 114 | Fingerprint: a4a9 4068 76fc bd3c 4567 70c8 8c71 8d3b 5072 e1f5 115 | Package : mysql-community-release-el7-5.noarch (installed) 116 | From : file:/etc/pki/rpm-gpg/RPM-GPG-KEY-mysql 117 | Is this ok [y/N]: y 118 | 119 | ## 遇到上述提示,输入 y 继续,执行完成会提示“完毕!”。此时MySQL 安装完成,它包含了 mysql-community-server、mysql-community-client、mysql-community-common、mysql-community-libs 四个包。 120 | 121 | ...... 122 | 123 | Installed: 124 | mysql-community-libs.x86_64 0:5.7.18-1.el7 mysql-community-libs-compat.x86_64 0:5.7.18-1.el7 mysql-community-server.x86_64 0:5.7.18-1.el7 125 | 126 | Dependency Installed: 127 | mysql-community-client.x86_64 0:5.7.18-1.el7 mysql-community-common.x86_64 0:5.7.18-1.el7 net-tools.x86_64 0:2.0-0.17.20131004git.el7 128 | 129 | Replaced: 130 | mariadb-libs.x86_64 1:5.5.44-2.el7.centos 131 | ``` 132 | 133 | 执行 134 | 135 | ```bash 136 | rpm -qi mysql-community-server.x86_64 0:5.6.24-3.el7 137 | ``` 138 | 139 | ### 查看安装目录 140 | 141 | ```bash 142 | whereis mysql 143 | 144 | mysql: /usr/bin/mysql /usr/lib64/mysql /usr/share/mysql /usr/share/man/man1/mysql.1.gz 145 | ``` 146 | 147 | 可以看到 MySQL 的安装目录是 /usr/bin/ 148 | 149 | ### MariaDB切换MySQL 150 | 151 | Centos7 上面默认是 MariaDB 不是MySQL了,所以 Centos6 安装会报错。在 Centos7 中,运行下面命令安装就不会有错误了,但是你的数据库被换成了MariaDB,MariaDB登录链接SQL语句等几乎一样。 152 | 153 | ```shell 154 | # 安装 mariadb-server 155 | yum install mariadb-server -y 156 | 157 | # 启动 mariadb 158 | systemctl start mariadb.service 159 | systemctl enable mariadb.service 160 | ``` 161 | 162 | 那在 Centos7 中默认安装 MySQL 会报错误,大概是我下面这样样子: 163 | 164 | ```bash 165 | --> 正在处理依赖关系 libmysqlclient.so.18(libmysqlclient_18)(64bit),它被软件包 2:postfix-2.10.1-6.el7.x86_64 需要 166 | ---> 软件包 mysql-community-libs.x86_64.0.5.7.16-1.el6 将被 舍弃 167 | --> 解决依赖关系完成 168 | 错误:软件包:2:postfix-2.10.1-6.el7.x86_64 (@anaconda) 169 | 需要:libmysqlclient.so.18(libmysqlclient_18)(64bit) 170 | 正在删除: 1:mariadb-libs-5.5.50-1.el7_2.x86_64 (@updates) 171 | libmysqlclient.so.18(libmysqlclient_18)(64bit) 172 | 取代,由: mysql-community-libs-5.7.16-1.el6.x86_64 (mysql57-community) 173 | .... 174 | ``` 175 | 176 | 如果你非要用 MySQL 那你先卸载 **yum remove mariadb** 和 **yum remove mysql-libs** 重新进行安装 **yum install mysql-server** 或许可解决 Centos7 安装mysql报上面错误的问题,具体问题还得具体看。 177 | 178 | ```shell 179 | # 卸载 mariadb 和 mysql-libs 180 | yum remove mariadb 181 | yum remove mysql-libs 182 | # 安装mysql 183 | yum install mysql-server 184 | ``` 185 | 186 | **安装发生依赖错误** 187 | 188 | ```bash 189 | --> Finished Dependency Resolution 190 | Error: Package: mysql-community-server-5.7.19-1.el6.x86_64 (mysql57-community) 191 | Requires: libsasl2.so.2()(64bit) 192 | You could try using --skip-broken to work around the problem 193 | You could try running: rpm -Va --nofiles --nodigest 194 | ``` 195 | 196 | 通过更新来解决 197 | 198 | ```bash 199 | yum update 200 | # 通过提示来解决错误,80%软件不能用,或者部分功能不能用 201 | # 不建议下面方式解决 202 | yum install mysql-server --skip-broken 203 | rpm -Va --nofiles --nodiges 204 | ``` 205 | 206 | 207 | ## 卸载 MySQL 软件 208 | 209 | ### 卸载mysql 210 | 211 | 通过下面这条命令查看本地mysql安装包 212 | 213 | ```bash 214 | # Linux查看 215 | rpm -qa | grep -i mysql 216 | 217 | # 输出结果 218 | perl-DBD-MySQL-4.013-3.el6.x86_64 219 | mysql-community-libs-5.6.33-2.el6.x86_64 220 | mysql-community-release-el6-5.noarch 221 | mysql-community-client-5.6.33-2.el6.x86_64 222 | compat-mysql51-5.1.54-1.el6.remi.x86_64 223 | mysql-community-server-5.6.33-2.el6.x86_64 224 | mysql-community-common-5.6.33-2.el6.x86_64 225 | ``` 226 | 227 | 你下面命令将它删除 228 | 229 | ```bash 230 | rpm -e mysql-community-server-5.6.33-2.el6.x86_64 231 | rpm -e compat-mysql51-5.1.54-1.el6.remi.x86_64 232 | ``` 233 | 234 | 235 | ### 删除mysql服务 236 | 237 | ```bash 238 | chkconfig --list | grep -i mysql 239 | chkconfig --del mysql 240 | ``` 241 | 242 | ### 删除分散mysql文件夹 243 | 244 | 清空相关mysql的所有目录以及文件,`whereis mysql` 或者 `find / -name mysql` 找到所有文件夹。 245 | 246 | ```bash 247 | rm -rf /usr/lib/mysql 248 | rm -rf /usr/share/mysql 249 | rm -rf /usr/my.cnf 250 | ``` 251 | -------------------------------------------------------------------------------- /docs/chapter2/2.3.md: -------------------------------------------------------------------------------- 1 | Docker 安装 MySQL 2 | === 3 | 4 | 通过 Docker 搭建 MySQL 数据库环境,同时能同时启动多个 MySQL 版本。在安装前,最好上 [docker](https://hub.docker.com/_/mysql) 官网上看一下 MySQL 的版本,更具具体需求版本安装 MySQL,假设你已经搭建好 Docker 环境下面介绍如何创建一个 MySQL 服务器实例。 5 | 6 | 7 | - [快速启动一个 MySQL 服务器实例](#快速启动一个-mysql-服务器实例) 8 | - [通过命令行访问 MySQL 容器](#通过命令行访问-mysql-容器) 9 | - [使用 MySQL 自定义配置文件](#使用-mysql-自定义配置文件) 10 | - [使用 stack 部署 MySQL](#使用-stack-部署-mysql) 11 | - [参考资料](#参考资料) 12 | 13 | 14 | ## 快速启动一个 MySQL 服务器实例 15 | 16 | 下面,我们通过通过 [docker](https://hub.docker.com/_/mysql) 镜像,或者 [MySQL](https://hub.docker.com/r/mysql/mysql-server) 官方镜像,进行快速启动一个实例。 17 | 18 | ```bash 19 | # Docker 官方镜像 20 | $ docker image pull library/mysql:8.0.18 21 | # MySQL 官方镜像 22 | $ docker image pull mysql/mysql-server:8.0.18 23 | ``` 24 | 25 | 上面命令中 `docker image pull` 是抓取 `image` 镜像的命令。`library/mysql:8.0.18` 是指定镜像仓库的位置和相对应的 `tag` 版本。由于 `Docker` 官方提供的 image 文件,都放在 [`library`](https://hub.docker.com/r/library/) 组里面,所以它的是默认组,可以省略。因此,上面的 Docker 命令可以写成下面这样。 26 | 27 | ```bash 28 | # Docker 官方镜像拉取,简写 29 | $ docker image pull mysql:8.0.18 30 | ``` 31 | 32 | 拉取镜像成功以后,就可以在本机看到这个 `image` 文件了。 33 | 34 | ```bash 35 | $ docker image ls 36 | ``` 37 | 38 | 现在,运行这个 image 文件。 39 | 40 | ```bash 41 | # Docker 官方镜像 42 | $ docker run --name mysqlname \ 43 | -p 3308:3306 \ 44 | -e MYSQL_ROOT_PASSWORD=my123456 \ 45 | -v /etc/localtime:/etc/localtime:ro \ 46 | --rm \ 47 | -d mysql:8.0.18 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci 48 | # MySQL 官方镜像 49 | $ docker run -d --name mysqlname mysql/mysql-server:8.0.18 --character-set-server=utf8mb4 --collation-server=utf8mb4_col 50 | ``` 51 | 52 | 上面命令的各个参数含义如下: 53 | 54 | - `--name mysqlname` 容器的名字叫做 `mysqlname` 55 | - `-p 3308:3306` 容器 MySQL 默认端口 `3306` 射到本机的 `3308` 端口。 56 | - `-d` 在后台运行容器并打印容器ID。 57 | - `--rm` 停止运行后,自动删除容器文件。 58 | - `-e MYSQL_ROOT_PASSWORD=my123456` 设置环境变量 `MYSQL_ROOT_PASSWORD` 值为 `my123456` 来设置 `root` 密码,[更多环境变量参考](https://dev.mysql.com/doc/refman/8.0/en/environment-variables.html)。 59 | - `--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)。 60 | - `-v /etc/localtime:/etc/localtime:ro` 是让容器的时钟与宿主机时钟同步,避免时区的问题,`ro` 是 `read only` 的意思,就是只读。 61 | 62 | 可以通过 `容器id`/`容器名称` 查看 MySQL 日志 63 | 64 | ```bash 65 | $ docker logs mysqlname 66 | ``` 67 | 68 | ## 通过命令行访问 MySQL 容器 69 | 70 | 可以通过[容器名字]或者[容器 ID]进入 MySQL 容器 71 | 72 | ```bash 73 | $ docker exec -it mysqlname bash 74 | ``` 75 | 76 | ## 使用 MySQL 自定义配置文件 77 | 78 | MySQL 的默认配置可以在 `/etc/mysql/my.cnf` 中找到,该目录可以包含附加目录,例如 `/etc/mysql/conf.d` 或 `/etc/mysql/mysql.conf.d`。 请检查 MySQL 镜像本身中的相关文件和目录,以获取更多详细信息。 79 | 80 | 如果 `/my/custom/config-file.cnf` 是自定义配置文件的路径和名称,则可以像这样启动 MySQL 容器(请注意,此命令仅使用自定义配置文件的目录路径): 81 | 82 | ```bash 83 | $ docker run --name mysqlname \ 84 | --rm \ 85 | -p 3306:3306 \ 86 | -e MYSQL_ROOT_PASSWORD=my123456 \ 87 | -v /my/custom:/etc/mysql/conf.d \ 88 | -v /etc/localtime:/etc/localtime:ro \ 89 | -d mysql:8.0.18 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci 90 | ``` 91 | 92 | 上面命令将启动一个新的容器 `mysqlname`,其中 MySQL 实例使用 `/etc/mysql/my.cnf` 和 `/etc/mysql/conf.d/config-file.cnf` 中的组合启动设置,其中后者的设置优先。 93 | 94 | 配置修改,可以通过【容器名字】或者【容器 ID】来重启 MySQL,可让配置生效。 95 | 96 | ```bash 97 | docker restart mysqlname 98 | ``` 99 | 100 | ## 使用 stack 部署 MySQL 101 | 102 | MySQL 的实例 `stack.yml`,下面实例使用 `root`/`example` 作为 `用户`/`密码` 凭据,`default_authentication_plugin=mysql_native_password` 这个是因 `MySQL 8` 的安全机制升级而需要修改的配置,不配置的话将无法登录管理: 103 | 104 | ```yml 105 | version: '3.1' 106 | services: 107 | 108 | db: 109 | image: mysql:8.0.18 110 | command: --default-authentication-plugin=mysql_native_password 111 | restart: always 112 | ports: 113 | - "3306:3306" 114 | volumes: 115 | # - /my/custom:/etc/mysql/conf.d 116 | - /etc/localtime:/etc/localtime:ro 117 | environment: 118 | MYSQL_ROOT_PASSWORD: example 119 | 120 | adminer: 121 | image: adminer 122 | restart: always 123 | ports: 124 | - 8080:8080 125 | ``` 126 | 127 | 通过下面命令运行 `stack`,等待它初始化,然后可以访问 `http://swarm-ip:8080`,`http://localhost:8080`, 或者 `http://host-ip:8080`,web 界面来管理 MySQL,有 web 管理工具是因为,在这个 stack 中我们除了添加了 `db` 的 `mysql` 容器,还添加了个添加了个额外的 `adminer` 容器,对外暴露了 `8080` 端口。 128 | 129 | ```bash 130 | $ docker stack deploy -c stack.yml mysql 131 | # 或者使用 docker-compose,方便开发模式下调试。 132 | $ docker-compose -f stack.yml up 133 | ``` 134 | 135 | ## 参考资料 136 | 137 | - [Docker 官方镜像地址](https://hub.docker.com/_/mysql) 138 | - [Docker 官方 Github 文档地址](https://github.com/docker-library/docs/tree/master/mysql) 139 | - [MySQL 官方资料:使用 Docker 在 Linux 上部署 MySQL](https://dev.mysql.com/doc/refman/8.0/en/docker-mysql-more-topics.html) -------------------------------------------------------------------------------- /docs/chapter2/2.4.md: -------------------------------------------------------------------------------- 1 | 启动数据库设置初始密码 2 | === 3 | 4 | 这一小节介绍在Mac OS、Linux、Windows上启动关闭重启MySQL服务,以及部分图形化界面对服务的操控。安装完成后,可以使用 service 命令启动 mysql 服务,在Mac上`service`命令不存在。 5 | 6 | ## 命令行启动关闭重启MySQL服务 7 | 8 | 在命令行终端启动 MySQL 非常方便,下面大概介绍几个平台通过命令启动服务的方法。 9 | 10 | ### 查看服务是否启动 11 | 12 | ```bash 13 | # 还可以这么查看,MySQL服务器是否启动 14 | ps -ef | grep mysqld 15 | 16 | # 查看服务运行的状态 17 | service mysqld status 18 | ``` 19 | 20 | ### Mac OS X 下命令操作 21 | 22 | 在 Mac 系统下操作起来就非常方便了。安装完之后就可以在终端上运行全局命令 mysql.server 命令,假设这个命令没有,你在系统的MySQL安装目录中找到 mysql.server 命令,运行它是一样的效果。 23 | 24 | ```bash 25 | mysqld start 26 | mysql.server start # 1. 启动 27 | mysql.server stop # 2. 停止 28 | mysql.server restart # 3. 重启 29 | ``` 30 | 31 | 当你安装过 MySQL 并没有找到 mysql.server 命令,那这时你需要找到安装目录中的 mysql.server 命令工具了,如 `sudo /usr/local/mysql/support-files/mysql.server start` 32 | 33 | ### Linux 下命令操作 34 | 35 | Linux生态系统中对服务的操作有点区别。其实在 Mac 系统下也可以直接 `mysqld start` 来启动服务。 36 | 37 | 1. 启动:`service mysqld start` 38 | 2. 停止:`service mysqld stop` 39 | 3. 重启:`service mysqld restart` 40 | 3. 查看状态:`service mysqld status` 41 | 4. 查看状态:`systemctl status mysqld.service` 42 | 43 | systemctl是一个systemd工具,主要负责控制systemd系统和服务管理器,在 Linux 系统中可以通过它来启动 mysql 服务。 44 | 45 | 启动过程中有可能会报错,错误处理,通过 **systemctl status mysqld.service** 和 **journalctl -xe** 命令查看服务启动失败的原因。 46 | 47 | ```bash 48 | systemctl status mysqld.service 49 | 50 | ● mysqld.service - SYSV: MySQL database server. 51 | Loaded: loaded (/etc/rc.d/init.d/mysqld) 52 | Active: failed (Result: exit-code) since 三 2016-11-02 22:14:36 EDT; 11s ago 53 | Docs: man:systemd-sysv-generator(8) 54 | Process: 14940 ExecStart=/etc/rc.d/init.d/mysqld start (code=exited, status=1/FAILURE) 55 | 56 | 11月 02 22:14:34 localhost.localdomain systemd[1]: Starting SYSV: MySQL database server.... 57 | 11月 02 22:14:35 localhost.localdomain mysqld[14940]: MySQL Daemon failed to start. 58 | 11月 02 22:14:35 localhost.localdomain mysqld[14940]: Starting mysqld: [FAILED] 59 | 11月 02 22:14:36 localhost.localdomain systemd[1]: mysqld.service: control process exited, code=exited status=1 60 | 11月 02 22:14:36 localhost.localdomain systemd[1]: Failed to start SYSV: MySQL database server.. 61 | 11月 02 22:14:36 localhost.localdomain systemd[1]: Unit mysqld.service entered failed state. 62 | 11月 02 22:14:36 localhost.localdomain systemd[1]: mysqld.service failed. 63 | ``` 64 | 65 | ```bash 66 | # 查看配置文件 my.cnf 的位置 67 | whereis my.cnf 68 | # 输出: my: /etc/my.cnf 69 | 70 | # 编辑 71 | vi /etc/my.cnf 72 | ``` 73 | 74 | 里面有个 log_error=/var/log/mysqld.log 的配置,通过命令 **tail -25 /var/log/mysqld.log** 查看 MySQL 错误日志 75 | 76 | ```bash 77 | 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) 78 | 2016-01-20T10:00:19.935795Z 0 [ERROR] Can't start server: can't create PID file: No such file or directory 79 | 160120 18:00:20 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended 80 | ``` 81 | 82 | 上面日志错误说,MySQL服务在启动的时候,不能创建pid文件。前去看一下 mysqld 文件是否存在,不存在创建 mysqld 目录。 83 | 84 | ```bash 85 | # 创建 mysqld 目录 86 | mkdir -p /var/run/mysqld/ 87 | 88 | # 启动MySQL 89 | /etc/init.d/mysqld start 90 | 91 | # 输出下面内容 92 | # 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. 93 | # [FAILED] 94 | ``` 95 | 96 | 创建 mysqld 目录还是启动报错,按照下面命令尝试解决问题 97 | 98 | ```shell 99 | ls -ld /var/run/mysqld/ 100 | 101 | # mysqld 文件夹如果不存在通过命令创建 102 | 103 | mkdir /var/run/mysqld 104 | 105 | # 会输出下面内容 106 | # drwxr-xr-x. 2 mysql mysql 60 11月 2 22:15 /var/run/mysqld/ 107 | chown mysql.mysql /var/run/mysqld/ 108 | /etc/init.d/mysqld start 109 | ``` 110 | 111 | 通过查看目录 /var/run/mysqld/ 的属主和属组还是root,mysql并不能在其中创建文件,后修改该目录的属主和属组,启动OK。 112 | 113 | 创建脚本`cat start-mysql.sh`,这个问题每次都会出现,因为Centos7上MySQL5.7.12系统不兼容启动失败, 每次开机后手动执行,或放在定时调度里。 114 | 115 | ```shell 116 | #!/bin/bash 117 | 118 | mkdir -p /var/run/mysqld/ 119 | chown mysql.mysql /var/run/mysqld/ 120 | 121 | /etc/init.d/mysqld start 122 | ``` 123 | 124 | ### Windows 下命令操作 125 | 126 | Windows平台操作起来有点不顺手,个人感觉 Windows 的DOS太难用了,下面简单的介绍一下操作过程。先找到 MySQL 的安装位置,如我的电脑的安装位置是:C:\Program Files\MySQL\MySQL Server 5.7,我就执行这样的操作:开始->运行->输入“cmd”开启命令行,然后输入“C:”。通过命令进入到 MySQL Server 5.7 的 bin 目录下,输入 MySQL 命令行的服务启用命令,如下: 127 | 128 | ```bash 129 | # net start [mysql服务名] 130 | 131 | # 启动 mysql 服务 132 | net start mysql 133 | 134 | # 停止 mysql 服务 135 | net stop mysql 136 | ``` 137 | 138 | 有很多情况可能导致无法启动 MySQL,常见解决方法如下: 139 | 140 | 1. 在 CMD 命令中断运行这条命令 C:\Program Files\MySQL\MySQL Server 5.7\bin\mysqladmin-u root -p shutdown 来关闭MYSQL,如果有密码根据提示输入密码即可。 141 | 2. 在 CMD 命令中断,执行net start mysql启动 MySQL,参考上面方法来启动 MySQL 服务。 142 | 143 | 144 | ## 图像界面启动关闭重启MySQL服务 145 | 146 | ### Mac OS X 下操作 147 | 148 | 在 Mac 系统下如果你官方下载安装就可以在`系统偏好设置` > `MySQL` 里面点击 `Stop MySQL Server` 按钮进行启动关闭。 149 | 150 | ![MySQL](../../img/2.3.1.png) 151 | 152 | 通过 [XAMMPP](https://www.apachefriends.org/zh_cn/index.html) 安装的 MySQL ,这个软件安装之后会自动安装 Apache + MySQL + PHP 对于初学者特别方便,新版本是默认安装`Apache + MariaDB + PHP + Perl`。 153 | 154 | ### Windows 下操作 155 | 156 | Windows 系统下启动关闭重启MySQL服务。 157 | 158 | ## 查看初始密码 159 | 160 | 默认情况下MySQL是有个初始密码,知道了初始密码才能改密码。 161 | 162 | ```bash 163 | [root@localhost home]# grep 'temporary password' /var/log/mysqld.log 164 | 165 | 2017-07-17T13:40:11.842835Z 1 [Note] A temporary password is generated for root@localhost: b&iu(sf;>ws 166 | ``` 167 | 168 | ## 设置初始化密码 169 | 170 | 启动后我们需要简单配置一下 mysql ,默认安装以后 mysql 的 root 用户是没有密码的,对于生产环境来说,这肯定是不行的,另外还有一些安全相关的设置,可以使用下面这行命令去配置一下,它是一个向导,问你一些问题,你要给出答案,比如是否要设置 root 用户的密码, 密码是什么等等。 171 | 172 | ```bash 173 | mysql_secure_installation 174 | 175 | Enter current password for root (enter for none): 176 | # 解释:输入当前 root 用户密码,默认为空,直接回车。 177 | 178 | Set root password? [Y/n] y 179 | # 解释:要设置 root 密码吗?输入 y 表示愿意。 180 | 181 | Remove anonymous users? [Y/n] y 182 | # 解释:要移除掉匿名用户吗?输入 y 表示愿意。 183 | 184 | Disallow root login remotely? [Y/n] y 185 | # 解释:不想让 root 远程登陆吗?输入 y 表示愿意。 186 | 187 | Remove test database and access to it? [Y/n] y 188 | # 解释:要去掉 test 数据库吗?输入 y 表示愿意。 189 | 190 | Reload privilege tables now? [Y/n] y 191 | # 解释:想要重新加载权限吗?输入 y 表示愿意。 192 | 193 | ``` 194 | 195 | 196 | 你安装成功后,可以查看一下 MySQL 版本,`mysql --version`,如果版本并非你所使用的版本,你可以参考这里进行升级数据库操作[Centos6下升级MySQL数据库](../chapter17/1.2.md)。 197 | 198 | ## 启动报错处理 199 | 200 | 下面是我尝试在Mac上启动MySQL报错 201 | 202 | **启动失败** 203 | 204 | ```bash 205 | sudo /usr/local/mysql/support-files/mysql.server start 206 | Password: 207 | Starting MySQL 208 | . ERROR! The server quit without updating PID file (/usr/local/mysql/data/localhost.pid 209 | ``` 210 | 211 | 通过日志查看报错信息 212 | 213 | ```bash 214 | # 编辑配置文件 215 | sudo vim /etc/my.cnf 216 | 217 | # 在配置文件最后添加一行错误日志输入的配置 218 | log_error = /usr/local/mysql/data/error.log 219 | ``` 220 | 221 | 上面添加完成之后,重新启动再查看日志 222 | 223 | ```bash 224 | sudo /usr/local/mysql/support-files/mysql.server start 225 | tail -100 /usr/local/mysql/data/error.log 226 | ``` 227 | 228 | ### 日志显示错误一 229 | 230 | ```bash 231 | 2017-01-19T03:48:24.695505Z 0 [ERROR] InnoDB: Unable to lock ./ibdata1 error: 35 232 | 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. 233 | ``` 234 | 235 | 日志显示 mysqld 进程使用相同的InnoDB data 文件或日志文件,通过 `ps -ef | grep mysql | grep -v grep` 查看是否有该进程,发现果然有,这时候你需要杀掉该进程,我在我本地是杀不掉的,于是我尝试使用 mysqld 启动MySQL,启动成功。 236 | 237 | ```bash 238 | sudo /usr/local/mysql/bin/mysqld restart 239 | ``` 240 | 241 | ### 日志显示错误二 242 | 243 | ``` 244 | [ERROR] InnoDB: The innodb_system data file 'ibdata1' must be writable 245 | ``` 246 | 247 | 上面的错误信息说的是 `ibdata1` 文件不可写。`ibdata1` 是InnoDB的共有表空间,默认情况下会把表空间存放在一个文件`ibdata1`中,(此原因会造成这个文件越来越大)。所以大概能猜测是 mysql 用户的权限不够了。所以再给 `ibdata1` 目录分配一下权限即可。 248 | 249 | 这个时候需要查看一下mysql 安装目录权限。使用 chown 改变了整个 mysql 目录的权限,这是一个非常不好的习惯。 250 | 251 | ```bash 252 | cd /usr/local/mysql 253 | sudo chown -R _mysql:_mysql * 254 | ``` 255 | 256 | 这里需要注意的是,Mac OS系统下,mysql 的用户组和用户名都是 `_mysql`,Linux 是 `mysql`。然后再重启 MySQL 你就完事大吉了。 257 | 258 | 上面调试定位错误的方法非常有用。我通过这个方法多次解决各种问题。 -------------------------------------------------------------------------------- /docs/chapter2/2.5.md: -------------------------------------------------------------------------------- 1 | MySQL 工具 2 | === 3 | 4 | 由于 MySQL 软件是基于 C/S 模式的数据库管理系统(一个客户机—服务器DBMS),因此在日常各种工作中,可以通过各种客户端软件来与 MySQL 数据库管理系统关联。MySQL,需要有一个客户机,即你需要用来与MySQL打交道(给MySQL 提供要执行的命令)的一个应用。有许多客户机应用可供选择,但在学习MySQL(确切地说,在编写 和测试MySQL脚本时),最好是使用专门用途的实用程序。官方自带 MySQL Command Line Client 和 MySQL-Workbench 客户端。 5 | 6 | MySQL 官方数据库管理系统提供了许多的命令工具,这些工具可以用来管理 MySQL 服务器,对数据库进行访问、管理 MySQL 用户以及数据库备份和恢复工具等。而且 MySQL 提供图形化管理工具,这样操作更简单。 7 | 8 | ## 命令行使用程序 9 | 10 | 每个 MySQL 安装都有一个名为 MySQL 的简单命令行实用程序。这 个实用程序没有下拉菜单、流行的用户界面、鼠标支持或任何类似的东西。 11 | 12 | #### MySQL 服务器端使用工具程序 13 | 14 | 1. `mysqld` - SQL 后台程序(即 MySQL 服务器进程)。该程序必须启动运行,才能连接服务器来访问数据库。 15 | 2. `mysqld_safe` - 服务器启动脚本,可以通过 mysqld_safe 来启动 mysqld 服务器。mysqld_safe 增加了一些安全特性,例如当前出现错误时重启服务器并向错误日至文件写入运行时间信息。 16 | 3. `mysql.server` - 服务器启动脚本。该脚本用于使用包含为特定级别的运行启动服务的脚本的运行目录的系统。 17 | 4. `mysqld_multi` - 服务器启动脚本,可以启动或停止系统上安装的多个服务器。 18 | 19 | #### MySQL 安装相关程序 20 | 21 | 1. `comp_err` - 编译MySQL错误信息文件。 22 | 2. `mysql_install_db` - 该脚本用默认权限创建MySQL授权表。通常只是在系统上首次安装MySQL时执行一次。 23 | 3. `mysql_plugin` - 配置MySQL服务器插件。 24 | 4. `mysql_secure_installation` - 提高MySQL安装的安全性。 25 | 5. `mysql_ssl_rsa_setup` - 创建 SSL/RSA 文件。 26 | 6. `mysql_tzinfo_to_sql` - 加载时区表。 27 | 7. `mysql_upgrade` - 检查并升级MySQL表。 28 | 29 | #### MySQL 客户端使用工具程序 30 | 31 | 1. `mysql` - MySQL命令行工具。 32 | 2. `mysqladmin` - 用于管理MySQL服务器客户端。 33 | 3. `mysqlcheck` - 表维护程序。 34 | 4. `mysqldump` - 数据库备份程序。 35 | 5. `mysqlimport` - 数据导入程序。 36 | 6. `mysqlpump` - 数据库备份程序。 37 | 7. `mysqlsh` - Shell下执行 mysql 命令。 38 | 8. `mysqlshow` - 显示数据库、表和列的信息,。 39 | 9. `mysqlslap` - 负载仿真客户端。 40 | 41 | #### MySQL 程序开发工具 42 | 43 | 1. `mysql_config` - 编译客户端的显示选项。 44 | 2. `my_print_defaults` - 显示选项文件的选项。 45 | 3. `resolve_stack_dump` - 解析数字堆栈跟踪转储到符号。 46 | 47 | #### MySQL 管理实用程序 48 | 49 | 1. `innochecksum` - 离线InnoDB文件校验工具。 50 | 2. `myisam_ftdump` - 显示全文索引信息。 51 | 3. `myisamchk` - MyISAM表维护实用工具。 52 | 4. `myisamlog` - 显示MyISAM日志文件内容。 53 | 5. `myisampack` - 产生压缩,只读MyISAM表。 54 | 6. `mysql_config_editor` - MySQL的配置实用程序。 55 | 7. `mysqlbinlog` - 处理二进制日志文件的效用。 56 | 8. `mysqldumpslow` - 总结慢查询日志文件。 57 | 58 | #### 杂项程序 59 | 60 | 1. `lz4_decompress` - 解压缩mysqlpump lz4压缩输出。 61 | 2. `perror` - 解释错误代码。 62 | 3. `replace` - 一个字符串替换工具。 63 | 4. `resolveip` - 解析主机名到IP地址或反之亦然。 64 | 5. `zlib_decompress` - 解压缩mysqlpump zlib压缩输出。 65 | 66 | MySQL 命令行实用程序是使用最多的实用程序之一,它对于快速测试 和执行脚本非常有价值。事实上,本书中使用的所有输出例子都是从 MySQL 命令行输出中抓取的。 67 | 68 | ## MySQL Workbench客户端 69 | 70 | 对于命令行客户端软件,想熟悉使用,必需对每一个相关命令需要非常熟悉,这对于现在初级 MySQL 用户来说,还得玩儿上好长一段时间。于是官方专卖开发了图形化客户端软件 [MySQL Workbench](http://dev.mysql.com/downloads/workbench/),进入 [MySQL Workbench](http://dev.mysql.com/downloads/workbench/) 进行下载安装程序,这里安装我是按照默认选项安装,直接不停的下一步。 71 | 72 | ![MySQL](../../img/1.4.1.jpg) 73 | 74 | MySQL Workbench 主要是为数据库管理员和开发人员提供了一整套可视化数据看操作环境,主要有以下功能: 75 | 76 | - 数据看设计和模型建立 77 | - SQL开发(取代MySQL Query Browser) 78 | - 数据看管理(取代MySQL Administrator) 79 | 80 | MySQL Workbench以前老版本分两个版本,MySQL Workbench Community Edition(也叫 MySQL Workbench OSS,社区版本)和 MySQL Workbench Standard Edition (MySQL Workbench SE,商业版),商业版是收费的,现在官网只看到社区版,官网不在提供商业版的技术支持和更新了。 81 | 82 | ## 常用图形管理工具 83 | 84 | MySQL Workbench 功能繁缛,操作复杂,而且在 Mac 上面启动慢操作不方便。对于太多大段英文操作界面十分不友好,长得也特别丑陋,所以在 Mac 上推荐一款界面简单、大方、好用的图形管理工具 [Sequel Pro](http://www.sequelpro.com/) 。这也是一个开源免费的软件,[源码在这里](https://github.com/sequelpro/sequelpro) 如果你有兴趣可研究研究它的源码,做出你的一点贡献。 85 | 86 | Sequel Pro 安装也特别简单,有着 Mac 安装应用的风范,下载之后打开 dmg 拖拽 APP 到你的应用程序文件夹即可安装成功,下面是它漂亮的界面: 87 | 88 | ![MySQL](../../img/1.4.2.jpg) 89 | ![MySQL](../../img/1.4.3.jpg) 90 | ![MySQL](../../img/1.4.4.jpg) 91 | 92 | 我在开发过程中一直使用它来配合命令行终端来使用。在这个过程中熟悉了不少命令,为今后在 Linux 服务器中也玩儿得如鱼得水,非常happy!个人小建议,终归是要熟悉一些命令行的,因为部署到生产环境,极为可能连操作系统都没有图形界面。 93 | 94 | 95 | ## MyCli替代MySQL的mysql命令行工具 96 | 97 | [MyCli](http://mycli.net/) 是一个 MySQL 命令行工具,支持自动补全和语法高亮。也可用于 MariaDB 和 Percona。推荐好用的图形界面也得推荐好用的命令行工具,这个工具也是免费开源的,[源码在这里](https://github.com/dbcli/mycli) 98 | 99 | 100 | ![MySQL](../../img/1.4.5.gif) 101 | 102 | 看上图就已经高潮了吧,它的安装也毫无压力,不费吹灰之力就搞定安装,没有复杂的配置,[MyCli](http://mycli.net/)实在太厉害了,不得不推荐它。安装方法如下: 103 | 104 | ```bash 105 | 106 | # 如果你已会安装 Python 包,那就简单了: 107 | $ pip install mycli 108 | 109 | # 只能在 Mac OS X 中安装 110 | $ brew update && brew install mycli 111 | 112 | # 只能在debian 或者 ubuntu 系统中安装 113 | $ sudo apt-get install mycli 114 | ``` 115 | 116 | 工具的帮助文档,在命令行中运行`mycli --help`就可以输出帮助文档 117 | 118 | ```bash 119 | $ mycli --help 120 | Usage: mycli [OPTIONS] [DATABASE] 121 | 122 | Options: 123 | -h, --host TEXT 数据库的主机地址。 124 | -P, --port INTEGER 用于连接的端口号。 Honors $MYSQL_TCP_PORT 125 | -u, --user TEXT 连接到数据库的用户名。 126 | -S, --socket TEXT 用于连接的套接字文件。 127 | -p, --password TEXT 连接到数据库的密码。 128 | --pass TEXT 连接到数据库的密码。 129 | -v, --version mycli的版本输出。 130 | -D, --database TEXT 使用数据库。 131 | -R, --prompt TEXT 提示格式 (Default: "\t \u@\h:\d> ") 132 | -l, --logfile FILENAME 将每一个查询和它的结果记录到一个文件中。 133 | --defaults-group-suffix TEXT 读取指定的后缀的配置组。 134 | --defaults-file PATH 只从给定文件中读取默认选项。 135 | --auto-vertical-output 如果结果比终端更宽,自动切换到垂直输出模式。 136 | --login-path TEXT 从登录文件中读取此路径。 137 | --help 显示此帮助消息 138 | ``` 139 | 140 | 141 | 使用例子 142 | 143 | ```bash 144 | $ mycli local_database 145 | $ mycli -h localhost -u root app_db 146 | $ mycli mysql://amjith@localhost:3306/django_poll 147 | ``` -------------------------------------------------------------------------------- /docs/chapter2/2.6.md: -------------------------------------------------------------------------------- 1 | MySQL 配置修改 2 | === 3 | 4 | 安装完了之后更改配置的需求比较少,所以你需要根据实际使用过程中来修改 MySQL 配置参数,MySQL提供了两个更改配置的方式。 5 | 6 | - 通过配置想来修改,听说在windows上面有个配置工具(MySQL server instance config) 提供了自动配置服务,真嗨皮。 7 | - 另一种是手工修改配置文件来修改。 8 | 9 | 对于初学者刚接触MySQL来说,使用工具来修改配置是非常好的,但是在 Mac 系统下面没有找到这样的工具,如果你部署到Linux下面好像没有这种工具,所以在真正的生产环境还是得修改配置来更改 MySQL 配置。接下来只讲解配置文件来修改,为你将来在 Mac 或者 Linux ,包括windows平台系统下容易配置做点准备吧,通过配置文件来配置,让你做跨平台玩儿 MySQL ,让你逼格更高一点,哈哈。 10 | 11 | 12 | ## MySQL安装目录说明 13 | 14 | MySQL 不同的版本安装目录会有一点不一致,但是大致会差不多,会有一点差异,我这个是 Mac OS X 系统中的安装目录,在这里`/usr/local/mysql` 15 | 16 | |目录 | 目录内容 | 17 | | ---- | ---- | 18 | |bin/ | 客户端程序和mysqld服务器,相关命令 | 19 | |data/ | | 20 | |docs/ | | 21 | |include/ | 包含头文件| 22 | |lib/ | 库 | 23 | |man/ | | 24 | |share/ | | 25 | |support-files/ | 存在一些默认配置文件,如`my-default.cnf` | 26 | 27 | 28 | ## 配置文件的位置 29 | 30 | 从命令行终端运行此命令,将在寻找Linux/BSD / OS X系统中的MySQL配置文件 my.cnf 文件: 31 | 32 | ```bash 33 | mysql --help | grep 'Default options' -A 1 34 | ``` 35 | 36 | 上面命令执行后,会有这样的输出: 37 | 38 | ```bash 39 | Default options are read from the following files in the given order: 40 | /etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf 41 | ``` 42 | 43 | 现在,可以检查你正在使用的 my.cnf 文件是否存在。在 Mac OS X 中默认式没有 my.cnf 文件的。你可以从这个地方复制一份过去 `/usr/local/mysql/support-files/my-default.cnf` 每个版本都不一样,你只需要找到一个 `.cnf` 后缀结尾的文件即可。复制到`/etc/`目录下并重新命名为 `my.cnf` 44 | 45 | ## Windows系统配置文件读取 46 | 47 | 在Windows上,MySQL的程序读取从下表中显示的文件,按照指定的顺序启动配置选项(顶部文件首先被读取,文件读取后优先)。 48 | 49 | | 文件名字 | 作用 | 50 | | ---- | ---- | 51 | | **%PROGRAMDATA%**\MySQL\MySQL Server 5.6\my.ini, **%PROGRAMDATA%**\MySQL\MySQL Server 5.6\my.cnf | 全局配置 | 52 | | %WINDIR%\my.ini, %WINDIR%\my.cnf | 全局配置 | 53 | | C:\my.ini, C:\my.cnf | 全局配置 | 54 | | **BASEDIR**\my.ini, **BASEDIR**\my.cnf | 全局配置 | 55 | | defaults-extra-file | 如果有的话指定该文件`--defaults-extra-file=文件名字` | 56 | | %APPDATA%\MySQL\.mylogin.cnf | 登录路径选项(仅适用于客户端) | 57 | 58 | 59 | - **%PROGRAMDATA%** 这个路径默认为 `C:\ProgramData` 老版本的Windows系统, 默认在 ` C:\Documents and Settings\All Users\Application Data\MySQL` 60 | - **%WINDIR%** 表示Windows的目录位置。使用下面的命令从windir环境变量的值确定其精确位置 `C:\> echo %WINDIR%` 61 | - **BASEDIR** 表示MySQL的安装目录。 62 | - **%APPDATA%** 表示Windows的目录位置。使用下面的命令从windir环境变量的值确定其精确位置 `C:\> echo %WINDIR%` 63 | 64 | MySQL 提供的二进制安装代码所创建的默认目录,在Windows中,默认安装路径是`C:\Program Files\MySQL\MySQL Server 5.7` 65 | 66 | ## Linux系统配置文件读取 67 | 68 | | 文件名字 | 作用 | 69 | | ---- | ---- | 70 | | /etc/my.cnf | 全局配置 | 71 | | /etc/mysql/my.cnf | 全局配置 | 72 | | SYSCONFDIR/my.cnf | 全局配置 | 73 | | $MYSQL_HOME/my.cnf | Server-specific 服务器特定的选项 (仅适用于服务端) | 74 | | defaults-extra-file | 如果有的话指定该文件`--defaults-extra-file=文件名字` | 75 | | ~/.my.cnf | Server-specific 服务器特定的选项 | 76 | | ~/.mylogin.cnf | User-specific 登录路径选择 (仅适用于客户端) | 77 | 78 | - **$HOME** 上表中表示用户的主目录,即用户的根目录。 79 | - **SYSCONFDIR** 代表指定的目录与SYSCONFDIR配置文件的安装路径,默认情况这个是位于安装目录里面的目录。 80 | - **$MYSQL_HOME** 是包含在该服务器的具体my.cnf文件所在的目录的路径环境变量。如果 $MYSQL_HOME 没有设置,你启动服务器使用mysqld_safe程序,mysqld_safe试图设置 $MYSQL_HOME 81 | 82 | 工具 **mysqld_safe** 使用注意: 83 | 84 | - 让BASEDIR和DATADIR分别代表MySQL的基本目录和数据目录的路径名。 85 | - 如果my.cnf文件在DATADIR但不是在BASEDIR中,mysqld_safe设置MYSQL_HOME到DATADIR。 86 | - 否则,如果MYSQL_HOME未设置并且在DATADIR没有my.cnf文件,mysqld_safe设置MYSQL_HOME到BASEDIR。 87 | 88 | ## 配置文件内容 89 | 90 | 91 | 92 | ```bash 93 | 94 | # 以下选项会被MySQL客户端应用读取。 95 | # 注意只有MySQL附带的客户端应用程序保证可以读取这段内容。 96 | # 如果你想你自己的MySQL应用程序获取这些值。 97 | # 需要在MySQL客户端库初始化的时候指定这些选项。 98 | 99 | # For advice on how to change settings please see 100 | # http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html 101 | # *** DO NOT EDIT THIS FILE. It's a template which will be copied to the 102 | # *** default location during install, and will be replaced if you 103 | # *** upgrade to a newer version of MySQL. 104 | 105 | # mysqld程序 106 | 107 | [mysqld] 108 | 109 | # Remove leading # and set to the amount of RAM for the most important data 110 | # cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%. 111 | # innodb_buffer_pool_size = 128M 112 | 113 | # ★★★这里很重要️能让MySQL登陆链接变快速 114 | skip-name-resolve 115 | 116 | # Remove leading # to turn on a very important data integrity option: logging 117 | # changes to the binary log between backups. 118 | # log_bin 119 | 120 | # These are commonly set, remove the # and set as required. 121 | # 使用给定目录作为根目录(安装目录)。 122 | # basedir = ..... 123 | # 从给定目录读取数据库文件。 124 | # datadir = ..... 125 | # 为mysqld程序指定一个存放进程ID的文件(仅适用于UNIX/Linux系统); 126 | # pid-file = ..... 127 | # 指定MsSQL侦听的端口 128 | # port = ..... 129 | # server_id = ..... 130 | # 为MySQL客户程序与服务器之间的本地通信指定一个套接字文件(Linux下默认是/var/lib/mysql/mysql.sock文件) 131 | # socket = ..... 132 | 133 | 134 | sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 135 | 136 | # 一般配置选项 137 | basedir = /data/apps/mysql 138 | datadir = /data/appData/mysql 139 | port = 3306 140 | socket = /var/run/mysqld/mysqld.sock 141 | # 设置 142 | character-set-server=utf8 143 | 144 | 145 | # 指定MySQL可能的连接数量。 146 | # 当MySQL主线程在很短时间内接收到非常多的连接请求,该参数生效,主线程花费很短时间检查连接并且启动一个新线程。 147 | # back_log参数的值指出在MySQL暂时停止响应新请求之前的短时间内多少个请求可以被存在堆栈中。 148 | # 如果系统在一个短时间内有很多连接,则需要增大该参数的值,该参数值指定到来的TCP/IP连接的侦听队列的大小。 149 | # 试图设定back_log高于你的操作系统的限制将是无效的。默认值为50。对于Linux系统推荐设置为小于512的整数。 150 | 151 | # back_log 是操作系统在监听队列中所能保持的连接数, 152 | # 队列保存了在 MySQL 连接管理器线程处理之前的连接. 153 | # 如果你有非常高的连接率并且出现 “connection refused” 报错, 154 | # 你就应该增加此处的值. 155 | # 检查你的操作系统文档来获取这个变量的最大值. 156 | # 如果将back_log设定到比你操作系统限制更高的值,将会没有效果 157 | back_log = 300 158 | 159 | # 不在 TCP/IP 端口上进行监听. 160 | # 如果所有的进程都是在同一台服务器连接到本地的 mysqld, 161 | # 这样设置将是增强安全的方法 162 | # 所有 mysqld 的连接都是通过 Unix Sockets 或者命名管道进行的. 163 | # 注意在 Windows下如果没有打开命名管道选项而只是用此项 164 | # (通过 “enable-named-pipe” 选项) 将会导致 MySQL 服务没有任何作用! 165 | #skip-networking 166 | 167 | # MySQL 服务所允许的同时会话数的上限 168 | # 其中一个连接将被 SUPER 权限保留作为管理员登录. 169 | # 即便已经达到了连接数的上限. 170 | max_connections = 3000 171 | 172 | # 每个客户端连接最大的错误允许数量,如果达到了此限制. 173 | # 这个客户端将会被 MySQL 服务阻止直到执行了 “FLUSH HOSTS” 或者服务重启 174 | # 非法的密码以及其他在链接时的错误会增加此值. 175 | # 查看 “Aborted_connects” 状态来获取全局计数器. 176 | max_connect_errors = 50 177 | 178 | # 所有线程所打开表的数量. 179 | # 增加此值就增加了 mysqld 所需要的文件描述符的数量 180 | # 这样你需要确认在 [mysqld_safe] 中 “open-files-limit” 变量设置打开文件数量允许至少等于 table_cache 的值 181 | table_open_cache = 4096 182 | 183 | # 允许外部文件级别的锁. 打开文件锁会对性能造成负面影响 184 | # 所以只有在你在同样的文件上运行多个数据库实例时才使用此选项(注意仍会有其他约束!) 185 | # 或者你在文件层面上使用了其他一些软件依赖来锁定 MyISAM 表 186 | #external-locking 187 | 188 | # 服务所能处理的请求包的最大大小以及服务所能处理的最大的请求大小(当与大的 BLOB 字段一起工作时相当必要) 189 | # 每个连接独立的大小,大小动态增加 190 | max_allowed_packet = 32M 191 | 192 | # 在一个事务中 binlog 为了记录 SQL 状态所持有的 cache 大小 193 | # 如果你经常使用大的,多声明的事务,你可以增加此值来获取更大的性能. 194 | # 所有从事务来的状态都将被缓冲在 binlog 缓冲中然后在提交后一次性写入到 binlog 中 195 | # 如果事务比此值大, 会使用磁盘上的临时文件来替代. 196 | # 此缓冲在每个连接的事务第一次更新状态时被创建 197 | binlog_cache_size = 4M 198 | 199 | # 独立的内存表所允许的最大容量。 200 | # 此选项为了防止意外创建一个超大的内存表导致永尽所有的内存资源。 201 | max_heap_table_size = 128M 202 | 203 | # 随机读取数据缓冲区使用内存(read_rnd_buffer_size):和顺序读取相对应, 204 | # 当 MySQL 进行非顺序读取(随机读取)数据块的时候,会利用>这个缓冲区暂存读取的数据 205 | # 如根据索引信息读取表数据,根据排序后的结果集与表进行 Join 等等 206 | # 总的来说,就是当数据块的读取需要满足>一定的顺序的情况下,MySQL 就需要产生随机读取,进而使用到 read_rnd_buffer_size 参数所设置的内存缓冲区 207 | read_rnd_buffer_size = 16M 208 | 209 | # 排序缓冲被用来处理类似 ORDER BY 以及 GROUP BY 队列所引起的排序 210 | # 如果排序后的数据无法放入排序缓冲,一个用来替代的基于磁盘的合并分类会被使用 211 | # 查看 “Sort_merge_passes” 状态变量。 212 | # 在排序发生时由每个线程分配 213 | # 每个需要进行排序的线程分配该大小的一个缓冲区。增加这值加速ORDER BY或GROUP BY操作。 214 | # 注意:该参数对应的分配内存是每连接独占!如果有100个连接,那么实际分配的总共排序缓冲区大小为100×6=600MB 215 | sort_buffer_size = 16M 216 | 217 | # 此缓冲被使用来优化全联合(FULL JOINS 不带索引的联合)。 218 | # 类似的联合在极大多数情况下有非常糟糕的性能表现,但是将此值设大能够减轻性能影响。 219 | # 通过 “Select_full_join” 状态变量查看全联合的数量 220 | # 当全联合发生时,在每个线程中分配 221 | join_buffer_size = 16M 222 | 223 | # 缓存可重用的线程数 224 | # thread_cache = 8 225 | 226 | # 避免MySQL的外部锁定,减少出错几率增强稳定性。 227 | # skip-locking 228 | 229 | # 我们在 cache 中保留多少线程用于重用 230 | # 当一个客户端断开连接后,如果 cache 中的线程还少于 thread_cache_size,则客户端线程被放入cache 中。 231 | # 这可以在你需要大量新连接的时候极大的减少线程创建的开销 232 | # (一般来说如果你有好的线程模型的话,这不会有明显的性能提升。) 233 | thread_cache_size = 16 234 | 235 | # 此允许应用程序给予线程系统一个提示在同一时间给予渴望被运行的线程的数量。 236 | # 此值只对于支持 thread_concurrency() 函数的系统有意义( 例如Sun Solaris)。 237 | # 你可可以尝试使用 [CPU数量]*(2..4) 来作为 thread_concurrency 的值 238 | #****(此属性对当前环境无效)**** 239 | # thread_concurrency = 8 240 | 241 | # 查询缓冲常被用来缓冲 SELECT 的结果并且在下一次同样查询的时候不再执行直接返回结果。 242 | # 打开查询缓冲可以极大的提高服务器速度, 如果你有大量的相同的查询并且很少修改表。 243 | # 查看 “Qcache_lowmem_prunes” 状态变量来检查是否当前值对于你的负载来说是否足够高。 244 | # 注意: 在你表经常变化的情况下或者如果你的查询原文每次都不同, 245 | # 查询缓冲也许引起性能下降而不是性能提升。 246 | query_cache_size = 128M 247 | 248 | # 只有小于此设定值的结果才会被缓冲 249 | # 此设置用来保护查询缓冲,防止一个极大的结果集将其他所有的查询结果都覆盖。 250 | query_cache_limit = 4M 251 | 252 | # 被全文检索索引的最小的字长。 253 | # 你也许希望减少它,如果你需要搜索更短字的时候。 254 | # 注意在你修改此值之后,你需要重建你的 FULLTEXT 索引 255 | ft_min_word_len = 8 256 | 257 | # 如果你的系统支持 memlock() 函数,你也许希望打开此选项用以让运行中的 mysql 在在内存高度紧张的时候,数据在内存中保持锁定并且防止可能被 swapping out 258 | # 此选项对于性能有益 259 | #memlock 260 | 261 | # 当创建新表时作为默认使用的表类型, 262 | # 如果在创建表示没有特别执行表类型,将会使用此值 263 | #****(此属性对当前环境无效)**** 264 | #default_table_type = InnoDB 265 | 266 | # 线程使用的堆大小. 此容量的内存在每次连接时被预留. 267 | # MySQL 本身常不会需要超过 64K 的内存 268 | # 如果你使用你自己的需要大量堆的 UDF 函数或者你的操作系统对于某些操作需要更多的堆,你也许需要将其设置的更高一点. 269 | thread_stack = 512K 270 | 271 | # 设定默认的事务隔离级别.可用的级别如下: 272 | # READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE 273 | transaction_isolation = REPEATABLE-READ 274 | 275 | # 内部(内存中)临时表的最大大小 276 | # 如果一个表增长到比此值更大,将会自动转换为基于磁盘的表。 277 | # 此限制是针对单个表的,而不是总和。 278 | tmp_table_size = 128M 279 | 280 | # 打开二进制日志功能。 281 | # 在复制(replication)配置中,作为 MASTER 主服务器必须打开此项 282 | # 如果你需要从你最后的备份中做基于时间点的恢复,你也同样需要二进制日志。 283 | log-bin=mysql-bin 284 | 285 | # 如果你在使用链式从服务器结构的复制模式 (A->B->C), 286 | # 你需要在服务器B上打开此项。 287 | # 此选项打开在从线程上重做过的更新的日志, 并将其写入从服务器的二进制日志。 288 | #log_slave_updates 289 | 290 | # 打开全查询日志。 所有的由服务器接收到的查询 (甚至对于一个错误语法的查询) 291 | # 都会被记录下来。 这对于调试非常有用, 在生产环境中常常关闭此项。 292 | #log 293 | 294 | # 将警告打印输出到错误 log 文件。 如果你对于 MySQL 有任何问题 295 | # 你应该打开警告 log 并且仔细审查错误日志,查出可能的原因。 296 | #log_warnings 297 | 298 | # 记录慢速查询。 慢速查询是指消耗了比 “long_query_time” 定义的更多时间的查询。 299 | # 如果 log_long_format 被打开,那些没有使用索引的查询也会被记录。 300 | # 如果你经常增加新查询到已有的系统内的话。 一般来说这是一个好主意, 301 | #log_slow_queries 302 | 303 | # 有的使用了比这个时间(以秒为单位)更多的查询会被认为是慢速查询。 304 | # 不要在这里使用“1″, 否则会导致所有的查询,甚至非常快的查询页被记录下来(由于 MySQL 目前时间的精确度只能达到秒的级别)。 305 | long_query_time = 6 306 | 307 | # 在慢速日志中记录更多的信息。 308 | # 一般此项最好打开。 309 | # 打开此项会记录使得那些没有使用索引的查询也被作为到慢速查询附加到慢速日志里 310 | #log_long_format 311 | 312 | # 此目录被MySQL用来保存临时文件。例如, 313 | # 它被用来处理基于磁盘的大型排序,和内部排序一样。 314 | # 以及简单的临时表。 315 | # 如果你不创建非常大的临时文件,将其放置到 swapfs/tmpfs 文件系统上也许比较好 316 | # 另一种选择是你也可以将其放置在独立的磁盘上。 317 | # 你可以使用”;”来放置多个路径 318 | # 他们会按照 roud-robin 方法被轮询使用。 319 | #tmpdir = /tmp 320 | 321 | # *** 主从复制相关的设置 322 | 323 | # 唯一的服务辨识号,数值位于 1 到 2^32-1之间。 324 | # 此值在master和slave上都需要设置。 325 | # 如果 “master-host” 没有被设置,则默认为1, 但是如果忽略此选项,MySQL不会作为master生效。 326 | server-id = 1 327 | 328 | # 复制的Slave (去掉master段的注释来使其生效) 329 | # 330 | # 为了配置此主机作为复制的slave服务器,你可以选择两种方法: 331 | # 332 | # 1) 使用 CHANGE MASTER TO 命令 (在我们的手册中有完整描述) - 333 | # 语法如下: 334 | # 335 | # CHANGE MASTER TO MASTER_HOST=, MASTER_PORT=, 336 | # MASTER_USER=, MASTER_PASSWORD= ; 337 | # 338 | # 你需要替换掉,等被尖括号包围的字段以及使用master的端口号替换 (默认3306)。 339 | # 340 | # 例子: 341 | # 342 | # CHANGE MASTER TO MASTER_HOST=’125.564.12.1′, MASTER_PORT=3306, 343 | # MASTER_USER=’joe’, MASTER_PASSWORD=’secret’; 344 | # 345 | # 或者 346 | # 347 | # 2) 设置以下的变量. 不论如何, 在你选择这种方法的情况下, 然后第一次启动复制(甚至不成功的情况下, 348 | # 例如如果你输入错密码在master-password字段并且slave无法连接), 349 | # slave会创建一个 master.info 文件,并且之后任何对于包含在此文件内的参数的变化都会被忽略 350 | # 并且由 master.info 文件内的内容覆盖, 除非你关闭slave服务, 删除 master.info 并且重启slave 服务。 351 | # 由于这个原因,你也许不想碰一下的配置(注释掉的) 并且使用 CHANGE MASTER TO (查看上面) 来代替 352 | # 353 | # 所需要的唯一id号位于 2 和 2^32 – 1之间 354 | # (并且和master不同) 355 | # 如果master-host被设置了.则默认值是2 356 | # 但是如果省略,则不会生效 357 | #server-id = 2 358 | # 359 | # 复制结构中的master – 必须 360 | #master-host = 361 | # 362 | # 当连接到master上时slave所用来认证的用户名 – 必须 363 | #master-user = 364 | # 365 | # 当连接到master上时slave所用来认证的密码 – 必须 366 | #master-password = 367 | # 368 | # master监听的端口. 369 | # 可选 – 默认是3306 370 | #master-port = 371 | 372 | # 使得slave只读。只有用户拥有SUPER权限和在上面的slave线程能够修改数据。 373 | # 你可以使用此项去保证没有应用程序会意外的修改slave而不是master上的数据 374 | #read_only 375 | 376 | #*** MyISAM 相关选项 377 | 378 | # 关键词缓冲的大小, 一般用来缓冲 MyISAM 表的索引块。 379 | # 不要将其设置大于你可用内存的30%, 380 | # 因为一部分内存同样被OS用来缓冲行数据 381 | # 甚至在你并不使用 MyISAM 表的情况下, 你也需要仍旧设置起 8-64M 内存由于它同样会被内部临时磁盘表使用。 382 | # key_buffer_size = 128M 383 | 384 | # 用来做 MyISAM 表全表扫描的缓冲大小. 385 | # 当全表扫描需要时,在对应线程中分配. 386 | # read_buffer_size = 8M 387 | 388 | # 当在排序之后,从一个已经排序好的序列中读取行时,行数据将从这个缓冲中读取来防止磁盘寻道. 389 | # 如果你增高此值,可以提高很多 ORDER BY 的性能. 390 | # 当需要时由每个线程分配 391 | # read_rnd_buffer_size = 64M 392 | 393 | # MyISAM 使用特殊的类似树的 cache 来使得突发插入 394 | # (这些插入是,INSERT … SELECT, INSERT … VALUES (…), (…), …, 以及 LOAD DATA INFILE) 更快. 395 | # 此变量限制每个进程中缓冲树的字节数. 396 | # 设置为 0 会关闭此优化. 397 | # 为了最优化不要将此值设置大于 “key_buffer_size”. 398 | # 当突发插入被检测到时此缓冲将被分配. 399 | # bulk_insert_buffer_size = 256M 400 | 401 | # 此缓冲当 MySQL 需要在 REPAIR, OPTIMIZE, ALTER 以及 LOAD DATA INFILE 到一个空表中引起重建索引时被分配. 402 | # 这在每个线程中被分配.所以在设置大值时需要小心. 403 | # myisam_sort_buffer_size = 256M 404 | 405 | # MySQL 重建索引时所允许的最大临时文件的大小 (当 REPAIR, ALTER TABLE 或者 LOAD DATA INFILE). 406 | # 如果文件大小比此值更大,索引会通过键值缓冲创建(更慢) 407 | # myisam_max_sort_file_size = 10G 408 | 409 | # 如果被用来更快的索引创建索引所使用临时文件大于制定的值,那就使用键值缓冲方法. 410 | # 这主要用来强制在大表中长字串键去使用慢速的键值缓冲方法来创建索引. 411 | # myisam_max_extra_sort_file_size = 10G 412 | 413 | # 如果一个表拥有超过一个索引, MyISAM 可以通过并行排序使用超过一个线程去修复他们. 414 | # 这对于拥有多个 CPU 以及大量内存情况的用户,是一个很好的选择. 415 | # myisam_repair_threads = 1 416 | 417 | # 自动检查和修复没有适当关闭的 MyISAM 表. 418 | # myisam_recover 419 | 420 | # 默认关闭 Federated 421 | # skip-federated 422 | 423 | # *** BDB 相关选项 *** 424 | 425 | # 如果你运行的MySQL服务有BDB支持但是你不准备使用的时候使用此选项. 这会节省内存并且可能加速一些事. 426 | #****(此属性对当前环境无效)**** 427 | #skip-bdb 428 | 429 | # *** INNODB 相关选项 *** 430 | 431 | # 如果你的 MySQL 服务包含 InnoDB 支持但是并不打算使用的话, 432 | # 使用此选项会节省内存以及磁盘空间,并且加速某些部分 433 | #skip-innodb 434 | 435 | # 附加的内存池被 InnoDB 用来保存 metadata 信息(5.6中不再推荐使用) 436 | # 如果 InnoDB 为此目的需要更多的内存,它会开始从 OS 这里申请内存. 437 | # 由于这个操作在大多数现代操作系统上已经足够快, 你一般不需要修改此值. 438 | # SHOW INNODB STATUS 命令会显示当先使用的数量. 439 | #****(此属性对当前环境无效)**** 440 | #innodb_additional_mem_pool_size = 64M 441 | 442 | # InnoDB使用一个缓冲池来保存索引和原始数据, 不像 MyISAM. 443 | # 这里你设置越大,这能保证你在大多数的读取操作时使用的是内存而不是硬盘,在存取表里面数据时所需要的磁盘 I/O 越少. 444 | # 在一个独立使用的数据库服务器上,你可以设置这个变量到服务器物理内存大小的80% 445 | # 不要设置过大,否则,由于物理内存的竞争可能导致操作系统的换页颠簸. 446 | # 注意在32位系统上你每个进程可能被限制在 2-3.5G 用户层面内存限制, 447 | # 所以不要设置的太高. 448 | innodb_buffer_pool_size = 6G 449 | 450 | # InnoDB 将数据保存在一个或者多个数据文件中成为表空间. 451 | # 如果你只有单个逻辑驱动保存你的数据,一个单个的自增文件就足够好了. 452 | # 其他情况下.每个设备一个文件一般都是个好的选择. 453 | # 你也可以配置 InnoDB 来使用裸盘分区 – 请参考手册来获取更多相关内容 454 | innodb_data_file_path = ibdata1:10M:autoextend 455 | 456 | # 设置此选项如果你希望InnoDB表空间文件被保存在其他分区. 457 | # 默认保存在MySQL的datadir中. 458 | #innodb_data_home_dir = 459 | 460 | # 用来同步IO操作的IO线程的数量. 461 | # 此值在Unix下被硬编码为8,但是在Windows磁盘I/O可能在一个大数值下表现的更好. 462 | #innodb_file_io_threads = 8 463 | 464 | # 如果你发现 InnoDB 表空间损坏, 设置此值为一个非零值可能帮助你导出你的表. 465 | # 从1开始并且增加此值知道你能够成功的导出表. 466 | #innodb_force_recovery=1 467 | 468 | # 在 InnoDb 核心内的允许线程数量. 469 | # 最优值依赖于应用程序,硬件以及操作系统的调度方式. 470 | # 过高的值可能导致线程的互斥颠簸. 471 | innodb_thread_concurrency = 16 472 | 473 | # 如果设置为1 ,InnoDB 会在每次提交后刷新(fsync)事务日志到磁盘上, 474 | # 这提供了完整的 ACID 行为. 475 | # 如果你愿意对事务安全折衷, 并且你正在运行一个小的事物, 你可以设置此值到0或者2来减少由事务日志引起的磁盘I/O 476 | # 0代表日志只大约每秒写入日志文件并且日志文件刷新到磁盘. 477 | # 2代表日志写入日志文件在每次提交后,但是日志文件只有大约每秒才会刷新到磁盘上. 478 | innodb_flush_log_at_trx_commit = 2 479 | #(说明:如果是游戏服务器,建议此值设置为2;如果是对数据安全要求极高的应用,建议设置为1; 480 | #设置为0性能最高,但如果发生故障,数据可能会有丢失的危险! 481 | #默认值1的意思是每一次事务提交或事务外的指令都需要把日志写入(flush)硬盘,这是很费时的。 482 | #特别是使用电池供电缓存(Battery backed up cache)时。 483 | #设成2对于很多运用,特别是从MyISAM表转过来的是可以的,它的意思是不写入硬盘而是写入系统缓存。 484 | #日志仍然会每秒flush到硬盘,所以你一般不会丢失超过1-2秒的更新。 485 | #设成0会更快一点,但安全方面比较差,即使MySQL挂了也可能会丢失事务的数据。而值2只会在整个操作系统挂了时才可能丢数据。) 486 | 487 | # 加速 InnoDB 的关闭. 这会阻止 InnoDB 在关闭时做全清除以及插入缓冲合并. 488 | # 这可能极大增加关机时间, 但是取而代之的是 InnoDB 可能在下次启动时做这些操作. 489 | #innodb_fast_shutdown 490 | 491 | # 用来缓冲日志数据的缓冲区的大小. 492 | # 当此值快满时, InnoDB 将必须刷新数据到磁盘上. 493 | # 由于基本上每秒都会刷新一次,所以没有必要将此值设置的太大(甚至对于长事务而言) 494 | innodb_log_buffer_size = 16M 495 | 496 | # 在日志组中每个日志文件的大小. 497 | # 你应该设置日志文件总合大小到你缓冲池大小的25%~100% 498 | # 来避免在日志文件覆写上不必要的缓冲池刷新行为. 499 | # 不论如何, 请注意一个大的日志文件大小会增加恢复进程所需要的时间. 500 | innodb_log_file_size = 512M 501 | 502 | # 在日志组中的文件总数. 503 | # 通常来说2~3是比较好的. 504 | innodb_log_files_in_group = 3 505 | 506 | # InnoDB 的日志文件所在位置. 默认是 MySQL 的 datadir. 507 | # 你可以将其指定到一个独立的硬盘上或者一个RAID1卷上来提高其性能 508 | #innodb_log_group_home_dir 509 | 510 | # 在 InnoDB 缓冲池中最大允许的脏页面的比例. 511 | # 如果达到限额, InnoDB 会开始刷新他们防止他们妨碍到干净数据页面. 512 | # 这是一个软限制,不被保证绝对执行. 513 | innodb_max_dirty_pages_pct = 90 514 | 515 | # InnoDB 用来刷新日志的方法. 516 | # 表空间总是使用双重写入刷新方法 517 | # 默认值是 “fdatasync”, 另一个是 “O_DSYNC”. 518 | # 一般来说,如果你有硬件 RAID 控制器,并且其独立缓存采用 write-back 机制,并有着电池断电保护,那么应该设置配置为 O_DIRECT 519 | # 否则,大多数情况下应将其设为 fdatasync 520 | #innodb_flush_method=fdatasync 521 | 522 | # 在被回滚前,一个 InnoDB 的事务应该等待一个锁被批准多久. 523 | # InnoDB 在其拥有的锁表中自动检测事务死锁并且回滚事务. 524 | # 如果你使用 LOCK TABLES 指令, 或者在同样事务中使用除了 InnoDB 以外的其他事务安全的存储引擎 525 | # 那么一个死锁可能发生而 InnoDB 无法注意到. 526 | # 这种情况下这个 timeout 值对于解决这种问题就非常有帮助. 527 | innodb_lock_wait_timeout = 120 528 | 529 | # 这项设置告知InnoDB是否需要将所有表的数据和索引存放在共享表空间里(innodb_file_per_table = OFF) 或者为每张表的数据单独放在一个.ibd文件(innodb_file_per_table = ON) 530 | # 每张表一个文件允许你在drop、truncate或者rebuild表时回收磁盘空间 531 | # 这对于一些高级特性也是有必要的,比如数据压缩,但是它不会带来任何性能收益 532 | innodb_file_per_table = on 533 | 534 | [mysqldump] 535 | # 不要在将内存中的整个结果写入磁盘之前缓存. 在导出非常巨大的表时需要此项 536 | quick 537 | 538 | max_allowed_packet = 32M 539 | 540 | [mysql] 541 | no-auto-rehash 542 | default-character-set=utf8 543 | # 仅仅允许使用键值的 UPDATEs 和 DELETEs . 544 | safe-updates 545 | 546 | [myisamchk] 547 | key_buffer = 16M 548 | sort_buffer_size = 16M 549 | read_buffer = 8M 550 | write_buffer = 8M 551 | 552 | [mysqlhotcopy] 553 | interactive-timeout 554 | 555 | [mysqld_safe] 556 | # 增加每个进程的可打开文件数量. 557 | # 警告: 确认你已经将全系统限制设定的足够高! 558 | # 打开大量表需要将此值设大 559 | open-files-limit = 8192 560 | 561 | # 562 | # MySQL 服务端 563 | # 564 | [client] 565 | default-character-set=utf8 566 | ``` 567 | 568 | 569 | 配置好定制配置文件 my.cnf 之后需要初始化一下 570 | 571 | ```bash 572 | mysqld --initialize 573 | ``` 574 | 575 | 初始化之后需要重启服务 576 | 577 | ```bash 578 | # 重启服务 579 | mysql.server restart 580 | 581 | # Linux 这么运行,启动服务 582 | service mysqld start 583 | # Mac 运行去掉 service 584 | mysqld start 585 | 586 | # Linux 查看服务运行的状态 587 | service mysqld status 588 | ``` 589 | -------------------------------------------------------------------------------- /docs/chapter3/3.1.md: -------------------------------------------------------------------------------- 1 | 2 | 连接数据库 3 | === 4 | 5 | 登录MySQL数据库有多种方式,GUI登录最方便,有特别多的App可以提供图形化工具登录MySQL,并且方便的查看数据信息,[这里推荐一些APP](/awesome-mysql.md#gui),你可以尝试下载,有些APP还提供命令执行功能。图形化界面就不一样讲解了,就介绍一下命令行下面登录MySQL数据库,这样你可以配合App来学习SQL语言,更快掌握这门语言。 6 | 7 | ## MySQL命令语法 8 | 9 | 用户名是你登录的用户,主机名或者IP地址为可选项,如果是本地连接则不需要,远程连接需要填写,密码是对应用户的密码。 10 | 11 | ```bash 12 | mysql –u用户名 [–h主机名或者IP地址,-P端口号] –p密码 13 | ``` 14 | 15 | 1. 该命令是在命令行窗口下执行,而不是MySQL的命令行; 16 | 2. 输入-p后可以直接跟上密码,也可以按回车,会提示你输入密码,二者都是相同的效果; 17 | 3. –p密码选项不一定是要在最后; 18 | 4. –u、-h、-p后无空格。 19 | 20 | ## MySQL命令连接数据库 21 | 22 | 首先将这个使用率高达80%以上的“mysql”命令工具简单的做一个讲解,在操作系统命令终端提示符下输入 `mysql -h 127.0.0.1 -u用户名 -p密码`,将出现一个如下的简单提示: 23 | 24 | ```bash 25 | → mysql -h127.0.0.1 -P3306 -uroot -prootpassword 26 | 27 | Welcome to the MySQL monitor. Commands end with ; or \g. 28 | Your MySQL connection id is 99 29 | Server version: 5.7.14 MySQL Community Server (GPL) 30 | 31 | Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. 32 | 33 | Oracle is a registered trademark of Oracle Corporation and/or its 34 | affiliates. Other names may be trademarks of their respective 35 | owners. 36 | 37 | Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 38 | 39 | mysql> 40 | ``` 41 | 42 | - `-h127.0.0.1` 其中“-p”是参数,“rootpassword”,默认本地参数可忽略 43 | - `-P3306` 其中“-P”是参数(注意大写),“3306”,默认本地参数可忽略 44 | - `-uroot` 其中“-u”是参数,“root” 是用户名。 45 | - `-prootpassword` 其中“-p”是参数,“rootpassword” 是用户名。 46 | - `Commands end with ; or \g.` 命令的结束符,用“;”或者“\g”符号结束,但是冒号结束退出是不行的。 47 | - `Your MySQL connection id is 99` 其中 id 表示客户端的连接 ID,该数据记录了 MySQL 服务到目前为止的连接次数,每次新连接都会自动加 1。由于数据库服务是我安装了好久的,所以当前 ID 值为 99。 48 | - `Server version: 5.7.14 MySQL` MySQL的版本。 49 | - `Community Server (GPL)` 表示 MySQL 软件是社区版。 50 | - `Type 'help;' or '\h' for help.` 表示输入 “help;” 或者 “\h” 命令可以查看帮助信息。 51 | - `Type '\c' to clear the current input statement.` 表示输入“\c” 命令可以清除前面的命令。 52 | 53 | 你只需要在`mysql>`命令中输入 SQL 语句,同时并以分号“;”结束。最后摁`Enter`键即可操作 MySQL软件。 54 | 55 | 当然,具体的版本和连接信息可能不同,但都可以使用这个实用程序。请注意: 56 | 57 | - 命令输入在`mysql>` 之后; 58 | - 用`q\`、`quit`、`exit`三种命令可以退出命令行实用程序; 59 | - 帮助命令,输入`help`或`\h`获得帮助,可以获得其它特定的命令的帮助(如,输入help select获得使用SELECT语句的帮助); 60 | 61 | 62 | ## 开启MySQL的远程帐号 63 | 64 | 用GUI连接数据库如果报下面错误,是你的 MySQL远程连接账号没有开启。 65 | 66 | ```bash 67 | Unable to connect to host 192.168.188.114, or the request timed out. 68 | Be sure that the address is correct and that you have the necessary privileges, or try increasing the connection timeout (currently 10 seconds). 69 | MySQL said: Host '192.168.188.106' is not allowed to connect to this MariaDB server 70 | ``` 71 | 72 | 通过下面的命令,解决不能连接的错误,进入 MySQL 执行下面语句。 73 | 74 | ```shell 75 | # 你想root使用123456从'192.168.188.106'主机连接到mysql服务器 wabg库下面所有表的话。 76 | MySQL> grant all PRIVILEGES on wabg.* to root@'192.168.188.106' identified by '123456' WITH GRANT OPTION; 77 | # 你想myuser使用mypassword从任何主机连接到mysql服务器的话 78 | MySQL> grant all PRIVILEGES on *.* to 'myuser'@'%' identified by 'mypassword' WITH GRANT OPTION; 79 | ``` 80 | 81 | 上面的语句表示将 wabg 数据库的所有权限授权给 root 这个用户,允许 root 用户在 192.168.1.106 这个 IP 进行远程登陆,并设置 root 用户的密码为 123456 。 82 | 83 | - all PRIVILEGES 表示赋予所有的权限给指定用户,这里也可以替换为赋予某一具体的权限 84 | - wabg.* 表示上面的权限是针对于哪个表的,wabg指的是数据库,后面的 * 表示对于所有的表,由此可以推理出: 85 | - 对于全部数据库的全部表授权为“ *.* ” 86 | - 对于某一数据库的全部表授权为“ 数据库名.* ” 87 | - 对于某一数据库的某一表授权为“数据库名.表名” 88 | - root 表示你要给哪个用户授权,这个用户可以是存在的用户,也可以是不存在的用户。 89 | - 192.168.188.106 表示允许远程连接的 IP 地址,如果想不限制链接的 IP 则设置为“%”即可。 90 | - 123456 为用户的密码。 91 | 92 | 如何开启MySQL的远程帐号?执行了上面的语句后,再执行下面的语句,方可立即生效。 93 | 94 | ```shell 95 | MySQL> flush privileges; 96 | ``` 97 | 98 | 当你报下面错误,提示您的密码不满足当前的策略要求。错误如下: 99 | 100 | ```shell 101 | ERROR 1819 (HY000): Your password does not satisfy the current policy requirements 102 | # 或者 103 | mysqladmin: unable to change password; error: 'Your password does not satisfy the current policy requirements' 104 | ``` 105 | 106 | 解决方法:可以按照现有策略设置密码,也可以更改密码策略。 107 | 108 | ```shell 109 | # 更改密码策略为LOW 110 | MySQL> set global validate_password_policy=0; 111 | # 更改密码长度 密码最小长度为4 112 | MySQL> set global validate_password_length=4; 113 | ``` 114 | 115 | 进入 MySQL 查看你的密码验证策略 116 | 117 | ```sql 118 | mysql> SHOW VARIABLES LIKE 'validate_password%'; 119 | +--------------------------------------+-------+ 120 | | Variable_name | Value | 121 | +--------------------------------------+-------+ 122 | | validate_password_check_user_name | OFF | 123 | | validate_password_dictionary_file | | 124 | | validate_password_length | 4 | 125 | | validate_password_mixed_case_count | 1 | 126 | | validate_password_number_count | 1 | 127 | | validate_password_policy | LOW | 128 | | validate_password_special_char_count | 1 | 129 | +--------------------------------------+-------+ 130 | 7 rows in set (0.00 sec) 131 | ``` 132 | 133 | - validate_password_check_user_name 不得使用当前会话用户名作为密码的一部分 134 | - validate_password_dictionary_file 验证密码强度的字典文件路径 135 | - validate_password_length 密码最小长度 136 | - validate_password_mixed_case_count 密码至少要包含的小写字母个数和大写字母个数 137 | - validate_password_number_count 密码至少要包含的数字个数 138 | - validate_password_policy 密码强度检查等级,0/LOW、1/MEDIUM、2/STRONG 139 | - 0/LOW:只检查长度。 140 | - 1/MEDIUM:检查长度、数字、大小写、特殊字符。 141 | - 2/STRONG:检查长度、数字、大小写、特殊字符字典文件。 142 | - validate_password_special_char_count 密码至少要包含的特殊字符数 143 | 144 | ## MySQL修改密码 145 | 146 | ```shell 147 | mysqladmin -uroot -p password 148 | ``` 149 | -------------------------------------------------------------------------------- /docs/chapter3/3.2.md: -------------------------------------------------------------------------------- 1 | 2 | 查看选择数据库 3 | === 4 | 5 | ## 查看数据库 6 | 7 | MySQL数据库连接成功之后,就可以使用SQL语句来查看当前所有存在的数据库,显示的一些默认的数据库是在 MySQL安装完成之后,在其目录 data 自动创建的几个必要的数据库,输入SQL语句如下: 8 | 9 | ```sql 10 | mysql> SHOW DATABASES; 11 | +--------------------+ 12 | | Database | 13 | |--------------------| 14 | | information_schema | 15 | | mysql | 16 | | performance_schema | 17 | | sys | 18 | | test | 19 | +--------------------+ 20 | 5 rows in set 21 | Time: 0.031s 22 | ``` 23 | 24 | 使用“SHOW DATABASES;” 语句之行完之后,就可以看到,数据库表包含了5个数据库,mysql是必须的,它主要描述用户访问权限,用户经常使用test数据库做测试的工作,其他数据库将在后面的章节做一些介绍。这个命令起到一些小作用,可以帮助你查看创建的数据库是否创建成功,选择你创建的数据库等操作。 25 | 26 | ## 选择数据库 27 | 28 | 如果你在你创建好的数据库里面创建表,对表坐一系列的操作,这个时候你需要使用到选择命令“USE”。比如我进入 test 数据库,输入语句如下: 29 | 30 | ```sql 31 | mysql> USE test; 32 | You are now connected to database "test" as user "root" 33 | Time: 0.003s 34 | ``` 35 | 36 | 使用“USE test;”语句之后,反馈出连接数据库成功,可以看出使用 root 用户连接到 "test" 数据了,并且输出连接时间。 37 | -------------------------------------------------------------------------------- /docs/chapter3/3.3.md: -------------------------------------------------------------------------------- 1 | 2 | 创建数据库 3 | === 4 | 5 | 我们上一节已经学会“SHOW DATABASES;”查看到本地数据库,MySQL安装好以后,首先需要创建数据库,你可以创建自己的数据库,这是使用 MySQL 各种功能的前提。 6 | 7 | ## SQL语句创建数据库 8 | 9 | ### 创建一个已知不存在的数据库 10 | 11 | 连接好 MySQL 之后运行下面SQL语句创建数据库: 12 | 13 | ```sql 14 | CREATE DATABASE test; 15 | ``` 16 | 17 | 运行上面SQL语句将输出下面信息 18 | 19 | ```bash 20 | Query OK, 1 row affected 21 | Time: 0.011s 22 | ``` 23 | 24 | 数据库创建之后可以使用 “SHOW CREATE DATABASE” 声明查看数据库的定义。运行下面SQL语句: 25 | 26 | ```sql 27 | SHOW CREATE DATABASE test\G; 28 | ``` 29 | 30 | 运行上面SQL语句将输出下面信息: 31 | 32 | ```bash 33 | ***************************[ 1. row ]*************************** 34 | Database | test 35 | Create Database | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */ 36 | 37 | 1 row in set 38 | Time: 0.001s 39 | ``` 40 | 41 | 42 | ### 创建一个不确定存在的数据库 43 | 44 | 如果你刚创建 test 这个数据,或者你的这个数据库已经存在,执行创建数据库的SQL语句 “CREATE DATABASE test;” 结果会输出一条错误信息,即不能创建数据库 test ,已经存在于数据库中。输出结果如下: 45 | 46 | ```bash 47 | mysql> CREATE DATABASE test; 48 | ERROR 1007 (HY000): Can't create database 'test'; database exists 49 | ``` 50 | 51 | 为了不产生错误,在创建数据库的时候可以加上一些简单的逻辑判断,判断数据库是否存在,不存在也不产生错误。会产生一个警告,如下: 52 | 53 | ```bash 54 | mysql> CREATE DATABASE if not exists test; 55 | Query OK, 1 row affected, 1 warning (0.00 sec) 56 | ``` 57 | 58 | ## 管理工具创建数据库 59 | 60 | 使用普通用户登陆 MySQL 服务器,你可能需要特定的权限来创建或者删除 MySQL 数据库。所以我们这边使用root用户登录,root用户拥有最高权限,可以使用 mysql mysqladmin 命令来创建数据库。 61 | 62 | ```bash 63 | $ mysqladmin -uroot -p create test 64 | Enter password:*** 65 | ``` 66 | 67 | 如果数据库存在则提示下面信息: 68 | 69 | ```bash 70 | $ mysqladmin -uroot -p create test 71 | Enter password:**** 72 | mysqladmin: CREATE DATABASE failed; error: 'Can't create database 'test'; database exists' 73 | ``` 74 | -------------------------------------------------------------------------------- /docs/chapter3/3.4.md: -------------------------------------------------------------------------------- 1 | 2 | 删除数据库 3 | === 4 | 5 | 删除数据库是将已经存在的数据库从磁盘空间上清除,清除之后,数据库中的所有数据也将一同被删除。所以删除数据库需要特别谨慎,建议先备份数据。 6 | 7 | ## SQL语句删除数据库 8 | 9 | ### 删除一个已经确定存在的数据库 10 | 11 | MySQL 中删除数据库的基本SQL语句: 12 | 13 | ```sql 14 | DROP DATABASE test2; 15 | ``` 16 | 17 | 运行之后会询问是否删除,运行输出如下: 18 | 19 | ```bash 20 | You're about to run a destructive command. 21 | Do you want to proceed? (y/n): y 22 | Your call! 23 | Query OK, 0 rows affected 24 | Time: 0.004s 25 | ``` 26 | 27 | ### 删除一个不确定存在的数据库 28 | 29 | 如果你没有创建 test2 这个数据,或者你的这个数据库被删除了,再次执行查看数据库的定义 “SHOW CREATE DATABASE” 结果会输出一条错误信息,即数据库 test2 已经不存在。输出结果如下: 30 | 31 | ```bash 32 | mysql> SHOW CREATE DATABASE test2; 33 | ERROR 1049 (42000): Unknown database 'test2' 34 | ``` 35 | 36 | 为了不产生错误,在删除数据库的时候可以加上一些简单的逻辑判断,判断数据库是否存在,不存在也不产生错误。 37 | 38 | ```bash 39 | mysql> drop database if exists test2; 40 | Query OK, 0 rows affected, 1 warning (0.00 sec) 41 | ``` 42 | 43 | 产生一个警告说明此数据库不存在。 44 | 45 | ## 管理工具删除 46 | 47 | 使用普通用户登陆 MySQL 服务器,你可能需要特定的权限来创建或者删除 MySQL 数据库。所以我们这边使用root用户登录,root用户拥有最高权限,可以使用 mysql mysqladmin 命令来创建数据库,也可以通过这个命令来删除数据库。 48 | 49 | ```bash 50 | mysqladmin -uroot -p drop test 51 | Enter password:****** 52 | ``` 53 | 54 | 上面命令,会出现输出两句提示来提示你删除数据带来的风险,同时会输出一个确认删除的提示,来确认是否真的删除数据库,当数据库 test 存在,并且你输入 y 摁下了Enter键的时候,会提示删除成功。 55 | 56 | ```bash 57 | Dropping the database is potentially a very bad thing to do. 58 | Any data stored in the database will be destroyed. 59 | 60 | Do you really want to drop the 'test' database [y/N] y 61 | Database "test" dropped 62 | ``` 63 | 64 | 如果数据库不存在则提示下面信息: 65 | 66 | ```bash 67 | mysqladmin: DROP DATABASE test failed; 68 | error: 'Can't drop database 'test'; database doesn't exist' 69 | ``` 70 | -------------------------------------------------------------------------------- /docs/chapter3/3.5.md: -------------------------------------------------------------------------------- 1 | 2 | 数据库存储引擎 3 | === 4 | 5 | 对于初学者来说我们通常不关注存储引擎,但是 MySQL 提供了多个存储引擎,包括处理事务安全表的引擎和处理非事务安全表的引擎。在 MySQL 中,不需要在整个服务器中使用同一种存储引擎,针对具体的要求,可以对每一个表使用不同的存储引擎。 6 | 7 | ## 存储引擎简介 8 | 9 | MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。 存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。 10 | 11 | 例如,如果你在研究大量的临时数据,你也许需要使用内存存储引擎。内存存储引擎能够在内存中存储所有的表格数据。又或者,你也许需要一个支持事务处理的数据库(以确保事务处理不成功时数据的回退能力)。 12 | 13 | 14 | ### InnoDB 15 | 16 | InnoDB是一个健壮的事务型存储引擎,这种存储引擎已经被很多互联网公司使用,为用户操作非常大的数据存储提供了一个强大的解决方案。我的电脑上安装的 MySQL 5.6.13 版,InnoDB就是作为默认的存储引擎。InnoDB还引入了行级锁定和外键约束,在以下场合下,使用InnoDB是最理想的选择: 17 | 18 | - 更新密集的表。InnoDB存储引擎特别适合处理多重并发的更新请求。 19 | - 事务。InnoDB存储引擎是支持事务的标准MySQL存储引擎。 20 | - 自动灾难恢复。与其它存储引擎不同,InnoDB表能够自动从灾难中恢复。 21 | - 外键约束。MySQL支持外键的存储引擎只有InnoDB。 22 | - 支持自动增加列AUTO_INCREMENT属性。 23 | - 从5.7开始innodb存储引擎成为默认的存储引擎。 24 | 25 | 一般来说,如果需要事务支持,并且有较高的并发读取频率,InnoDB是不错的选择。 26 | 27 | 28 | ### MyISAM 29 | 30 | MyISAM表是独立于操作系统的,这说明可以轻松地将其从Windows服务器移植到Linux服务器;每当我们建立一个MyISAM引擎的表时,就会在本地磁盘上建立三个文件,文件名就是表名。例如,我建立了一个MyISAM引擎的tb_Demo表,那么就会生成以下三个文件: 31 | 32 | - tb_demo.frm,存储表定义。 33 | - tb_demo.MYD,存储数据。 34 | - tb_demo.MYI,存储索引。 35 | 36 | MyISAM表无法处理事务,这就意味着有事务处理需求的表,不能使用MyISAM存储引擎。MyISAM存储引擎特别适合在以下几种情况下使用: 37 | 38 | 1. 选择密集型的表。MyISAM存储引擎在筛选大量数据时非常迅速,这是它最突出的优点。 39 | 2. 插入密集型的表。MyISAM的并发插入特性允许同时选择和插入数据。例如:MyISAM存储引擎很适合管理邮件或Web服务器日志数据。 40 | 41 | ### MRG_MYISAM 42 | 43 | MRG_MyISAM存储引擎是一组MyISAM表的组合,老版本叫 MERGE 其实是一回事儿,这些MyISAM表结构必须完全相同,尽管其使用不如其它引擎突出,但是在某些情况下非常有用。说白了,Merge表就是几个相同MyISAM表的聚合器;Merge表中并没有数据,对Merge类型的表可以进行查询、更新、删除操作,这些操作实际上是对内部的MyISAM表进行操作。 44 | 45 | Merge存储引擎的使用场景。对于服务器日志这种信息,一般常用的存储策略是将数据分成很多表,每个名称与特定的时间端相关。例如:可以用12个相同的表来存储服务器日志数据,每个表用对应各个月份的名字来命名。当有必要基于所有12个日志表的数据来生成报表,这意味着需要编写并更新多表查询,以反映这些表中的信息。与其编写这些可能出现错误的查询,不如将这些表合并起来使用一条查询,之后再删除Merge表,而不影响原来的数据,删除Merge表只是删除Merge表的定义,对内部的表没有任何影响。 46 | 47 | - ENGINE=MERGE,指明使用MERGE引擎,其实是跟MRG_MyISAM一回事儿,也是对的,在MySQL 5.7已经看不到MERGE了。 48 | - UNION=(t1, t2),指明了MERGE表中挂接了些哪表,可以通过alter table的方式修改UNION的值,以实现增删MERGE表子表的功能。比如: 49 | 50 | ```sql 51 | alter table tb_merge engine=merge union(tb_log1) insert_method=last; 52 | ``` 53 | 54 | - INSERT_METHOD=LAST,INSERT_METHOD指明插入方式,取值可以是:0 不允许插入;FIRST 插入到UNION中的第一个表; LAST 插入到UNION中的最后一个表。 55 | - MERGE表及构成MERGE数据表结构的各成员数据表必须具有完全一样的结构。每一个成员数据表的数据列必须按照同样的顺序定义同样的名字和类型,索引也必须按照同样的顺序和同样的方式定义。 56 | 57 | ### MEMORY 58 | 59 | 使用MySQL Memory存储引擎的出发点是速度。为得到最快的响应时间,采用的逻辑存储介质是系统内存。虽然在内存中存储表数据确实会提供很高的性能,但当mysqld守护进程崩溃时,所有的Memory数据都会丢失。获得速度的同时也带来了一些缺陷。它要求存储在Memory数据表里的数据使用的是长度不变的格式,这意味着不能使用BLOB和TEXT这样的长度可变的数据类型,VARCHAR是一种长度可变的类型,但因为它在MySQL内部当做长度固定不变的CHAR类型,所以可以使用。 60 | 61 | 一般在以下几种情况下使用Memory存储引擎: 62 | 63 | - 目标数据较小,而且被非常频繁地访问。在内存中存放数据,所以会造成内存的使用,可以通过参数max_heap_table_size控制Memory表的大小,设置此参数,就可以限制Memory表的最大大小。 64 | - 如果数据是临时的,而且要求必须立即可用,那么就可以存放在内存表中。 65 | - 存储在Memory表中的数据如果突然丢失,不会对应用服务产生实质的负面影响。 66 | - Memory同时支持散列索引和B树索引。B树索引的优于散列索引的是,可以使用部分查询和通配查询,也可以使用<、>和>=等操作符方便数据挖掘。散列索引进行“相等比较”非常快,但是对“范围比较”的速度就慢多了,因此散列索引值适合使用在=和<>的操作符中,不适合在<或>操作符中,也同样不适合用在order by子句中。 67 | 68 | ### CSV 69 | 70 | CSV 存储引擎是基于 CSV 格式文件存储数据。 71 | 72 | - CSV 存储引擎因为自身文件格式的原因,所有列必须强制指定 NOT NULL 。 73 | - CSV 引擎也不支持索引,不支持分区。 74 | - CSV 存储引擎也会包含一个存储表结构的 .frm 文件,还会创建一个 .csv 存储数据的文件,还会创建一个同名的元信息文件,该文件的扩展名为 .CSM ,用来保存表的状态及表中保存的数据量。 75 | - 每个数据行占用一个文本行。 76 | 77 | 因为 csv 文件本身就可以被Office等软件直接编辑,保不齐就有不按规则出牌的情况,如果出现csv 文件中的内容损坏了的情况,也可以使用 CHECK TABLE 或者 REPAIR TABLE 命令检查和修复 78 | 79 | ### ARCHIVE 80 | 81 | Archive是归档的意思,在归档之后很多的高级功能就不再支持了,仅仅支持最基本的插入和查询两种功能。在MySQL 5.5版以前,Archive是不支持索引,但是在MySQL 5.5以后的版本中就开始支持索引了。Archive拥有很好的压缩机制,它使用zlib压缩库,在记录被请求时会实时压缩,所以它经常被用来当做仓库使用。 82 | 83 | ### BLACKHOLE 84 | 85 | 黑洞存储引擎,所有插入的数据并不会保存,BLACKHOLE 引擎表永远保持为空,写入的任何数据都会消失, 86 | 87 | ### PERFORMANCE_SCHEMA 88 | 89 | 主要用于收集数据库服务器性能参数。MySQL用户是不能创建存储引擎为PERFORMANCE_SCHEMA的表,一般用于记录binlog做复制的中继。在这里有官方的一些介绍[MySQL Performance Schema](https://dev.mysql.com/doc/refman/5.6/en/performance-schema.html) 90 | 91 | ### FEDERATED 92 | 93 | 主要用于访问其它远程MySQL服务器一个代理,它通过创建一个到远程MySQL服务器的客户端连接,并将查询传输到远程服务器执行,而后完成数据存取;在MariaDB的上实现是FederatedX 94 | 95 | ### 其他 96 | 97 | 这里列举一些其它数据库提供的存储引擎,OQGraph、SphinxSE、TokuDB、Cassandra、CONNECT、SQUENCE。提供的名字仅供参考。 98 | 99 | 100 | ## 常用引擎对比 101 | 102 | 不同存储引起都有各自的特点,为适应不同的需求,需要选择不同的存储引擎,所以首先考虑这些存储引擎各自的功能和兼容。 103 | 104 | | 特性 | InnoDB | MyISAM | MEMORY | ARCHIVE | 105 | | ---- | ----- | ------- | ------ | ------- | 106 | | 存储限制(Storage limits) | 64TB | No | YES | No | 107 | | 支持事物(Transactions) | Yes | No | No | No | 108 | | 锁机制(Locking granularity) | 行锁 | 表锁 | 表锁 | 行锁 | 109 | | B树索引(B-tree indexes) | Yes | Yes | Yes | No | 110 | | T树索引(T-tree indexes) | No | No | No | No | 111 | | 哈希索引(Hash indexes) | Yes | No | Yes | No | 112 | | 全文索引(Full-text indexes) | Yes | Yes | No | No | 113 | | 集群索引(Clustered indexes) | Yes | No | No | No | 114 | | 数据缓存(Data caches) | Yes | No | N/A | No | 115 | | 索引缓存(Index caches) | Yes | Yes | N/A | No | 116 | | 数据可压缩(Compressed data) | Yes | Yes | No | Yes | 117 | | 加密传输(Encrypted data[1]) | Yes | Yes | Yes | Yes | 118 | | 集群数据库支持(Cluster databases support) | No | No | No | No | 119 | | 复制支持(Replication support[2]) | Yes | No | No | Yes | 120 | | 外键支持(Foreign key support) | Yes | No | No | No | 121 | | 存储空间消耗(Storage Cost) | 高 | 低 | N/A | 非常低 | 122 | | 内存消耗(Memory Cost) | 高 | 低 | N/A | 低 | 123 | | 数据字典更新(Update statistics for data dictionary) | Yes | Yes | Yes | Yes | 124 | | 备份/时间点恢复(backup/point-in-time recovery[3]) | Yes | Yes | Yes | Yes | 125 | | 多版本并发控制(Multi-Version Concurrency Control/MVCC) | Yes | No | No | No | 126 | | 批量数据写入效率(Bulk insert speed) | 慢 | 快 | 快 | 非常快 | 127 | | 地理信息数据类型(Geospatial datatype support) | Yes | Yes | No | Yes | 128 | | 地理信息索引(Geospatial indexing support[4]) | Yes | Yes | No | Yes | 129 | 130 | 1. 在服务器中实现(通过加密功能)。在其他表空间加密数据在MySQL 5.7或更高版本兼容。 131 | 2. 在服务中实现的,而不是在存储引擎中实现的。 132 | 3. 在服务中实现的,而不是在存储引擎中实现的。 133 | 4. 地理位置索引,InnoDB支持可mysql5.7.5或更高版本兼容 134 | 135 | ## 查看存储引擎 136 | 137 | 使用“SHOW VARIABLES LIKE '%storage_engine%';” 命令在mysql系统变量搜索磨人设置的存储引擎,输入语句如下: 138 | 139 | ```sql 140 | mysql> SHOW VARIABLES LIKE '%storage_engine%'; 141 | +----------------------------------+---------+ 142 | | Variable_name | Value | 143 | |----------------------------------+---------| 144 | | default_storage_engine | InnoDB | 145 | | default_tmp_storage_engine | InnoDB | 146 | | disabled_storage_engines | | 147 | | internal_tmp_disk_storage_engine | InnoDB | 148 | +----------------------------------+---------+ 149 | 4 rows in set 150 | Time: 0.005s 151 | ``` 152 | 153 | 使用“SHOW ENGINES;”命令显示安装以后可用的所有的支持的存储引擎和默认引擎,后面带上 \G 可以列表输出结果,你可以尝试一下如“SHOW ENGINES\G;”。 154 | 155 | ```sql 156 | mysql> SHOW ENGINES; 157 | +--------------------+---------+--------------------------------------+-------------+--------+-----------+ 158 | | Engine | Support | Comment | Transactions| XA | Savepoints| 159 | |--------------------+---------+--------------------------------------+-------------+--------+-----------| 160 | | InnoDB | DEFAULT | Supports transactions, | YES | YES | YES | 161 | | | | row-level locking, and foreign keys | | | | 162 | | MRG_MYISAM | YES | Collection of identical MyISAM tables| NO | NO | NO | 163 | | MEMORY | YES | Hash based, stored in memory, useful | NO | NO | NO | 164 | | | | for temporary tables | | | | 165 | | BLACKHOLE | YES | /dev/null storage engine (anything | NO | NO | NO | 166 | | | | you write to it disappears) | | | | 167 | | MyISAM | YES | MyISAM storage engine | NO | NO | NO | 168 | | CSV | YES | CSV storage engine | NO | NO | NO | 169 | | ARCHIVE | YES | Archive storage engine | NO | NO | NO | 170 | | PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO | 171 | | FEDERATED | NO | Federated MySQL storage engine | | | | 172 | +--------------------+---------+--------------------------------------+-------------+--------+-----------+ 173 | ``` 174 | 175 | 由上面命令输出,可见当前系统的默认数据表类型是InnoDB。当然,我们可以通过修改数据库配置文件中的选项,设定默认表类型。 176 | 177 | ## 设置存储引擎 178 | 179 | 对上面数据库存储引擎有所了解之后,你可以在`my.cnf` 配置文件中设置你需要的存储引擎,这个参数放在 [mysqld] 这个字段下面的 default_storage_engine 参数值,例如下面配置的片段 180 | 181 | ```bash 182 | [mysqld] 183 | default_storage_engine=CSV 184 | ``` 185 | 186 | 在创建表的时候,对表设置存储引擎,例如: 187 | 188 | ```sql 189 | CREATE TABLE `user` ( 190 | `id` int(100) unsigned NOT NULL AUTO_INCREMENT, 191 | `name` varchar(32) NOT NULL DEFAULT '' COMMENT '姓名', 192 | `mobile` varchar(20) NOT NULL DEFAULT '' COMMENT '手机', 193 | PRIMARY KEY (`id`) 194 | )ENGINE=InnoDB; 195 | ``` 196 | 197 | 在创建用户表 user 的时候,SQL语句最后 ENGINE=InnoDB 就是设置这张表存储引擎为 InnoDB。 198 | 199 | ## 如何选择合适的存储引擎 200 | 201 | 提供几个选择标准,然后按照标准,选择对应的存储引擎即可,也可以根据[常用引擎对比](#常用引擎对比)来选择你使用的存储引擎。使用哪种引擎需要根据需求灵活选择,一个数据库中多个表可以使用不同的引擎以满足各种性能和实际需求。使用合适的存储引擎,将会提高整个数据库的性能。 202 | 203 | 1. 是否需要支持事务; 204 | 2. 是否需要使用热备; 205 | 3. 崩溃恢复,能否接受崩溃; 206 | 4. 是否需要外键支持; 207 | 5. 存储的限制; 208 | 6. 对索引和缓存的支持; 209 | -------------------------------------------------------------------------------- /docs/chapter3/3.md: -------------------------------------------------------------------------------- 1 | 2 | 数据库的基本操作 3 | === 4 | 5 | 安装好 MySQL 之后,首先要进入数据库创建数据库,这是使用 MySQL 各种功能的前提。这一章详细介绍数据库的基本操作,主要内容包括:连接数据库、创建数据库、查看选择数据库、删除数据库和不同数据库存储引擎介绍、选择以及存储引擎的工作原理。 -------------------------------------------------------------------------------- /examples/create-table.sql: -------------------------------------------------------------------------------- 1 | -- NOT NULL 不能为空 2 | -- unsigned 是指数值类型只能为正数。 3 | -- DEFAULT 默认值 4 | 5 | CREATE TABLE `user_accounts` ( 6 | `id` int(100) unsigned NOT NULL AUTO_INCREMENT, 7 | `name` varchar(32) NOT NULL DEFAULT '' COMMENT '姓名', 8 | `sex` tinyint(32) NOT NULL DEFAULT 0 COMMENT '性别:0,保密;1,男;2,女', 9 | `mobile` varchar(20) NOT NULL DEFAULT '' COMMENT '手机', 10 | `create_at` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), 11 | `update_at` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), 12 | -- 创建唯一索引,不允许重复 13 | UNIQUE INDEX idx_user_mobile(`mobile`), 14 | PRIMARY KEY (`id`) 15 | ) 16 | ENGINE=InnoDB DEFAULT CHARSET=utf8 17 | COMMENT='用户表信息'; -------------------------------------------------------------------------------- /idoc.chapters.yml: -------------------------------------------------------------------------------- 1 | 2 | #### 第1章 初识 MySQL 3 | 4 | - chapter1/: 第1章 初识 MySQL 5 | - chapter1/1.1.md: 数据库基础 6 | - chapter1/1.2.md: 数据库技术构成 7 | - chapter1/1.3.md: 什么是MySQL 8 | - chapter1/1.4.md: 如何学习MySQL 9 | 10 | 11 | #### 第2章 MySQL的安装与配置 12 | 13 | - chapter2/: 第2章 MySQL 的安装与配置 14 | - chapter2/2.1.md: Mac平台下安装与配置MySQL 15 | - chapter2/2.2.md: Centos 平台安装与卸载MySQL 16 | - chapter2/2.3.md: Docker 安装 MySQL 17 | - chapter2/2.4.md: 启动数据库设置初始密码 18 | - chapter2/2.5.md: MySQL工具 19 | - chapter2/2.6.md: MySQL配置修改 20 | 21 | 22 | #### 第3章 数据库的基本操作 23 | 24 | - chapter3/: 第3章 数据库的基本操作 25 | - chapter3/3.1.md: 连接数据库 26 | - chapter3/3.2.md: 查看选择数据库 27 | - chapter3/3.3.md: 创建数据库 28 | - chapter3/3.4.md: 删除数据库 29 | - chapter3/3.5.md: 数据库存储引擎 30 | -------------------------------------------------------------------------------- /idoc.yml: -------------------------------------------------------------------------------- 1 | logo: ./mysql.svg 2 | favicon: ./mysql.svg 3 | 4 | cacheFileStat: true 5 | 6 | homepage: https://wangchujiang.com/swiftui-example/ 7 | 8 | menus: 9 | Home: index.html 10 | CheatSheet: 21-minutes-MySQL-basic-entry.html 11 | Awesome: awesome-mysql.html 12 | Sponsor: 13 | url: https://wangchujiang.com/#/sponsor 14 | target: __blank 15 | 16 | editButton: 17 | label: Edit this page on GitHub 18 | url: https://github.com/jaywcjlove/mysql-tutorial/blob/master/ 19 | 20 | footer: | 21 | App • 22 | Projects • 23 | Sponsor • 24 | More Apps

25 | Released under the MIT License. Copyright © 2024 Kenny Wong
26 | Generated by idoc v{{idocVersion}} -------------------------------------------------------------------------------- /img/1.4.1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/41e338408f5a622f3255ccfa8d86c50c27111235/img/1.4.1.jpg -------------------------------------------------------------------------------- /img/1.4.2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/41e338408f5a622f3255ccfa8d86c50c27111235/img/1.4.2.jpg -------------------------------------------------------------------------------- /img/1.4.3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/41e338408f5a622f3255ccfa8d86c50c27111235/img/1.4.3.jpg -------------------------------------------------------------------------------- /img/1.4.4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/41e338408f5a622f3255ccfa8d86c50c27111235/img/1.4.4.jpg -------------------------------------------------------------------------------- /img/1.4.5.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/41e338408f5a622f3255ccfa8d86c50c27111235/img/1.4.5.gif -------------------------------------------------------------------------------- /img/2.1_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/41e338408f5a622f3255ccfa8d86c50c27111235/img/2.1_1.jpg -------------------------------------------------------------------------------- /img/2.3.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/41e338408f5a622f3255ccfa8d86c50c27111235/img/2.3.1.png -------------------------------------------------------------------------------- /img/data.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/41e338408f5a622f3255ccfa8d86c50c27111235/img/data.jpg -------------------------------------------------------------------------------- /img/mysql-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaywcjlove/mysql-tutorial/41e338408f5a622f3255ccfa8d86c50c27111235/img/mysql-logo.png -------------------------------------------------------------------------------- /img/mysql-logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /mysql.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mysql-tutorial", 3 | "version": "0.0.1", 4 | "title": "MySQL 入门教程", 5 | "description": "从零开始学习MySQL,主要是面向MySQL数据库管理系统初学者。", 6 | "homepage": "https://jaywcjlove.github.io/mysql-tutorial", 7 | "author": "jaywcjlove", 8 | "license": "MIT", 9 | "private": true, 10 | "scripts": { 11 | "start": "idoc --watch", 12 | "build": "idoc" 13 | }, 14 | "repository": { 15 | "type": "git", 16 | "url": "git+https://github.com/jaywcjlove/mysql-tutorial.git" 17 | }, 18 | "devDependencies": { 19 | "idoc": "^1" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "config:base" 4 | ], 5 | "packageRules": [ 6 | { 7 | "matchPackagePatterns": ["*"], 8 | "rangeStrategy": "replace" 9 | } 10 | ] 11 | } 12 | --------------------------------------------------------------------------------