Ubuntu 20.04安装MySQL 8.0.20记

很久没手工装过MySQL了,诸如AppNode这样的服务器面板很好的帮助开发人员屏蔽了琐碎的底层环境配置问题。不过AppNode支持的系统版本都很老了,其他面板又用不惯,于是打算手工安装一次环境尝鲜下新版本。

不夸张的说,我为了装一个MySQL昨天晚上从12点折腾到凌晨3点,今天早上11点起来又折腾到13点……于是今天打算把遇到的坑总结一下,免得后人再踩进来。

坑一

Ubuntu 20.04下安装mysql-server的过程中是不会要求输入root密码的,root密码被设置成了什么至今我也没弄明白。

看到网上教程以及官方文档都说安装过程中会生成一个默认密码,并被保存在错误日志里,然而我仔细翻过,发现并没有。

于是乎打算强制修改root密码,由此引出了坑二……

正确的查看管理密码的方式是:

sudo cat /etc/mysql/debian.cnf

上述文件的内容是:

可以看到user字段就是管理员用户名,password当然就是默认密码了。这个debian-sys-maint账号是Debian系Linux下MySQL的默认管理账号。

直接使用这个账号登录MySQL就可以愉快的玩耍了,如果你和我一样不幸的按照网上的坑比文章强制重设了root密码,请看“坑二”。

坑二

当时为了重置root密码,在网上搜了很多文章,大部分都是教要在/etc/mysql/my.cnf中添加skip-grant-tables;选项来跳过密码登录。

如果你这么做了,恭喜你,你完蛋了。

根据一篇台湾同胞写的文章来看,这个选项会修改mysql的用户表,造成不可预知的问题。

其具体表现的症状就是你在修改完root密码并登陆后,执行show databases;命令会弹出如下报错:

ERROR 1449 (HY000): The user specified as a definer ('mysql.infoschema'@'localhost') does not exist

这个报错着实让我头疼了一阵,谷歌搜、百度搜、官网搜,得出的结论无非就是执行mysql_upgrade -u root -p命令,尝试升级/var/lib/mysql下的数据库文件。

可是,这个命令在MySQL 8.0.16中已经被废弃了……执行后会出现如下提示:

Enter password: 
The mysql_upgrade client is now deprecated. The actions executed by the upgrade client are now done by the server.
To upgrade, please start the new MySQL binary with the older data directory. Repairing user tables is done automatically. Restart is not required after upgrade.
The upgrade process automatically starts on running a new MySQL binary with an older data directory. To avoid accidental upgrades, please use the --upgrade=NONE option with the MySQL binary. The option --upgrade=FORCE is also provided to run the server upgrade sequence on demand.
It may be possible that the server upgrade fails due to a number of reasons. In that case, the upgrade sequence will run again during the next MySQL server start. If the server upgrade fails repeatedly, the server can be started with the --upgrade=MINIMAL option to start the server without executing the upgrade sequence, thus allowing users to manually rectify the problem.

当然,更可笑的是,我压根没执行过数据库服务器的升级,为何要去升级数据库文件……

要解决这个问题,就得把整个MySQL完全卸载,并删除/var/lib/mysql目录,重新安装后再通过“坑一“中介绍的方式来查看管理员账号。

如果你必须要用root用户,可以使用这个命令重置其密码:sudo mysql_secure_installation

MySQL基本命令介绍

关于本篇文章:
本文中只包含最常用的MySQL命令,也是应该全部掌握的MySQL命令,我将以一个简单的案例来对这些命令做简要说明。
MySQL介绍:
MySQL是优秀的开源关系型数据库,最初由瑞典MySQL AB 公司开发,目前属于Oracle旗下产品。
基本数据库管理命令介绍:
注:以下内容中的“mysql>”为MySQL客户端的命令提示符标志。另外,MySQL命令建议使用大写字母来书写,因为我个人习惯的问题,本篇文章中采用小写。
创建一个名为db_name的数据库。

mysql>create database db_name;

查看当前已存在的数据库。

mysql>show databases;

MySQL返回信息:

创建一个新用户,user_name,密码为ibadboy.net。

mysql>create user user_name@localhost identified by "ibadboy.net";

设置用户权限,使其对db_name数据库拥有全部权限。

mysql>grant all privileges on db_name.* to user_name@localhost identified by "ibadboy.net";

查看刚刚添加的用户。

mysql>select host,user from mysql.user;


查看user_name用户所拥有的权限。

mysql>show grants for user_name@localhost;


使用新添加的user_name用户重新登录数据库 。

[root@localhost ~]# mysql -u user_name -p

选择db_name数据库,其后的建表查表以及插入数据等操作都会在此数据库下进行。

mysql>use db_name;

创建一个名为user的表,其拥有三个字段,分别是ID(int型)、name(char型)、password(char型),其中ID是主键且可自增。

mysql>create table user(ID int auto_increment primary key,name char(10),password char(64));

查看数据库中已有的表。

mysql>show tables;

MySQL返回信息:

查看user表的结构。

mysql>desc user;

MySQL返回信息:

向user表中插入两行数据。

mysql>insert into user values(0,'myuser1','123456'); 
mysql>insert into user values(1,'myuser2','654321');

查看user表中所有字段的数据。

mysql>select * from user;

MySQL返回信息:

只查看user表中的name字段的数据。

mysql>select name from user;

MySQL返回信息:

更新user表中的name字段中的“myuser1”为“admin”,where关键字后面是替换条件。

mysql>update user set name='admin' where name='myuser1';

再次查看user表中的name字段发现“myuser1”已变为“admin”。

向user表中插入字段sex(varchar型)。

mysql>alter table user add sex varchar(6);

查看user表的表结构,可以发现,sex字段已加入其中。

查看user表中的数据。

此时,在之前插入的两行数据中,sex字段的值都是NULL(空值),现在我分别在其中插入“male”和“female”两个值。这里以主键“ID”来作为替换条件,以此达到只修改sex字段在某一行的值的效果。

mysql>update user set sex='male' where ID=0;
mysql>update user set sex='female' where ID=1;

查询user表中sex字段的值,已经变成了预想的样子。

在user表的“password”字段的后面插入一个字段“age”,类型为int。其中,after关键字后面指定的是新加字段要跟随的字段。

mysql>alter table user add age int after password;

查看user表的表结构,age字段已添加至指定位置。

基本的数据库操作就这些,下面我将一步步的删除掉我们刚刚添加的字段、表及数据库。
先删除“age”字段。

mysql>alter table user drop column age;

查看表结构,字段已删除。

删除user这个数据表。

mysql>drop table user;

查看数据库中已有的表,因数据库已空,所以这里没有列出任何内容。

删除db_name数据库。

mysql>drop database db_name;

查看当前已存在的数据库,发现此时db_name已被删除。

切换到MySQL的root用户身份上,删除user_name用户。

mysql>drop user user_name@localhost