一、什么是数据库

   数据库是依照某种数据模型组织起来并存放二级存储器中的数据集合。这种数据集合具有如下特点:尽可能不重复,以最优方式为某个特定组织的多种应用服务,其数据结构独立于使用它的应用程序,对数据的增、删、改、查由统一软件进行管理和控制。从发展的历史看,数据库是数据管理的高级阶段,它是由文件管理系统发展起来的。

二、数据库基本结构

  • 物理数据层。 

   它是数据库的最内层,是物理存贮设备上实际存储的数据的集合。这些数据是原始数据,是用户加工的对象,由内部模式描述的指令操作处理的位串、字符和字组成。

  • 概念数据层。 

   它是数据库的中间一层,是数据库的整体逻辑表示。指出了每个数据的逻辑定义及数据间的逻辑联系,是存贮记录的集合。它所涉及的是数据库所有对象的逻辑关系,而不是它们的物理情况,是数据库管理员概念下的数据库。

  • 用户数据层。 

   它是用户所看到和使用的数据库,表示了一个或一些特定用户使用的数据集合,即逻辑记录的集合。 数据库不同层次之间的联系是通过映射进行转换的。

三、数据库主要特点

  • 实现数据共享 

   数据共享包含所有用户可同时存取数据库中的数据,也包括用户可以用各种方式通过接口使用数据库,并提供数据共享。

  • 减少数据的冗余度 

   同文件系统相比,由于数据库实现了数据共享,从而避免了用户各自建立应用文件。减少了大量重复数据,减少了数据冗余,维护了数据的一致性。

  • 数据的独立性 

   数据的独立性包括逻辑独立性(数据库中数据库的逻辑结构和应用程序相互独立)和物理独立性(数据物理结构的变化不影响数据的逻辑结构)。

  • 数据实现集中控制 

   文件管理方式中,数据处于一种分散的状态,不同的用户或同一用户在不同处理中其文件之间毫无关系。利用数据库可对数据进行集中控制和管理,并通过数据模型表示各种数据的组织以及数据间的联系。

  • 数据一致性和可维护性,以确保数据的安全性和可靠性 

   主要包括:①安全性控制:以防止数据丢失、错误更新和越权使用;②完整性控制:保证数据的正确性、有效性和相容性;③并发控制:使在同一时间周期内,允许对数据实现多路存取,又能防止用户之间的不正常交互作用。

  • 故障恢复 

   由数据库管理系统提供一套方法,可及时发现故障和修复故障,从而防止数据被破坏。数据库系统能尽快恢复数据库系统运行时出现的故障,可能是物理上或是逻辑上的错误。比如对系统的误操作造成的数据错误等。

四、数据库分类

  • 层次结构模型

  • 网状结构模型

  • 关系结构模型  

  • 对象-关系型结构模型 

  • 非关系结构模型

五、数据库发展阶段

1、人工管理

这一阶段的主要特征可归纳为如下几点:

  • 计算机中没有支持数据管理的软件。 

  • 数据组织面向应用,数据不能共享,数据重复。 

  • 在程序中要规定数据的逻辑结构和物理结构,数据与程序不独立。 

  • 数据处理方式——批处理。

2、文件系统

   这一阶段的主要标志是计算机中有了专门管理数据库的软件——操作系统(文件管理)。

3、数据系统阶段

  • 面向企业或部门,以数据为中心组织数据,形成综合性的数据库,为各应用共享。 

  • 采用一定的数据模型。数据模型不仅要描述数据本身的特点,而且要描述数据之间的联系。 

  • 数据冗余小,易修改、易扩充。不同的应用程序根据处理要求,从数据库中获取需要的数据,这样就减少了数据的重复存储,也便于增加新的数据结构,便于维护数据的一致性。 

  • 程序和数据有较高的独立性。 

  • 具有良好的用户接口,用户可方便地开发和使用数据库。 

  • 对数据进行统一管理和控制,提供了数据的安全性、完整性、以及并发控制。

4、高级数据系统阶段

   由于现在数据成爆炸式增长,在传统型的数据系统已经不能满足人们的需要,为存储海量的数据现阶段引入了分布式文件系统以及nosql等新的高级数据系统。

