MySQL数据库体验

  1. 数据(data)
    1. 描述事物的符号记录称为数据。数字(较多)、文字(较多)、图形、图像、声音、档案记录
    2. 在数据库中,数据是以“记录”的形式按照统一的格式进行存储的,而不是杂乱无章的
    3. 存储的一行数据,在数据库中称为一条“记录”(Record),每条记录中的每一个输入项称为“列”
  2. 数据库和数据库表
    1. 不同的记录组织在一起,就形成了数据库(Database,DB)的“表”(Table)
    2. 数据库就是表的集合。它是以一定的组织方式存储的相互有关的数据集合
      1. 如关系数据库的表由记录组成,记录由字段组成,字段由字符或数字组成。它可以供各种用户共享,具有最小冗余度和较高的数据独立性,它是统一管理的相关数据的集合
    3. 数据库并不是简单地存储这些数据的,还要表示它们之间的关系
  3. 数据库管理系统和数据库系统
    1. 数据库管理系统(Database Management System),DBMS)是实现对数据库资源有效组织、管理和存取的系统软件。它在操作系统的支持下,支持用户对数据库的各项操作
  •                 数据库的建立和维护功能:包括建立数据库的结构和数据的录入与转换、数据库的转储与恢复、数据库的重组与性能监视等功能
    •         数据定义功能:包括定义全局数据结构、局部逻辑数据结构、存储结构、保密模式及信息格式等功能。保证存储在数据库中的数据正确、有效和相容,以防止不合语义的错误数据被输入或输出
      • 通信功能:DBMS 与其他软件系统之间的通信,如 Access 能与其他 Office 组件进行数据交换
      • 数据库的运行管理功能:这是数据库管理系统的核心部分,包括并发控制、存取控制、数据库内部维护等功能
      • 数据操纵功能:包括数据查询统计和数据更新两个方面

                2. 数据库系统(Database System,DBS)是一个人-机系统,一般由硬件、操作系统、数据库、DBMS、应用软件和数据库用户(包括数据库管理员)组成

                3. 应用程序是利用 DBMS 为解决某个具体的管理或数据处理的任务而编制的一系列命令的有序集合

                4. 数据库管理员(Database Administrator,DBA)负责数据库的更新和备份、数据库系统的维护、用户管理等工作,保证数据库系统的正常运行

数据模型

数据是现实世界中“量”的抽象,而数据模型(Data Model)是数据特征的抽象。在数据库系统中,数据模型是它的核心与基础

数据模型表现为数据的结构、定义在其上的操作及约束条件。它从概念层次上描述了系统的静态特征、动态特征和约束条件,为数据库系统

的信息表示与操作提供了一个抽象框架

(1)网状模型

        a. 数据结构

  • 一个银行客户可以拥有多个银行账号(一对多)
  • 一个银行账号也可以被多个客户所有(一对多)
  • 每个银行账户位于特定的银行支行(一对一)

        b. 数据操作

  • 从数据结构的定义上不难看出,网状模型的数据操作是建立在关系链基础上的导航式的操作
  • 针对一个特定的网状模型系统的数据结构,有可能找到最优的查询算法。但是,一旦结构发生变化,就需要新的查询办法。网状模型以图论为基础,还无法得到一个通用的、高效的解决方案

        c. 数据约束

  • 网状模型的数据约束是零散孤立的,或者分散在各个节点,或者集中成为一种关系链,这样容易导致不一致性或降低效率。所以,通常网状模型不具体实现数据约束,而由应用程序自身来实现数据约束
(2)层次模型

        a. 数据结构

  • 企业下辖多个部门(一对多)
  • 部门下辖多个科室(一对多)
  • 科室下辖多个小组(一对多)

        b. 数据操作

  • 在层次模型上的数据操作不可避免地具有网状模型的特点--导航性
  • 但是,由于禁止了多对一和多对多的关系,因此数据操作相对网状模型而言简单了许多。这样的结构有利于提高数据的查询效率,但数据存取上还存在着必须导航的要求

        c. 数据约束

  • 层次模型的数据约束与网状模型相似,由于结构的简化,去掉了网状模型中多对多和多对一的关系,数据约束处理的复杂性按级数下降
  • 层次模型的实现技术比关系模型优越,比网状模型简单,所以一直独领风骚
(3)关系模型

        a. 数据结构

  • 关系模型建立在关系代数的理论基础上,数据结构使用简单易懂的二维数据表,可以用简单的“实体-关系”(E-R)图来直接表示,E-R图中包含了实体(数据对象)、关系和属性三个要素

  • 实体:也称为实例,对应现实世界中可区别于其他对象的“事件”或“事物”,如银行客户、银行账户
  • 实体集:具有相同类型及共享相同性质的实体集合。例如,银行所有客户的集合可以定义为“银行客户”实体集
  • 属性:实体所具有的某一特性,一个实体可以有多个属性。例如,“银行客户”实体集中的每个实体均具有姓名、住址、电话等属性
  • 联系:实体集之间的对应关系称为联系,也称为关系。例如,银行客户和银行账户之间存在“储蓄”的关系

        b. 数据操作

  • 对于数据库的用户而言,关系模型使用从关系代数上抽象出来的数据库操作语言(DML)进行操作。结构化查询语言(SQL)就是其中最重要的一种,已经成为关系数据库的标准操作语言。它的特色是直接面向结果,简化操作步骤,使得数据库应用的设计变得非常简单易懂

        c. 数据约束

  • 关系模型的数据约束可以针对实体,也可以针对实体的属性,还可以针对关系,并可以在定义实体、实体属性和关系时全面实现
  • 关系模型相比网状模型和层次模型有更为坚实和完整的理论基础。相比层次模型和网状模型而言,关系模型与用户更靠近些,而网状模型和层次模型与底层实现的结合更紧密

主流数据库

1:关系型数据库:SQL Server(微软公司产品):遵守GPL协议

Oracle(甲骨文公司产品)、DB2(IBM公司产品)、MySQL(甲骨文公司收购)

        a. 基本结构

  • 关系数据库使用的存储结构是多个二维表格,即反映事物及其联系的数据描述是以平面表格形式体现的
  • 在每个二维表中,每一行称为一条记录,用来描述一个对象的信息;每一列称为一个字段,用来描述对象的一个属性。数据表与数据库之间存在相应的关联,这些关联用来查询相关的数据
    • 数据表通常是一个由行和列组成的二维表,每一个数据表分别说明数据库中某一特定的方面或部分的对象及其属性
    • 数据表中的行通常叫做记录或者元组,它代表众多具有相同属性的对象中的一个
    • 数据表中的列通常叫做字段或者属性,它代表相应数据库中存储对象的共有属性

        b. 主键和外键

  • 主键(Primary Key)唯一标识表中的行数据,一个主键值对应一行数据。主键由一个或多个字段组成,其值具有唯一性,不允许取空值(NULL)。一个表只能有一个主键
    •         如果一个属性集能唯一地标识表的一行而又不含有多余的属性,那么这个属性集称为候选键。表中可以有多个候选键,但是只能有一个候选键可以选作表的主键,所有其他候选键称为备用键
    • 一个关系数据库通常包含多个表,通过外键(Foreign Key)可以使这些表关联起来
      • 外键是用于建立和加强两个表数据之间的链接的一列或多列。通过将表中主键值的一列或多列添加到另一个表中,可创建两个表之间的链接。这个列就称为第二个表的外键

        c. 数据的完整性规则

  • 实体完整性规则
    • 实体完整性规则要求关系中的元组在主键的属性上不能有空值。如果出现空值,那么主键值就起不到唯一标识元组的作用
  • 域完整性规则
    • 域完整性也称列完整性,指定一个数据集对某一个列是否有效或确定是否允许空值
  • 引用完整性规则
    • 如果两个表之间相互关联,那么引用完整性规则要求不允许引用不存在的元组
  • 用户定义的完整性规则
    • 用户定义的完整性规则是针对某一具体数据的约束条件,由应用环境决定。它反映某一具体应用所涉及的数据必须满足的语义要求。系统提供定义和检验这类完整性的机制,以便用统一的系统方法进行处理,不再由应用程序承担这项工作

2:非关系数据库

  • 非关系数据库也被称作 NoSQL(Not Only SQL),存储数据不以关系模型为依据,不需要固定的表格式。非关系型数据库作为关系数据库的一个补充
  • 非关系型数据库的优点:
    • 数据库高并发读写的需求
    • 对海量数据高效率存储与访问
    • 数据库的高扩展性与高可用性的需求
  • 非关系数据库例如 Memcached、Redis、MongoDB、HBase

MySQL编译安装

(1)准备工作

//如果系统中安装有mariadb,先卸载,如果没有,此步骤省略
[root@www ~]# rpm -q mariadb 
mariadb-5.5.52-1.el7.x86_64 
[root@www ~]# yum remove mariadb

//centos系统默认安装了mariadb-libs包,这个包在/etc下生成了mariadb的配置文件my.cnf,所以系统中默认有一个my.cnf的配置文件

//安装mysql的依赖包
[root@www ~]# yum -y install gcc gcc-c++ ncurses-devel openssl openssl-devel

//ncurses是字符终端下屏幕控制的基本库,你在TTY下登录到主机上mysql需要的
//OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份

//MySQL5.7源码安装需要 cmake 编译安装,所以先下载最新稳定版本的 cmake 包并安装.官方下载网站:https://cmake.org/download/
[root@www ~]# tar zxf cmake-3.16.2.tar.gz 
[root@www ~]# cd cmake-3.16.2 
[root@www cmake-3.16.2]# ./configure 
[root@www cmake-3.16.2]# gmake && gmake install

//MySQL5.7需要 Boost 库,所以也需要下载安装.Boost 官方下载网址是:http://sourceforge.net/projects/boost/files/boost/
[root@www ~]# tar zxvf boost_1_59_0.tar.gz 
[root@www ~]# mv boost_1_59_0/ /usr/local/boost

//Boost库是为C++语言标准库提供扩展的一些C++程序库的总称,由Boost社区组织开发、维护。Boost库可以与C++标准库完美共同工作,并且为其提供扩展功能;Mysql使用c语言和c++语言写的

(2)源码编译安装mysql

//创建运行用户
[root@www ~]# useradd -M -s /sbin/nologin mysql

//解包
[root@www ~]# tar zxf mysql-5.7.28.tar.gz 
[root@www ~]# cd mysql-5.7.28

//配置
[root@www mysql-5.7.28]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DSYSCONFDIR=/etc-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DWITH_BOOST=/usr/local/boost

//-DSYSCONFDIR:指定初始化配置文件目录
//-DDEFAULT_CHARSET:指定默认使用的字符集编码,如 utf8
//-DDEFAULT_COLLATION:指定默认使用的字符集校对规则,utf8_general_ci 是适用于 UTF-8 字符集的通用规则
//-DWITH_EXTRA_CHARSETS:指定额外支持的其他字符集编码
//-DWITH_BOOST:指定 boost 库的位置,MySQL5.7 版本编译安装时必须添加这个参数

//编译并安装
[root@www mysql-5.7.28]# make 
[root@www mysql-5.7.28]# make install

(3)安装后其他调整

//建立配置文件
[root@www ~]# vim /etc/my.cnf 
[client] 
socket=/usr/local/mysql/data/mysql.sock 

[mysqld] 
socket=/usr/local/mysql/data/mysql.sock

#绑定监听地址 0.0.0.0 
bind-address = 0.0.0.0
skip-name-resolve
#设置 3306 端口 
port = 3306 
# 设置 mysql 的安装目录 
basedir=/usr/local/mysql 
# 设置 mysql 数据库的数据的存放目录 
datadir=/usr/local/mysql/data
# 允许最大连接数 
max_connections=2048 
# 服务端使用的字符集默认为 utf8 
character-set-server=utf8 
# 创建新表时将使用的默认存储引擎 
default-storage-engine=INNODB 
#表名大小写不敏感
lower_case_table_names=1 
#mysql服务允许接受的数据包最大值
max_allowed_packet=16M

[mysqld_safe]
log-error=/usr/local/mysql/data/error.log
#pid-file=/var/run/mariadb/mariadb.pid
//[mysqld_safe]下面的log-error只在用mysqld_safe启动时才会生成。
如果希望在初始化mysql后马上生成这个日志文件,可以将log-error写入到[mysqld] 中

//初始化数据库
[root@www mysql-5.7.28]# /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

//设置环境变量
[root@www mysql-5.7.28]#echo "export PATH=$PATH:/usr/local/mysql/bin">> /etc/profile 
[root@www mysql-5.7.28]# . /etc/profile

(4)添加系统服务

//若希望添加 mysqld 系统服务,以便通过 systemct1 进行管理,可以直接使用源码包中提供的服务脚本。找到 support-files 文件夹下的 mysq1.server 脚本文件,
//将其复制到/etc/rc.d/init.d目录下,并改名为 mysqld,然后再设置执行权限
[root@www mysql-5.7.28]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld 
[root@www mysql-5.7.28]# chmod +x /etc/rc.d/init.d/mysqld

//将 MySQL 添加为 systemd 标准服务,之后方便使用“systemctl”命令进管理
[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

[root@www ~]# systemctl daemon-reload 
[root@www ~]# systemctl enable mysqld 
[root@www ~]# systemctl start mysqld
[root@www ~]# systemctl status mysqld
[root@www ~]# netstat -anpt | grep mysqld

//访问数据库
[root@www ~]# mysql -u root -p
mysql>set password =password('pwd123');

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. 关闭 SELinux 和防火墙

[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    //初始化mysql
//记住初始密码

        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

种类

解释

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

  • 30
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值