mysql数据库

章节内容

 关系型数据库基础

 安装mysql yum包安装,源码包编译安装,二进制安装。

 管理数据库和表

 用户和权限管理

 函数和存储过程

 mysql架构

 存储引擎

服务器选项,系统和状态变量 最主要的一项,共计1000多个变量选项

 优化查询和索引管理

 锁和事务管理 并发性人物的时候需要用到

 日志管理

 备份还原

 mysql集群 多个mysql的集合

数据库的特点

 涉及的数据量大

 数据不随程序的结束而消失

 数据被多个应用程序共享

 大数据 分析大数据,得出具体的某个人或团体的需求/意向,针对不同的人,推送广告或其他消息,从中获得利益.

数据库的发展史

 萌芽阶段:文件系统

使用磁盘文件来存储数据(需要了解文件的格式才能读取,过程麻烦)

文件管理系统的缺点

编写应用程序不方便

数据冗余不可避免

应用程序依赖性

不支持对文件的并发访问 多个人同时访问一个文件的时候,一个写入,一个删除,容易导致混乱

 数据间联系弱

 难以按用户视图表示数据

 无安全控制功能

文件系统适合个人使用.

 初级阶段:第一代数据库

出现了网状模型、层次模型的数据库

 中级阶段:第二代数据库

关系型数据库和结构化查询语言

 高级阶段:新一代数据库 “关系-对象”型数据库

以上三种称为数据库管理系统(dbms,由一种专门的软件,来管理这些数据)

数据库管理系统的优点

 相互关联的数据的集合

 较少的数据冗余

程序与数据相互独立 数据与管理程序互相独立,通过管理程序,打开以及管理保存在磁盘上的数据文件.

保证数据的安全、可靠 用户不直接接触数据库文件,通关管理软件来访问,然后在管理软件上设置权限,用来确保数据安全,不被更改. 最大限度地保证数据的正确性

数据可以并发使用并能同时保证一致性同时支持了多用户同时访问数据库,什么用户看那一块数据都可以通过配置来实现.

数据库管理系统

数据的汇集,它以一定的组织形式存于存储介质上(一个或多个文件的形式存储起来) 或者像cle的数据管理系统,是以raw的形式,将数据存储到裸文件系统上,类似于mbr的形式,数据以0101的形式存在,可以提高性能.

dbms是管理数据库的系统软件,它实现数据库系统的各种功能。是数据库系统的核心,可以用给一个管理系统,管理多个数据文件.

 dba:负责数据库的规划、设计、协调、维护和管理等工作

 应用程序指以数据库为基础的应用程序

数据库管理软件类型的分类:

网状数据库:数据结构类似于蜘蛛网一样,错综复杂.具有数据模式和日志的特征.最早通用电气使用的,现在已被淘汰

层次数据库:以树型的结构来构建数据库,关系支持一对多,代表公司ibm

数据库管理系统的基本功能

 数据定义 比如说存学生信息,学号,性别,姓名之类的数据,都需要先定义再存储进去.

 数据处理 对输入的输入,进行增删改查操作.

 数据安全 设置读写权限,保证数据不被增删改查或被无关人员看到.

 数据备份

数据库系统的架构

 单机架构

 大型主机/终端架构

 主从式架构(c/s)

 分布式架构

关系型数据库sql,比如mysql (非关系数据库叫 nosql 比如redis,

memcached,mongodb)

关系关系就是二维表。并满足如下性质:表中的行、列次序并不重要(第几行,第几列并不重要)

行row:表中的每一行,又称为一条记录

列column:表中的每一列,称为属性,字段

主键(primary key):用于惟一确定一个记录的字段,实现避免出现多条重复记录的方式.主键可以作用在某个字段(列)上,但是这个字段(列)上不可以出现重复的项.设定主键的字段,必须有不可重复性,比如不能将性别设置为主键,毕竟性别就两种...除非这张数据表中就两条记录.在一个数据表中,主键最多只能有一个.

域domain:属性的取值范围,如,性别只能是‘男’和‘女’两个值,每列的域的取值方式不用统一.

马哥学习----李洋个人笔记----mysql(上)_运维

外键

两个数据表a和b,b依赖与a,那么数据表b上面的主键,就称为外键,b数据表上的主键取值范围,不能超过a数据表上主键的范围.

马哥学习----李洋个人笔记----mysql(上)_运维_02

关系数据库rdbms:

mysql: mysql, mariadb, percona server

postgresql: 简称为pgsql,enterprisedb

oracle

mssql

db2

实体-联系模型e-r

