一、数据库简介
1.使用数据库的必要性
使用数据库可以高效且条理分明地存储数据,使人们能够更加迅速、方便地管理数据。
数据库具有以下特点。
- 可以结构化存储大量的数据信息,方便用户进行有效的检索和访问。
- 可以有效地保持数据信息的一致性、完整性,降低数据冗余。
- 可以满足应用的共享和安全方面的要求。
数据库技术是计算机科学的核心技术之一,具有完备的理论基础。对数据库基本概念的掌握,将有助于对数据库的理解。
2.数据库的基本概念
(1)数据
描述事物的符号记录称为数据(Data)。数字、文字、图形、图像、声音、档案记录等都是数据。
在数据库中,数据是以“记录”的形式按照统一的格式进行存储的,而不是杂乱无章的。
(2)数据库和数据库表
不同的记录组织在一起,就形成了数据库(Database,DB)的“表”(Table)。也可以说,表是用来存储具体数据的,简单地说,数据库就是表的集合。它是以一定的组织方式存储的相互有关的数据集合。例如,关系数据库的表由记录组成,记录由字段组成,字段由字符或数字组成。它可以供各种用户共享,具有最小冗余度和较高的数据独立性,它是统一管理的相关数据的集合。
通常,数据库并不是简单地存储这些数据的,还要表示它们之间的关系。这种关系也需要用数据库来表示,因此关系的描述也是数据库的一部分。
(3)数据库管理系统和数据库系统
数据库管理系统(Database Management System,DBMS)是实现对数据库资源有效组织管理和存取的系统软件。它在操作系统的支持下,支持用户对数据库的各项操作。DBMS主要包括以下功能。
- 数据库的建立和维护功能:包括建立数据库的结构和数据的录入与转换、数据库的转储与恢复、数据库的重组与性能监视等功能。
- 数据定义功能:包括定义全局数据结构、局部逻辑数据结构、存储结构、保密模式及信息格式等功能。保证存储在数据库中的数据正确、有效和相容,以防止不合语义的错误数据被输入或输出。
- 数据操纵功能:包括数据查询统计和数据更新两个方面。
- 数据库的运行管理功能:这是数据库管理系统的核心部分,包括并发控制、存取控制、数据库内部维护等功能。
- 通信功能:DBMS 与其他软件系统之间的通信,如 Access 能与其他 Office 组件进行数据交换。
数据库系统(Database System,DBS)是一个人-机系统,一般由硬件、操作系统、数据库、DBMS、应用软件和数据库用户(包括数据库管理员)组成。用户可以通过 DBMS 操作数据库,也可以通过应用程序操作数据库。
应用程序是利用 DBMS 为解决某个具体的管理或数据处理的任务而编制的一系列命令的有序集合。如果应用程序比较完善,能够提供友好的人机界面,并编译成可执行文件发行,使得普通用户不需要具备计算机的专业知识,在较短时间就学会使用,那么就称为数据库应用软件。
常用的数据库应用软件有人事管理、财务管理、图书管理等信息管理软件及各类信息咨询系统等
数据库管理员(Database Administrator,DBA)负责数据库的更新和备份、数据库系统的维护、用户管理等工作,保证数据库系统的正常运行。
3.数据库发展史
数据库技术的发展已经成为先进信息技术的重要组成部分,是现代计算机信息系统和计算机应用系统的基础和核心。数据库技术最初产生于 20世纪 60年代中期,根据数据模型的发展,可以划分为三个阶段:第一代的网状、层次数据库系统;第二代的关系数据系统;第三代的以面向对象模型为主要特征的数据库系统。
4.当今主流数据库介绍
在数据库技术日益发展的今天,主流数据库代表着成熟的数据库技术。了解常用数据库,就能知道数据库技术发展的程度,以及未来的大体方向。
(1)关系数据库
20 世纪 80~90年代是关系数据库产品发展和竞争的时代。在市场逐渐淘汰了第一代数据库管理系统的大局面下,SQL Server、0racle、IBM DB2、MySQL 等一批很有实力的关系数据库产品走到了主流商用数据库的位置。
(2)非关系数据库
非关系数据库也被称作 NoSQL(Not 0nly SQL),存储数据不以关系模型为依据,不需要固定的表格式。非关系型数据库作为关系数据库的一个补充,在日益快速发展的网站时代,发挥着高效率与高性能。
非关系型数据库的优点:
- 数据库高并发读写的需求
- 对海量数据高效率存储与访问
- 数据库的高扩展性与高可用性的需求
常用的非关系数据库例如 Memcached、Redis、MongoDB、HBase
5.关系数据库的基本概念
关系数据库系统是基于关系模型的数据库系统,是关系模型应用到数据库领域的实例化。它的基本概念来自于关系模型。
(1)关系数据库的基本结构
关系数据库使用的存储结构是多个二维表格,即反映事物及其联系的数据描述是以平面表格形式体现的。
在每个二维表中,每一行称为一条记录,用来描述一个对象的信息;每一列称为一个字段,用来描述对象的一个属性。数据表与数据库之间存在相应的关联,这些关联用来查询相关的数据。
关系数据库是由数据表之间的关联组成的。其中:
- 数据表通常是一个由行和列组成的二维表,每一个数据表分别说明数据库中某一特定的方面或部分的对象及其属性。
- 数据表中的行通常叫做记录或者元组,它代表众多具有相同属性的对象中的一个
- 数据表中的列通常叫做字段或者属性,它代表相应数据库中存储对象的共有属性。
(2)主键与外键
a.主键
数据表中的每行记录都必须是唯一的,而不允许出现完全相同的记录,通过定义主键(主关键字,Primary Key)可以保证记录(实体)的唯一性。
主键唯一标识表中的行数据,一一个主键值对应一行数据。主键由一个或多个字段组成,其值具有唯一性,不允许取空值(NULL)。一个表只能有一个主键。
如果一个属性集能唯一地标识表的一行而又不含有多余的属性,那么这个属性集称为候选键。表中可以有多个候选键,但是只能有一个候选键可以选作表的主键,所有其他候选键称为备用键。
b.外键
一个关系数据库通常包含多个表,通过外键(Foreign Key)可以使这些表关联起来。外键是用于建立和加强两个表数据之间的链接的一列或多列。通过将表中主键值的一列或多列添加到另一个表中,可创建两个表之间的链接。这个列就称为第二个表的外键。
(3)数据完整性规则
为了维护数据库中的数据与现实世界的一致性,关系数据库的数据与更新操作必须遵守下列四类完整性规则。
- 实体完整性规则:要求关系中的元组在主键的属性上不能有空值。如果出现空值,那么主键值就起不到唯一标识元组的作用。
- 域完整性规则:也称列完整性,指定一个数据集对某一个列是否有效或确定是否允许空值。
- 引用完整性规则:如果两个表之间相互关联,那么引用完整性规则要求不允许引用不存在的元组。
- 用户定义的完整性规则:是针对某一具体数据的约束条件,由应用环境决定。它反映某一具体应用所涉及的数据必须满足的语义要求。系统提供定义和检验这类完整性的机制,以便用统一的系统方法进行处理,不再由应用程序承担这项工作。
二、MySQL 的二进制安装
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/init.d/mysqld
[root@www ~]# chmod +x /etc/init.d/mysqld
[root@www ~]# vim /lib/systemd/system/mysqld.service
[Unit]
Description=mysqld
After=network.target
[Service]
Type=forking
ExecStart=/etc/init.d/mysqld start
ExecReload=/etc/init.d/mysqld reload
ExecStop=/etc/init.d/mysqld stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target
备注:
种类 | 解释 |
Type=oneshot | 这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes 使得 systemd 在服务进程退出之后仍然认为服务处于激活状态。 |
Type=notify | 与 Type=simple 相同,但约定服务会在就绪后向 systemd 发送一个信号。这一通知的实现由 libsystemd-daemon.so 提供。 |
Type=dbus | 若以此方式启动,当指定的 BusName 出现在DBus系统总线上时,systemd认为服务就绪。 |
Type=idle | systemd会等待所有任务处理完成后,才开始执行 idle 类型的单元。其他行为与 Type=simple 类似。 |
Type=forking | systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求,使用此类型启动即可。使用此启动类型应同时指定 PIDFile=,以便 systemd 能够跟踪服务的主进程 |
Type=simple | systemd认为该服务将立即启动。服务进程不会 fork 。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是socket 激活型。 |
备注:
在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');