0%

MySQL 8.0 的安装和使用

MySQL 的安装

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

使用包管理工具

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

1
2
3
wget https://dev.mysql.com/get/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 wget https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-boost-8.0.13.tar.gz
tar -xzvf 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 允许个性化设置提示符,在操作数据库时更加方便快捷。可用的参数有:

Option Description
\c A counter that increments for each statement you issue
\D The full current date
\d The default database
\h The server host
\l The current delimiter (new in 5.0.25)
\m Minutes of the current time
\n A newline character
\O The current month in three-letter format (Jan, Feb, …)
\o The current month in numeric format
\P am/pm
\p The current TCP/IP port or socket file
\R The current time, in 24-hour military time (0–23)
\r The current time, standard 12-hour time (1–12)
\S Semicolon
\s Seconds of the current time
\t A tab character
\U Your full user_name@host_name account name
\u Your user name
\v The server version
\w The current day of the week in three-letter format (Mon, Tue, …)
\Y The current year, four digits
\y The current year, two digits
\_ A space
\ A space (a space follows the backslash)
' Single quote
" Double quote
\\ A literal "" backslash character
\x x, for any "x" not listed above

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

启动

完成设置后,重新启动 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 之类的辅助软件。

后记

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

🍭支持一根棒棒糖!
张书樵 微信

微信

张书樵 支付宝

支付宝