实体entity

客观存在并可以相互区分的客观事物或抽象事件称为实体(比如刚才说的学员信息,这就是实体,在数据库中表现为记录,相当于表格的行)

在e-r图中用矩形框表示实体,把实体名写在框内

属性

实体所具有的特征或性质(相当于列)

联系:联系是数据之间的关联集合,是客观存在的应用语义链

实体内部的联系:指组成实体的各属性之间的联系。如职工实体中,职工号和

部门经理号之间有一种关联关系,如下图:

马哥学习----李洋个人笔记----mysql(上)_Linux_03

实体之间的联系:指不同实体之间联系。也就是表与表之间的联系.

实体之间的联系用菱形框表示

表与表之间的联系的类型

一对一联系(1:1) 比如员工信息表,和员工考勤表.

一对多联系(1:n) 比如员工信息表和部门表,部门表有部门的标号,部门名称,部门经理的编号等.一个部门里面包括了多个员工,即一(部门)对多(员工)

ps:一对多最好设置主键,和外键.即员工的id来源于部门的id号.避免出现一共10个部门,给来个11号部门的员工该编号.

多对多联系(m:n) 假设有两个班级,一个学员可以报多个班级,而每个班级又有多名学员,这就是多(班级表)对多(学员表)的关系. 多对多关系,通常使用建立第三张表的方式来表达,当中需要使用两张表的主键来构建,比如用班级表里的id号,和学员的id号来生成第三张表. 如下图:

马哥学习----李洋个人笔记----mysql(上)_运维_04

事务transaction:多个操作被当作一个整体对待acid:

a :原子性 一个事务含有多个操作,要么这些操作全部做完,要不都不做.如果操作做了一半没做完,那么在数据库检查的时候,发现有一个事务只做了一半,会把已经做的那一半给撤销掉.以此来保证事务的完整性.事务只处理了一半,这时候的事务叫做脏数据,除了正在处理的人外,其他人不可见.

c :一致性 任何情况,数据在数据库存放,都会保持一致.假设有两个人,一方给另一方汇钱,只要一方账户钱减少了,另外一方必定会加上同等的钱数.

i :隔离性 在a个b俩人对同一个数据增删改时,数据库会判断控制权交给哪一方(比如a),并在交过去之后给这个数据加锁禁止别人访问,等a处理完这个数据之后,再把锁撤销.这就是隔离性

d: 持久性 整个事务结束了,对数据的更改将永久的存在磁盘上.结束后的事务是无法撤销的.

数据三要素

数据结构:包括两类

一类是与数据类型、内容、性质有关的对象,比如关系模型中的域、属性和

关系等;

另一类是与数据之间联系有关的对象,比如关系属性的域.属性之类.它从数据组织层表达数据记录与字段的结构,比如如何存放这个数据,数据的类型,格式(整数,浮点数)之类.

数据的操作:(用的最多的是查询)

数据提取:在数据集合中提取感兴趣的内容。select

数据更新:变更数据库中的数据。insert、delete、update

数据的约束条件 :是一组完整性规则的集合(用来确保数据的完整性)

实体(行)完整性 entity integrity 每一条(行)记录都是唯一的,如何来确定唯一性呢? 用主键来确保.

域(列)完整性 domain integrity 每个域(列)的取值范围都是合理的.

参考完整性referential integrity 表和表之间的关系,比如主外键表达的关系.

简易数据规划流程(设计数据库)

第一阶段:收集数据,得到字段

收集必要且完整的数据项

转换成数据表的字段

第二阶段:把字段分类,归入表,建立表的关联

关联:表和表间的关系

分割数据表并建立关联的优点

节省空间

减少输入错误

方便数据修改

第三阶段:规范化数据库

数据库的正规化分析

 rdmbs设计范式基础概念

设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不

同的规范要求被称为不同范式,各种范式呈递次规范,越高的范式数据库冗余越小(冗余rongyu越小代表重复数据越少,占用空间越少)

 目前关系数据库有六种范式:第一范式(1nf)、第二范式(2nf)、第三范式

(3nf)、巴德斯科范式(bcnf)、第四范式(4nf)和第五范式(5nf,又称完美范式)。满足最低要求的范式是第一范式(1nf)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2nf),其余范式以次类推。一般说来,数据库只需满足第三范式(3nf)即可.456范式虽然效果好,但是数据复杂度变高了.

范式

1nf无重复的列,每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。除去同类型的字段,就是无重复的列.ps:第一范式(1nf)是对关系模式的基本要求,不满足第一范式(1nf)的数据库就不是关系数据库

