背景
MySQL 是一个开源的关系型数据库管理系统(RDBMS),最初由瑞典公司 MySQL AB 开发,后被 Oracle 公司收购。MySQL 使用标准 SQL 进行查询和管理数据,并支持多种操作系统。它是最流行的开源数据库之一,被广泛用于Web应用程序开发。
目录
一、基本介绍
1. 基本概念
数据库是用来存储和管理数据,是各种表的集合,或者存放行和列的信息,即表中存放各类数据。三者是包含和包含于的关系。以下是数据库的基本介绍:
① 数据(data):描述事物的符号记录,包括数字,文字、图形、图像、声音、档案记录等,以
“记录”形式按统一的格式进行存储
② 表(table):由记录和字段(属性)组成,分别对应行和列;将不同的记录组织在一起,用来存储具体数据
③ 数据库(database):表的集合,是存储数据的仓库,以一定的组织方式存储的相互有关的数据集合
2. 数据库管理系统(DBMS)
DBMS是一种软件工具,实现对数据库资源的有效组织、管理和存取。功能如下:
① 数据库的建立和维护功能(定义蓝图,维修保养)
② 数据定义功能(字段、结构等)
③ 数据操纵功能(增删改查等)
④ 数据库的运行管理功能(软件的状态、操作等)
⑤ 通信功能(与外界对接联系)
3. 数据库系统及DBMS工作模式
3.1 数据库系统概述
一个人去管理一个系统,一般由硬件、操作系统、数据库、DBMS、应用软件和数据库用户(如管理员)组成,用户可以通过DBMS操作数据库,也可以通过应用程序来操作。
3.2 DBMS工作模式
① 接受应用程序的数据请求和处理请求
② 将用户的数据请求(高级指令)转换为复杂机器代码(低层指令)
③ 实现对数据库的操作
④ 从数据库的操作中接受查询结果
⑤ 对查询结果进行处理(格式转换)
⑥ 将处理结果返回给用户
3.3 图示
4. 数据库的发展史
第一代:层次模型与网状模型的数据库系统,如:图书馆、档案库
第二代:关系型数据库,如:公安系统查询个人会生成家庭其他成员关系
第三代:组合型,即关系型数据库+非关系型数据库(作数据缓冲),可以提高抗高并发能力,完成海量数据处理
5. 关系数据库与非关系数据库
5.1 关系数据库
5.1.1 概述与组成
关系数据库是基于关系模型的数据库,数据以表格的形式存储,每个表格包含多个行和列。每一行代表一个记录,每一列代表一个字段。关系数据库使用结构化查询语言(SQL)进行数据检索和操作。它是所有实体之间联系的集合,存储结构是二维表格。常见的关系数据库有:Oracle、MySQL、SQLServerde等。相关概念如下:
① 实体:实体是关系数据库中的一个基本单位,它可以是一个具体的对象,也可以是一个抽象的概念。在关系数据库中,实体通常对应于一个表,表中的每一行就是一个实体。(如:银行客户、账户等)
② 属性:属性是实体的特征或者描述,它用于描述实体的各种特性。属性通常对应于表中的列,列中的每一个值就是一个属性。(如:姓名、电话等)
③ 联系:是实体之间的关联,它用于描述实体之间的关系。在关系数据库中,联系通常对应于表之间的关联,关联的建立通常需要使用外键。(如下图的“储蓄”关系)
其他常用关系型数据库:
mariadb:时序数据库,该数据查询只能往后看,如天气信息
postgrsql:支持高并发的后端数据库,如在线游戏数据的处理
5.1.2 优缺点
优点:
- 数据结构为二维数据表,易于维护
- 结构化SQL查询语句,使用方便
- 可用于复杂查询
缺点:
- 存储在硬盘,海量存储读写性能较差
- 固定的二维数据库表,不够灵活、可扩展性较低
- 由于硬盘I/O瓶颈,抗高并发能力弱
5.1.3 示例图示
根据“银行客户表”和“银行储蓄表”得到关系数据表“储蓄关系表”
5.2 非关系数据库
5.2.1概述
非关系数据库(NoSQL)是指那些不使用关系模型的数据库、不需要固定的数据格式,它们的数据存储和检索方式更加灵活。在这种模型中,数据被存储为键值对(类似于变量),其中键是唯一的,而值可以是任何类型的数据,包括字符串、数字、列表、集合等。它存放在内存中,常见的非关系数据库有:Redis(占额约85%)、Memcached、mongoDB、HBase等。
5.2.2优缺点
优点:
- 数据结构无固定格式,可以是key,value形式、文档形式、图片形式等
- 存放内存中,速度快
- 高扩展性、有高可用性,可以处理大量数据
- 成本低,nosql数据库部署简单,基本都是开源软件
缺点:
- 针对特定的数据模型特定的查询语句,查询较为复杂
- 数据存放在内存中,容易丢失,关系数据库的安全性可能不如关系数据库
- 如果一个操作失败,可能会导致数据的不一致,不支持事务处理
- 不提供sql支持,学习和使用成本较高
5.3 区别
类型 | 关系型数据库 | 非关系型数据库 |
数据结构 | 固定的二维数据库表 | 无固定格式 |
查询语句 | 结构化SQL查询语句,可复杂查询 | 特定的查询语句 |
存储位置 | 硬盘、安全性高、速度较慢 | 内存、安全性低、速度较快 |
6. 产品版本功能性迭代
5.0-5.1版本,早期产品
5.4-5.7版本,整合了MySQL提高性能,常用5.7版本
6.0-7.1版本,就是MySQLCluster版本为适应新时代对数据库的集群需求而开发,各种bug,目前大厂一般选择8.1
二、部署
MySQL安装方式通常有:yum、二进制编译安装、下载二进制包安装,综合考虑,在生产环境中我们一般选择编译安装,具体步骤如下:
1. 安装编译依赖
yum install -y gcc gcc-c++ ncurses ncurses-devel bison cmake
yum -y install \
gcc \ #是GNU C编译器,用于编译和链接C程序。
gcc-c++ \ #是GNU C++编译器,用于编译和链接C++程序
ncurses \ #字符终端下图形互动功能的动态库
ncurses-devel \ #ncurses开发包
bison \ #语法分析器
cmake #mysql需要用cmake编译安装
2. 编译安装
准备源代码包:
mysql-5.7.17.tar.gz 是 MySQL 数据库的源代码压缩包: 下载地址:MySQL :: MySQL 下载
boost_1_59_0.tar.gz 是 Boost C++ 库的源代码压缩包,下载地址:Download boost_1_59_0.tar.gz (Boost C++ Libraries)
[root@localhost opt]# ls
boost_1_59_0.tar.gz mysql-5.7.17.tar.gz
[root@localhost opt]# tar zxvf mysql-5.7.17.tar.gz -C /opt #解压
[root@localhost opt]# tar zxvf boost_1_59_0.tar.gz -C /usr/local/
[root@localhost opt]# mv /usr/local/boost_1_59_0 /usr/local/boost
[root@localhost opt]# cd /opt/mysql-5.7.17/
cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ #指定mysql的安装路径
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \ #指定mysql进程监听套接字文件(数据库连接文件)的存储路径
-DSYSCONFDIR=/etc \ #指定配置文件的存储路径
-DSYSTEMD_PID_DIR=/usr/local/mysql \ #指定进程文件的存储路径
-DDEFAULT_CHARSET=utf8 \ #指定默认使用的字符集编码,如 utf8
-DDEFAULT_COLLATION=utf8_general_ci \ #指定默认使用的字符集校对规则
-DWITH_EXTRA_CHARSETS=all \ #指定支持其他字符集编码
-DWITH_INNOBASE_STORAGE_ENGINE=1 \ #安装INNOBASE存储引擎
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \ #安装ARCHIVE存储引擎
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ #安装BLACKHOLE存储引擎
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \ #安装FEDERATED存储引擎
-DMYSQL_DATADIR=/usr/local/mysql/data \ #指定数据库文件的存储路径
-DWITH_BOOST=/usr/local/boost \ #指定boost的路径,若使用mysql-boost集成包安装则-DWITH_BOOST=boost
-DWITH_SYSTEMD=1 #生成便于systemctl管理的文件
[root@localhost mysql-5.7.17]# make -j 4 && make install
#4核心编译,并将执行文件及相关依赖拷贝指定目录安装
3. 创建普通用户管理mysql
useradd -s /sbin/nologin mysql #创建普通用户管理mysql
chown -R mysql:mysql /usr/local/mysql/ #更改安装目录属主属组
chown mysql:mysql /etc/my.cnf #更改核心配置文件属主属组
4. 修改核心配置文件
vim /etc/my.cnf #删除原配置项,再重新添加下面内容
[client] #客户端设置
port = 3306
socket=/usr/local/mysql/mysql.sock
[mysqld] #服务全局设置
user = mysql #设置管理用户
basedir=/usr/local/mysql #指定数据库的安装目录
datadir=/usr/local/mysql/data #指定数据库文件的存储路径
port = 3306 #指定端口
character-set-server=utf8 #设置服务器字符集编码格式为utf8
pid-file = /usr/local/mysql/mysqld.pid #指定pid 进程文件路径
socket=/usr/local/mysql/mysql.sock #指定数据库连接文件
bind-address = 0.0.0.0 #设置监听地址,0.0.0.0代表允许所有,如允许多个IP需空格隔开
skip-name-resolve #禁用DNS解析
max_connections=2048 #设置mysql的最大连接数
default-storage-engine=INNODB #指定默认存储引擎
max_allowed_packet=16M #设置数据库接收的数据包大小的最大值
server-id = 1 #指定服务ID号
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES
sql_mode常用值如下:
NO_ENGINE_SUBSTITUTION
# 如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常
STRICT_TRANS_TABLES
# 在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做限制
NO_AUTO_CREATE_USER
# 禁正GRANT创建密码为空的用户
NO_AUTO_VALUE_ON_ZERO
# mysql中的自增长列可以从O开始。默认情况下自增长列是从1开始的,如果你插入值为0的数据会报错
NO_ZERO_IN_DATE
# 不允许日期和月份为零
NO_ZERO_DATE
# mysql数据库不允许插入零日期,插入零日期会抛出错误而不是警告
ERROR_FOR_DIVISION_BY_ZERO
# 在INSERT或UPDATE过程中,如果数据被零除,则产生错误而非警告。默认情况下数据被零除时MysQL返回NULL
PIPES_As_CONCAT
# 将"||"视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,也和字符串的拼接函数Concat相类似
# ANSI_QUOTES
启用ANSI_QUOTES后,不能用双引号来引用字符串,因为它被解释为识别符
5. 设置环境变量
echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
# 申明mysql命令便于系统识别
source /etc/profile #执行刷新
6. 初始化数据库
cd /usr/local/mysql/bin/
[root@localhost bin]# ./mysqld \
> --initialize-insecure \ #生成初始化密码为空
> --user=mysql \ #指定管理用户
> --basedir=/usr/local/mysql \ #指定数据库的安装目录
> --datadir=/usr/local/mysql/data #指定数据库文件的存储路径
cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/
systemctl daemon-reload #刷新识别
systemctl start mysqld.service #开启服务
systemctl enable mysqld #开机自启动
netstat -anpt | grep 3306 #查看端口
7. 给root账号设置密码
mysqladmin -u root -p password "123456"
————》直接回车
8. 登录mysql数据库
[root@localhost ~]# mysql -u root -p123456
mysql> show databases; #显示当前MySQL服务器上的所有数据库
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
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> show tables; #显示当前数据库中的所有表
31 rows in set (0.00 sec)
mysql> quit #退出,或者exit,或者ctrl+d
Bye