数据库简介与 Mysql 服务基础「建议收藏」

2022-09-18 12:28:08 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君

前言

一、数据库系统发展史

第一代数据库

  • 自 20 世纪 60 年代起,第一代数据库系统问世
  • 是层次模型与网状模型的数据库系统
  • 为统—管理和共享数据提供了有力的支撑

第二代数据库

  • 20 世纪 70 年代初,第二代数据库——关系型数据库开始出现
  • 20 世纪 80 年代初,IBM 公司的关系型数据库系统 DB2 问世,开始逐步取代层次与网状模型的数据库,成为行业主流
  • 到目前为止,关系型数据库系统仍占领数据库应用的主要地位

第三代数据库

  • 自 20 世纪 80 年代开始,适应不同领域的新型数据库系统不断涌现
  • 面向对象的数据库系统,实用性强、适应面广
  • 20 世纪 90 年代后期,形成了多种数据库系统共同支撑应用的局面
  • —些新的元素被添加进主流数据库系统中 例如:Oracle 支持的 < 关系 - 对象 > 数据库模型

二、数据库基本概念

数据(data)

  • 描述事物的符号记录
  • 包括数字,文字、图形、图像、声音、档案记录等
  • 如下表所示:每一行称为一条记录,用来描述一个对象的信息;每一列称为一个字段,用来描述对象的一个属性

姓名

年龄

存款

小红

19

2000

小刘

20

5000

表(table)

  • 将不同的记录组织在一起用来存储具体数据

数据库(database)

  • 表的集合,是存储数据的仓库
  • 以一定的组织方式存储的相互有关的数据集合

数据库管理系统(DBMS)

  数据库管理系统(DatabaseManagementSystem,DBMS)是实现对数据库资源有效组织、管理和存取的系统软件。它在操作系统的支持下,支持用户对数据库的各项操作。

DBMS 的工作模式如下

代码语言:javascript复制
接受应用程序的数据请求和处理请求
将用户的数据请求(高级指令)转换为复杂机器代码(底层指令)
实现对数据库的操作
从数据库的操作中接受查询结果
对查询结果进行处理(格式转换)
将处理结果返回给用户

DBMS主要包括以下功能

代码语言:javascript复制
数据库的建立和维护功能:包括建立数据库的结构和数据的录入与转换、数据库的 转储与恢复、数据库的重组与性能监视等功能。
数据定义功能:包括定义全局数据结构、局部逻辑数据结构、存储结构、保密模式及信息格式等功能。保证存储在数据库中的数据正确、有效和相容,以防止不合语义的错误数据被输入或输出。
数据操纵功能:包括数据查询统计和数据更新两个方面。
数据库的运行管理功能:这是数据库管理系统的核心部分,包括并发控制、存取控 制、数据库内部维护等功能。
通信功能:DBMS 与其他软件系统之间的通信,如 Access 能与其他 Office 组件进行数据交换。

数据库系统(DBS)

  • 是一个人机系统,由硬件、OS、数据库、DBMS、应用软件和数据库用户组成
  • 用户可以通过 DBMS 或应用程序操作数据库

三、主流数据库介绍

SQL Server(微软公司产品)

  • 面向 Windows 操作系统
  • 简单、易用

Oracle(甲骨文公司产品)

  • 面向所有主流平台
  • 安全、完善,操作复杂

DB2(IBM 公司产品)

  • 面向所有主流平台
  • 大型、安全、完善

MySQL(甲骨文公司收购)

  • 免费、开源、体积小

PostgreSQL(PostgreSQL Global Development Group维护)

  • 面向所有主流平台
  • 免费、开源、功能强大

GaussDB(华为公司产品)

  • 涵盖关系型、非关系型数据库服务
  • 可靠性、扩展性、备份恢复

OceanBase(蚂蚁集团产品)

  • 金融级分布式关系数据库
  • 数据强一致、高可用、高性能、在线扩展、高度兼容 SQL 标准和主流关系数据库、低成本

四、数据库类型

1. 关系型数据库

关系型数据库是基于关系模型的数据库系统 关系模型的数据结构使用简单易懂的二维数据表 关系模型可用简单的 “实体 – 关系”(E – R) 图来表示 E – R 图中包含了实体(数据对象)、关系和属性三个要素 所有实体及实体之间联系的集合构成了一个关系数据库

实体

  • 也称为实例,对应现实世界中可区别于其他对象的 “事件” 或 “事务”
  • 如上图的银行客户、银行账户

属性

  • 实体所具有的某一特性,一个实体可以有多个属性
  • 如上图的 “银行客户” 实体集中的每个实体均具有姓名、住址、电话等属性

联系

  • 实体集之间的对应关系称为联系,也称为关系
  • 如银行客户和银行账户之间存在 “储蓄” 的关系

二维数据表

关系数据库的存储结构是二维表格 在每个二维表中:

  • 每一行称为一条记录,用来描述一个对象的信息
  • 每一列称为一个字段,用来描述对象的一个属性

主键

  • 数据表中的每行记录都必须是唯一的,不允许出现完全相同的记录,通过定义主键(主关键字,Promary Key)可以保证记录(实体)的唯一性
  • 键,即关键字,它是关系模型中一个非常重要的元素
  • 主键唯一标识表中的行数据,一个主键值对应一行数据,主键由一个或多个字段组成,其值具有唯一性,不允许取空值(NULL)
  • 一个表只能有一个主键
  • 如果一个属性集能唯一地标识表的一行而又不含有多余的属性,那么这个属性集称为候选键
  • 表中可以有多个候选键,但是只能有一个候选键可以选做表的主键,所有其他候选键称为备用键
  • 例如下图,“编号”、“姓名”、“性别”、“年龄”、“专业编号” 都可以说是候选键,而可以定义 “编号” 为主键

编号

姓名

性别

年龄

专业编号

1

徐一

21

1

2

徐二

22

3

3

徐三

18

3

4

徐四

18

5

外键

  • 一个关系数据库通常包括多个表,通过外键(Foreign Key)可以使这些表关联起来
  • 外键是用于建立和加强两个表数据之间的链接的一列或多列,通过表中主键值得一列或多列添加到另一个表中,可创建两个表之间的链接,这个列就称为第二个表的外键
  • 如下表所示,字段 “专业编号” 是该表的主键,而上表中也有一个相同的字段 “专业编号”,则该字段称为外键

专业编号

专业

1

云计算运维

3

大数据开发

5

人工智能

  • 主键的表称之为 “主表”,外键的表称之为 “从表”
  • 主表和从表总是成对出现的,相互之间以 “外键” 形成关联

数据完整性规则

为了维护数据库中的数据与现实世界的一致性,关系数据库的数据与更新操作必须遵循下列四类完整性规则

  • 实体完整性规则
  • 域完整性规则
  • 引用完整性规则
  • 用户定义的完整性规则

数据完整性

关系型数据库的应用

关系型数据库

应用举例

Oracle、MySQL

12306 用户信息系统

SQL Server、Sybase

淘宝账号系统

Informix、access

联通手机号信息系统

DB2、FoxPRO

银行用户账号系统

PostgreSQL

网站用户信息系统

2. 非关系型数据库

简介

  • 非关系数据库也被称为 NoSQL(Not Only SQL)
  • 存储数据不以关系模型为依据,不需要固定的表格式
  • 常用的非关系数据库有:Redis、mongoDB 等

非关系数据库的优点

  • 数据库可高并发读写
  • 对海量数据高效率存储与访问
  • 数据库具有高扩展性与高可用性

对比关系型数据库

优势

  • 成本:nosql 数据库简单易部署,基本都是开源软件,不需要像使用 oracle 那样花费大量成本购买使用,相比关系型数据库价格便宜
  • 查询速度:nosql 数据库将数据存储于缓存之中,关系型数据库将数据存储在硬盘中,自然查询速度远不及 nosql 数据库
  • 存储数据的格式:nosql 的存储格式是 key-value 形式、文档形式、图片形式等等,所以可以存储基础类型以及对象是集合等各种格式,而关系型数据库则只支持基础类型
  • 扩展性:关系型数据库有类似 join 这样的多表查询机制的限制导致扩展很难