六、数据库系统软件

  • 关系数据库管理系统(RDBMS)

        Oracle

        SQLServer

        Mysql

        MariaDB(开源免费使用)

        DB2

        Sybase

        PostgreSQL

        SQLITE(适用与嵌入式系统)

  • 非关系数据库管理系统(nosql)

        基于键值:Redis

        基于列存储数据库:HBase

        基于文档型数据库:MongoDb

        基于图形数据库:Neo4J

   关于关系型及非关系型数据库这里只列举了一部分常见的,特别是非关系型数据库还有很多,这里就不多做介绍了。下面的学习是针对目前还算是开源免费的关系型数据库Mysql。

七、RDBMS(关系数据库管理系统)术语

在我们开始讲解MySQL数据库系统,让我们修改数据库相关的一些定义。

  • Database:数据库是一个表的集合,与相关的数据。 

  • Table: 一个表的数据是一个矩阵。在一个数据库中的表看起来像一个简单的电子表格。 

  • Column: 一列(数据元素)包含的是同一个样的数据,例如列邮政编码。 

  • Row: 行(元组,进入或记录)是一组相关的数据,例如一个订阅的数据。 

  • Redundancy: 存储数据的两倍,冗余,使系统速度更快。 

  • Primary Key:  主键是唯一的。一个关键值可以在一个表中不能出现两次。使用key我们可以在大多数行找到。 

  • Foreign Key: 外键是两个表之间的链接杆。 

  • Compound Key: 复合键(组合键)是一个重要的,由多个列,一列是因为并非十分独特。 

  • Index:在一个数据库中的索引类似于在一本书的背面的一个索引。 

  • Referential Integrity:参照完整性可以确保一个外键的值总是指向一个现有的行。

八、关系型数据库

针对关系型数据库作如下解释:

    1、关系型数据库可以简单的理解为二维数据库,表格式类似于excel表格,我们平时我接触的数据据,一般都是关系型数据库。

    2、关系型数据库不是唯一的高级数据库模型,也不是最优的一种,但是,关系型数据库是现今使用最广泛、最易于理解和使用的数据库模型。

  • 关系:可以理解成一张二维表,每个关系都有一个关系名,即表名。

  • 元组:可以理解成二维表中的一行,在数据库中常被称作记录。 

  • 属性:可以理解成二维表中的一列,在数据库中常被成为字段。 

  • 域:属性的取值范围,也是数据库中某一列的取值限制。 

  • 关键字:一组可以唯一标识元组的属性。数据库中常称为主键有一个或多个列组成。 

  • 关系模式:对关系的描述,在数据库中通常称之为表结构。 

    4、关系型数据库特点:

   容易理解:二维表结构是非常贴近逻辑世界的一个概念,相对与网状、层次以及其它模型更容易理解。

   使用方便:通过SQL语言程序员和数据管理员可以很方便的在逻辑层面操作数据库而不必理解其底层实现。

   易于维护:丰富的完整性(实体完整性、参照完整性、用户自定义完整性)降低数据冗余和数据不一致的概率。      

    5、关系操作:

      数据查询:选择、投影、连接、并、交、差、除

      数据操作:增加、删除、修改、查询

    6、SQL(Structured Query Language):结构化查询语言,一种特殊目的的编程语言,数据库查询和程序设计语言,用于存储数据以及查询、更新和管理关系型数据库。

      SQL查询语言组成部分:

    DDL(Data Definition Languages)语句:数据定义语句,用于定义不同的数据段、数据库、表、列、索引等数据库的对象定义。常用关键字主要包括create、drop、alter等。

    DML(Data Manipulation Language)语句:数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性。常用关键字包括insert、delete、update和select等。

    DCL(Data Control Language)语句:数据控制语句,用于控制不同数据段直接的许可和访问级别的语句,用于定义数据库、表、字段、用户的访问权限和安全级别。常用关键字有grant、revoke等。

九、Mysql

1、什么是Mysql

   MySQL是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 旗下公司。MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS应用软件之一。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL 所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策(本词条“授权政策”),它分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。由于其社区版的性能卓越,搭配 PHP 和 Apache 可组成良好的开发环境。

2、MySQL数据库实现模型

wKioL1XdJQjx8zXaAAIt7vUJKjk034.jpg


通过上图可以把数据库操作分为以下四个阶段:

  1. 用户通过本地或网络使用C、PHP等多种开发语言开发的接口连接MySQL数据库服务器。

  2. 用户接入服务器后进入连接池,在连接池中实现用户认证、线程重用、并发连接数限制、内存检测、连接缓存等操作,而后数据处理结果进入下一层面,接受用户输入的指令,结合SQL接口,分析器,优化器,缓存缓存管理器,将指令处理后发送给数据库引擎完成数据库管理、维护、集群、配置等操作。

  3. 数据库引擎接收到其能支持的数据处理命令后,对数据执行响应的查询、修改等操作,数据库引擎是直接数据处理层面。

  4. 物理存储层面,数据的最终存储位置,根据数据库引擎的处理以索引顺序或者堆文件存储模式存储底层数据。