马哥学习----李洋个人笔记----mysql(上)_运维_05

2nf属性完全依赖于主键,第二范式必须先满足第一范式,要求表中的每个行必须可以被唯一地区分。通常为表加上一个列,以存储各个实例的唯一标识

pk,非pk的字段需要与整个pk有直接相关性

马哥学习----李洋个人笔记----mysql(上)_运维_06

ps:主键可以设置为复合主键。复合主键是由多个字段组成,其中复合主键的单独字段拿出去可以有重复项目,但合在一起就不能重复,如下图:

马哥学习----李洋个人笔记----mysql(上)_运维_07

解决方式就是将城市和区号单独列出来,如下图:

马哥学习----李洋个人笔记----mysql(上)_运维_08

3nf属性不依赖于其它非主属性,满足第三范式必须先满足第二范式。第三范式要求一个数据库表中不包含已在其它表中已包含的非主关键字信息,非pk 的字段间不能有从属关系

马哥学习----李洋个人笔记----mysql(上)_Linux_09

同样解决方式是将城市和区号单独列出来建表,最终结果如下:

马哥学习----李洋个人笔记----mysql(上)_运维_10

这样在第一个表中,城市就不用再详细的写出名字了,只写出第二个表中对应的的id号即可。

总结:在2nf和3nf当中,不符合的都需要再单独建立一张表才可以成立,虽然实现了范式要求。也节约了空间(避免了多次输入城市名称)。但是带来了负面影响,比如查员工城市的时候,需要查看两张表,逻辑量增加了,效率也降低了。

sql概念

 sql: structure query language 结构化查询语言

sql解释器:

数据存储协议:应用层协议,基于c/s结构

 s:server, 监听于套接字(mysql使用的端口号是3306tcp端口号),接收并处理客户端的应用请求

 c:client,通过网络连接数据库服务器。

客户端程序接口 (命令行工具) cli和gui

应用编程接口(api)用户通过软件和网络连接到数据库,软件调用数据库的接口来与数据库相连(user—app—network—mysql—dbfile)常用软件如下:

odbc:open database connectivity 以及 jdbc:java data base connectivity

mysql的接口 dbo,扩展接口 mysqli

约束:constraint,表中的数据要遵守的限制

主键:一个或多个字段的组合,填入的数据必须能在本表中唯一标识本行;

必须提供数据,即not null,一个表只能有一个,主键不能为空

惟一键(uk):一个或多个字段的组合,填入的数据必须能在本表中唯一标识本行; 允许为null,一个表可以存在多个,用来确保数据在本表中是唯一的。

外键:一个表中的某字段可填入的数据取决于另一个表的主键或唯一键已有的数据

检查:字段值在一定范围内

基本概念

索引:将表中的一个或多个字段中的数据复制一份另存,并且此些需要按特定次序排序存储。快速查找到某页(比如一本书本的目录,就相当于索引)索引适合与修改少,查询多的场景。因为索引建立起来后,一旦改变其中的一项,就会破坏其他数据的排序。(比如索引号1---10,中间插入数字就会导致数字后面的索引号发生变化)

关系运算:(对表的操作)

选择:挑选出符合条件的行

投影:挑选出需要的字段 (挑一部分列出来)

连接:表间字段的关联(主外键)

数据模型

数据抽象

物理层:数据存储格式,即rdbms(关系型数据库管理系统)在磁盘上如何组织文件。每一种数据库用来存储的格式都不相同.生产环境中,按照需求,将常用的数据放在性能高的磁盘上,以提高服务器性能。

逻辑层:dba角度,描述存储什么数据,以及数据间存在什么样的关系(主外键,有没有索引之类)

视图层:用户角度,描述db(数据库)中的部分数据(有一些隐私性的数据不想被一般用户看到,比如淘宝上的进货价,就不会让用户看到。)

关系模型的分类:

 关系模型

 基于对象的关系模型

 半结构化的关系模型:xml数据 扩展的标签语言

mysql和mariadb

官方网址:

https://www.mysql.com/

http://mariadb.org/

官方文档

https://dev.mysql.com/doc/

https://mariadb.com/kb/en/

版本演变:

mysql:5.1 --> 5.5 --> 5.6 --> 5.7 -->8.0

mariadb:5.5 -->10.0--> 10.1 --> 10.2 --> 10.3

mysql的特性

 插件式存储引擎:也称为“表类型”,存储管理器有多种实现版本,功能和特性可能均略有差别;用户可根据需要灵活选择,mysql5.5.5开始innodb引擎是mysql默认引擎

