MySQL 8.0 的安装和使用

MySQL 的安装

在 MySQL 官网的下载页上,提供了各种系统和环境的安装方法。你可以选择通过包管理工具的软件源安装,也可以通过源码编译安装。不过编译是非常吃内存的(实测至少需要 4GiB 内存),并且还很耗时(毕竟是 C++ 写的),因此不推荐。具体来说,你可以:

使用包管理工具

yum 为例,首先增加并启用 MySQL 软件源,在 Download MySQL Yum Repository 页面找到适合你的版本,然后下载并启用之:

1
2
3
wget https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm #换成适合你的版本
rpm -ivh mysql80-community-release-el7-1.noarch.rpm
yum-config-manager --enable mysql80-community

这样,就可以直接通过 yum 安装 MySQL 服务器了。

1
yum install mysql-community-server

安装完成后,会在 /usr/sbin//usr/bin/ 目录下出现 MySQL 的可执行文件,而 mysqld.service 会自动加载好。MySQL 的配置文件则是 /etc/my.cnf

如果你在使用 macOS,并配置好了 Homebrew:

1
brew install mysql

其它系统也可以使用相应的包管理工具安装。

使用源码编译安装

再次提醒:源码编译安装方式非常麻烦,如果可以的话请使用包管理工具安装。

1
2
3
4
5
wget https://cdn.mysql.com//archives/mysql-8.0/mysql-boost-8.0.13.tar.gz
tar -xzf mysql-boost-8.0.13.tar.gz
cd mysql-boost-8.0.13
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data/mysql -DDOWNLOAD_BOOST=1 -DWITH_BOOST=boost -DSYSCONFDIR=/etc -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DWITH_FEDERATED_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_EMBEDDED_SERVER=1 -DENABLE_DTRACE=0 -DENABLED_LOCAL_INFILE=1 -DDEFAULT_CHARSET=utf8mb4 -DEXTRA_CHARSETS=all
make && make install

这里的 -DCMAKE_INSTALL_PREFIX-DMYSQL_DATADIR 参数指定了 MySQL 的安装目录和数据文件存储目录。

MySQL 的配置

为了正确地让 PHP 链接 MySQL 数据库,在 /etc/my.cnf 中,配置以下内容:

1
2
3
4
5
6
7
8
9
[mysqld]
datadir=/data/mysql
socket=/tmp/mysql.sock

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[client]
socket=/tmp/mysql.sock

这里的 datadir 是数据文件存储目录,请确保用户 mysql 对其拥有访问权限。如果是覆盖升级安装,需要确保它与之前版本 MySQL 使用的目录相同。
而 socket 是 UNIX 套接字,使用它的地方要保持一致。具体来说,你需要保证:

  • /etc/my.cnf 中,[mysqld] 下的 socket
  • /etc/my.cnf 中,[client] 下的 socket
  • php.ini 中,[Pdo_mysql] 下的 pdo_mysql.default_socket
  • php.ini 中,[MySQLi] 下的 mysqli.default_socket

这四个值是一致的。而之所以选择 /tmp/mysql.sock,是因为 PHP 默认的 MySQL 套接字在这个位置,配置好 my.cnf 就行,而不用修改 PHP 的配置(即 php.ini 中的对应项留空即可,会采用默认值);如果用了其他的目录,就需要修改 php.ini
php.ini 根据你的安装方式,可能出现在 /etc/usr/local/php 下的某个位置,可以自行处理。
为了优化 MySQL,还可以在 /etc/my.cnf 中增加如下设置:

1
2
3
4
5
6
7
8
[mysql]
no-auto-rehash
connect_timeout=2
prompt="MySQL [\\d]> "

[mysqldump]
quick
max_allowed_packet = 500M

其中,[mysql] 下的 prompt 参数允许个性化设置提示符,用于在操作数据库时给出相关信息。可用的参数见 mysql Client Commands 对 prompt 的介绍。

这里配置的 \d 将会显示当前的数据库名。

启动

完成设置后,重新启动 mysqld 即可:

1
systemctl restart mysqld

如果是 macOS 上使用 Homebrew 安装的,需要使用 mysql.server start 命令手动开启 MySQL 服务。可以通过运行 lsof -i:3306 查看 MySQL 是否正确工作在 3306 端口。
如果你是初次登陆,通过以下方式查看临时 root 密码:

1
grep 'temporary password' /var/log/mysqld.log

然后执行

1
mysql -u root -p

按回车后输入密码,即可登录。如果你登录后设置了新的 root 密码,一定要记住。
除此之外,如果要直接登录某个数据库,执行:mysql -h host -u user -p dbname
而如果是升级安装的,需要先执行 mysql_upgrade -u root -p 来升级数据库。

MySQL 命令

以下所有命令均需要以 ; 结尾,大小写取决于系统设置。

  • 显示版本:SHOW VARIABLES LIKE "%version%";
  • 查看所有的库:SHOW DATABASES;
  • 创建数据库:CREATE DATABASE dbname;
  • 删库:DROP DATABASE dbname;
  • 跑路:略
  • 使用某个库:USE dbname;
  • 查看库有哪些表:SHOW TABLES;
  • 查看表的列:DESCRIBE tablename;
  • 创建表需要用 CREATE TABLE 并指定数据结构
  • 删除某个表:DROP TABLE tablename
  • 添加用户:CREATE USER 'username'@'host' IDENTIFIED BY 'password';
  • 删除用户:DROP USER 'username'@'host';
  • 显示用户信息:SELECT User, Host FROM mysql.user;
  • 授权:GRANT SELECT, UPDATE ON dbname.* TO 'username'@'host' WITH GRANT OPTION;
  • 所有权限:GRANT ALL ON dbname.* TO 'username'@'host' WITH GRANT OPTION;
  • 刷新权限:FLUSH PRIVILEGES;
  • 退出:QUIT;

MySQL 8.0 的用户授权和之前有所区别,老版本的常用授权语句在 8.0 中会报错。
在执行命令时,如果数据库名、表名等包含特殊字符,例如 - 等,要避免出现语法错误。例如:

1
DROP DATABASE hello-world;

直接这样输入会造成问题,正确做法是:

1
DROP DATABASE `hello-world`;

如果对这些命令不熟悉,也可以安装 phpMyAdmin 之类的辅助软件。

此外,要向数据库中插入 Emoji 表情符号,需要先切换到 utf8mb4_binutf8mb4_unicode_ci

1
2
3
ALTER DATABASE dbname CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE tablename CHANGE columnname VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

后记

MySQL8.0 是 MySQL5.7 的后继版本,这次更新带来了许多新特性,比如更好的字符集支持、降序排列的优化等 —— 官方宣传性能提高了 2 倍。
当然,版本号从 5.7 之间跨越到了 8.0 确实是一次大飞跃,要知道这本来是属于 MySQL5.8 的位置。PHP 6、Windows 9 和 iPhone 9 点了个赞,Sketch 和 Java 笑而不语。
除此之外,这样还有一个好处是,避免版本 6.4 被 GFW 屏蔽。嗯,仿佛没有什么问题。