上图中MySQL的核心组件:

  • 连接池:用于完成用户认证、线程重用、并发连接数限制、内存检测以及连接缓存。 

  • SQL接口:使用SQL结构查询语言对数据库就行操作的接口(DDL DML等) 

  • Parser:分析器,用来进行查询转换、权限分析获取的操作。 

  • Optimizer:优化器,生成并选择最佳的访问路径。 

  • Cache & Buffers:与存储引擎相关的I/O性能提升工具。 

  • 存储引擎(真正执行数据查询操作的工具):MyISAM,InnoDB,NDB,Archive,Federated,Memory,Merge,Partner,Community,Custom等等。

3、系统特性

  • 使用 C和 C++编写,并使用了多种编译器进行测试,保证了源代码的可移植性。 

  • 支持 AIX、FreeBSD、HP-UX、Linux、Mac OS、NovellNetware、OpenBSD、OS/2 Wrap、Solaris、Windows等多种操作系统。 

  • 为多种编程语言提供了 API。这些编程语言包括 C、C++、Python、Java、Perl、PHP、Eiffel、Ruby、.NET和 Tcl 等。 

  • 支持多线程,充分利用 CPU 资源。 

  • 优化的 SQL查询算法,有效地提高查询速度。 

  • 既能够作为一个单独的应用程序应用在客户端服务器网络环境中,也能够作为一个库而嵌入到其他的软件中。 

  • 提供多语言支持,常见的编码如中文的 GB 2312、BIG5,日文的 Shift_JIS等都可以用作数据表名和数据列名。 

  • 提供 TCP/IP、ODBC 和 JDBC等多种数据库连接途径。 

  • 提供用于管理、检查、优化数据库操作的管理工具。 

  • 支持大型的数据库。可以处理拥有上千万条记录的大型数据库。 

  • 支持多种存储引擎。 

  • MySQL 是开源的,所以你不需要支付额外的费用。 

  • MySQL 使用标准的 SQL数据语言形式。 

  • MySQL 对 PHP 有很好的支持,PHP是目前最流行的 Web 开发语言。 

  • MySQL是可以定制的,采用了 GPL协议,你可以修改源码来开发自己的 MySQL 系统。 

  • 在线 DDL/更改功能,数据架构支持动态应用程序和开发人员灵活性(5.6新增) 

  • 复制全局事务标识,可支持自我修复式集群(5.6新增) 

  • 复制无崩溃从机,可提高可用性(5.6新增) 

  • 复制多线程从机,可提高性能(5.6新增)

4、应用环境及架构

   与其他的大型数据库例如 Oracle、DB2、SQL Server等相比,MySQL 自有它的不足之处,但是这丝毫也没有减少它受欢迎的程度。对于一般的个人使用者和中小型企业来说,MySQL提供的功能已经绰绰有余,而且由于 MySQ L是开放源码软件,因此可以大大降低总体拥有成本。Linux作为操作系统,Apache和 Nginx作为 Web 服务器,MySQL 作为数据库,PHP/Perl/Python作为服务器端脚本解释器。由于这四个软件都是免费或开放源码软件(FLOSS),因此使用这种方式不用花一分钱(除开人工成本)就可以建立起一个稳定、免费的网站系统,被业界称为“LAMP“或“LNMP”组合。