myisam ==> aria (mysql5.5.5之前使用的引擎)

innodb ==> xtradb(mysql5.5.5之后使用的引擎)

单进程,多线程,如下图

马哥学习----李洋个人笔记----mysql(上)_Linux_11

可以看出 1613是进程,负责接收,1615…16..是线程,负责处理.

 诸多扩展和新特性

 提供了较多测试组件

 开源

安装mysql

 mariadb安装方式:(生产环境多用源代码或二进制安装的形式)

1、源代码:编译安装

2、二进制格式的程序包展开至特定路径,并经过简单配置后即可使用(二进制安装等同于windows的免安装(绿色)版,已经将软件从源代码编译成2进制了,只需改一改配置文件后就能使用,比如配置下软件的存放位置以及生成文件的存放位置之列。)

3、程序包管理器管理的程序包

 centos安装光盘

 项目官方: https://downloads.mariadb.org/mariadb/repositories/

马哥学习----李洋个人笔记----mysql(上)_运维_12 yum源(国外官方的),复制并配置好文件后,执行命令 # yum install –y mariadb-server 即可自动安装。

国内yum源https://mirrors.tuna.tsinghua.edu.cn/mariadb/yum/10.2/centos7-amd64

rpm包安装mysql

 rpm包安装 安装完后使用 systemctl start mariadb 来启动mysql的默认端口号(3306)

马哥学习----李洋个人笔记----mysql(上)_运维_13

默认的数据库位置,里面粉色的mysql.sock是负责进程间通信来使用的(同一台主机,进程之间通信来使用的)

马哥学习----李洋个人笔记----mysql(上)_运维_14

直接输入mysql就可以连接

马哥学习----李洋个人笔记----mysql(上)_系统_15

使用命令 # show databases可以显示当前有多少个数据库,刚装好就有四个

马哥学习----李洋个人笔记----mysql(上)_Linux_16

切换数据库中的表:use + 指定的表名

马哥学习----李洋个人笔记----mysql(上)_系统_17

ps:登入mysql后,使用服务器端命令必须使用分号;作为结束符,比如show databases使用客户端命令则没有要求,直接输入就可,比如 use test

在mysql提示符中,使用help可以查看相关帮助命令

# help contents 可以查看服务器端可以执行的各种操作。

创建新的数据表 # create database +表单名字

# create database db1

马哥学习----李洋个人笔记----mysql(上)_Linux_18

删除新的数据表 # drop database +表单名字

# drop database db1

mariadb-server 服务器包

mariadb 客户端工具包centos 6

提高安全性 跑一下 mysql_secure_installation脚本即可解决下列问题

设置完是否给root设置面,删除匿名用户后。直接mysql就登录不上去了,使用命令 # mysql –u用户名 –p 回车后输入密码后才能登录。

1 设置数据库管理员root口令 # select user();可以查看管理数据库用户:

2 禁止root远程登录

3 删除anonymous(匿名)用户帐号 ,匿名账号的表单放在名字为mysql的数据库当中,进入mysql(进入mysql数据库后,使用 use mysql;)数据库后,使用命令 # show tables;以查看mysql数据库当中的数据,

马哥学习----李洋个人笔记----mysql(上)_运维_19

因为user表中的列太多,直接使用命令# select * from user会显示的乱七八糟,可以先用desc user来查看下user表中的列数。

马哥学习----李洋个人笔记----mysql(上)_系统_20

共计46列,直接查看无法实现,指定列名来查看

# select host,user,password from user;

马哥学习----李洋个人笔记----mysql(上)_Linux_21

4 删除test数据库

mariadb程序

客户端程序

mysql: 交互式的cli工具

mysqldump备份工具,基于mysql协议向mysqld发起查询请求,并将查得的所 有数据转换成insert等写操作语句保存文本文件中(生产环境必用工具)

mysqladmin:基于mysql协议管理mysqld

mysqlimport:数据导入工具,可以将列整齐的文本文件导入到数据库中。

myisam存储引擎的管理工具:(基本被淘汰)

myisamchk:检查myisam库

myisampack:打包myisam表,只读

服务器端程序

mysqld_safe

mysqld------------# ps –ef 进程树中可见

mysqld_multi多实例(程序可以多开,每个程序占一个进程,而每个进程都可视为一个实例),mysql的多实例是通过修改配置文件,将其端口号修改为不同的端口号来实现的。这是从逻辑上将两个mysql视为不同的软件。

示例:mysqld_multi --example

