|
1 |
| - |
2 |
| -启动数据库设置初始密码 |
| 1 | +Docker 安装 MySQL |
3 | 2 | ===
|
4 | 3 |
|
5 |
| -这一小节介绍在Mac OS、Linux、Windows上启动关闭重启MySQL服务,以及部分图形化界面对服务的操控。安装完成后,可以使用 service 命令启动 mysql 服务,在Mac上`service`命令不存在。 |
| 4 | +通过 Docker 搭建 MySQL 数据库环境,同时能同时启动多个 MySQL 版本。在安装前,最好上 [docker](https://hub.docker.com/_/mysql) 官网上看一下 MySQL 的版本,更具具体需求版本安装 MySQL,假设你已经搭建好 Docker 环境下面介绍如何创建一个 MySQL 服务器实例。 |
| 5 | +<!-- TOC --> |
6 | 6 |
|
7 |
| -## 命令行启动关闭重启MySQL服务 |
| 7 | +- [快速启动一个 MySQL 服务器实例](#快速启动一个-mysql-服务器实例) |
| 8 | +- [通过命令行访问 MySQL 容器](#通过命令行访问-mysql-容器) |
| 9 | +- [使用 MySQL 自定义配置文件](#使用-mysql-自定义配置文件) |
| 10 | +- [使用 stack 部署 MySQL](#使用-stack-部署-mysql) |
| 11 | +- [参考资料](#参考资料) |
8 | 12 |
|
9 |
| -在命令行终端启动 MySQL 非常方便,下面大概介绍几个平台通过命令启动服务的方法。 |
| 13 | +<!-- /TOC --> |
| 14 | +## 快速启动一个 MySQL 服务器实例 |
10 | 15 |
|
11 |
| -### 查看服务是否启动 |
| 16 | +下面,我们通过通过 [docker](https://hub.docker.com/_/mysql) 镜像,或者 [MySQL](https://hub.docker.com/r/mysql/mysql-server) 官方镜像,进行快速启动一个实例。 |
12 | 17 |
|
13 | 18 | ```bash
|
14 |
| -# 还可以这么查看,MySQL服务器是否启动 |
15 |
| -ps -ef | grep mysqld |
16 |
| - |
17 |
| -# 查看服务运行的状态 |
18 |
| -service mysqld status |
| 19 | +# Docker 官方镜像 |
| 20 | +$ docker image pull library/mysql:8.0.18 |
| 21 | +# MySQL 官方镜像 |
| 22 | +$ docker image pull mysql/mysql-server:8.0.18 |
19 | 23 | ```
|
20 | 24 |
|
21 |
| -### Mac OS X 下命令操作 |
22 |
| - |
23 |
| -在 Mac 系统下操作起来就非常方便了。安装完之后就可以在终端上运行全局命令 mysql.server 命令,假设这个命令没有,你在系统的MySQL安装目录中找到 mysql.server 命令,运行它是一样的效果。 |
| 25 | +上面命令中 `docker image pull` 是抓取 `image` 镜像的命令。`library/mysql:8.0.18` 是指定镜像仓库的位置和相对应的 `tag` 版本。由于 `Docker` 官方提供的 image 文件,都放在 [`library`](https://hub.docker.com/r/library/) 组里面,所以它的是默认组,可以省略。因此,上面的 Docker 命令可以写成下面这样。 |
24 | 26 |
|
25 | 27 | ```bash
|
26 |
| -mysqld start |
27 |
| -mysql.server start # 1. 启动 |
28 |
| -mysql.server stop # 2. 停止 |
29 |
| -mysql.server restart # 3. 重启 |
| 28 | +# Docker 官方镜像拉取,简写 |
| 29 | +$ docker image pull mysql:8.0.18 |
30 | 30 | ```
|
31 | 31 |
|
32 |
| -当你安装过 MySQL 并没有找到 mysql.server 命令,那这时你需要找到安装目录中的 mysql.server 命令工具了,如 `sudo /usr/local/mysql/support-files/mysql.server start` |
33 |
| - |
34 |
| -### Linux 下命令操作 |
35 |
| - |
36 |
| -Linux生态系统中对服务的操作有点区别。其实在 Mac 系统下也可以直接 `mysqld start` 来启动服务。 |
37 |
| - |
38 |
| -1. 启动:`service mysqld start` |
39 |
| -2. 停止:`service mysqld stop` |
40 |
| -3. 重启:`service mysqld restart` |
41 |
| -3. 查看状态:`service mysqld status` |
42 |
| -4. 查看状态:`systemctl status mysqld.service` |
43 |
| - |
44 |
| -systemctl是一个systemd工具,主要负责控制systemd系统和服务管理器,在 Linux 系统中可以通过它来启动 mysql 服务。 |
45 |
| - |
46 |
| -启动过程中有可能会报错,错误处理,通过 **systemctl status mysqld.service** 和 **journalctl -xe** 命令查看服务启动失败的原因。 |
| 32 | +拉取镜像成功以后,就可以在本机看到这个 `image` 文件了。 |
47 | 33 |
|
48 | 34 | ```bash
|
49 |
| -systemctl status mysqld.service |
50 |
| - |
51 |
| - ● mysqld.service - SYSV: MySQL database server. |
52 |
| - Loaded: loaded (/etc/rc.d/init.d/mysqld) |
53 |
| - Active: failed (Result: exit-code) since 三 2016-11-02 22:14:36 EDT; 11s ago |
54 |
| - Docs: man:systemd-sysv-generator(8) |
55 |
| - Process: 14940 ExecStart=/etc/rc.d/init.d/mysqld start (code=exited, status=1/FAILURE) |
56 |
| - |
57 |
| - 11月 02 22:14:34 localhost.localdomain systemd[1]: Starting SYSV: MySQL database server.... |
58 |
| - 11月 02 22:14:35 localhost.localdomain mysqld[14940]: MySQL Daemon failed to start. |
59 |
| - 11月 02 22:14:35 localhost.localdomain mysqld[14940]: Starting mysqld: [FAILED] |
60 |
| - 11月 02 22:14:36 localhost.localdomain systemd[1]: mysqld.service: control process exited, code=exited status=1 |
61 |
| - 11月 02 22:14:36 localhost.localdomain systemd[1]: Failed to start SYSV: MySQL database server.. |
62 |
| - 11月 02 22:14:36 localhost.localdomain systemd[1]: Unit mysqld.service entered failed state. |
63 |
| - 11月 02 22:14:36 localhost.localdomain systemd[1]: mysqld.service failed. |
| 35 | +$ docker image ls |
64 | 36 | ```
|
65 | 37 |
|
66 |
| -```bash |
67 |
| -# 查看配置文件 my.cnf 的位置 |
68 |
| -whereis my.cnf |
69 |
| -# 输出: my: /etc/my.cnf |
70 |
| - |
71 |
| -# 编辑 |
72 |
| -vi /etc/my.cnf |
73 |
| -``` |
74 |
| - |
75 |
| -里面有个 log_error=/var/log/mysqld.log 的配置,通过命令 **tail -25 /var/log/mysqld.log** 查看 MySQL 错误日志 |
| 38 | +现在,运行这个 image 文件。 |
76 | 39 |
|
77 | 40 | ```bash
|
78 |
| -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) |
79 |
| -2016-01-20T10:00:19.935795Z 0 [ERROR] Can't start server: can't create PID file: No such file or directory |
80 |
| -160120 18:00:20 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended |
| 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 |
81 | 50 | ```
|
82 | 51 |
|
83 |
| -上面日志错误说,MySQL服务在启动的时候,不能创建pid文件。前去看一下 mysqld 文件是否存在,不存在创建 mysqld 目录。 |
84 |
| -
|
85 |
| -```bash |
86 |
| -# 创建 mysqld 目录 |
87 |
| -mkdir -p /var/run/mysqld/ |
88 |
| -
|
89 |
| -# 启动MySQL |
90 |
| -/etc/init.d/mysqld start |
91 |
| -
|
92 |
| -# 输出下面内容 |
93 |
| -# 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. |
94 |
| -# [FAILED] |
95 |
| -``` |
| 52 | +上面命令的各个参数含义如下: |
96 | 53 |
|
97 |
| -创建 mysqld 目录还是启动报错,按照下面命令尝试解决问题 |
| 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` 的意思,就是只读。 |
98 | 61 |
|
99 |
| -```shell |
100 |
| -ls -ld /var/run/mysqld/ |
101 |
| -
|
102 |
| -# mysqld 文件夹如果不存在通过命令创建 |
103 |
| -
|
104 |
| -mkdir /var/run/mysqld |
105 |
| -
|
106 |
| -# 会输出下面内容 |
107 |
| -# drwxr-xr-x. 2 mysql mysql 60 11月 2 22:15 /var/run/mysqld/ |
108 |
| -chown mysql.mysql /var/run/mysqld/ |
109 |
| -/etc/init.d/mysqld start |
110 |
| -``` |
111 |
| -
|
112 |
| -通过查看目录 /var/run/mysqld/ 的属主和属组还是root,mysql并不能在其中创建文件,后修改该目录的属主和属组,启动OK。 |
113 |
| -
|
114 |
| -创建脚本`cat start-mysql.sh`,这个问题每次都会出现,因为Centos7上MySQL5.7.12系统不兼容启动失败, 每次开机后手动执行,或放在定时调度里。 |
115 |
| -
|
116 |
| -```shell |
117 |
| -#!/bin/bash |
118 |
| - |
119 |
| -mkdir -p /var/run/mysqld/ |
120 |
| -chown mysql.mysql /var/run/mysqld/ |
121 |
| - |
122 |
| -/etc/init.d/mysqld start |
123 |
| -``` |
124 |
| -
|
125 |
| -### Windows 下命令操作 |
126 |
| -
|
127 |
| -Windows平台操作起来有点不顺手,个人感觉 Windows 的DOS太难用了,下面简单的介绍一下操作过程。先找到 MySQL 的安装位置,如我的电脑的安装位置是:C:\Program Files\MySQL\MySQL Server 5.7,我就执行这样的操作:开始->运行->输入“cmd”开启命令行,然后输入“C:”。通过命令进入到 MySQL Server 5.7 的 bin 目录下,输入 MySQL 命令行的服务启用命令,如下: |
| 62 | +可以通过 `容器id`/`容器名称` 查看 MySQL 日志 |
128 | 63 |
|
129 | 64 | ```bash
|
130 |
| -# net start [mysql服务名] |
131 |
| -
|
132 |
| -# 启动 mysql 服务 |
133 |
| -net start mysql |
134 |
| -
|
135 |
| -# 停止 mysql 服务 |
136 |
| -net stop mysql |
| 65 | +$ docker logs mysqlname |
137 | 66 | ```
|
138 | 67 |
|
139 |
| -有很多情况可能导致无法启动 MySQL,常见解决方法如下: |
140 |
| -
|
141 |
| -1. 在 CMD 命令中断运行这条命令 C:\Program Files\MySQL\MySQL Server 5.7\bin\mysqladmin-u root -p shutdown 来关闭MYSQL,如果有密码根据提示输入密码即可。 |
142 |
| -2. 在 CMD 命令中断,执行net start mysql启动 MySQL,参考上面方法来启动 MySQL 服务。 |
143 |
| -
|
144 |
| -
|
145 |
| -## 图像界面启动关闭重启MySQL服务 |
146 |
| -
|
147 |
| -### Mac OS X 下操作 |
| 68 | +## 通过命令行访问 MySQL 容器 |
148 | 69 |
|
149 |
| -在 Mac 系统下如果你官方下载安装就可以在`系统偏好设置` > `MySQL` 里面点击 `Stop MySQL Server` 按钮进行启动关闭。 |
150 |
| -
|
151 |
| - |
152 |
| -
|
153 |
| -通过 [XAMMPP](https://www.apachefriends.org/zh_cn/index.html) 安装的 MySQL ,这个软件安装之后会自动安装 Apache + MySQL + PHP 对于初学者特别方便,新版本是默认安装`Apache + MariaDB + PHP + Perl`。 |
154 |
| -
|
155 |
| -### Windows 下操作 |
156 |
| -
|
157 |
| -Windows 系统下启动关闭重启MySQL服务。 |
158 |
| -
|
159 |
| -## 查看初始密码 |
160 |
| -
|
161 |
| -默认情况下MySQL是有个初始密码,知道了初始密码才能改密码。 |
162 |
| -
|
163 |
| -```bash |
164 |
| -[root@localhost home]# grep 'temporary password' /var/log/mysqld.log |
165 |
| -
|
166 |
| -2017-07-17T13:40:11.842835Z 1 [Note] A temporary password is generated for root@localhost: b&iu(sf;>ws |
167 |
| -``` |
168 |
| -
|
169 |
| -## 设置初始化密码 |
170 |
| -
|
171 |
| -启动后我们需要简单配置一下 mysql ,默认安装以后 mysql 的 root 用户是没有密码的,对于生产环境来说,这肯定是不行的,另外还有一些安全相关的设置,可以使用下面这行命令去配置一下,它是一个向导,问你一些问题,你要给出答案,比如是否要设置 root 用户的密码, 密码是什么等等。 |
| 70 | +可以通过[容器名字]或者[容器 ID]进入 MySQL 容器 |
172 | 71 |
|
173 | 72 | ```bash
|
174 |
| -mysql_secure_installation |
175 |
| -
|
176 |
| -Enter current password for root (enter for none): |
177 |
| -# 解释:输入当前 root 用户密码,默认为空,直接回车。 |
178 |
| -
|
179 |
| -Set root password? [Y/n] y |
180 |
| -# 解释:要设置 root 密码吗?输入 y 表示愿意。 |
181 |
| -
|
182 |
| -Remove anonymous users? [Y/n] y |
183 |
| -# 解释:要移除掉匿名用户吗?输入 y 表示愿意。 |
184 |
| -
|
185 |
| -Disallow root login remotely? [Y/n] y |
186 |
| -# 解释:不想让 root 远程登陆吗?输入 y 表示愿意。 |
187 |
| -
|
188 |
| -Remove test database and access to it? [Y/n] y |
189 |
| -# 解释:要去掉 test 数据库吗?输入 y 表示愿意。 |
190 |
| -
|
191 |
| -Reload privilege tables now? [Y/n] y |
192 |
| -# 解释:想要重新加载权限吗?输入 y 表示愿意。 |
193 |
| -
|
| 73 | +$ docker exec -it mysqlname bash |
194 | 74 | ```
|
195 | 75 |
|
| 76 | +## 使用 MySQL 自定义配置文件 |
196 | 77 |
|
197 |
| -你安装成功后,可以查看一下 MySQL 版本,`mysql --version`,如果版本并非你所使用的版本,你可以参考这里进行升级数据库操作[Centos6下升级MySQL数据库](../chapter17/1.2.md)。 |
198 |
| -
|
199 |
| -## 启动报错处理 |
| 78 | +MySQL 的默认配置可以在 `/etc/mysql/my.cnf` 中找到,该目录可以包含附加目录,例如 `/etc/mysql/conf.d` 或 `/etc/mysql/mysql.conf.d`。 请检查 MySQL 镜像本身中的相关文件和目录,以获取更多详细信息。 |
200 | 79 |
|
201 |
| -下面是我尝试在Mac上启动MySQL报错 |
202 |
| -
|
203 |
| -**启动失败** |
| 80 | +如果 `/my/custom/config-file.cnf` 是自定义配置文件的路径和名称,则可以像这样启动 MySQL 容器(请注意,此命令仅使用自定义配置文件的目录路径): |
204 | 81 |
|
205 | 82 | ```bash
|
206 |
| -sudo /usr/local/mysql/support-files/mysql.server start |
207 |
| -Password: |
208 |
| -Starting MySQL |
209 |
| -. ERROR! The server quit without updating PID file (/usr/local/mysql/data/localhost.pid |
| 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 |
210 | 90 | ```
|
211 | 91 |
|
212 |
| -通过日志查看报错信息 |
213 |
| -
|
214 |
| -```bash |
215 |
| -# 编辑配置文件 |
216 |
| -sudo vim /etc/my.cnf |
217 |
| -
|
218 |
| -# 在配置文件最后添加一行错误日志输入的配置 |
219 |
| -log_error = /usr/local/mysql/data/error.log |
220 |
| -``` |
| 92 | +上面命令将启动一个新的容器 `mysqlname`,其中 MySQL 实例使用 `/etc/mysql/my.cnf` 和 `/etc/mysql/conf.d/config-file.cnf` 中的组合启动设置,其中后者的设置优先。 |
221 | 93 |
|
222 |
| -上面添加完成之后,重新启动再查看日志 |
| 94 | +配置修改,可以通过【容器名字】或者【容器 ID】来重启 MySQL,可让配置生效。 |
223 | 95 |
|
224 | 96 | ```bash
|
225 |
| -sudo /usr/local/mysql/support-files/mysql.server start |
226 |
| -tail -100 /usr/local/mysql/data/error.log |
| 97 | +docker restart mysqlname |
227 | 98 | ```
|
228 | 99 |
|
229 |
| -### 日志显示错误一 |
230 |
| -
|
231 |
| -```bash |
232 |
| -2017-01-19T03:48:24.695505Z 0 [ERROR] InnoDB: Unable to lock ./ibdata1 error: 35 |
233 |
| -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. |
234 |
| -``` |
| 100 | +## 使用 stack 部署 MySQL |
235 | 101 |
|
236 |
| -日志显示 mysqld 进程使用相同的InnoDB data 文件或日志文件,通过 `ps -ef | grep mysql | grep -v grep` 查看是否有该进程,发现果然有,这时候你需要杀掉该进程,我在我本地是杀不掉的,于是我尝试使用 mysqld 启动MySQL,启动成功。 |
| 102 | +MySQL 的实例 `stack.yml`,下面实例使用 `root`/`example` 作为 `用户`/`密码` 凭据,`default_authentication_plugin=mysql_native_password` 这个是因 `MySQL 8` 的安全机制升级而需要修改的配置,不配置的话将无法登录管理: |
237 | 103 |
|
238 |
| -```bash |
239 |
| -sudo /usr/local/mysql/bin/mysqld restart |
240 |
| -``` |
| 104 | +```yml |
| 105 | +version: '3.1' |
| 106 | +services: |
241 | 107 |
|
242 |
| -### 日志显示错误二 |
| 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 |
243 | 119 |
|
| 120 | + adminer: |
| 121 | + image: adminer |
| 122 | + restart: always |
| 123 | + ports: |
| 124 | + - 8080:8080 |
244 | 125 | ```
|
245 |
| -[ERROR] InnoDB: The innodb_system data file 'ibdata1' must be writable |
246 |
| -``` |
247 |
| -
|
248 |
| -上面的错误信息说的是 `ibdata1` 文件不可写。`ibdata1` 是InnoDB的共有表空间,默认情况下会把表空间存放在一个文件`ibdata1`中,(此原因会造成这个文件越来越大)。所以大概能猜测是 mysql 用户的权限不够了。所以再给 `ibdata1` 目录分配一下权限即可。 |
249 | 126 |
|
250 |
| -这个时候需要查看一下mysql 安装目录权限。使用 chown 改变了整个 mysql 目录的权限,这是一个非常不好的习惯。 |
| 127 | +通过下面命令运行 `stack`,等待它初始化,然后可以访问 `http://swarm-ip:8080`,`http://localhost:8080`, 或者 `http://host-ip:8080`,web 界面来管理 MySQL,有 web 管理工具是因为,在这个 stack 中我们除了添加了 `db` 的 `mysql` 容器,还添加了个添加了个额外的 `adminer` 容器,对外暴露了 `8080` 端口。 |
251 | 128 |
|
252 | 129 | ```bash
|
253 |
| -cd /usr/local/mysql |
254 |
| -sudo chown -R _mysql:_mysql * |
| 130 | +$ docker stack deploy -c stack.yml mysql |
| 131 | +# 或者使用 docker-compose,方便开发模式下调试。 |
| 132 | +$ docker-compose -f stack.yml up |
255 | 133 | ```
|
256 | 134 |
|
257 |
| -这里需要注意的是,Mac OS系统下,mysql 的用户组和用户名都是 `_mysql`,Linux 是 `mysql`。然后再重启 MySQL 你就完事大吉了。 |
| 135 | +## 参考资料 |
258 | 136 |
|
259 |
| -上面调试定位错误的方法非常有用。我通过这个方法多次解决各种问题。 |
| 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) |
0 commit comments