二进制版
二进制版是官方提供的预先编译好的版本
下载二进制版发行包
创建用户
useradd mysql
初始化
目录:
tar xvfz mysql-8.0.11-el7-x86_64.tar.gz
cd mysql-8.0.11-el7-x86_64
ln -s $PWD /usr/local/mysql
chown -R mysql:mysql /usr/local/mysql
export PATH=$PATH:/usr/local/mysql/bin
mkdir -p /var/log/mariadb
chown -R mysql:mysql /var/log/mariadb
mkdir -p /var/run/mariadb
touch /var/log/mariadb/mariadb.log
chown -R mysql:mysql /var/run/mariadb
数据库:
mysqld --initialize --user=mysql
- 注意这一行日志:
2018-04-25T08:19:15.332554Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: dCa0tyVgN1&o
检查配置
vi /etc/my.cnf
检查一下 /etc/my.cnf 中配置的 datadir 跟初始化时是否一样。
[mysqld]
datadir=/var/lib/mysql
[client]
socket=/var/lib/mysql/mysql.sock
默认的datadir必须改成init的目录。
默认客户端是 /var/lib/mysql.sock方式,因此只能如下方式登录:
mysql -uroot -p --socket=/var/lib/mysql/mysql.sock
所以必须修改默认的客户端访问时使用自定义的sock,应用才可以访问。
配置服务
cp support-files/mysql.server /etc/init.d/mysqld
chmod a+x /etc/init.d/mysqld
chkconfig --add mysqld
chkconfig mysqld on
service mysqld start
如果报错,检查一下 /etc/my.cnf 中配置的 datadir 跟初始化时是否一样。
初始化数据表及权限
mysql_secure_installation
编译安装
如无必要,不要考虑编译安装方式,因为编译很慢,而且一旦遇到依赖冲突,解决起来非常麻烦。
什么是必要?
- 需要修改源码。
- 需要将自己的插件编译进去。
- 需要新版本,包管理器安装的版本太低。
- 二进制版本没有新版,这个一般不太可能,官方一般源码和与编译版本一起发布。
- 某些特别的linux发行版,没有对应的二进制分发包可用。
你想好了?那就开始了。。。。(准备3个小时)
安装依赖
yum install libaio -y
yum install glibc-devel.i686 glibc-devel -y
yum install gcc gcc-c++ cmake boost-devel openssl-devel ncurses-devel -y
编译
tar xvfz mysql-8.0.11.tar.gz
cd mysql-8.0.11
cmake . \
-DDOWNLOAD_BOOST=1 -DWITH_BOOST=/usr/include/boost \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql
# 以下过程非常缓慢
make && make install
后续的步骤和二进制差不多,只是在部分环节出现了一点问题。
创建用户
useradd mysql
初始化
目录:
chown -R mysql:mysql /usr/local/mysql
mkdir -p /var/log/mariadb
chown -R mysql:mysql /var/log/mariadb
export PATH=$PATH:/usr/local/mysql/bin
mkdir -p /var/run/mariadb
touch /var/log/mariadb/mariadb.log
chown -R mysql:mysql /var/run/mariadb
数据库:
mysqld --initialize --user=mysql
在这里我遇到了一个问题:
- 初始化失败:COLLATION 'utf8mb4_0900_ai_ci' is not valid for CHARACTER SET 'utf8'
这个问题在二进制版没有遇到,经过分析,按照下面官网配置修改配置文件:
[mysqld]
character_set_server=latin1
collation_server=latin1_swedish_ci
https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-1.html
重新初始化即可。
经过测试修改为如下也可以:
character-set-server = utf8
collation-server = utf8_general_ci
这样更接近实际情况,不过这个所谓mysql8 新特性的字符集"utf8mb4_0900_ai_ci" 为什么就报错呢?
推测 utf8mb4_0900_ai_ci
对应的字符集不是 utf8
,而是 utf8mb4
,因此最初使用 -DDEFAULT_CHARSET=utf8
参数编译,与mysql8默认使用 utf8mb4_0900_ai_ci
作为 collation字符集是冲突的。
- 我最初测试的时候贱兮兮的添加了一个cmake选项:
-DDEFAULT_CHARSET=utf8
,他正是罪魁祸首。
因此,要么修改默认字符集为 utf8mb4
让它自适应:
-DDEFAULT_CHARSET=utf8mb4 \
要么完整的配置这两个字符集为匹配的关联字符集:
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
配置服务
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chmod a+x /etc/init.d/mysqld
chkconfig --add mysqld
chkconfig mysqld on
service mysqld start
初始化数据表及权限
mysql_secure_installation
编译失败了怎么办?
首先找到原因,或者线索,安装需要的依赖,或者修改需要的环境。
清理现场:
make clean
rm -f CMakeCache.txt
重新来过。
权限问题
mysql 8 的权限管理方式改变了,以前的方式可能不是很好用了。
mysql> create role app_read;
Query OK, 0 rows affected (0.03 sec)
mysql> grant all on *.* to app_read;
Query OK, 0 rows affected (0.07 sec)
mysql> create user root@'%' identified by 'dCa0tyVgN1&o';
彩蛋
如果你只是想看一下mysql8是个什么鬼,可以用docker启动:
docker run -de MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 --name mysql mysql:8.0.11
测试:
docker exec -ti mysql mysql -uroot -p
密码 123456 ,几分钟的事,砖头扔过来。