CentOS安装Mysql5.7

YUM镜像

(1) 备份

1
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

(2) 查看系统版本

1
cat /etc/redhat-release

(3) 下载

下载新的CentOS-Base.repo 到/etc/yum.repos.d/

  • CentOS 7

    1
    wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
  • CentOS 6

    1
    wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
  • CentOS 5

    1
    wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo

(4) 生成缓存

1
yum makecache fast

安装

1: 检测系统是否自带安装MySQL

1
yum list installed | grep mysql

2: 删除系统自带的mysql及其依赖 命令:

1
yum -y remove mysql-libs.x86_64

3: 给CentOS添加rpm源

1
2
3
wget -i http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm
yum -y install mysql57-community-release-el7-7.noarch.rpm
yum repolist enabled | grep mysql

4:安装mysql 服务器 命令:

1
yum install -y mysql-community-server

如果报错

源 “MySQL 5.7 Community Server” 的 GPG 密钥已安装,但是不适用于此软件包。请检查源的公钥 URL 是否配置正确。

解决方法

1
2
rm /etc/pki/rpm-gpg/RPM-GPG-KEY-mysql 
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022

5: 启动mysql 命令:

1
service mysqld start

6: 查看mysql是否自启动,并且设置开启自启动 命令:

1
2
chkconfig --list | grep mysqld
chkconfig mysqld on

或者

1
systemctl enable mysqld.service

配置

配置修改

表名/编码/连接数/数据包大小

设置表名不区分大小写/字符编码/连接数

修改 /etc/my.cnf

1
vi /etc/my.cnf

添加以下的5行

1
2
3
4
5
6
[mysqld]
lower_case_table_names=1
character_set_server = utf8
max_connections = 1000
max_allowed_packet = 100M
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

重启

1
service mysqld restart

修改密码

默认密码

打开日志文件

1
vi /var/log/mysqld.log

找到密码

1
[Note] A temporary password is generated for root@localhost: pHsgs6o4t4+6

修改密码:

MySQL 5.7推荐使用ALTER USER修改密码

MySQL修改用户的密码主要有:ALTER USER 和UPDATE用户表

ALTER USER方式

推荐用此方式

1
mysql -uroot -p

连接上以后

1
2
3
4
set global validate_password_policy=0;
set global validate_password_length=1;
alter user user() identified by "123456";
flush privileges;

注意

上面的user()为当前Mysql登录的用户 也可以换成其它要修改的用户

Mysql8.0配置

1
2
set global validate_password.policy=0;
set global validate_password.length=1;

UPDATE方式

在MySQL 5.7 password字段已从mysql.user表中删除,新的字段名是authenticalion_string.

1
2
3
use mysql;
update user set authentication_string=password('123456') where user='root';
flush privileges;

5.1

1
2
use mysql;
UPDATE user SET Password = PASSWORD('123456') WHERE user = 'root';

允许远程登录

1
2
3
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
FLUSH PRIVILEGES;
quit

设置密码永不过期

1
2
ALTER USER 'root'@'%' PASSWORD EXPIRE NEVER;
flush privileges;

密码丢失

按如下处理

1
vi /etc/my.cnf

[mysqld]的段中加上一句:skip-grant-tables
例如:

1
2
[mysqld]
skip-grant-tables

保存并且退出vi。

重启

1
service mysqld restart

这时候重新连接数据库就不用输入密码了。

常见错误

错误1

You must reset your password using ALTER USER statement before executing this statement

1
2
3
SET PASSWORD = PASSWORD('your new password');
ALTER USER 'root'@'%' PASSWORD EXPIRE NEVER;
flush privileges;

错误2

Your password does not satisfy the current policy requirements

数据库密码太简单了 复杂点即可

也可以输入以下

1
2
set global validate_password_policy=0;
set global validate_password_length=1;

卸载

1
2
3
chkconfig mysqld off
service mysqld stop
yum remove mysql-community-server

防火墙配置

添加信任规则

打开文件

1
vim /etc/sysconfig/iptables

添加规则

1
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT

重启防火墙

1
service iptables restart

常见问题

默认文件存储位置

数据库文件存储位置

1
show global variables like "%datadir%";

默认路径

1
cd /var/lib/mysql

日志文件位置

1
vi /var/log/mysqld.log

修改默认位置请参看https://www.psvmc.cn/article/2019-02-13-mysql-datadir.html

启动失败

1
2
[root@root ~]# /etc/init.d/mysqld start
Starting mysqld (via systemctl): Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe" for details.

解决方式

1
2
mkdir -p /var/run/mysqld/
chown mysql.mysql /var/run/mysqld/

长时间未访问 断开

mysql有一个连接超时时间的概念。。。查询此项目的数据库的连接超时时间为28800秒,即为8小时。。

1
2
3
4
5
6
7
mysql> show global variables like 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout | 28800 |
+---------------+-------+
1 row in set

于是不难得知,肯定是由于项目长时间没有请求数据库,数据库过了8小时和这个连接超时时间之后,就会断开连接。。

而我们的项目使用的是c3p0的连接池,,过了8小时后,连接池中的连接已经被mysql断开了,即连接失效。。

但是c3p0认为此连接却依然有效,此时当我们发请求请求数据库中的数据时,由于连接失效,并不能去连接数据库操纵数据,所以服务器会抛出一个500的错误

问题的原因已经找到,那我们该怎么解决呢??

其实解决起来很简单的。。

先说第一种办法吧,就是将数据库的连接超时时间设置大一点,

1
2
msyql> set global wait_timeout=1814400;
msyql> set global interactive_timeout=1814400;

当然这种办法我并不推荐,,这个办法不太好,弊端太多了 比如占用数据库资源,关键是这种办法并不能彻底根治mysql连接断开这种情况

所以我推荐第二种办法:设置c3p0隔多少时间自动检测与数据库的连接,如果断开则自动重连

1
2
3
4
5
6
7
8
9
<bean id="pooledDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">  
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
//下面两个属性就是设置c3p0隔28800秒自动检测与数据库的连接(28800也是mysql的默认的连接超时时间)
<property name="testConnectionOnCheckin" value="true"></property>
<property name="idleConnectionTestPeriod" value="28800"></property>
</bean>