这两天要帮一个小可爱安装hive.
记得以前安装hive的时候进展比较顺利,在MySql的安装上却遇到过一些问题.
为了到时候操作小可爱电脑时能行云流水,先用自己的虚拟机偷偷的把MySQL安装一遍
机智如我~
把这次安装的详细过程,以及遇到的问题记录下来,分享给大家
本篇博客要点如下:
linux下安装MySql5.7.24
一. 准备工作
1.1 检查是否安装过mysql
rpm -qa | grep mysql
我这台机器没有安装过mysql,所以上述命令输出为空,
否则要执行如下命令删除mysql:
rpm -e --nodeps * #(*为上一个命令输出结果)
1.2 查询并删除所有mysql对应的文件夹
查找所有mysql对应的文件夹
whereis mysql
find / -name mysql # 这里要切换到root账户,否则可能会出现目录没有权限的问题
删除上述的全部文件夹:
rm -rf /etc/selinux/targeted/active/modules/100/mysql /usr/lib64/mysql /usr/share/mysql /usr/lib64/mysql /usr/share/mysql
# 注意 : 对rm -rf命令的使用一定要谨慎!! 建议先在文本编辑器上编辑好,执行时一定要再三确认! 尤其是在生产环境!
确认下mysql相关目录是否清除干净:
find / -name mysql
whereis mysql
1.3.检查mysql用户组和用户是否存在,没有要创建
cat /etc/group | grep mysql
cat /etc/passwd |grep mysql
groupadd mysql
useradd -r -g mysql mysql
1.4.下载linux对应的mysql安装包
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz
# 首先尝试使用wget命令直接下载...
执行如下图 : (速度高达每秒10K, 12小时就可以下载完…)
到这里,我只能说,对不起,打扰了!
接着尝试着去官网下载
mysql官网下载链接, 选择社区版
点击looking for previous GA versions ,下载较早版本
选择好对应的系统和位数,下载框中所示的tar.gz文件
到了这里,需要登录Oracle用户,没有Oracle用户的要填写一大堆信息注册账户,
之后可以真正开始下载,浏览器界面中看到下载状况是这样的:
到这一步,只有长叹一声! 万恶的资本主义,万恶的墙!
这个时候,只能求助于万能的CSDN下载模块,最终通过会员下载权限拿到了安装包
为了照顾既不能翻墙,又没有CSDN会员和积分的童鞋的感受,我把这个tar.gz文件上传到了百度云里.
能够翻墙的小伙伴按照上面的步骤在官网下载即可!
mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz百度网盘链接
提取码 : ixwd
1.5.文件上传
我这里将tar.gz文件上传到了
/opt/module
文件夹下,这里可根据自己的需要和规划自定义设置
在这里插入图片描述
注意 : 如果是使用wget命令,默认文件会下载到执行wget命令的目录下
这个时候,需要在合适的目录执行wget命令
或者使用mv操作,将tar.gz文件移动到合适的位置
二. 正式安装MySQL
2.1. 解压mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz文件
tar -zxvf mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz
解压之后结果如下:
# 将mysql-5.7.24-linux-glibc2.12-x86_64文件夹重明名为mysql
mv /opt/module/mysql-5.7.24-linux-glibc2.12-x86_64 /opt/module/mysql
2.2 在mysql解压目录下新建data目录
mkdir /opt/module/mysql/data
2.3. 更改mysql目录下所有的目录文件及文件夹所属的用户和组,更改文件夹权限
chown -R mysql:mysql /opt/module/mysql
chmod -R 755 /opt/module/mysql
2.4. 编译安装mysql
cd /opt/module/mysql/bin
./mysqld --initialize --user=mysql --datadir=/opt/module/mysql/data --basedir=/opt/module/mysql
运行结果如下图:
请务必记住初始化输出日志末尾的内容(数据库管理员临时密码)!!!我把自己输出日志的文字内容全部截取出来!
2020-04-16T11:25:57.726087Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp serveroption (see documentation for more details).
2020-04-16T11:25:57.726242Z 0 [Warning] 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.
2020-04-16T11:25:57.726257Z 0 [Warning] 'NO_AUTO_CREATE_USER' sql mode was not set.
2020-04-16T11:25:57.735098Z 0 [Warning] ./mysqld: ignoring option '--innodb-file-per-table' due to invalid value '64'
2020-04-16T11:25:58.482391Z 0 [Warning] InnoDB: New log files created, LSN=45790
2020-04-16T11:25:58.639002Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2020-04-16T11:25:58.740607Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 0b96a796-7fd5-11ea-b583-000c29df67f8.
2020-04-16T11:25:58.744135Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2020-04-16T11:25:58.745668Z 1 [Note] A temporary password is generated for root@localhost: fsi%Sg&U<5VY
这里**root@localhost:**后的字符串,我这里是:
fsi%Sg&U<5VY
为mysql管理员临时登录密码
2.5. 编辑配置文件my.cnf
[root@linux01 bin]# vi /etc/my.cnf
修改配置项:
datadir
log-error
pid-file
添加配置项:
sql_mode
max_connections
innodb_file_per_table
lower_case_table_names
basedir
[client]
port
socket
修改后配置如下:
[mysqld]
datadir=/opt/module/mysql/data
#socket=3306
socket=/var/lib/mysql/mysql.sock
basedir=/opt/module/mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
max_connections=400
innodb_file_per_table=64
lower_case_table_names=1
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
[mysqld_safe]
log-error=/opt/module/mysql/log/mariadb/mariadb.log
pid-file=/opt/module/mysql/run/mariadb/mariadb.pid
[client]
port=3306
socket=/var/lib/mysql/mysql.sock
2.6. 创建log-error,pid-file,socket对应目录并赋予权限
mkdir -vp /opt/module/mysql/log/mariadb #递归创建目录
chown -R mysql:mysql /opt/module/mysql/log
chown -R mysql:mysql /opt/module/mysql/log/mariadb
chmod -R 755 /opt/module/mysql/log/mariadb
touch /opt/module/mysql/log/mariadb/mariadb.log
mkdir -vp /opt/module/mysql/run/mariadb #递归创建目录
chown -R mysql:mysql /opt/module/mysql/run
chown -R mysql:mysql /opt/module/mysql/run/mariadb
chmod -R 755 /opt/module/mysql/run
mkdir -vp /var/lib/mysql
chown -R mysql:mysql /var/lib/mysql
2.7. 启动mysql服务器:
/opt/module/mysql/support-files/mysql.server start
出现以下输出证明服务启动成功!
2.8. 添加软连接,并重启mysql服务:
ln -s /opt/module/mysql/support-files/mysql.server /etc/init.d/mysql
ln -s /opt/module/mysql/bin/mysql /usr/bin/mysql
ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock
service mysql restart
2.9 登录mysql,修改密码(密码为步骤2.4生成的临时密码)
mysql -u root -p
set password for root@localhost = password('yourpassword');
2.10 开放远程连接
mysql> use mysql;
mysql> update user set user.Host='%' where user.User='root';
mysql> flush privileges;
2.11 设置开机自动启动
cp /opt/module/mysql/support-files/mysql.server /etc/init.d/mysqld #将服务文件拷贝到init.d下,并重命名为mysqld
chmod +x /etc/init.d/mysqld #赋予可执行权限
chkconfig --add mysqld #添加服务
chkconfig --list # 显示服务器列表
至此,mysql彻底安装成功
三. 安装中遇到的问题
3.1. 启动mysql时报错:
报错1:
[root@linux01 mysql-5.7.24-linux-glibc2.12-x86_64]# /opt/module/mysql/mysql-5.7.24-linux-glibc2.12-x86_64/support-files/mysql.server start
/opt/module/mysql/mysql-5.7.24-linux-glibc2.12-x86_64/support-files/mysql.server:行239: my_print_defaults: 未找到命令
/opt/module/mysql/mysql-5.7.24-linux-glibc2.12-x86_64/support-files/mysql.server: 第 259 行:cd: /usr/local/mysql: 没有那个文件或目录
原因 :编辑配置文件my.cnf时,没有配置basedir属性
解决办法:
[root@linux01 bin]# vi /etc/my.cnf
basedir=/opt/module/mysql/ # 这里根据个人实际情况配置
报错2:
Starting MySQL.2020-04-16T08:30:15.375180Z mysqld_safe error: log-error set to '/var/log/mariadb/mariadb.log', however file don't exists. Createwritable for user 'mysql'.
报错原因:log-error文件夹没有创建或者log-error文件夹mysql用户缺乏相关权限
解决办法:
mkdir /var/log/mariadb
chown -R mysql:mysql /var/log/mariadb
chmod -R 755 /var/log/mariadb
报错3:
[root@linux01 mysql-5.7.24-linux-glibc2.12-x86_64]# /opt/module/mysql/support-files/mysql.server start
Starting MySQL.. ERROR! The server quit without updating PID file (/opt/module/mysql/data/linux01.pid).
a. 首先怀疑mysql进程是否已经启动
ps -ef|grep mysqld
这里并没有查看到mysql相关进程,证明不是该原因导致
b.怀疑是selinux惹的祸,如果是centos系统,默认会开启selinux
vi /etc/selinux/config
# 将SELINUX=enforcing改为SELINUX=disabled,重启服务器
问题仍然没有解决
后面又试了N多种方案, 都没有能够解决问题,失败的方法就不一一列举…
c.根据过往的经验,一般linux出现让人束手无策的问题,都是权限的锅
于是,开始着手相关目录的权限排查, 不排查不知道,一排查吓一跳!!
log目录,run目录的权限居然是root!!罪魁祸首找到了!
原因: 最初执行的赋权命令为:
chown -R mysql:mysql /opt/module/mysql/run/mariadb
chown -R mysql:mysql /opt/module/mysql/log/mariadb
是以root用户的身份执行的,它们的父目录仍然为root权限,也因此导致了mysql启动失败
解决方案 :
chown -R mysql:mysql /opt/module/mysql/log
chown -R mysql:mysql /opt/module/mysql/run
之后重启mysql,启动成功!!
linux使用一定要注意权限问题!!!
linux使用一定要注意权限问题!!!
linux使用一定要注意权限问题!!!
3.2 mysql通过账户名密码登陆报错:
[root@linux01 lib]# mysql -u root -p
Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
这次学聪明,首先考虑是否是权限问题:
chown -R mysql:mysql /var/lib/mysql
赋权后,该问题依然存在.
解决方案,添加client配置项
vi /etc/my.cnf
#添加如下内容
[client]
port=3306
socket=/var/lib/mysql/mysql.sock
和最初的my.cof文件对比下感受下区别
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
添加完之后,再次执行,问题得到解决!