MySQL 安装

1. CentOS 6 RPM方式安装 MySQL7

1.1. 下载

设置选项

  • 选择版本 5.7
  • 选择系统 Red Hat
  • 选择系统版本 Linux6 x86-64

在列表中下载以下几项

  • RPM Package, MySQL Configuration (mysql-community-common-5.7.25-1.el6.x86_64.rpm)
  • RPM Package, Shared Libraries (mysql-community-libs-5.7.25-1.el6.x86_64.rpm)
  • RPM Package, MySQL Server (mysql-community-server-5.7.25-1.el6.x86_64.rpm)
  • RPM Package, Client Utilities (mysql-community-client-5.7.25-1.el6.x86_64.rpm)

1.2. 卸载自带的mysql

一开始系统自带mysql-libs

1
2
$ rpm -qa | grep -i mysql            # grep 选项-i表示不区分大小写
mysql-libs-5.1.73-8.el6_8.x86_64

将其卸载

1
2
3
# -e: 卸载rpm
# --nodeps 卸载时不检查依赖关系
rpm -e --nodeps mysql-libs-5.1.73-8.el6_8.x86_64

按照依赖关系依次安装MySQL的rpm包,安装顺序为common->libs->client->server

1
2
3
4
5
6
7
# -i: install安全
# -v: verbose显示进度
# -h: hash进行哈希检验
rpm -ivh mysql-community-common-5.7.25-1.el6.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.25-1.el6.x86_64.rpm
rpm -ivh mysql-community-client-5.7.25-1.el6.x86_64.rpm
rpm -ivh mysql-community-server-5.7.25-1.el6.x86_64.rpm

检验安装成功

1
2
3
4
5
6
7
8
9
10
11
12
13
$ rpm -qa | grep mysql   # 检验rpm是否安装
mysql-community-common-5.7.25-1.el6.x86_64
mysql-community-server-5.7.25-1.el6.x86_64
mysql-community-client-5.7.25-1.el6.x86_64
mysql-community-libs-5.7.25-1.el6.x86_64

$ cat /etc/passwd | grep mysql # 检测是否生成mysql用户
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
$ cat /etc/group | grep mysql # 检测是否生成mysql用户组
mysql:x:27:

$ mysql --version
mysql Ver 14.14 Distrib 5.7.25, for Linux (x86_64) using EditLine wrapper

1.3. 启动关闭MySQL服务

1
2
service mysqld start
service mysqld stop

1.4. 配置root密码

一开始MySQL的root用户是没有密码的。这样不安全,所以要先设置

启动MySQL服务之后,用mysqladmin命令设置root密码。发现无权访问

1
2
3
$ mysqladmin -u root password 123456
mysqladmin: connect to server at 'localhost' failed
error: 'Access denied for user 'root'@'localhost' (using password: NO)'

解决方法如下:

1
2
3
service mysqld stop  # 先关闭服务
mysqld_safe --user=mysql --skip-grant-tables --skip-networking & # 启动安全模式
mysql -u root # 以root用户连接MySQL,没有密码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> use mysql;

mysql> set PASSWORD = PASSWORD('123456'); -- 通过设置PASSWORD来修改密码,发现--skip-grant-tables模式下不能修改
ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement

mysql> UPDATE user SET password=PASSWORD('123456') WHERE User='root'; -- 设置密码,发现MySQL 5.7的user将password字段修改为authentication_string
ERROR 1054 (42S22): Unknown column 'Password' in 'field list'

mysql> UPDATE user SET authentication_string=PASSWORD('123456') WHERE User='root'; -- 再尝试设置密码

mysql> ALTER USER 'root'@'localhost' PASSWORD EXPIRE NEVER; -- 设置密码永久生效
ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement

mysql> FLUSH PRIVILEGES; -- 使设置生效
mysql> exit;

关闭mysql服务,注意此时的服务是指mysqld_safe

1
2
3
4
$ service mysqld stop   # 关闭mysqld_safe
2019-04-10T01:43:39.129247Z mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
Stopping mysqld: [ OK ]
[1]+ Done mysqld_safe --user=mysql --skip-grant-tables --skip-networking

再开启mysql服务,用root用户连接mysql,发现连接成功

1
2
service mysqld start
mysql -uroot -p123456

