MYSQL之基础认识(卸载安装登录, 基本概念)
一. 卸载安装和登录
卸载 MYSQL
1. 查看有无mysql服务正在运行:
ps ajx | grep mysql
2. 查看到 mysql 的服务名称:
systemctl list-units --type=service | grep mysql
3. 关闭 mysql 服务
4. 卸载
dpkg -l | grep mysql | awk '{print $2}' | xargs sudo apt remove --purge -y
5. 再次检查发现没有mysql相关组件
安装MYSQL
1. 下载 MySQL APT Repository 配置包
wget https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb
2. 安装 MySQL APT Repository 配置包
sudo dpkg -i mysql-apt-config_0.8.29-1_all.deb
安装过程中,会弹出一个交互式界面, 这里选择了 8.0 版本:
3. 更新软件包列表
sudo apt update
4. 检查 APT 软件源是否包含 MySQL
grep -r 'mysql' /etc/apt/sources.list /etc/apt/sources.list.d/
5. 安装
sudo apt install mysql-server -y
6. 检查一下
7. 启动服务, 查看状态并设置开机自启:
查看启动服务:
登录MYSQL
这里只介绍免密登录, 用于不创建用户快速使用mysql:
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
在[mysqld]最后⼀栏配置加⼊: skip-grant-tables 选项, 并保存退出
systemctl restart mysql # 重启mysql服务, 使配置生效
现在mysql -uroot 可以直接登录mysql:
配置文件
配置 my.cnf:
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
log-error = /var/log/mysql/error.logcharacter-set-server=utf8
# 基础设置
port=3306
bind-address = 0.0.0.0
symbolic-links=0
# InnoDB 设置
default-storage-engine=innodb# 免密登录
skip-grant-tables
登录选项
由于一开始为了尽快使用mysql, 选择了免密登录, 导致 MySQL 不开启网络认证模块, 也就 不会监听 3306 端口.
配置文件中将 skip-grant-tables 注释掉, 发现MYSQL正常监听 3306 端口:
但由于root权限还没有设置, 所以此时无法登陆, 后面再说.
二. 数据库基础
mysql与mysqld
1. 站在服务器角度: mysql 和 mysqld 分别是是数据库服务的客户端和服务端, 而 MYSQL产品 本质是基于C(mysql)S(mysqld) 模式的网络服务.
2. mysql是一种服务, 是什么服务呢?
MYSQL 是一套给我提供关系型数据存取服务的网络程序.
什么是数据库?
数据库一般是指在磁盘或内存中存储的特定结构组织的数据(数据库文件), 也可以是指将来在磁盘存储的一套数据库方案.
3. 为什么要有数据库?
数据管理技术经历了人工管理、文件系统、数据库系统3个阶段:
- 人工管理时期是最早期的数据管理方案, 数据不保存, 不共享, 不独立, 由应用程序管理数据, 当数据的逻辑结构或物理结构发生变化后, 必须对应用程序做相应的修改, 这就加重了程序员的负担。
- 文件系统阶段, 虽然数据由文件系统管理, 可以长期保存, 但文件不利于存储海量数据
, 数据共享性和独立性仍然差, 冗余度大.
但我们更关心对于程序员来说, 数据管理是否方便, 一般的文件系统确实提供了数据存储的功能, 但是并没有给用户提供便利的数据管理能力, 我们仅仅是能找到这个数据, 在程序中控制不方便.
为了解决上述问题, 专家们设计出更加利于管理数据的东西——数据库, 它能更有效的管理数据. 数据库的水平是衡量一个程序员水平的重要指标
- 数据库系统管理数据: 数据结构化;数据的共享性高, 冗余度低, 易扩充; 数据独立性高; 数据由DBMS统一管理和控制
数据库本质是对数据内存存储的一套解决方案, 它对于用户来说就是:"你(user)给我字段或者要求, 我(mysqld)直接给你结果就行", 对于数据的增删查改(主要是查)更方便.
什么是数据库?
- 一方面, 数据库是一组有组织的数据集合, 通常存储在磁盘上, 并由数据库管理系统(DBMS, 比如mysqld)进行管理.
- 另一方面, 也可以认为数据库是数据内存存储的一套解决方案, 包括mysql, mysqld和数据库文件三者的交互.
数据库文件
先举一个例子, 使用mysql建立一个数据库, 建立一张表结构, 插入一些数据, 对比mysql在linux下是如何实现的:
结论1: 建立数据库的本质, 实际是在datadir目录下创建一个新的目录, 如图:
结论2: 在数据库内建立一张表, 本质就是在linux下建立对应的文件
进入helloworld目录下, 此时目录什么也没有:
创建一张student表, 此时 helloworld 目录下多出一个文件:
结论3: 结论1和结论2的这些工作, 都是 mysqld 服务帮我们完成的. 因此程序员不再关心数据库文件本身, 数据库文件的结构由 mysqld 帮我们维护, 程序员对数据的操作从直接操作(文件)变为通过 mysql 客户端请求 mysqld 帮助我们操作(数据库文件).
主流数据库
SQL Sever: 微软的产品, .Net程序员的最爱, 中大型项目
Oracle: 甲骨文产品, 适合大型项目, 复杂的业务逻辑(比如银行), 并发一般来说不如MySQL
MySQL: 世界上最受欢迎的数据库, 属于甲骨文, 并发性好, 不适合做复杂的业务. 主要用在电商, SNS, 论坛. 对简单的SQL处理效果好.
PostgreSQL :加州大学伯克利分校计算机系开发的关系型数据库, 不管是私用, 商用, 还是学术研究使用, 可以免费使用, 修改和分发, 用得不多.
SQLite: 是一款轻型的数据库, 是遵守ACID的关系型数据库管理系统, 它包含在一个相对小的C库中. 它的设计目标是嵌入式的, 而且目前已经在很多嵌入式产品中使用了它, 它占用资源非常的低,在嵌入式设备中, 可能只需要几百K的内存就够了.
H2: 是一个用Java开发的嵌入式数据库, 它本身只是一个类库, 可以直接嵌入到应用项目中.
服务器,数据库,表关系
所谓安装数据库服务器, 只是在机器上安装了一个数据库管理系统程序, 这个管理程序可以管理多个数据库, 一般开发人员会针对每一个应用创建一个数据库.
为保存应用中实体的数据, 一般会在数据库中创建多个表, 以保存程序中实体的数据
MySQL架构
MySQL 是一个可移植的数据库, 几乎能在当前所有的操作系统上运行, 如 Unix/Linux, Windows, Mac 和 Solaris. 各种系统在底层实现方面各有不同, 但是 MySQL 基本上能保证在各个平台上的物理体系结构的一致性
1. 连接层(Connection Pool)
主要是解决安全和用户连接管理: 如认证用户身份(mysql.user
表), 维持连接管理.
2. SQL 层
主要负责 SQL 解析, 优化和执行
3. 存储引擎层
负责数据的存储和读取, 不同存储引擎提供不同的功能, 默认使用 InnoDB.
可以注意到图中在SQL层和存储引擎层之间有一个插座图标, 说明存储引擎是支持热插拔的, 想使用哪个存储引擎就像使用插件一样加载进去即可.
综上: mysql依然是一套文件系统, 只是它是基于OS提供的文件系统之上的一层文件系统.
SQL语句分类
1. DDL【data definition language】 数据定义语言, 用来维护存储数据的结构
代表指令: create, drop, alter
2. DML【data manipulation language】 数据操纵语言, 用来对数据进行操作
代表指令: insert, delete, update
DML中又单独分了一个DQL, 数据查询语言代表指令: select
3. DCL【Data Control Language】 数据控制语言, 主要负责权限管理和事务
代表指令: grant, revoke, commit
存储引擎
存储引擎是: 数据库管理系统如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法.
MySQL的核心就是插件式存储引擎, 支持多种存储引擎.
mysql 下使用 show engines; 可以查看存储引擎:
存储引擎对比: