一、数据库简介
1.1使用数据库的必要性
使用数据库可以高效且条理分明地存储数据,使人们能够更加迅速、方便地管理数据。
数据库具有以下特点。
- 可以结构化存储大量的数据信息,方便用户进行有效的检索和访问。
- 可以有效地保持数据信息的一致性、完整性,降低数据冗余。
- 可以满足应用的共享和安全方面的要求。
数据库技术是计算机科学的核心技术之一,具有完备的理论基础。对数据库基本概念的掌握,将有助于对数据库的理解。
1.2数据库的基本概念
1.数据
描述事物的符号记录称为数据(Data)。数字、文字、图形、图像、声音、档案记录等都是数据。
2.数据库和数据库表
不同的记录组织在一起,就形成了数据库(Database,DB)的“表”(Table)。也可以说,表是用来存储具体数据的,如图1.1所示。那么数据库和表存在什么关系呢?简单地说,数据库就是表的集合。它是以一定的组织方式存储的相互有关的数据集合。例如,关系数据库的表由记录组成,记录由字段组成,字段由字符或数字组成。它可以供各种用户共享,具有最小冗余度和较高的数据独立性,它是统一管理的相关数据的集合。
通常,数据库并不是简单地存储这些数据的,还要表示它们之间的关系。例如,书和人是存在联系的,书的作者可能就是某个人,因此需要建立书与人的“关系”。这种关系也需要用数据库来表示,因此关系的描述也是数据库的一部分。
3.数据库管理系统和数据库系统
数据库管理系统(Database Management System,DBMS)是实现对数据库资源有效组织.管理和存取的系统软件。它在操作系统的支持下,支持用户对数据库的各项操作。DBMS主要包括以下功能。
- 数据库的建立和维护功能:包括建立数据库的结构和数据的录入与转换、数据库的转储与恢复、数据库的重组与性能监视等功能。
- 数据定义功能:包括定义全局数据结构、局部逻辑数据结构、存储结构、保密模式及信息格式等功能。保证存储在数据库中的数据正确、有效和相容,以防止不合语义的错误数据被输入或输出。
- 数据操纵功能:包括数据查询统计和数据更新两个方面。
- 数据库的运行管理功能:这是数据库管理系统的核心部分,包括并发控制、存取控制、数据库内部维护等功能。
- 通信功能:DBMS 与其他软件系统之间的通信,如Access 能与其他 Office 组件进行数据交换。
数据库系统(Database System,DBS)是一个人-机系统,一般由硬件、操作系统、数据库、DBMS、应用软件和数据库用户(包括数据库管理员)组成。用户可以通过 DBMS 操作数据库,也可以通过应用程序操作数据库。
应用程序是利用 DBMS 为解决某个具体的管理或数据处理的任务而编制的一系列命令的有序集合。如果应用程序比较完善,能够提供友好的人机界面,并编译成可执行文件发行使得普通用户不需要具备计算机的专业知识,在较短时间就学会使用,那么就称为数据库应用软件。
1.3数据库发展史
1.数据库系统发展史
数据库技术的发展已经成为先进信息技术的重要组成部分,是现代计算机信息系统和计算机应用系统的基础和核心。数据库技术最初产生于 20 世纪 60年代中期,根据数据模型的发展,可以划分为三个阶段:第一代的网状、层次数据库系统:第二代的关系数据库系统:第三代的以面向对象模型为主要特征的数据库系统。
(1)初级阶段--第一代数据库
自 20世纪 60年代起,第一代数据库系统问世。它们是层次模型与网状模型的数据库系统,为统一管理和共享数据提供了有力的支撑。在这个阶段中,数据库的代表是 1969年 IBM公司研制的层次模型的数据库管理系统--IMS(Information Management System,信息管理系统)和 20世纪 70年代美国数据系统语言协会(CODASYL)下属数据库任务组(DBTG)提议的网状模型。
(2)中级阶段--第二代数据库
20 世纪 70 年代初,第二代数据库--关系数据库开始出现。自 1970 年 IBM 研究员德加·考特阐述了关系模型的概念后,IBM 大力投入关系数据库的研究。关系数据库的底层实现起来比较容易,所以很快被采用,并进入了众多商业数据库的研发计划。0racle就是当时应关系数据模型的出现而成立的一家专做(关系)数据库的公司。20 世纪 80年代初,IBM公司的关系数据库系统 DB2 问世,而 0racle 公司也将 0racle 数据库移植到桌面计算机上。这时,作为第二代数据库系统的关系数据库,开始逐步取代层次与网状模型的数据库,成为占主导地位的数据库,成为行业主流。到目前为止,关系数据库系统仍占领数据库应用的主要地位。
关系数据库系统将结构化查询语言(Structured QueryLanguage,SqL)作为数据定义语言(Data Definition Language,DDL)和数据操作语言(Data Manipulation Language,DML),它一诞生就成为关系数据库的标准语言。SQL使得关系数据库中的数据库表的查询可以通过简单的、声明性的方式进行,大大简化了程序员的工作。
关系数据库系统构筑在比较高的软件层次上,执行查询的效率普遍偏低。另外,严格的、标准的关系数据库是一个纯理论的模型。如果完全按照关系模型实现,会涉及很多方面的问题,其中一条就是效率不高。在现实环境中,考虑到商业运用的目的,数据库生产厂商各自加入了一些提高效率和提高可用性的功能,舍弃了一些不太现实的约束。不同的数据库厂商在不同基础上的选择,导致了关系数据库系统向不同方向上的变迁。例如,在这个阶段中0racle 加入了“并行”的元素,并开始了向“关系-对象”型数据库的变迁。这样的变迁,也慢慢引出了新一代的数据库系统。
(3)高级阶段--第三代数据库
由于计算机应用的发展,计算机已从传统的科学计算、事务处理等领域,逐步扩展到工程设计、人工智能、多媒体、分布式等领域,这些新的领域需要有新的数据库支撑,而传统关系数据库系统是以商业应用、事务处理为背景而发展起来的,并不完全适用于新领域的应用,因此,需要新的数据库系统,以满足不同领域的要求。
自20世纪80年代开始,各种适应不同领域的新型数据库系统不断涌现,如工程数据库、多媒体数据库、图形数据库、智能数据库、分布式数据库及面向对象数据库等,特别是面向对象数据库系统,由于其实用性强、适应面广而受到人们的青睐。20 世纪 90 年代后期,形成了多种数据库系统共同支撑应用的局面。当然,在商务应用方面,依然还是关系数据库占主流。不过,已经有一些新的元素被添加进主流商务数据库系统中。例如,0racle 支持的“关系-对象”数据库模型。
随着科学技术的发展,计算机技术不断应用到各行各业。数据存储需求的不断膨胀,对未来的数据库技术将会有更高的要求。
2.经典数据模型
数据是现实世界中“量”的抽象,而数据模型(Data Model)是数据特征的抽象。在数据库系统中,数据模型是它的核心与基础。数据模型表现为数据的结构、定义在其上的操作及约束条件。它从概念层次上描述了系统的静态特征、动态特征和约束条件,为数据库系统
的信息表示与操作提供了一个抽象框架。
在 DBMS 的发展过程中,出现了网状模型、层次模型和关系模型三种经典的数据模型。由于受限于数学基础、编程技术和硬件条件,最初出现的层次模型和网状模型与关系模型相比,在用户接口的上、中层部分更易于实现。所以,这在很长一段时间阻碍了关系模型的发展。
数据模型所描述的内容包括三方面:数据结构、数据操作和数据约束。
(1)网状模型
(2)层次模型
(3)关系模型
3.当今主流数据库介绍
在数据库技术日益发展的今天,主流数据库代表着成熟的数据库技术。了解常用数据库,就能知道数据库技术发展的程度,以及未来的大体方向。
(1)关系数据库
20世纪 80~90 年代是关系数据库产品发展和竞争的时代。在市场逐渐淘汰了第一代数据库管理系统的大局面下,SQL Server、0racle、IBM DB2、MySQL,等一批很有实力的关系数据库产品走到了主流商用数据库的位置。
①SQL Server 简介
SQL Server 是 Microsoft 公司的数据库产品,在设计上大量利用了 Microsoft Windows操作系统的底层结构,直接面向Microsoft Windows,尤其是Windows 系列服务器操作系统的用户。
Microsoft Windows 拥有众多的用户群,Microsoft 所有的产品都遵循统一的操作习惯。
对数据库基本概念熟悉的 Windows用户,可以很快地学会使用 SQL Server,上手比较容易。
Windows 系统的易用性也让数据库管理员可以更容易、更方便、更轻松地进行管理。
Microsoft 公司针对市场的需求,不断扩展其性能,使得 SQL Server 在网络数据库服务和电子商务方面展示了强大的性能。
②0racle 简介
0racle 公司成立于 1977年,最初就是专门的数据库公司。
1998年9月,0racle公司正式发布 0racle8i,“i”代表 Internet,这一版本中添加了大量为支持 Internet 而设计的特性。这一版本为数据库用户提供了全方位的 Java 支持。
在 2001年6月的 0racle 0pen World大会中,0racle 公司发布了 0racle 9i,包含应用集群软件 Real Application Clusters(RAC)和商务智能(BI)功能。
2004年2月,0racle 公司发布了 0racle 10g版本,“g”代表 grid(网格)。这一版的最突出特性就是加入了网格计算的功能。
2013年6月,0racle12c正式发布,该版本提供了先进的技术堆管理、安全的数据库管理及企业级的服务管理,使企业能够快速实现私有云。
数据库领域 0racle 公司在很长一段时间内一直处于领先地位,不仅数据库核心相当优秀,而且其相关的支持产品也相当完善和全面。0racle 能适应 70 多种操作系统,这也是其他产品难以企及的优势。不过随着云计算的不断发展,以0racle为代表的传统数据库正在逐渐失势,云数据库时代正在来临。2019年10月15日亚马逊宣布永久关闭 0racle 数据库业务。可以说亚马逊关闭 0racle 既是自身产业转型升级的需要,也是云计算领域发展迈出的重要一步。如今已经有越来越多的企业开始上云,抛弃传统数据库,转而使用云数据库,推动着云计算的不断发展。
③DB2 简介
1970年,IBM 公司的一位研究员德加·考特发表论文,提出“关系模型”的概念。此后他被称为“关系数据库之父”。IBM 公司投入巨资,开展包括“SystemR”和“SystemR*”项目在内的关系数据库技术的研究。13年后,在“SystemR”和“SystemR*”项目的基础上,DB2 以 SystemR 为原型面世。
DB2 支持从 PC 到 UNIX,从中小型机到大型机,从 IBM 到非 IBM(HP 及 Sun UNIX 系统等)的各种操作系统平台。其中,服务器平台可以是 0S/400、AIX、0S/2、HP-UNIX、Sun Solaris等操作系统,客户机平台可以是 0S/2或 Windows、DOS、AIX、HP-UX、Sun Solaris 等操作系统。但是,DB2服务器端的最佳运行环境还是IBM自己的操作系统平台 0S/400。
DB2 数据库核心又称为 DB2 通用服务器,可以运行于多种操作系统之上,它根据相应的平台环境做了调整和优化,以便达到较好的性能。由于IBM公司在商用服务器领域内的长期优势在全球 500 强的企业中,超过 80%的企业曾使用 DB2 作为数据库平台
MySQL 简介
MySQL 也是一个关系型数据库管理系统,现已被 0racle 公司收购。它与上述大型数据库相比,有不足之处,但是这丝毫没有减少它受欢迎的程度。
MySQL 运行于 Linux 操作系统之上,Apache 和 Nginx 作为 Web 服务器,MySQL 作为后台数据库,PHP/Perl/Python 作为脚本解释器。这四款软件都是免费或开源的,也就是说,企业可以不花一分钱(除人工外)就能建立起一个稳定、高速的网站系统,业内称为“LAMP’组合。因此,其以体积小、速度快、开源等特点,霸占了中小型网站相当大的市场。
(2)非关系数据库
非关系数据库也被称作 NoSQL(Not 0nly SQL),存储数据不以关系模型为依据,不需要固定的表格式。非关系型数据库作为关系数据库的一个补充,在日益快速发展的网站时代,发挥着高效率与高性能。
非关系型数据库的优点:
- 数据库高并发读写的需求
- 对海量数据高效率存储与访问
- 数据库的高扩展性与高可用性的需求
常用的非关系数据库例如 Memcached、Redis、MongoDB、HBase,我们将在后续课程中进行介绍。
1.4关系数据库的基本概念
关系数据库系统是基于关系模型的数据库系统,是关系模型应用到数据库领域的实例化。它的基本概念来自于关系模型。
1.关系数据库的基本结构
关系数据库使用的存储结构是多个二维表格,即反映事物及其联系的数据描述是以平面表格形式体现的。
在每个二维表中,每一行称为一条记录,用来描述一个对象的信息;每一列称为一个字段,用来描述对象的一个属性。数据表与数据库之间存在相应的关联,这些关联用来查询相关的数据。
关系数据库是由数据表之间的关联组成的。其中:
- 数据表通常是一个由行和列组成的二维表,每一个数据表分别说明数据库中某一特定的方面或部分的对象及其属性。
- 数据表中的行通常叫做记录或者元组,它代表众多具有相同属性的对象中的一个。
- 数据表中的列通常叫做字段或者属性,它代表相应数据库中存储对象的共有属性。
2.主键与外键
(1)主键
数据表中的每行记录都必须是唯一的,而不允许出现完全相同的记录,通过定义主键(主关键字,Primary Key)可以保证记录(实体)的唯一性。
(2)外键
一个关系数据库通常包含多个表,通过外键(Foreign Key)可以使这些表关联起来。
外键是用于建立和加强两个表数据之间的链接的一列或多列。通过将表中主键值的一列或多列添加到另一个表中,可创建两个表之间的链接。这个列就称为第二个表的外键。
3.数据完整性规则
(1)实体完整性规则
(2)域完整性规则
(3)引用完整性规则
(4)用户定义的完整性规则
二、MySQL服务基础
2.1MySQL的编译安装
1.基础环境准备
[root@www ~]# yum -y install gcc vim wget net-tools lrzsz libaio备注:libaio是linux版本的aio库,aio指的是异步io
2.创建运行用户
[root@www ~]# useradd -M -s /sbin/nologin mysql
3.关闭防火墙
[root@www ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
[root@www ~]# setenforce 0
[root@www ~]# systemctl disable firewalld
[root@www ~]# systemctl stop firewalld
4.二进制安装
[root@www ~]# tar zxvf mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz
[root@www ~]# mv mysql-5.7.28-linux-glibc2.12-x86_64 /usr/local/mysql
[root@www ~]# mkdir /usr/local/mysql/data
[root@www ~]# chown -R mysql.mysql /usr/local/mysql/data
[root@www ~]# cd /usr/local/mysql/bin
[root@www ~]# ./mysqld --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --initialize
5.设定配置文件
[root@www ~]# vim /etc/my.cnf
[client]
socket=/usr/local/mysql/data/mysql.sock [mysqld]
socket=/usr/local/mysql/data/mysql.sock
bind-address = 0.0.0.0
skip-name-resolve
port = 3306
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
max_connections=2048
character-set-server=utf8
default-storage-engine=INNODB
lower_case_table_names=1
max_allowed_packet=16M[mysqld_safe]
log-error=/usr/local/mysql/data/error.log
#pid-file=/var/run/mariadb/mariadb.pid
备注:
skip-name-resolve :跳过名称解析
所谓反向解析是这样的:
mysql接收到连接请求后,获得的是客户端的ip,为了更好的匹配mysql.user里的权限记录(某些是用hostname定义的)。
如果mysql服务器设置了dns服务器,并且客户端ip在dns上并没有相应的hostname,那么这个过程很慢,导致连接等待。
添加skip-name-resolve以后就跳过着一个过程了
[root@www ~]# echo "export PATH=$PATH:/usr/local/mysql/bin">> /etc/profile
[root@www ~]# . /etc/profile
6.配置 systemctl 方式启动
[root@www ~]# cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld
[root@www ~]# chmod +x /etc/rc.d/init.d/mysqld[root@www ~]# vim /lib/systemd/system/mysqld.service
[Unit]
Description=mysqld
After=network.target
[Service]
Type=forking
ExecStart=/etc/rc.d/init.d/mysqld start
ExecReload=/etc/rc.d/init.d/mysqld restart
ExecStop=/etc/rc.d/init.d/mysqld stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target
备注:
在linux中fork函数是非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。
当一个进程调用fork()函数后,系统先给新的进程分配资源,然后把原来的进程的所有值都复制到新的新进程中。这样就把新的进程创建了出来, 在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。当子进程创建好后,这个父进程就退出,也代表该服务创建成功。
[root@www ~]# systemctl daemon-reload
[root@www ~]# systemctl enable mysqld
[root@www ~]# systemctl start mysqld
[root@www~]# netstat -tunlp|grep 3306
7.访问 MySQL 数据库
[root@www ~]# mysql -u root -p
mysql>set password =password('pwd123');
在此处做个快照,方便后续的实验