####################################################################实现多实例(以三个为准)

1 首先查询下rpm -q MariaDB-server,确认没有安装MariaDB-server

马哥学习----李洋个人笔记----mysql(上)_运维_22

2 创建文件夹mkdir -pv /mysqldb/{3306,3307,3308}/{etc,bin,data,pid,socket,log}

马哥学习----李洋个人笔记----mysql(上)_系统_23

3 安装mariadb-server

# yum install -y mariadb-server

4 更改所属人和所属组 # chown -R mysql.mysql /mysqldb/

马哥学习----李洋个人笔记----mysql(上)_运维_24

5 创建数据库文件,执行如下命令

# mysql_install_db --datadir=/mysqldb/3306/data --user=mysql

# mysql_install_db --datadir=/mysqldb/3307/data --user=mysql

# mysql_install_db --datadir=/mysqldb/3308/data --user=mysql

成功后显示如下图:

马哥学习----李洋个人笔记----mysql(上)_系统_25

6 指定各自的的配置文件

# cp /etc/my.cnf /mysqldb/3306/etc/

# 编辑 vim /mysqldb/3306/etc/my.cnf文件,并做如下修改

马哥学习----李洋个人笔记----mysql(上)_Linux_26

7 将这个作为模板,复制到3307和3308的目录当中,然后将配置文件中的3306分别改为3307 3308

# cp /mysqldb/3306/etc/my.cnf /mysqldb/3307/etc/

# cp /mysqldb/3306/etc/my.cnf /mysqldb/3308/etc/

8 准备启动服务,简单图解如下:马哥学习----李洋个人笔记----mysql(上)_Linux_27

将mysqld文件复制到/mysqldb/3306/bin/目录下,并做如下更改

马哥学习----李洋个人笔记----mysql(上)_Linux_28

加上执行权限,尝试运行一遍

# chmod +x /mysqldb/3306/bin/mysqld

# /mysqldb/3306/bin/mysqld start

启动成功如下图:

马哥学习----李洋个人笔记----mysql(上)_系统_29

同样将这个复制到3307.3308对应目录下,并将其中的3306改为3307,3308,并分别启动.

马哥学习----李洋个人笔记----mysql(上)_Linux_30

马哥学习----李洋个人笔记----mysql(上)_Linux_31

9 但是直接连接会失败,因为软件默认的sock地址与设置的不同,要连上需要手动指定sock

# mysql -S /mysqldb/3306/socket/mysql.sock

# 这样才能连接上

PS:在启动状态下,可以给mysql的root用户加口令

# mysqladmin -S /mysqldb/3308/socket/mysql.sock password 'centos'

# 将端口号为3308的mysql的root用户密码设置为centos

在关闭服务的时候会使用到这个命令

马哥学习----李洋个人笔记----mysql(上)_Linux_32

也可以在配置文件mysqld文件中,将密码直接写入,省的每次都输密码:

马哥学习----李洋个人笔记----mysql(上)_Linux_33

这样就不必每次都输密码了

马哥学习----李洋个人笔记----mysql(上)_系统_34

####################################################################

二进制安装环境下,实现多实例

1创建文件夹mkdir -pv /mysqldb/{3306,3307,3308}/{etc,bin,data,pid,socket,log}

2 进去mysql文件目录,执行如下命令

# scripts/mysql_install_db --datadir=/mysqldb/3306/data --user=mysql

# scripts/mysql_install_db --datadir=/mysqldb/3307/data --user=mysql

# scripts/mysql_install_db --datadir=/mysqldb/3308/data --user=mysql

3 准备配置文件

# cp /etc/my.cnf /mysqldb/3306/etc/

# cp /etc/my.cnf /mysqldb/3307/etc/

# cp /etc/my.cnf /mysqldb/3308/etc/

修改为:(PS 一定要互相对应,如下图的3306对应目录的3306)

马哥学习----李洋个人笔记----mysql(上)_运维_35

马哥学习----李洋个人笔记----mysql(上)_运维_36

马哥学习----李洋个人笔记----mysql(上)_运维_37

4 准备启动服务脚本(同样修改的时候注意端口号要与目录文件互相对应)

# cp /etc/my.cnf /mysqldb/3306/etc/

# cp /etc/my.cnf /mysqldb/3307/etc/

# cp /etc/my.cnf /mysqldb/3308/etc/

马哥学习----李洋个人笔记----mysql(上)_Linux_38

5 在/mysqldb/3306/bin/下用命令设置3306,3307,3308的密码

# mysqladmin -S /mysqldb/3306/socket/mysql.sock password 'centos'

