在腾讯云 Ubuntu18.04 安装配置 MySQL 5.7(踩坑警告)

前言

和标题一样,本文的主要内容就是在腾讯云 Ubuntu18.04 上安装配置 MySQL 5.7,之所以要写这篇文章是因为前两天和朋友讨论现在的 mysql 设置 root 账户的密码上和以前不一样了而且后续的操作也比以前麻烦了,他不信相信,然后为了向他验证我的说法,我就把我的一台暂时闲置的腾讯云服务器重装了下系统(程序员较起真来就是这么不讲理?)

这不,虽然我证实了我说的,但我也付出了要重新配置我这台服务器的惨痛代价,既然这样倒不如把安装配置的过程记录下。话不多说,我们就开始吧。

环境准备

  • 一台腾讯云服务器
  • 系统环境为Ubuntu 18.04

安装

安装mysql非常简单,只需要执行下面两个命令:

代码语言:javascript
复制
sudo apt-get install mysql-serversudo apt-get install mysql-client

检查MySQL是否运行:

代码语言:javascript
复制
sudo netstat -tap | grep mysql

如果成功安装,我的会显示如下内容:

代码语言:javascript
复制
tcp6       0      0 [::]:1030               [::]:*                  LISTEN      5743/mysqld

顺便在这里提一下*重启/打开/关闭 MySQL *的方法是:

代码语言:javascript
复制
sudo service mysql restart/start/stop

配置

虽然我们可以通过执行两个命令就能很方便的安装好MySQL,但是我在安装过程中并没有出现要我写用户名和密码的地方,这让我一脸懵逼,索性在终端输入 mysql-u root-p之后,要求我输入密码,可是我并不知道密码,心想可能默认密码就是空吧,直接回车不对,随便输入一个密码也不对,终于在查找了很多资料后,我找到了解决方案。

查看初始用户名和密码

查看一个文件

代码语言:javascript
复制
sudo cat /etc/mysql/debian.cnf

在这个文件里面有着MySQL默认的用户名和用户密码, 最最重要的是:用户名默认的不是root,而是debian-sys-maint,如下所示

代码语言:javascript
复制
    # Automatically generated for Debian scripts. DO NOT TOUCH!
[client]

host     = localhost

user     = debian-sys-maint

password = skFz7zS0Fl1t2QHK

socket   = /var/run/mysqld/mysqld.sock

[mysql_upgrade]

host     = localhost

user     = debian-sys-maint

password = skFz7zS0Fl1t2QHK

