在centos7.4下安装 mysql 5.7.25
前言
在部署linux数据库的,往往因为客户有指定版本的要求,或者有软件安装的审计的需要制定对应的版本号, 我也遇到客户必须制定的mysql的版本的要求,mysql 版本号为v5.7.25。
mysql安装
环境检查
检查是否安装了mysql
rpm -qa| grep -i mysql
如有,类似
mysql-libs-5.1.52-1.el6_0.1.x86_64
卸载之
如果已经安装了mysql,先关闭mysql服务
killall mysqld
rpm -e --nodeps mysql-libs-5.1.52.x86_64
检查否存在 mariadb
数据库,如有,卸载之,卸载同上
rpm -qa | grep mariadb
彻底卸载mysql
如果已经安装了mysql
killall mysqld
使用 find / -name mysql
查找出所有的mysql删除对应的文件夹
查找结果如下:
[root@SZDC04291 soft]# find / -name mysql
/run/lock/subsys/mysql
/etc/linux/targeted/active/modules/100/mysql
/usr/lib64/mysql
/usr/local/mysql
/home/app/soft/mysql-5.7.25-linux-glibc2.12-x86_64/bin/mysql
/home/app/soft/mysql-5.7.25-linux-glibc2.12-x86_64/include/mysql
/mysql
/mysql/bin/mysql
/mysql/include/mysql
/data/mysqldata/mysql
删除对应的mysql目录
[root@SZDC04291 soft]# rm -rf /run/lock/subsys/mysql*
[root@SZDC04291 soft]# rm -rf /etc/lib/linux/targeted/active/modules/100/mysql*
[root@SZDC04291 soft]# rm -rf /usr/lib64/mysql*
[root@SZDC04291 soft]# rm -rf /usr/local/mysql/*
[root@SZDC04291 soft]# rm -rf /mysql/*
[root@SZDC04291 soft]# rm -rf /mysql/bin/mysql/*
[root@SZDC04291 soft]# rm -rf /mysql/include/mysql/*
[root@SZDC04291 soft]# rm -rf /data/mysqldata/mysql/*
注意:卸载后/etc/my.cnf
不会删除,需要进行手工删除
再次查找机器是否安装mysql
rpm -qa|grep -i mysql
无结果,说明已经卸载彻底,接下来直接安装mysql即可.
检查操作系统
如何查看linux版本是centos还是redhat
使用
cat /etc/redhat-release
则会出现具体系统
Red Hat Enterprise Linux AS release 4 (Nahant Update 8) Kernel /r on an /m
或
CentOS release 7.4 (Final)
查看linux系统是64位还是32位
getconf LONG_BIT
64
下载mysql 5.7.25
注意:我们的实际环境是linux
系统是64
位,操作系统是CentOS release 7.4 (Final)
,大家根据实际情况下载对应的mysql 5.7.25
包
方法1: 到mysql官网下载安装包(64位) mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz
上传安装包至 /home/app/soft
方法2: 使用wget下载
cd /home/app/soft
wget https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz
方法3: 使用两台linux服务器之前传送文件,速度最快。
scp mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz root@10.9.1.133:/home/app/soft
三种方式都是可以下载到全的安装,看大家那个比较方便。
解压包文件
cd /home/app/soft
tar -zxvf mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz
mv mysql-5.7.25-linux-glibc2.12-x86_64 /usr/local/mysql
配置编译
创建data目录
cd /usr/local/mysql
mkdir data
检查mysql组和用户
检查mysql组和用户是否存在,如无创建
cat /etc/group | grep mysql
类似出现如下:
mysql:x:490:
类似像如下
cat /etc/passwd | grep mysql
mysql:x:496:490::/home/mysql:/bin/bash
以上为存在的情况,如无,执行添加命令:
groupadd mysql
useradd -r -g mysql mysql
useradd -r参数表示mysql用户是系统用户,不可用于登录系统
修改所有者和组
将 /usr/local/mysql
的所有者及所属组改为 mysql
chown -R mysql.mysql /usr/local/mysql
创建 my_default.cnf
文件
因为 mysql 5.7
版本开始 my_default.cnf
文件不会自带,需要手动创建。
cd /usr/local/mysql/support-files
vi my_default.cnf
在 /usr/local/mysql/support-files
目录下创建 my_default.cnf
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
# *** DO NOT EDIT THIS FILE. It's a template which will be copied to the
# *** default location during install, and will be replaced if you
# *** upgrade to a newer version of MySQL.
[mysqld]
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
socket = /tmp/mysql.sock
character-set-server=utf8
log-error = /usr/local/mysql/data/mysqld.log
pid-file = /usr/local/mysql/data/mysqld.pid
拷贝my_default.cnf
到/etc/my.cnf
cp /usr/local/mysql/support-files/my-default.cnf /etc/my.cnf
初始化 mysqld
cd /usr/local/mysql/bin
./mysqld --initialize --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/
初始化完成之后,查看日志
tail -f /usr/local/mysql/data/mysqld.log
mysql安装的时候是否有问题。
设置开机启动mysql
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
启动/停止/重启 mysql服务
启动mysql
service mysqld start
停止mysql
service mysqld stop
重启mysql
service mysqld restart
查看运行状态
service mysqld status
查看mysql进程
ps -ef | grep mysql
结束mysql进程
kill -9
进程号 或 killall mysqld
初始化mysql密码
ln -s 建立链接
mysql -u root -p
出现错误:-bash: mysql: command not found
原因:这是由于系统默认会查找
/usr/bin
下的命令,如果这个命令不在这个目录下,当然会找不到命令,我们需要做的就是映射一个链接到/usr/bin
目录下,相当于建立一个链接文件。 首先得知道mysql
命令或mysqladmin
命令的完整路径,比如mysql的路径是:/usr/local/mysql/bin/mysql
,我们则可以这样执行命令:
建立命令的软件
ln -s /usr/local/mysql/bin/mysql /usr/bin
ln -s /usr/local/mysql/bin/mysqladmin /usr/bin
ln -s /usr/local/mysql/bin/mysqld_safe /usr/bin
或
加入环境变量
编辑 /etc/profile
,这样可以在任何地方用mysql命令了
vi /etc/profile
添加如下一行:
export PATH=$PATH:/usr/local/mysql//bin
使 /etc/profile 环境变量生效
source /etc/profile
这个就可以在 任何地方用 mysql
命令了。
添加密码
mysql 安装好了,但是没有设置root密码,如果此时访问mysql会报错,
忘记MySQL
密码或者本地lcoalhost
,root
用户无法登录时。可用以下方法无密码登录
关闭mysqld服务
/etc/init.d/mysqld stop 关闭mysqld服务 (可以直接killall mysqld)
进入安全模式
在执行命令之前必须先关闭mysqld服务,请注意!
mysqld_safe --skip-grant-tables &
使用 mysql -u root -p
空密码进入shell
模式
mysql -u root -p
// 查看用户用户
SELECT User, Host FROM mysql.user;
在 mysql 5.7.25
有点特殊的地方是 没有password
字段,密码字段是 authentication_string
,我们刚开始的时候一直使用 password
字段去修改报错。
因此,修改root的命令如下:
更改mysql用户密码 为
update mysql.user set authentication_string=password("123") where user='root';
mysql> use mysql;
mysql> update user set authentication_string =password('123') where user='root';
mysql> flush privileges;
mysql> quit;
修改密码方式还有其他几种:
方法1: 用SET PASSWORD命令 首先登录MySQL。
格式:mysql> set authentication_string for 用户名@localhost = password('新密码');
例子:mysql> set authentication_string for root@localhost = password('123');
方法2:用mysqladmin
格式:mysqladmin -u用户名 -p旧密码 authentication_string 新密码
例子:mysqladmin -uroot -p123456 authentication_string 123
方法3:用UPDATE直接编辑user表
首先登录MySQL。
mysql> use mysql;
mysql> update user set authentication_string =password('123') where user='root';
mysql> flush privileges;
mysql> quit;
**注意:修改root的密码以后,千万不需要重启mysql
,因为还没有设置远程访问的权限,还有本地访问的权限,重启以后安全模式失效,还是登录不了mysql
。 **
设置远程访问
允许root用户在任何地方进行远程登录,并具有所有库任何操作权限。
如果出现 提示”Access denied for user ‘root’@’localhost’ (using password: YES)”
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select user,host from user;
+------------------+-----------+
| user | host |
+------------------+-----------+
| epass | % |
| epass | localhost |
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+------------------+-----------+
6 rows in set (0.00 sec)
mysql>
发现root只有本地权限,
那么,
我们需要给root 加上 127.0.0.1,% 还有指定服务器ip访问的权限,
// 设置127.0.0.1访问的root权限
mysql> INSERT INTO mysql.user(host,user,authentication_string) VALUES("127.0.0.1","root",PASSWORD("123456"));
// 设置%所有ip访问的root权限,注意这个版本有点奇怪,按照道理设置所有%就可以访问了,但一定要设置 127.0.0.1 和 localhost 也要加权限。具体原因还没有查明
mysql> INSERT INTO mysql.user(host,user,authentication_string) VALUES("%","root",PASSWORD("123456"));
// 我们还可以指定对应的服务器的访问权限
mysql> INSERT INTO mysql.user(host,user,authentication_string) VALUES("10.6.9.96","root",PASSWORD("123456"));
//刷新权限
mysql> flush privileges;
//退出
mysql> quit;
如果出现 Field 'ssl_cipher' doesn't have a default value
错误怎么解决?
使用 grant all on root.* to 'root'@'localhost';
和 grant all on root.* to 'root'@'127.0.0.1';
命令
此时,使用 select user,host from user;
查看是否权限都有了
如果有,重新mysql
,让设置生效即可访问了。
或者 可以简单一点一些,
使用 grant all privileges on *.* to root@"%" identified by "Qa~!@#4^" ;
//给mysql用户分配远程访问权限 需要使用 flush privileges;
刷新权限。
service mysqld restart
测试本地是否可以访问
使用 mysql -uroot -h127.0.0.1 -p
登录并授权localhost
本地root
登录
也可以使用 mysql -uroot -p
登录一下测试是否可以登录
其他的问题
怎样保护“/tmp/mysql.sock ”不被删除
怎样保护“/tmp/mysql.sock ”
不被删除
如果你有这个问题,事实上任何人可以删除MySQL通讯套接字“/tmp/mysql.sock”
,在Unix
的大多数版本上,你能通过为其设置sticky(t)位来保护你的“/tmp”
文件系统。作为root
登录并且做下列事情:
在shell模式下:
shell> chmod +t /tmp
这将保护你的“/tmp”
文件系统使得文件仅能由他们的所有者或超级用户(root)
删除。
你能执行ls -ld /tmp
检查sticky
位是否被设置,如果最后一位许可位是t,该位被设置了。
mysql -h localhost和mysql -h 127.0.0.1的区别
mysql -h localhost和mysql -h 127.0.0.1的区别, 通过localhost连接到mysql是使用UNIX socket,而通过127.0.0.1连接到mysql是使用TCP/IP。
看看状态:mysql -h localhost
- mysql -h localhost > status
Connection id: 639
Current database: mysql
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ”
Using delimiter: ;
Server version: 5.7.25-log Source distribution
Protocol version: 10
Connection: Localhost via UNIX socket
看看状态:mysql -h 127.0.0.1
- mysql -h 127.0.0.1 > status
Connection id: 640
Current database: mysql
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ”
Using delimiter: ;
Server version: 5.7.25-log Source distribution
Protocol version: 10
Connection: 127.0.0.1 via TCP/IP
安装时的一些错误
- -bash: ./scripts/mysql_install_db: 类似错误
出现
-bash: ./scripts/mysql_install_db: /usr/bin/perl: bad interpreter:
没有那个文件或目录
解决办法:
yum -y install perl perl-devel
- 出现 libaio.so.1: cannot open shared object 类似错误
Installing MySQL system tables..../bin/mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory
解决办法:
yum -y install libaio-devel
- ERROR 2002 (HY000): Can‘t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock‘
登录时有可能报这样的错:
ERROR 2002 (HY000): Can‘t connect to local MySQL server through >socket ‘/var/lib/mysql/mysql.sock‘ (2),原因 是/var/lib/mysql>的访问权限问题。下面的命令把/var/lib/mysql的拥有者改为当前用户:
sudo chown -R root:root /var/lib/mysql
service mysqld restart