# mysqladmin -S /mysqldb/3307/socket/mysql.sock password 'centos'

# mysqladmin -S /mysqldb/3308/socket/mysql.sock password 'centos'

6 关闭再开启,验证下

马哥学习----李洋个人笔记----mysql(上)_Linux_39

实验完成

####################################################################

用户账号

mysql用户账号由两部分组成: 'username'@'host‘

 说明:

host限制此用户可通过哪些远程主机连接mysql服务器支持使用通配符:

% 匹配任意长度的任意字符,类似于shell中的*

172.16.0.0/255.255.0.0 或 172.16.%.%

172.16.%。%可理解为,允许指定用户从172.16这个网段中来连接这个服务器。

PS:设置好网段后,不能从本机上连接数据库,可以使用如下格式来实现:

# mysql -uroot -pcentos -h172.16.0.1

# -u指定用户,-p指定密码,-h+IP,指明从那个网段过来

_ 匹配任意单个字符,类似于shell中的?

通过二进制格式安装mysql

(1) 准备数据目录 ,建议使用逻辑卷

逻辑卷的建立

逻辑卷,卷组,物理卷之间的关系

LVM (逻辑卷管理器),将一个或多个硬盘的分区在逻辑上集合,相当于一个大硬盘来使用,当硬盘的空间不够使用的时候,可以继续将其它的硬盘的分区加入其中,这样可以实现磁盘空间的动态管理,相对于普通的磁盘分区有很大的灵活性。与传统的磁盘与分区相比,LVM为计算机提供了更高层次的磁盘存储。它使系统管理员可以更方便的为应用与用户分配存储空间。在LVM管理下的存储卷可以按需要随时改变大小与移除(可能需对文件系统工具进行升级)。

PV (物理卷)就是指硬盘分区或从逻辑上与磁盘分区具有同样功能的设备(如RAID),是LVM的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘等)比较,却包含有与LVM相关的管理参数。

vg(卷组):LVM卷组类似于非LVM系统中的物理硬盘,其由物理卷组成。可以在卷组上创建一个或多个“LVM分区”(逻辑卷),LVM卷组由一个或多个物理卷组成

lv(逻辑卷):LVM的逻辑卷类似于非LVM系统中的硬盘分区,在逻辑卷之上可以建立文件系统(比如xfs等等)。

可以这样理解他们之间的关系:现在有这么几个人每个人有一个苹果,但是有的人想吃1.4个苹果,有的人想吃0.8个苹果,有的还想吃0.6个不等 那么做么样才能满足这样的需求呢,这样 :把苹果搅拌成苹果泥。然后再给人分配苹果泥,这样就可以满足此条件了;这个例子中苹果相当于物理磁盘,然后必须把它搅拌成泥(泥就相当于物理卷PV),只有把泥一起放在泥罐(相当于卷组)才能进一步重新分给所需的人,重新分配的过程就是把卷组重新分成lv(逻辑卷)也就是/home /usr /var 等等。只有先把苹果能成泥,才能进一步重新分给人,也就是只有先把物理磁盘转化成pv(物理卷) ,然后才能加入到卷组,然后才能重新分成lv(逻辑卷),这样就能做到动态管理,也就是说,存储空间不足时 ,可以再加物理磁盘,转化成物理卷,再加入到卷组,再分给空间不足的逻辑卷,

1 查看分区 lsblk /dev/sda

2 建立分区 fdisk /dev/sda 具体过程如下图:

马哥学习----李洋个人笔记----mysql(上)_系统_40

马哥学习----李洋个人笔记----mysql(上)_系统_41

马哥学习----李洋个人笔记----mysql(上)_运维_42

然后开始设置为lvm(逻辑卷)

马哥学习----李洋个人笔记----mysql(上)_运维_43

这个时候只是设置完毕,并没有生效.使用w保存的时候,也会提示

马哥学习----李洋个人笔记----mysql(上)_运维_44

马哥学习----李洋个人笔记----mysql(上)_系统_45

最后来查看下新加的分区

马哥学习----李洋个人笔记----mysql(上)_运维_46

接下来将物理硬盘分区初始化为物理卷,以便LVM使用.

# pvcreate /dev/sda6

马哥学习----李洋个人笔记----mysql(上)_Linux_47

指定一个物理卷组的名称,使用之后可以用vgdisplay来列出来一点.

# vgcreate vg0 /dev/sda6

马哥学习----李洋个人笔记----mysql(上)_系统_48

在使用lvcreate创建LVM的逻辑卷.