5、存储引擎

  • MyISAM在MySQL 5.0 之前是默认数据库引擎,最为常用。拥有较高的插入,查询速度,但不支持事务 

  • InnoDB事务型数据库的首选引擎,支持ACID事务,支持行级锁定, MySQL 5.5 起成为默认数据库引擎 

  • BDB源 自 Berkeley DB,事务型数据库的另一种选择,支持Commit 和Rollback 等其他事务特性 

  • Memory所有数据置于内存的存储引擎,拥有极高的插入,更新和查询效率。但是会占用和数据量成正比的内存空间。并且其内容会在 MySQL 重新启动时丢失 

  • Merge将一定数量的 MyISAM 表联合而成一个整体,在超大规模数据存储时很有用 

  • Archive非常适合存储大量的独立的,作为历史记录的数据。因为它们不经常被读取。Archive 拥有高效的插入速度,但其对查询的支持相对较差 

  • Federated将不同的 MySQL 服务器联合起来,逻辑上组成一个完整的数据库。非常适合分布式应用 

  • Cluster/NDB高冗余的存储引擎,用多台数据机器联合提供服务以提高整体性能和安全性。适合数据量大,安全和性能要求高的应用 

  • CSV: 逻辑上由逗号分割数据的存储引擎。它会在数据库子目录里为每个数据表创建一个 .csv 文件。这是一种普通文本文件,每个数据行占用一个文本行。CSV 存储引擎不支持索引。 

  • BlackHole:黑洞引擎,写入的任何数据都会消失,一般用于记录 binlog 做复制的中继 

  • EXAMPLE 存储引擎是一个不做任何事情的存根引擎。它的目的是作为 MySQL 源代码中的一个例子,用来演示如何开始编写一个新存储引擎。同样,它的主要兴趣是对开发者。EXAMPLE 存储引擎不支持编索引。 

6、ACID

   ACID,指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。一个支持事务(Transaction)的数据库,必需要具有这四种特性,否则在事务过程(Transaction processing)当中无法保证数据的正确性,交易过程极可能达不到交易方的要求。

  • 原子性

   整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

  • 一致性

   在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。具体来说就是,比如表与表之间存在外键约束关系,那么你对数据库进行的修改操作就必需要满足约束条件,即如果你修改了一张表中的数据,那你还需要修改与之存在外键约束关系的其他表中对应的数据,以达到一致性。

  • 隔离性

   隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。

  • 持久性

   在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。 由于一项操作通常会包含许多子操作,而这些子操作可能会因为硬件的损坏或其他因素产生问题,要正确实现ACID并不容易。ACID建议数据库将所有需要更新以及修改的资料一次操作完毕,但实际上并不可行。 

  目前主要有两种方式实现ACID:第一种是Write ahead logging,也就是日志式的方式。第二种是Shadow paging。

7、MySQL替代产品

   随着 MySQL 被 Oracle 收购,MySQL 的用户和开发者开始质疑开源数据库的命运,与此同时他们开始寻找替代品。

  • MariaDB:从 MySQL 转向 MariaDB的代表厂家:谷歌(2013年9月)、RedHat(2013年6月)、维基百科(2013年4月) 。 MariaDB如同 MySQL 的影子版本,MariaDB是 MySQL 的一个分支版本(branch),而不是衍生版本(folk),提供的功能可和 MySQL 完全兼容。 

  • PostgreSQL:从 MySQL 转向 PostgreSQL的代表厂家:苹果(2011年) 。

  • NoSQL:(NoSQL = Not Only SQL),意即“不仅仅是 SQL”,是一项全新的数据库革命性运动。NoSQL指的是非关系型的数据库。

8、MySQL安装

MySQL的安装大致有以下四个方法,本例是关于通用二进制格式的压缩文件进行安装。

  • Vendor:操作系统自带的rpm包 

  • MySql官方rpm包 

  • 通用二进制格式 

  • 源码编译

安装环境介绍

hostnameIP系统版本MySQL版本
example.com192.168.1.8CentOS 6.6mysql-5.5.44


  • 基于逻辑卷创建mysql数据目录

[root@example.com mysql]# yum install -y lvm2
[root@example.com mysql]# pvcreate /dev/sdb1   //磁盘分区这里就不列出了
  Physical volume "/dev/sdb1" successfully created
[root@example.com mysql]# vgcreate data /dev/sdb1
  Volume group "data" successfully created
[root@example.com mysql]# lvcreate -L 2G -n mydata data
  Logical volume "mydata" created.
[root@example.com mysql]# mke2fs -t ext4 /dev/data/mydata


  • 安装MySQL及初始化