劣势

  • 维护的工具和资料有限,因为 nosql 是属于新的技术,而关系型数据库出现已有十几年时间
  • 不提供对 sql 语句的支持,如果不支持 sql 这样的工业标准,将产生一定程度的学习和使用成本
  • 不提供关系型数据库对事物的处理

3. 时序数据库 TSD

  基于时间序列数据的特点,关系型数据库无法满足对时间序列数据的有效存储与处理,因此迫切需要一种专门针对时间序列数据来做优化的数据库系统,即时间序列数据库。   时序数据库全称为时间序列数据库。时间序列数据库指主要用于处理带时间标签(按照时间的顺序变化,即时间序列化)的数据,带时间标签的数据也称为时间序列数据。

五、Mysql 数据库

1. MySQL 简介

  • MySQL 是一个真正的多线程、多用户的 SQL 数据库服务,凭借其高性能、高可靠和易于使用的特点,成为服务器领域中最受欢迎的开源数据库系统
  • 在 2008 年以前,MySQL 项目由 MySQL AB 公司进行开发、发布和支持,之后历经 Sun 公司收购 MySQL,Oracle 公司收购 Sun 公司的过程,目前 MySQL 项目由 Oracle 公司负责运营和维护

2. 商业版与社区版

  • MySQL 商业版是由 MySQL AB 公司负责开发与维护,需要付费才能使用
  • MySQL 社区版是由分散在世界各地的 MySQL 开发者、爱好者一起开发与维护,可以免费使用
  • 两者区别
    • 商业版组织管理与测试环节更加严格,会比社区版更稳定
    • 商业版不遵守 GPL,社区版遵从 GPL 可以免费使用
    • 商业版可获得 7*24 小时的服务,社区版则没有

3. 产品阵营

  • 第一阵营:5.0-5.1 阵营,可说是早期产品的延续
  • 第二阵营:5.4-5.7 阵营,整合了 MySQL AB 公司、社区和第三方公司开发的存储引擎,从而提高性能
  • 第三阵营:6.0-7.1 阵营,就是 MySQL Cluster 版本,为适应新时代对数据库的集群需求而开发

4. Mysql 特点

  • 性能卓越、服务稳定
  • 开源、无版权限制、成本低
  • 多线程、多用户
  • 基于 C/S 架构
  • 安全可靠

5. 源码编译安装

这里使用脚本一键执行,安装包放在我的云主机上

代码语言:javascript复制
#!/bin/bash
#一键安装 mysql-5.7.17
#联网下载两个源码包,包在我的云主机上
#安装包下载在 /data 目录
#编译安装需较长时间,请耐心等待

mkdir /data
wget http://101.34.22.188/mysql-5.7.17/boost_1_59_0.tar.gz -P /data
wget http://101.34.22.188/mysql-5.7.17/mysql-5.7.17.tar.gz -P /data

systemctl stop firewalld && systemctl disable firewalld
setenforce 0
ntpdate ntp1.aliyun.com
tar zxvf /data/mysql-5.7.17.tar.gz -C /opt
tar zxvf /data/boost_1_59_0.tar.gz -C /usr/local
mv /usr/local/boost_1_59_0 /usr/local/boost
yum -y install gcc gcc-c   ncurses ncurses-devel bison cmake make git perl expat-devel pcre-devel pcre
useradd -s /sbin/nologin mysql
cd /opt/mysql-5.7.17/

cmake 
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql 
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock 
-DSYSCONFDIR=/etc 
-DSYSTEMD_PID_DIR=/usr/local/mysql 
-DDEFAULT_CHARSET=utf8  
-DDEFAULT_COLLATION=utf8_general_ci 
-DWITH_EXTRA_CHARSETS=all 
-DWITH_INNOBASE_STORAGE_ENGINE=1 
-DWITH_ARCHIVE_STORAGE_ENGINE=1 
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 
-DMYSQL_DATADIR=/usr/local/mysql/data 
-DWITH_BOOST=/usr/local/boost 
-DWITH_SYSTEMD=1