# lvcreate -n mysql -l +100%FREE vg0

马哥学习----李洋个人笔记----mysql(上)_运维_49

接下来就是创建文件系统了,文件系统只能创建在逻辑卷上

# mkfs.xfs /dev/vg0/mysql

马哥学习----李洋个人笔记----mysql(上)_运维_50

然后将创建的逻辑卷挂载并写入到/etc/fstab当中

马哥学习----李洋个人笔记----mysql(上)_系统_51

这时就可以看到逻辑卷已经可以使用了.

马哥学习----李洋个人笔记----mysql(上)_Linux_52

(2) 准备用户

# useradd -r -s /sbin/nologin -d /app/mysql -m mysql

# -r 创建系统该用户,-s指定使用的shell语言,-d指定家目录位置,-m强制创建家目录,因为系统用户不会自动创建家目录

创建的家目录是用来存放用户数据库的 数据内容来使用的,类似于默认安装的/var/lib/mysql

(3) 准备二进制程序

# tar xvf mariadb-10.2.16-linux-x86_64.tar.gz -C /usr/local

指定解压缩的位置,也就是二进制程序的位置.不能随意更改目录/usr/local,因为编译好后的二进制文件,conf(配置)文件已经跑完了,指定了安装路径.指定别处会出错.

# cd /usr/local

# ln -sv mariadb-version mysql

解压缩完后的文件名,不符合要求,所以创建一个名字符合的软链接(这样就相当于跑在/usr/local/mysql下了,创建软链接的也方便之后换版本号了,只需重新指定一下源文件的位置) ln -s 创建软链接,-d 创建硬链接

# chown -R root.mysql /usr/local/mysql/

将软链接的所有者和所属组分别改为 root和mysql

# vim /etc/profile.d/mysql.sh 加入如下内容

PATH=/usr/local/mysql/bin:$PATH

因为二进制程序经常使用,而默认的$PATH变量中没有这个地址,需手动加上

(4)创建数据库文件

# cd /usr/local/mysql/ 进入到mysql目录当中

# scripts/mysql_install_db --datadir=/app/mysql --user=mysql

跑一遍这个脚本,用来生成mysql数据库所需要的文件.比如默认安装时候,系统自带的用户,test mysql等数据库文件. --datadir=/app/mysql --user=mysql

当中, --datadir=/app/mysql用来指明生成文件的位置, --user=mysql指明用户

(5) 准备配置文件

# cp mysql/support-files/my-large.cnf /etc/my.cnf

将解压缩后的support-files/my-large.cnf文件复制到/etc/my.cnf当中,作为配置文件.

打开这个文件,在[mysqld]下添加选项:

datadir = /app/mysql------------指定数据库文件的存储路径.

(6)准备服务脚本,并启动服务,centso7里面虽然使用systemctl来管理服务,但也支持之前的服务启动方式.所以在/usr/local/mysql目录下:

# cp support-files/mysql.server /etc/init.d/mysqld

复制指定脚本到指定目录当中去.

# chkconfig --add mysqld

将mysql增加所指定的系统服务,让chkconfig指令得以管理它,并同时在系统启动的叙述文件内增加相关数据

# service mysqld start 以centos6的方式来启动mysql服务

(7)安全初始化

# /usr/local/mysql/bin/mysql_secure_installation

# 跑一遍mysql_secure_installation脚本,继续增加root密码啊,删除匿名账号之类的操作.

源码编译安装mariadb

需要安装如下包

yum install bison bison-devel zlib-devel libcurl-devel libarchive-devel boost-devel gcc gcc-c++ cmake ncurses-devel gnutls-devel libxml2-devel openssl-devel libevent-devel libaio-devel

做准备用户和数据目录

1 mkdir /data

2 useradd -r -d /data/mysql/ -s /sbin/nologin mysql

创建一个系统用户mysql,家目录为/data/mysql 使用的shell为/sbin/nologin

3 chown mysql.mysql /data/mysql

将/data/mysql目录的所属人和所属组改为mysql

4 tar xvf mariadb-10.2.15.tar.gz 解压缩mariadb-10.2.15.tar.gz

cmake 编译安装:

cmake的重要特性之一是其独立于源码(out-of-source)的编译功能,即编译工作可以在 另一个指定的目录中而非源码目录中进行,这可以保证源码目录不受任何一次编译的影响,因此在同一个源码树上可以进行多次不同的编译,如针对于不同平台编译

编译选项:

https://dev.mysql.com/doc/refman/5.7/en/source-configuration-options.html