[root@example.com ~]# tar xf mysql-5.5.44-linux2.6-x86_64.tar.gz -C /usr/local/
[root@example.com ~]# groupadd -r mysql
[root@example.com ~]# useradd -g mysql -r -s /sbin/nologin mysql
[root@example.com ~]# cd /usr/local/
[root@example.com local]# ln -sv mysql-5.5.44-linux2.6-x86_64 mysql
[root@example.com local]# cd mysql
[root@example.com mysql]# chown -R mysql.mysql ./*
[root@example.com mysql]# vim /etc/fstab //在最后添加下面的挂载信息
/dev/data/mydata       /data                   ext4    defaults,noatime 0 0 
[root@example.com mysql]# mkdir -p /data/mydata  
[root@example.com mysql]# mount -a 
[root@example.com mysql]# chown -R mysql.mysql /data/mydata
[root@example.com mysql]# scripts/mysql_install_db --datadir=/data/mydata --user=mysql  //初始化MySQL
[root@example.com mysql]# chown -R root ./*    //将安装文件还改回root,避免出错
[root@example.com mysql]# cp support-files/mysql.server /etc/init.d/mysqld   //设置启动脚本
[root@example.com mysql]# chkconfig --add mysqld   
[root@example.com mysql]# cp support-files/my-large.cnf /etc/my.cnf   //设置配置文件
[root@example.com ~]# vim /etc/my.cnf   //在配置文件内添加存放数据的目录
datadir=/data/mydata
[root@example.com ~]# service mysqld start
Starting MySQL..... SUCCESS! 
[root@example.com ~]# ls /data/mydata/
example.com.err  ibdata1      ib_logfile1  mysql-bin.000001  performance_schema
example.com.pid  ib_logfile0  mysql        mysql-bin.index   test


  • 后续配置

设置命令的环境变量

[root@example.com ~]# vim /etc/profile.d/mysqld.sh
export PATH=/usr/local/mysql/bin:$PATH
[root@example.com ~]# .  /etc/profile.d/mysqld.sh

导出头文件:

[root@example.com mysql]# ln -sv /usr/local/mysql/include/ /usr/include/mysql
"/usr/include/mysql" -> "/usr/local/mysql/include/"

导出库文件:

[root@example.com ~]# vim /etc/ld.so.conf.d/mysql.conf
/usr/local/mysql/lib
[root@example.com ~]# ldconfig -v
[root@example.com ~]# ldconfig -p |grep "mysql"
libtcmalloc_minimal.so.0 (libc6,x86-64) => /usr/local/mysql/lib/libtcmalloc_minimal.so.0
libmysqlclient.so.18 (libc6,x86-64) => /usr/local/mysql/lib/libmysqlclient.so.18
libmysqlclient.so (libc6,x86-64) => /usr/local/mysql/lib/libmysqlclient.so
导出帮助文件:
[root@example.com ~]# vim /etc/man.config   //配置文件内添加下面的内容
MANPATH /usr/local/mysql/man
[root@example.com ~]# man mysqld
MySQL 5.5                         05/02/2015                         MYSQLD(8)


  • MySQL数据库用户设置

第一次登录由于未设置密码就可以直接登录MySQL服务端,下面就为root用户设置密码:

[root@example.com ~]# mysql
mysql> SET PASSWORD FOR 'root'@'localhost' =PASSWORD('redhat');
Query OK, 0 rows affected (0.00 sec)
mysql> SET PASSWORD FOR 'root'@'127.0.0.1' =PASSWORD('redhat');
Query OK, 0 rows affected (0.00 sec)

删除MySQL系统不必要的用户:

[root@example.com ~]# mysql -uroot -p -h127.0.0.1
Enter password: //输入刚才设置的密码
mysql> use mysql;    //设置mysql为默认库
mysql> SELECT User,Host,Password FROM user;//查看系统有四个用户未设置密码,删除此用户
+------+-------------+-------------------------------------------+
| User | Host        | Password                                  |
+------+-------------+-------------------------------------------+
| root | localhost   | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
| root | example.com |                                           |
| root | 127.0.0.1   | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
| root | ::1         |                                           |
|      | localhost   |                                           |
|      | example.com |                                           |
+------+-------------+-------------------------------------------+
6 rows in set (0.00 sec)
mysql> DROP USER 'root'@'example.com';
Query OK, 0 rows affected (0.01 sec)
mysql> DROP USER ''@'example.com';
Query OK, 0 rows affected (0.00 sec)
mysql> DROP USER ''@'localhost';
Query OK, 0 rows affected (0.00 sec)
mysql> DROP USER 'root'@'::1';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT User,Host,Password FROM user;
+------+-----------+-------------------------------------------+
| User | Host      | Password                                  |
+------+-----------+-------------------------------------------+
| root | localhost | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
| root | 127.0.0.1 | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
+------+-----------+-------------------------------------------+


2 rows in set (0.00 sec)

        由此mysql服务端已经配置好了,在初始化mysql时有可能会遇下面的错误,解决方法是安装libaio库文件就好了。

./bin/mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory