Linux 下的 MySQL 安装与使用
1. 安装说明
1. 1 准备
- 克隆虚拟机需要修改的操作
- mac 地址
- 主机名
- ip 地址
- UUID
- CentOS 6 和 CentOS 7 在使用中的区别
1. 防火墙:6 是 iptables 7 是 firewalld
2. 启动服务命令: 6 是 service 7 是 systemctl
1.2 查看是否安装过 MySQL
-
若使用 rpm 安装
rpm -qa | grep -i mysql # -i 忽略大小写
-
若存在 mysql-libs 的旧版本包,则会显示;若不存在,则什么都不显示
-
检查 mysql service
systemctl status mysqld.service
1.3 MySQL 的卸载
- 停止服务
systemctl stop mysqld.service
- 查看当前 mysql 安装状况
rpm -qa|grep -i mysql
或
yum list installed | grep mysql
- 卸载上述命令查询出的已安装程序
yum remove mysql-xxx mysql-xxx mysql-xxx mysqk-xxxx
一定要卸载干净,反复执行rpm -qa|grep -i mysql
确认是否有卸载残留 - 删除 mysql 相关文件
- 查找相关的文件
find / -name mysql
- 删除上述命令查询出的相关文件
rm -rf xxx
- 删除 my.cnf
rm -rf /etc/my.cnf
2. MySQL 的 Linux 版本 安装
2.1 MySQL 的 4 大版本
-
MySQL Community Server 社区版本,开源免费,自由下载,但不提供官方技术支持,适用于大多数普通用户。
-
MySQL Enterprise Edition 企业版本,需付费,不能在线下载,可以试用30天。提供了更多的功能和更完备的技术支持,更适合于对数据库的功能和可靠性要求较高的企业客户。
-
MySQL Cluster 集群版,开源免费。用于用于架设集群服务器,可将几个MySQL Server封装成一个Server。需要在社区版或企业版的基础上使用。
-
MySQL Cluster CGE 高级集群版,需付费
-
截止目前,官方最新版本为
8.0.29
。此前,8.0.0 在 2016.9.12日就发布了
此外,官方还提供了 MySQL Workbench
(GUITOOL)一款专为MySQL设计的 ER/数据库建模工具
。它是著名的数据库设计工具DBDesigner4的继任者。MySQLWorkbench又分为两个版本,分别是 社区版
(MySQL Workbench OSS)、 商用版
(MySQL WorkbenchSE)。
2.2 下载 MySQL
-
地址
官网:https://www.mysql.com -
打开官网,点击DOWNLOADS
然后,点击MySQL Community(GPL) Downloads
-
点击 MySQL Community Server
-
在General Availability(GA) Releases中选择适合的版本
- 如果安装Windows 系统下MySQL ,推荐下载
MSI安装程序
;点击Go to Download Page
进行下载即可 - Windows下的MySQL安装有两种安装程序
mysql-installer-web-community-8.0.25.0.msi
下载程序大小:2.4M;安装时需要联网安装组件mysql-installer-community-8.0.25.0.msi
下载程序大小:435.7M;安装时离线安装即可。推荐。
- 如果安装Windows 系统下MySQL ,推荐下载
-
Linux系统下安装MySQL的几种方式
-
Linux系统下安装软件的常用三种方式:
方式一:rpm 命令
使用rpm命令安装扩展名为".rpm"的软件包
.rpm包的一般格式:
方式二:yum 命令
需联网,从互联网获取的 yum 源,直接使用 yum 命令安装
方式三:编译安装源码包
针对 tar.gz
这样的压缩格式,要用tar命令来解压;如果是其它压缩格式,就使用其它命令。
安装方式 | 特点 |
---|---|
rpm | 安装简单,灵活性差,无法灵活选择版本、升级 |
rpm repository | 安装包极小,版本安装简单灵活,升级方便,需要联网安装 |
通用二进制包 | 安装比较复杂,灵活性高,平台通用性好 |
源码包 | 安装最复杂,时间长,参数设置灵活,性能好 |
- 选择
Red Hat enterprise Linux
即可,下载 RPM Bundle 全量包;已包括下面所有组件 - 下载的 tar 包,使用解压工具打开
- 解压后 rpm 安装包
- 解压后 rpm 安装包
2.3 CentOS 7 下检查 MySQL 依赖
1. 检查 /tmp 临时目录权限
由于mysql安装过程中,会通过mysql用户在/tmp目录下新建tmp_db文件,所以请给/tmp较大的权限。执行 :
chmod -R 777 /tmp
2. 安装前,检查依赖
rpm -qa|grep libaio
- 若存在 libaio 包如下:
rpm -qa|grep net-tools
- 若存在 net-tools 包如下:
rpm -qa|grep net-tools
- 如果不存在需要到centos安装盘里进行rpm安装。安装linux如果带图形化界面,这些都是安装好的。
2.4 CentOS7 下 MySQL 安装过程
1. 将安装程序复制到 /opt 目录下
在mysql的安装文件目录下执行:(必须按照顺序执行)
rpm -ivh mysql-community-common-8.0.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-plugins-8.0.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-8.0.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-8.0.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-8.0.25-1.el7.x86_64.rpm
rpm
是Redhat Package Manage缩写,通过RPM的管理,用户可以把源代码包装成以rpm为扩展名的文件形式,易于安装。-i
, --install 安装软件包-v
, --verbose 提供更多的详细信息输出-h
, --hash 软件包安装的时候列出哈希标记 (和 -v 一起使用效果更好),展示进度条
注意: 如在检查工作时,没有检查mysql依赖环境在安装mysql-community-server会报错
2. 安装过程
安装过程中可能的报错信息:
一个命令:yum remove mysql-libs 解决,清除之前安装过的依赖即可
3. 查看 MySQL 版本
查看版本
mysql --version
mysqladmin --version
查看是否安装成功
rpm -qa|grep -i mysql
4. 初始化
若以 root 身份运行 mysql 服务,则需要执行下面的命令初始化
mysqld --initialize --user=mysql
说明: --initialize 选项默认以“安全”模式来初始化,则会为 root 用户生成一个密码并将 该密码标记为过期
,登录后你需要设置一个新的密码。生成的 临时密码
会往日志中记录一份。
查看密码:
cat /var/log/mysqld.log
root@localhost: 后面就是初始化的密码
5. 启动 MySQL,查看状态
加不加.service后缀都可以
启动:systemctl start mysqld.service
关闭:systemctl stop mysqld.service
重启:systemctl restart mysqld.service
查看状态:systemctl status mysqld.service
查看进程:
ps -ef | grep -i mysql
6. 查看 MySQL 服务是否自启动
systemctl list-unit-files|grep mysqld.service
默认是enabled
-
如不是enabled可以运行如下命令设置自启动
systemctl enable mysqld.service
-
若不希望进行自启
systemctl disable mysqld.service
3. MySQL 登录
3.1 首次登录
通过 mysql -hlocalhost -P3306 -uroot -p
进行登录,输入初始化密码
注意
:
若登录出现 ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using passwor)问题
- 在配置文件
/etc/my.cnf
中[mysqld] 下添加 skip-grant-tables
则可以无密码进入 mysql;在MySQL 之前应重启 mysql 服务systemctl restart mysqld
- 进入后修改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
- 若出现
ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
。则执行flush privileges
命令再执行修改密码的命令即可
3.2 修改密码
- 因为初始化密码默认是过期的,所以查看数据库会报错
- 修改密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
5. 字符集的相关操作
5.1 修改 MySQL 5.7 字符集
- 查看默认使用的字符集
show variables like 'character%';
# 或
show variables like '%char%';
-
修改字符集
vim /etc/my.cnf
在MySQL5.7 或之前,在文件上加上
character_set_server = utf8
-
重启 mysql 服务
systemctl restart mysqld
在修改之前创建的库和表不会发生变化,需要手动修改
5.2 各级别的字符集
MySQL 中有 4 个级别的字符集和比较规则
- 服务器级别
- 数据库级别
- 表级别
- 列级别
show variables like 'character%';
- character_set_server:服务器级别的字符集
- character_set_database:当前数据库的字符集
- character_set_client:服务器解码请求时使用的字符集
- character_set_connection:服务器处理请求时会把请求字符串从character_set_client转为character_set_connection
- character_set_results:服务器向客户端返回数据时使用的字符集
5.4 请求到相应过程中字符集的变化
系统变量 | 描述 |
---|---|
character_set_client |
服务器解码请求时使用的字符集 |
character_set_connection |
服务器处理请求时把请求字符串从 character_set_client 转为 character_set_connection |
character_set_results |
服务器向客户端返回数据时使用的字符集 |
变化过程:
- 客户端发送请求所使用的字符集
- 类
Unix
系统使用的是UTF-8
Windows
使用的是gbk
- 类
如果你使用的是可视化工具,比如navicat之类的,这些工具可能会使用自定义的字符集来编码发送到服务器的字符串,而不采用操作系统默认的字符集(所以在学习的时候还是尽量用命令行窗口)。
- 服务器接收到客户端发来的请求,是一串二进制的字节,会默认认为这串字节使用 的字符集是
character_set_client
,按照character_set_client
字符集解码
,后将此串字节转换为character_set_connection
字符集编码
- 注意:若字段使用的字符集和
character_set_connection
的字符集不一致,则还需要进行一次字符集转换。 - 服务器返回客户端数据,查找到指定数据,使用
character_set_connection
的字符集 进行解码,后再使用character_set_results
字符集编码 ,返回给客户端
6. SQL 大小写规范
6.1 Windows 和 Linux 平台区别
windows系统默认大小写不敏感
,Linux系统是大小写敏感的
SHOW VARIABLES LIKE '%lower_case_table_names%'
-
Windows 系统
-
Linux 系统:
-
lower_case_table_names 参数值的设置:
默认为 0 ,大小写敏感
- 设置为1,大小写不敏感。创建的表,库都是以小写的形式存放在磁盘上,sql语句转为小写对表和数据库进行查找
- 设置为 2,创建表和库按照语句进行存放,查找则都是转为小写进行
在 Linux 中数据库名、表名、列名、别名规则如下:
- 数据库名、表名、表别名、变量名是严格区分大小写
- 关键字、函数名在 SQL 中不区分大小写
- 字段名 与 字段别名 所有情况下都忽略大小写
在 Windows 环境下全部不区分大小写
6.2 Linux 大小写规则设置
设置大小写不敏感时,应在 /etc/my.cnf
配置文件中 [mysqld]
中加入 lower_case_table_names = 1
,后重启服务器。
注意:
- (MySQL 5.7)要在重启之前将数据库中的数据库名和表名转换为 小写 ,否则找不到数据库名
- MySQL 8 禁止在重启 MySQL 服务器时修改此参数。若非要修改
1、停止MySQL服务
2、删除数据目录,即删除 /var/lib/mysql 目录
3、在MySQL配置文件( /etc/my.cnf )中添加 lower_case_table_names=1
4、启动MySQL服务
6.3 SQL 编写建议
- 关键字和函数名全部大写
- 数据库名、表名、表别名、字段名、字段别名等全部小写
- SQL语句必须以分号结尾
7. sql_mode 的合理设置
7.1 宽松模式 vs 严格模式
宽松模式:
在插入数据时,若数据是错误的,也可能插入成功并且不报错
举例:
表中 name 字段类型为 char(10)
,若插入数据时,超过长度为 10
,仍会插入成功,只是将数据进行截断。
应用场景:
通过设置sql mode为宽松模式,来保证大多数sql符合标准的sql语法,这样应用在不同数据库之间进行 迁移
时,则不需要对业务sql 进行较大的修改。
严格模式:
出现上述情况,应该报错。 Mysql 5.7 sql_mode 默认值为严格模式。在 生产环境
中,我们必须使用 严格模式,进而 开发、测试环境
的数据库也要设置
开发经验
:我们应该在 应用层就做这些校验。再进行数据库迁移或项目迁移时,会方便很多
改为严格模式后可能会存在的问题:
若设置模式中包含了 NO_ZERO_DATE
,那么MySQL数据库不允许插入零日期,插入零日期会抛出错误而不是警告。例如,表中含字段TIMESTAMP列(如果未声明为NULL或显示DEFAULT子句)将自动分配DEFAULT ‘0000-00-00 00:00:00’(零时间戳),这显然是不满足sql_mode中的NO_ZERO_DATE而报错。
7.3 模式查看和设置
- 查看当前的 sql_mode
select @@session.sql_mode
select @@global.sql_mode
或者
show variables like 'sql_mode';
- 临时设置方式:设置当前窗口中设置 sql_mode
改为严格模式。此方法在当前服务中生效,重启MySQL服务后失效。
SET GLOBAL sql_mode = 'modes...'; #全局
改为严格模式。此方法只在当前会话中生效,关闭当前会话就不生效了
SET SESSION sql_mode = 'modes...'; #当前会话
- 永久设置方式:在/etc/my.cnf中配置sql_mode
在my.cnf文件(windows系统是my.ini文件),新增:
[mysqld]
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
然后 重启MySQL。
当然生产环境上是禁止重启MySQL服务的,所以采用临时设置方式 + 永久设置方式 来解决线上的问题,那么即便是有一天真的重启了MySQL服务,也会永久生效了。