MySQL 8.0 的安装和使用
MySQL 的安装
在 MySQL 官网的下载页上,提供了各种系统和环境的安装方法。你可以选择通过包管理工具的软件源安装,也可以通过源码编译安装。不过编译是非常吃内存的(实测至少需要 4GiB 内存),并且还很耗时(毕竟是 C++ 写的),因此不推荐。具体来说,你可以:
使用包管理工具
以 yum
为例,首先增加并启用 MySQL 软件源,在 Download MySQL Yum Repository 页面找到适合你的版本,然后下载并启用之:1
2
3wget 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
5wget 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_bin
或 utf8mb4_unicode_ci
。1
2
3ALTER 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 屏蔽。嗯,仿佛没有什么问题。