CentOS安装MySQL8

CentOS7.9源码编译安装MySQL8.0.35

操作系统版本:

[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
[root@localhost ~]# uname -a
Linux localhost.localdomain 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

安装mysql8数据库v8.0.35,无法用yum源安装的相关依赖有cmake-3.27.0、gcc8.3.1

注意:

源码安装mysql,其中两个版本对编译环境有要求

  1. mysql从5.5版本开始,不再使用./configure编译,而是使用cmake编译器。

  2. mysql从8.0.35版本开始,要求cmake的版本是cmake3以上

  3. centos7.6默认安装的是cmake2.8.12.2和gcc4.8.5,这是为考虑向下兼容centos6.2及稳定性,但对编辑安装mysql8.0.35会形成阻碍,所以安装前建议升级cmake到cmake3以上(最新为3.14),并以scl软件集(Software Collections)的方式临时切换为高版本的gcc8.3.1完成mysql编辑(本文会分别讲述此两项)

  4. 务必记得先删除mariadb相关内容,尤其要删除/etc/my.cnf文件,mysql启动时会默认加载该配置文件,导致在安装参数里的设置无效,会默认加载原系统自带的mariadb目录,然后引发一系列的错误

  5. 请仔细查看mysql的cmake预编译参数以及正确正确的mysql源码包,很多同学在这里乱来
    mysql8.0官方编译参数:
    https://dev.mysql.com/doc/refman/8.0/en/source-configuration-options.html

​ mysql-8.0.35.tar.gz源码包下载地址:
https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-boost-8.0.35.tar.gz
在这里插入图片描述

准备工作

1、安装wget,用wget下载相应安装包,卸载centos自带的mariadb

[root@localhost ~]# yum remove mariadb
[root@localhost ~]# yum install -y wget
[root@localhost ~]# wget https://cmake.org/files/v3.27/cmake-3.27.0.tar.gz
[root@localhost ~]# wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-boost-8.0.35.tar.gz

2、安装基本依赖包,先用yum安装cmake、automake 、autoconf ,另MySQL 8.x需要最少安装的包有:bison,gcc、gcc-c++、ncurses-devel、openssl-devel

[root@localhost ~]# yum install vim lsof lrzsz nmap screen nmap epel-release cmake make gcc gcc-c++ autoconf bison automake openssl openssl-devel zlib* fiex* libxml* ncurses-devel libmcrypt* libtool-ltdl-devel* -y

3、安装环境要求:gcc5.3及以上版本,cmake3.75以上版本(本文用gcc8.3.1和cmake3.27.0)

官方文档说明及截图如下
https://dev.mysql.com/doc/refman/8.0/en/source-installation.html
查看当前 gcc 版本,显示yum默认安装的是gcc4.8.5,由于旧版本gcc对各种c语言特性不支持
[root@mysql8035 ~]# gcc -v

安装gcc8.3.1,这里介绍使用scl软件集(Software Collections)实现多个gcc版本之间的灵活切换

1、安装scl源
[root@localhost ~]# yum install centos-release-scl -y
2、列出scl有哪些源可以用
[root@localhost ~]#  yum list|grep gcc
3、安装8.3.1版本的gcc、gcc-c++、gdb,当前CentOS7支持3,4,6,7,8五个版本,分别对应GCC4.9,GCC5.3,GCC8.3.1,GCC7.3,,GCC8.2,用户可以根据自己的需要选择安装哪一个版本,本文安装GCC8.3.1
[root@localhost ~]# yum install devtoolset-8-gcc* -y
4、临时切换gcc为新版本有两个命令(source /opt/rh/devtoolset-8/enable或scl enable devtoolset-8 bash)
[root@localhost ~]# source /opt/rh/devtoolset-8/enable
[root@localhost ~]# gcc -v
gcc version 8.3.1 20190311 (Red Hat 8.3.1-3) (GCC)

至此,gcc已显示为8.3.1版本,若要在启动的时候就生效,可以放置到~/.bashrc之中即可

只要make编译通不过,请检查当前的gcc版本(命令:gcc -v),版本要求5.3以上(※ 非常重要)

4、升级cmake2为cmake3以上

yum默认安装2.8.12.2,编译mysql8.0.35会提示以下错误:

-- Running cmake version 2.8.12.2
CMake Warning at CMakeLists.txt:43 (MESSAGE):
 Please use cmake3 rather than cmake on this platform
-- Please install cmake3 (yum install cmake3)
CMake Error at CMakeLists.txt:55 (CMAKE_MINIMUM_REQUIRED):
 CMake 3.4.3 or higher is required. You are running version 2.8.12.2
-- Configuring incomplete, errors occurred!

更新cmake,先用yum移除原cmake

[root@localhost ~]#  yum remove cmake  -y
[root@localhost ~]# tar -zxvf cmake-3.27.0.tar.gz
[root@localhost ~]# cd cmake-3.27.0
[root@localhost cmake-3.27.0]# ./bootstrap
[root@localhost cmake-3.27.0]# gmake && gmake install
[root@localhost cmake-3.27.0]# /usr/local/bin/cmake  --version
cmake version 3.27.0

显示的版本号为cmake version 3.27.0,再建立软连接[cmake更新完毕]

[root@localhost cmake-3.27.0]# ln -s /usr/local/bin/cmake /usr/bin/

mysql的安装步骤:

mysql目录配置如下:

安装路径:/usr/local/mysql
数据库路径:/var/lib/mysql
源码包存放位置:/root/

[root@localhost ~]# tar -zxvf mysql-8.0.35.tar.gz
[root@localhost ~]# mkdir -p /usr/local/mysql
[root@localhost ~]# mkdir  -p /var/lib/mysql
[root@localhost ~]# cd mysql-8.0.35
[root@localhost mysql-8.0.35]# mkdir -p build
[root@localhost mysql-8.0.35]# cd build
[root@localhost build]# cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DSYSCONFDIR=/usr/local/mysql -DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_unicode_ci -DWITH_SSL=system -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_PERFSCHEMA_STORAGE_ENGINE=1  -DWITH_MYISAM_STORAGE_ENGINE=1    -DWITH_INNODB_MEMCACHED=ON -DENABLED_LOCAL_INFILE=ON -DMYSQL_TCP_PORT=3306 -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/root/mysql-8.0.35/boost/boost_1_77_0/  -DMYSQL_DATADIR=/var/lib/mysql
[root@localhost build]# make -j 4  && make install

执行多任务并发编译安装,make -j x(x为任务数)


※ 部分编译参数特别说明
-DDOWNLOAD_BOOST=1 -DWITH_BOOST=/tmp
若mysql编译时未加入上述参数,会报错如下:
报错:CMake Error at cmake/boost.cmake:101 (MESSAGE): You can download it with -DDOWNLOAD_BOOST=1 -DWITH_BOOST=<directory>
-DDOWNLOAD_BOOST=1,表示系统会自动下载解压boost,若已下载,请将该参数置0

mysql的配置步骤:

1、创建mysql用户组(查看mysql.mysql的用户及组是否存在,不存在就创建)
[root@localhost ~]# cat /etc/passwd |grep mysql
[root@localhost ~]# groupadd mysql
[root@localhost ~]# useradd mysql -g mysql -s /sbin/nologin
[root@localhost ~]# cat /etc/passwd |grep mysql
mysql:x:1000:1000::/home/mysql:/sbin/nologin
2、将mysql目录赋予mysql用户的执行权限
[root@localhost ~]# chown mysql.mysql -R /usr/local/mysql
[root@localhost ~]# chown mysql.mysql -R /var/lib/mysql
3、初始化mysql,会生成root初始化密码,注意保存
[root@localhost ~]# /usr/local/mysql/bin/mysqld --initialize --user=mysql
4、启动mysql

修改错误日志路径:

cat /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

[mysqld_safe]
log-error=/usr/local/mysql/mysql-error.log
pid-file=/usr/local/mysql/mysqld.pid

创建文件并授权:

[root@localhost ~]# touch /usr/local/mysql/mysql-error.log
[root@localhost ~]# chown mysql.mysql /usr/local/mysql/mysql-error.log
[root@localhost ~]# /usr/local/mysql/bin/mysqld_safe --user=mysql & 
[root@localhost ~]# /usr/local/mysql/bin/mysql -uroot -h127.0.0.1 -p'临时密码'
# 修改root 密码为 614513
mysql> alter user 'root'@'localhost' identified by "614513";
mysql> show databases;
# 添加mysql远程登录账号
mysql> create user root@'%' identified by '614513';
Query OK, 0 rows affected (0.02 sec)
mysql> grant all privileges on *.* to root@'%';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
# 查看目前的帐号,有%的root账号表示远程登录账号配置成功
mysql> select user,host from mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| root             | %         |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
5 rows in set (0.01 sec)

5、配置为系统服务并加入开机启动
[root@localhost ~]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
[root@localhost ~]# chmod 755 /etc/init.d/mysqld
[root@localhost ~]# chkconfig --list|grep mysqld
[root@localhost ~]# chkconfig mysqld on
[root@localhost ~]# chkconfig --list|grep mysqld
mysqld          0:关    1:关    2:开    3:开    4:开    5:开    6:关

mysqld已加入系统服务,设置为开机自启动

通过服务启动数据库:

[root@localhost ~]# systemctl start mysqld

通过服务停止数据库:

[root@localhost ~]# systemctl stop mysqld

查看数据库服务状态

[root@localhost ~]# systemctl status mysqld.service

配置系统环境变量:

[root@localhost mysql]# tail -n 1 /etc/profile
export PATH="/usr/local/mysql/bin:$PATH"
[root@localhost mysql]# source /etc/profile

至此,mysql安装配置结束!

在防火墙中开启mysql的3306的远程访问,这样就可以使用navicat等工具连上mysql

[root@localhost ~]# firewall-cmd --zone=public --add-port=3306/tcp --permanent
Warning: ALREADY_ENABLED: 3306:tcp
success

重新载入,使修改立即生效(每次修改都执行该命令)

[root@localhost ~]# firewall-cmd --reload

查看所有打开的端口

[root@localhost ~]# firewall-cmd --zone=public --list-ports

查看指定的端口是否打开

[root@localhost ~]# firewall-cmd --permanent --query-port=3306/tcp 

删除指定的端口

[root@localhost ~]# firewall-cmd --zone= public --remove-port=3306/tcp --permanent

mysql8.0官方编译参数的英文文档简单翻译说明一下:
https://dev.mysql.com/doc/refman/8.0/en/source-configuration-options.html
The InnoDB, MyISAM, MERGE, MEMORY, and CSV engines are mandatory (always compiled into the server) and need not be installed explicitly. (说明:mysql默认支持的数据库引擎有InnoDB,MyISAM, MERGE, MEMORY, CSV,无需在编译时再声明)

所以上面的编译条件省掉了如下行
-DWITH_MYISAM_STORAGE_ENGINE=1
-DWITH_MEMORY_STORAGE_ENGINE=1
-DWITH_INNOBASE_STORAGE_ENGINE=1 \

相关错误处理
\1. CMake Error: The source directory “/xxx/mysql-8.0.35” does not appear to contain CMakeLists.txt
解决:下载的mysql版本有问题。应下载:选择Source Code

\2. mysql8源码编译运行CMake,提示Please do not build in-source. Out-of source builds are highly recommended,提示不要在源文档中cmake

解决:在源文档中建个子目录来执行cmake即可(本例中建立了build目录),不在源目录中cmake是良好的习惯。

\3. CMake Error at cmake/ssl.cmake:68 (MESSAGE): Please install the appropriate openssl developer package

解决:yum install ncurses-devel 和 yum install openssl-devel

问题:

mysql 中为 datetime 类型的字段有时候想插入默认值:0000-00-00 00:00:00,但是却报错无效的值插入

在配置文件my.cnf中 (CentOS7操作系统 路径:/etc)

#8.0以下
[mysqld]
sql_mode='NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,PIPES_AS_CONCAT,ANSI_QUOTES'
#8.0以上
#已经取消了NO_AUTO_CREATE_USER这个关键字,删掉sql语句中的这个关键字即可
[mysqld]
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'
#重启mysql服务,ok
sql_mode常用值如下: 

ONLY_FULL_GROUP_BY:对于GROUP BY聚合操作,如果在 SELECT 中的列,没有在 GROUP BY 中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中。

NO_AUTO_VALUE_ON_ZERO:该值影响自增长列的插入。默认设置下,插入0或NULL代表生成下一个自增长值。如果用户 希望插入的值为0,而该列又是自增长的,那么这个选项就有用了。

STRICT_TRANS_TABLES:在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做限制

NO_ZERO_IN_DATE:在严格模式下,不允许日期和月份为零

NO_ZERO_DATE:设置该值,mysql数据库不允许插入零日期,插入零日期会抛出错误而不是警告。

ERROR_FOR_DIVISION_BY_ZERO:在INSERT或UPDATE过程中,如果数据被零除,则产生错误而非警告。如 果未给出该模式,那么数据被零除时MySQL返回NULL

NO_AUTO_CREATE_USER:禁止GRANT创建密码为空的用户

NO_ENGINE_SUBSTITUTION:如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常

PIPES_AS_CONCAT:将"||"视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,也和字符串的拼接函数Concat相类似

ANSI_QUOTES:启用ANSI_QUOTES后,不能用双引号来引用字符串,因为它被解释为识别符
1. ALLOW_INVALID_DATES - 允许插入无效日期(如'0000-00-00')。
2. ANSI_QUOTES - 激活ANSI_QUOTES模式,使双引号成为标识符引用的有效字符。 默认情况下,mysql使用单引号将字符串引起来,使用双引号将标识符引号起来。
3. ERROR_FOR_DIVISION_BY_ZERO - 除以零时抛出错误而不是警告。
4. HIGH_NOT_PRECEDENCE - 将NOT运算符视为具有高优先级。
5. IGNORE_SPACE - 忽略空格,多个关键字之间的任何空格都被视为一个空格。
6. NO_AUTO_CREATE_USER - 禁止GRANT创建新用户。
7. NO_AUTO_VALUE_ON_ZERO - 当插入的值为0时,不要将自增量列自动设置为1。
8. NO_BACKSLASH_ESCAPES - 禁用反斜杠(\)作为转义字符。
9. NO_ENGINE_SUBSTITUTION - 如果指定的存储引擎不存在,则引发错误,而不是使用默认的存储引擎。
10. NO_UNSIGNED_SUBTRACTION - 禁止将无符号数减去大于或等于零的数,否则会返回一个无符号结果。
11. ONLY_FULL_GROUP_BY - 如果SELECT语句中包含GROUP BY子句,则必须在SELECT列表中显式命名所有非聚合列。
12. PAD_CHAR_TO_FULL_LENGTH - 使用CHAR类型时,自动填充字符串值的剩余空间。
13. PIPES_AS_CONCAT - 将竖杠符号(|)视为字符串连接运算符而不是按位或运算符。
14. REAL_AS_FLOAT - 将REAL数据类型视为FLOAT数据类型。
15. STRICT_ALL_TABLES - 启用所有严格模式选项(等同于STRICT_TRANS_TABLES,STRICT_WRITE_TABLES和STRICT_PARTITION_ENGINE)。
16. STRICT_TRANS_TABLES - 在对非事务表进行更新或插入操作时强制执行与SQL标准一致的错误检查,并将警告转换为错误。
17. STRICT_WRITE_TABLES - 当对MyISAM表进行更新或插入操作时强制执行与SQL标准兼容的错误检查,并将警告转换为错误。
18. TIME_TRUNCATE_FRACTIONAL - 精度低于毫秒的时间类型(如TIME、DATETIME、TIMESTAMP)插入时,忽略时间分数部分。
19. TRADITIONAL - 完全按照SQL标准执行选项,禁用全部非标准功能。
——————————————

说明介绍完了,但是在8.0中这么设置下依然会报错,原因如下:

ERROR 1231 (42000): Variable 'sql_mode' can't be set to the value of 'NO_AUTO_CREATE_USER'

8.0以上已经取消了NO_AUTO_CREATE_USER这个关键字,删掉sql语句中的这个关键字即可

误。
17. STRICT_WRITE_TABLES - 当对MyISAM表进行更新或插入操作时强制执行与SQL标准兼容的错误检查,并将警告转换为错误。
18. TIME_TRUNCATE_FRACTIONAL - 精度低于毫秒的时间类型(如TIME、DATETIME、TIMESTAMP)插入时,忽略时间分数部分。
19. TRADITIONAL - 完全按照SQL标准执行选项,禁用全部非标准功能。
——————————————

说明介绍完了,但是在8.0中这么设置下依然会报错,原因如下:

ERROR 1231 (42000): Variable ‘sql_mode’ can’t be set to the value of ‘NO_AUTO_CREATE_USER’

8.0以上已经取消了NO_AUTO_CREATE_USER这个关键字,删掉sql语句中的这个关键字即可


  • 22
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BugSir000

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值