源码编译安装mariadb

1 cd mariadb-10.2.15/ 进入到解封后的目录中,并复制运行如下紫色代码:

cmake . \

-DCMAKE_INSTALL_PREFIX=/app/mysql \

-DMYSQL_DATADIR=/data/mysqldb/ \

-DSYSCONFDIR=/etc \

-DMYSQL_USER=mysql \

-DWITH_INNOBASE_STORAGE_ENGINE=1 \

-DWITH_ARCHIVE_STORAGE_ENGINE=1 \

-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \

-DWITH_PARTITION_STORAGE_ENGINE=1 \

-DWITHOUT_MROONGA_STORAGE_ENGINE=1 \

-DWITH_DEBUG=0 \

-DWITH_READLINE=1 \

-DWITH_SSL=system \

-DWITH_ZLIB=system \

-DWITH_LIBWRAP=0 \

-DENABLED_LOCAL_INFILE=1 \

-DMYSQL_UNIX_ADDR=/app/mysql/mysql.sock \

-DDEFAULT_CHARSET=utf8 \

-DDEFAULT_COLLATION=utf8_general_ci

2 make && make install

提示:如果出错,执行rm -f cmakecache.txt

准备环境变量

# echo path=/app/mysql/bin:$path > /etc/profile.d/mysql.sh

# ./etc/profile.d/mysql.sh 执行脚本

生成数据库文件cd /app/mysqldb/

# scripts/mysql_install_db --datadir=/data/mysqldb/ --user=mysql

# chown mysql.mysql /data/mysqldb 修改目录的所属者和所属组

确认:ll /date/mysqldb/

准备配置文件

# cp /app/mysql/support-files/my-huge.cnf /etc/my.cnf

# 默认有就覆盖。然后编辑并添加如下内容:

马哥学习----李洋个人笔记----mysql(上)_运维_53

# chown -R mysql.mysql /app/mysql/

# 莫忘了改权限

马哥学习----李洋个人笔记----mysql(上)_运维_54

准备启动脚本

# cp /app/mysql/support-files/mysql.server /etc/init.d/mysqld

准备启动服务

# chkconfig --list 看下当前启动服务中有无mysqld,没有就执行下面命令

# chkconfig --add mysqld ; service mysqld start

# chkconfig –list 执行完看下结果:

马哥学习----李洋个人笔记----mysql(上)_Linux_55

安全配置

在/app/mysql/bin目录下,执行 # mysql_secure_installation

日常设置下root用户口令,删除匿名账户等操作。

马哥学习----李洋个人笔记----mysql(上)_Linux_56

诺,没有了匿名账户,且root用户有了密码

关系型数据库的常见组件

数据库:database

表:table

行:row

列:column

索引:index

视图:view

用户:user

权限:privilege

存储过程:procedure,无返回值

存储函数:function,有返回值

触发器:trigger

事件调度器:event scheduler,任务计划

sql语言规范

在数据库系统中,sql语句不区分大小写(建议用大写)

 sql语句可单行或多行书写,以“;”结尾

关键词不能跨多行或简写

用空格和缩进来提高语句的可读性

子句通常位于独立行,便于编辑,提高可读性

关于注释:

sql标准

/*注释内容*/ 多行注释

-- 注释内容 单行注释,注意有空格

mysql注释: #

数据库的组件(对象):

数据库、表、索引、视图、用户、存储过程、函数、触发器、事件调度器等的命名规则:

必须以字母开头

可包括数字和三个特殊字符(# _ $)

不要使用mysql的保留字

同一database数据库(schema模式)下的对象不能同名

sql语句分类:

ddl: data defination language 数据定义语言

create(创建),drop(删除),alter(更改

dml: data manipulation language 数据操纵语言

insert(插入),delete(删除),update(更新),select(挑选)

dcl:data control language 数据控制语言

grant(授权),revoke(撤销),commit(提交),rollback(回滚)

dql:data query language 数据查询语言 select(挑选)

sql语句构成:

keyword(关键字)组成clause(子句),多条clause(子句)组成语句

示例:

select * select子句

from products from子句

where price>400 where子句

说明:一组sql语句,由三个子句构成,select,from和where是关键字

数据库操作

创建数据库:

# create database|schema [if not exists] 'db_name';

# character set 'character set name' collate 'collate name'

删除数据库

# drop database|schema [if exists] 'db_name';

查看支持所有字符集:show character set;

查看支持所有排序规则:show collation;

获取命令使用帮助:mysql> help keyword;

查看数据库列表:mysql> show databases;