socket   = /var/run/mysqld/mysqld.sock</code></pre></div></div><p>记下这里的 <strong>user</strong> 和 <strong>password</strong>,然后到终端里输入 <code>mysql-u debian-sys-maint-p</code>,随即会让我们输入密码,此时输入我们刚才记下的密码即可进入 mysql 的shell环境了。</p><h4 id="4f5di" name="%E6%9B%B4%E6%94%B9%E8%AE%BF%E9%97%AE%E8%B4%A6%E6%88%B7%E5%92%8C%E5%AF%86%E7%A0%81">更改访问账户和密码</h4><p>每次都这么登录自然很麻烦,因此先想到了更改root密码:</p><div class="rno-markdown-code"><div class="rno-markdown-code-toolbar"><div class="rno-markdown-code-toolbar-info"><div class="rno-markdown-code-toolbar-item is-type"><span class="is-m-hidden">代码语言:</span>javascript</div></div><div class="rno-markdown-code-toolbar-opt"><div class="rno-markdown-code-toolbar-copy"><i class="icon-copy"></i><span class="is-m-hidden">复制</span></div></div></div><div class="developer-code-block"><pre class="prism-token token line-numbers language-javascript"><code class="language-javascript" style="margin-left:0">mysql&gt; update mysql.user set authentication_string=password(&#39;password&#39;) where user=&#39;root&#39;and Host = &#39;localhost&#39;;</code></pre></div></div><blockquote><p>Tips:这里说明下,在 MySQL 5.7 password字段已从 <code>mysql.user</code>表中删除,新的字段名是 <code>authenticalion_string</code>。</p></blockquote><p>然后你以为在终端输入 <code>mysql-u root-p</code>,然后再输入你刚才设置的密码就可以访问了吗?</p><figure class=""><div class="rno-markdown-img-url" style="text-align:center"><div class="rno-markdown-img-url-inner" style="width:69.78%"><div style="width:100%"><img src="https://cdn.static.attains.cn/app/developer-bbs/upload/1723347080144774346.jpeg" /></div></div></div></figure><p>天真,怎么会那么简单,想要成长,怎么能不被无情的现实蹂躏一番。</p><figure class=""><div class="rno-markdown-img-url" style="text-align:center"><div class="rno-markdown-img-url-inner" style="width:100%"><div style="width:100%"><img src="https://cdn.static.attains.cn/app/developer-bbs/upload/1723347080557390802.jpeg" /></div></div></div></figure><p>可我明明就已经改过密码了,为啥还是登陆不进去。</p><p>于是我又开始在度娘上搜索,终于找到了问题的原因:</p><blockquote><p>原因是因为在最近的Ubuntu安装(当然也可能是其他安装)中,MySQL默认使用了 <code>UNIX auth_socket plugin</code>插件。

简单来说这意味着当 db_users使用数据库时,将会通过系统用户认证表进行认证

你可以通过下面的命令看看你的root用户是否设置成了这样:

代码语言:javascript
复制
    mysql> USE mysql;

mysql&gt; SELECT User, Host, plugin FROM mysql.user;


+------------------+-----------------------+

| User             | plugin                |

+------------------+-----------------------+

| root             | auth_socket           |

| mysql.sys        | mysql_native_password |

| debian-sys-maint | mysql_native_password |

+------------------+-----------------------+</code></pre></div></div><p>如果是这样的话就说明root用户正在使用 <code>auth_socket</code>插件,对于这种问题,有两种解决方案:</p><ol class="ol-level-0"><li>

*设置你的root用户使用 mysql_native_password 插件 *

  • 创建一个与你的系统用户一致的新的数据库用户(推荐)

  • 设置 root 用户使用 mysqlnativepassword 插件

    因为不推荐采用这种方式,所以这里只是给出要执行的命令:

    代码语言:javascript
    复制
        mysql> USE mysql;
    
        mysql> UPDATE user SET plugin='mysql_native_password' WHERE User='root';
    
        mysql> FLUSH PRIVILEGES;
    
        mysql> exit;
    创建一个新用户

    重点来说下这种方式。之所以要新建一个用户,不单单是为了解决修改root账户密码的情况。我们知道,当一个项目的体量上去了,数据库的维护就变得非常重要了,如果发展到一定程度后用户名仍然是root(如果这时候还开通了外网访问),那安全性就会大大降低。况且每个项目的开发人员肯定不止一个,不同coder的权限等级也不一样,能对数据库进行的操作肯定也是不一样的。所以综上所述,我依旧推荐在刚开始安装mysql时就新建一个用户进行配置。

    命令:

    代码语言:javascript
    复制
    CREATE USER 'username'@'host' IDENTIFIED BY 'password';

    说明:

    • username:你将创建的用户名
    • host:指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost,如果想让该用户可以从任意远程主机登陆,可以使用通配符 %
    • password:该用户的登陆密码,密码可以为空,如果为空则该用户可以不需要密码登陆服务器

    举例:

    如果我想创建一个用户名为"lyy",密码为123456,且允许从任意远程主机登陆,可以执行下面这条命令:

    代码语言:javascript
    复制
    CREATE USER 'lyy'@'%' IDENTIFIED BY '123456';
    给新创建的用户授权

    命令:

    代码语言:javascript
    复制
    GRANT privileges ON databasename.tablename TO 'username'@'host'

    说明:

    • privileges:用户的操作权限,如 SELECTINSERTUPDATE等,如果要授予所的权限则使用 ALL
    • databasename:数据库名
    • tablename:表名,如果要授予该用户对所有数据库和表的相应操作权限则可用 *表示,如 *.*

    例子:

    代码语言:javascript
    复制
        GRANT SELECT, INSERT ON test.user TO 'lyy'@'%';
    
    GRANT ALL ON *.* TO &#39;lyy&#39;@&#39;%&#39;;</code></pre></div></div><p>这样我们在回到shell环境中,执行 <code>mysql-u lyy-p</code>然后输入密码就可以进入mysql的shell环境了。</p><blockquote><p></p></blockquote><p>Tips:如果想要更新某个用户的密码只需要执行:</p><div class="rno-markdown-code"><div class="rno-markdown-code-toolbar"><div class="rno-markdown-code-toolbar-info"><div class="rno-markdown-code-toolbar-item is-type"><span class="is-m-hidden">代码语言:</span>javascript</div></div><div class="rno-markdown-code-toolbar-opt"><div class="rno-markdown-code-toolbar-copy"><i class="icon-copy"></i><span class="is-m-hidden">复制</span></div></div></div><div class="developer-code-block"><pre class="prism-token token line-numbers language-javascript"><code class="language-javascript" style="margin-left:0">update user set authentication_string=password(&#39;password&#39;) where user=&#39;username&#39; and host=&#39;host&#39;;</code></pre></div></div><h4 id="3tmri" name="%E8%AE%BE%E7%BD%AE-mysql-%E5%8F%AF%E4%BB%A5%E5%A4%96%E7%BD%91%E8%AE%BF%E9%97%AE">设置 mysql 可以外网访问</h4><p>在使用 mysql 的过程中,我们往往都会使用Navicat等工具对数据库进行可视化管理,这时就需要设置mysql外网访问了。</p><p>设置过程分为两步:</p><ol class="ol-level-0"><li>设置用户可以<strong>从任意远程主机登陆</strong></li><li>修改配置文件,注释掉 <code>bind_ip_address</code></li></ol><p>第一步在上面已经说过了,这里来说下第二步:</p><p>mysql 5.7的配置文件路径在:<code>/etc/mysql/mysql.conf.d/mysqld.cnf</code>,当我们执行 <code>sudo cat/etc/mysql/mysql.conf.d/mysqld.cnf</code>命令时结果如下所示:</p><figure class=""><div class="rno-markdown-img-url" style="text-align:center"><div class="rno-markdown-img-url-inner" style="width:100%"><div style="width:100%"><img src="https://cdn.static.attains.cn/app/developer-bbs/upload/1723347080854460258.jpeg" /></div></div></div></figure><p>在 <code>bind-address</code>前添加 <code>#</code>注释掉该行即可。</p><blockquote><p>Tips:出于安全考虑,如果我们想要修改mysql的启动端口,可以修改上述图片中的 <strong>port</strong> 部分为自己想要的端口号。</p></blockquote><p>在这一切都弄好之后别忘了重新启动下mysql哦?</p><div class="rno-markdown-code"><div class="rno-markdown-code-toolbar"><div class="rno-markdown-code-toolbar-info"><div class="rno-markdown-code-toolbar-item is-type"><span class="is-m-hidden">代码语言:</span>javascript</div></div><div class="rno-markdown-code-toolbar-opt"><div class="rno-markdown-code-toolbar-copy"><i class="icon-copy"></i><span class="is-m-hidden">复制</span></div></div></div><div class="developer-code-block"><pre class="prism-token token line-numbers language-javascript"><code class="language-javascript" style="margin-left:0">sudo service restart mysql</code></pre></div></div><h3 id="9hgjt" name="%E8%BF%9E%E6%8E%A5%E5%88%B0-MySQL">连接到 MySQL</h3><p>这里我们使用 Navicat 连接到mysql,其实步骤很简单,打开软件-&gt;新建链接-&gt;编辑信息就可以了,如下所示:</p><figure class=""><div class="rno-markdown-img-url" style="text-align:center"><div class="rno-markdown-img-url-inner" style="width:100%"><div style="width:100%"><img src="https://cdn.static.attains.cn/app/developer-bbs/upload/1723347081477825296.jpeg" /></div></div></div></figure><p>至于怎么下载安装破解 Navicat 这里就不多说了。</p><h3 id="63ntb" name="%E5%88%A0%E9%99%A4-mysql">删除 mysql</h3><p>最后说下如何卸载 mysql</p><div class="rno-markdown-code"><div class="rno-markdown-code-toolbar"><div class="rno-markdown-code-toolbar-info"><div class="rno-markdown-code-toolbar-item is-type"><span class="is-m-hidden">代码语言:</span>javascript</div></div><div class="rno-markdown-code-toolbar-opt"><div class="rno-markdown-code-toolbar-copy"><i class="icon-copy"></i><span class="is-m-hidden">复制</span></div></div></div><div class="developer-code-block"><pre class="prism-token token line-numbers language-javascript"><code class="language-javascript" style="margin-left:0">    sudo apt-get autoremove --purge mysql-server-5.7
    
    sudo apt-get remove mysql-server
    
    sudo apt-get autoremove mysql-server
    
    sudo apt-get remove mysql-common</code></pre></div></div><p>上面的可能会有些是多余的,之后需要清理残余数据</p><div class="rno-markdown-code"><div class="rno-markdown-code-toolbar"><div class="rno-markdown-code-toolbar-info"><div class="rno-markdown-code-toolbar-item is-type"><span class="is-m-hidden">代码语言:</span>javascript</div></div><div class="rno-markdown-code-toolbar-opt"><div class="rno-markdown-code-toolbar-copy"><i class="icon-copy"></i><span class="is-m-hidden">复制</span></div></div></div><div class="developer-code-block"><pre class="prism-token token line-numbers language-javascript"><code class="language-javascript" style="margin-left:0"> dpkg -l |grep ^rc|awk &#39;{print $2}&#39; |sudo xargs dpkg -P</code></pre></div></div>