cd /opt/mysql-5.7.17/
make -j 4 && make install
echo > /etc/my.cnf

cat > /etc/my.cnf<<EOF [client] port = 3306 default-character-set=utf8 socket=/usr/local/mysql/mysql.sock [mysql] port = 3306 default-character-set=utf8 socket=/usr/local/mysql/mysql.sock auto-rehash [mysqld] user = mysql basedir=/usr/local/mysql datadir=/usr/local/mysql/data port = 3306 character-set-server=utf8 pid-file = /usr/local/mysql/mysqld.pid socket=/usr/local/mysql/mysql.sock bind-address = 0.0.0.0 skip-name-resolve max_connections=2048 default-storage-engine=INNODB max_allowed_packet=16M server-id = 1 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 EOF

chown -R mysql.mysql /usr/local/mysql/
chown mysql.mysql /etc/my.cnf
echo 'PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH' >> /etc/profile
echo 'export PATH' >> /etc/profile
source /etc/profile

cd /usr/local/mysql/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 && systemctl enable mysqld
ln -s /usr/local/mysql/bin/mysql /usr/local/sbin/


pgrep "mysqld" &> /dev/null
if [ $? -eq 0 ];then
        echo -e "33[32mmysqld服务运行正常33[0m"
else
        echo -e "33[31mmysqld服务运行异常,请检查33[0m"
fi
sleep 2
echo ' '
echo -e "33[32mMySQL 没有设置密码,执行 mysql 命令登录33[0m"

修改密码

代码语言:javascript复制
mysqladmin -u root -p password "123456"
# 不需要登录,直接敲回车

授权远程登录

代码语言:javascript复制
# 需要登录
grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;

6. Mysql 初步使用

代码语言:javascript复制
数据库 ----> 数据表 -----> 行(记录):用来描述一个对象的信息
数据库 ----> 数据表 -----> 列(字段):用来描述对象的一个属性

(1) MySQL 常用数据类型

mysql 常用数据类型很多,这里列举几种:

代码语言:javascript复制
int:整型
float:单精度浮点 4 字节 32 位
double:双精度浮点 8 字节 64 位
char:固定长度的字符类型
varchar:可变长度的字符类型
text:文本
image:图片
decimal(5,2): 5 个有效长度数字,小数点后面有 2 位

MySQL 数据类型

(2) 查看当前服务器中的数据库

代码语言:javascript复制
show databases;

(3) 查看数据库中包含的表

代码语言:javascript复制
use <数据库名>;	#切换数据库
show tables;	#查看所有表
#可以合写
show tables in <数据库名>;

  MySQL 数据库的数据文件存放在 /usr/local/mysql/data 目录下,每个数据库对应一个子目录,用于存储数据表文件。每个数据表对应为三个文件,扩展名分别为:

代码语言:javascript复制
.frm
.MYD
.MYI

(4) 查看表的结构

代码语言:javascript复制
use <数据库名>;
describe <数据库名>.<表名>;
#describe 可缩写
desc <表名>;

(4) 创建新的数据库

代码语言:javascript复制
create database <数据库名>;

(5) 创建新的表

  • create table 表名 (字段1 数据类型,字段2 数据类型,[…],parmary key (主键名));
  • 主键一般选择能代表唯一性的字段,不允许取空值(NULL),一个表只能有一个主键
代码语言:javascript复制
CREATE TABLE web_demo (id int NOT NULL,name char(10) NOT NULL,score decimal(5,2),passwd char(48) DEFAULT '',PRIMARY KEY (id));

(6) 删除指定的数据表

代码语言:javascript复制
drop table <数据库名>.<表名>;
#不 use 进入库中需加上数据库名

(7) 删除指定的数据库

代码语言:javascript复制
drop database <数据库名>;

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/164615.html原文链接:https://javaforall.cn

0 人点赞