1.5. 设置root密码永久有效

之前在配置root密码时,尝试设置永久生效,但是由于处于--skip-grant-tables状态,所以无法设置

1
2
mysql> ALTER USER 'root'@'localhost' PASSWORD EXPIRE NEVER;  -- 设置密码永久生效
ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement

连接mysql,发现做很多操作都提示以下信息,说明root密码已经失效了

1
2
mysql> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

只要更新root密码,就能暂时使密码生效。但是发现另一个问题,由于MySQL存在密码策略的问题,当发现root密码过于简单,就会限制其操作。所以现在SET PASSWORD就无法执行了

1
2
3
mysql> SET PASSWORD=PASSWORD('123456');
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
mysql> show variables like 'default_password_lifetime';

解决办法是,先修改密码策略

1
2
3
4
5
mysql> SET GLOBAL validate_password_policy=0;
mysql> SET GLOBAL validate_password_mixed_case_count=0;
mysql> SET GLOBAL validate_password_number_count=3;
mysql> SET GLOBAL validate_password_special_char_count=0;
mysql> SET GLOBAL validate_password_length=3;

再设置密码,设置永久生效

1
2
3
mysql> SET PASSWORD=PASSWORD('123456');  -- 密码生效
mysql> ALTER USER 'root'@'localhost' PASSWORD EXPIRE NEVER; -- 密码永久有效
mysql> flush privileges; -- 配置立即生效

1.6. 设置MySQL服务开机自启动

设置mysqld开机自启动

1
chkconfig mysqld on

查看运行级别

1
2
$ chkconfig --list | grep mysql
mysqld 0:off 1:off 2:on 3:on 4:on 5:on 6:off

0/1/6是off状态,2~5是on状态,说明就是开机自启动的。

1
2
3
4
5
6
7
8
9
$ cat /etc/inittab   # 查看运行级别说明
# ................
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)

也可以通过ntsysv查看自启动的服务,前面是[*]的,代表已经设置为自启动

1
ntsysv

Tab可以切换到Cancel退出

1.7. 查看MySQL相关目录

查看mysql进程

1
2
3
$ ps -ef | grep mysql
root 37916 1 0 09:44 pts/1 00:00:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --pid-file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysql
mysql 38110 37916 0 09:44 pts/1 00:00:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock

你会看到--datadir=/var/lib/mysql,这说明/var/lib/mysql就是mysql数据库文件的存放路径

总的来説,与MySQL相关的有这几个路径

路径 说明
/var/lib/mysql 存放数据库文件
/usr/share/mysql 存放配置文件
/usr/bin 存放相关命令,如mysql、mysqladmin
/etc/init.d/mysqld 启动关闭服务的脚本
/var/run/mysqld/mysqld.pid pid文件

1.8. 设置字符集

查看字符集变量,可以看到character_set_databasecharacter_set_server默认都是latin1,这意味着,你往数据库中添加数据,如果是中文就会出现乱码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> SHOW VARIABLES LIKE '%char%';
+--------------------------------------+----------------------------+
| Variable_name | Value |
+--------------------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
| validate_password_special_char_count | 0 |
+--------------------------------------+----------------------------+

编辑配置文件/etc/my.cnf,在对应位置设置以下内容

1
2
3
4
5
6
7
8
9
10
11
12
[mysqld]
# 忽略客户端字符集,只使用服务器的字符集配置
character-set-client-handshake=FALSE
# 服务器默认字符集
character-set-server=utf8mb4
# collation-server指定数据集如何排序,以及字符串的比对规则
collation-server=utf8mb4_unicode_ci
# init_connect指定连接到MySQL后就执行的SQL
init_connect=’SET NAMES utf8mb4’
[client]
# 指定客户端默认字符集
default-character-set=utf8mb4

重启mysql服务

1
service mysqld restart

连接数据库,可以看到字符集已经修改了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> SHOW VARIABLES LIKE '%char%';
+--------------------------------------+----------------------------+
| Variable_name | Value |
+--------------------------------------+----------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
| validate_password_special_char_count | 1 |
+--------------------------------------+----------------------------+

这里说明一点,utf8mb4是utf8的扩展。支持更多的字符,如emoji等。更推荐使用utf8mb4

panchaoxin wechat
关注我的公众号
支持一下