MyAQL数据库1

  • 数据库各种安装方法
  • SQL语言介绍
  • mysql基础命令

1. 数据库基础理论

  • 数据库的发展史

    1. 萌芽阶段:文件系统
      使用磁盘文件来存储数据,甚至可以不以文件方式存放在磁盘中,以0|1记录。优点是,方便,简单
    2. 初级阶段:第一代数据库
      出现了网状模型、层次模型的数据库,到这时候,已经有专业的数据库了,提出了数据库关系系统
    3. 中级阶段:第二代数据库
      关系型数据库和结构化查询语言
    4. 高级阶段:新一代数据库
      “关系-对象”型数据库
  • 文件管理系统的缺点

    1. 编写应用程序不方便
    2. 数据冗余不可避免,比如怎么找到这个文件
    3. 应用程序依赖性,应用程序与数据直连,安全性低
    4. 不支持对文件的并发访问,多用户访问时,会加锁不允许访问
    5. 数据间联系弱
    6. 难以按用户视图表示数据
    7. 无安全控制功能
  • 数据库管理系统的优点
    用户通过软件,将请求发送给专门的数据库管理系统(DBMS),通过它再去访问磁盘文件。
    DBMS是专门针对特定的文件来管理的,比如说MySQY数据库文件,打开此文件就必须要用MySQY的数据管理系统,其他程序不能打开,相对安全

    1. 相互关联的数据的集合
    2. 较少的数据冗余,用户只需要关心得到的数据是什么 ,不需要关心怎么找到数据
    3. 程序与数据相互独立
    4. 保证数据的安全、可靠
    5. 最大限度地保证数据的正确性
    6. 数据可以并发使用并能同时保证一致性
  • 名词解释

    1. 数据库
      数据库是数据的汇集,它以一定的组织形式存于存储介质上
    2. 数据库系统(DBMS)
      DBMS是管理数据库的系统软件,它实现数据库系统的各种功能。是数据库系统的核心
      3 数据库管理员(DBA)
      负责数据库的规划、设计、协调、维护和管理等工作
    3. 应用程序
      指以数据库为基础的应用程序
  • 数据库管理系统的基本功能

    1. 数据定义
    2. 数据处理
    3. 数据安全
    4. 数据备份
  • 数据库系统的架构

    1. 单机架构
      数据库在哪,管理员就在哪里,典型的就是access数据库
    2. 大型主机/终端架构
      一个主机,接多个中断,实际还是单机架构
    3. 主从式架构(C/S)
      现在用的比较多的,服务器端和用户端
    4. 分布式架构
      按用户访问地址,增加不同区域服务器

2. 关系型数据库

关系型数据库用的由SQL语言(结构化查询语言)实现的,包括一些例如ACID的特性,可以保证数据库的安全和稳定,但是代价为性能瓶颈,当用户量达到一定数量时,这个瓶颈非常明显;基于这个原因出现了NoSQL数据库(redis等),其突出的特性就是高性能,高并发

2.1 概述

  • 关系型数据库简介

    1. 为什么叫关系型
      所谓关系型数据库,就是将数据放在二维的表中,而一个数据库中可以有多张表 ,例如学员信息表、学员成绩表等,这些表中某些数据是有联系的,比方说姓名;正是因为数据库中表与表之间的联系说以叫做关系型数据库
    2. 关系型数据库常见组件
      1. . 表格的组成
        1. 行(row):表中的每一行,又称为一条记录
        2. 列(column):表中的每一列,称为属性,字段
        3. 主键(Primary key):用主键标记一个字段,使其不能出现重复数据,避免产生冗余的一种手段
        4. 域(domain):属性的取值范围,如,性别只能是‘男’和‘女’两个值
      2. 索引:index
      3. 视图:view
      4. 用户:user
      5. 权限:privilege
      6. 存储过程:procedure,无返回值
      7. 存储函数:function,有返回值
      8. 触发器:trigger
      9. 事件调度器:event scheduler,任务计划
    3. DBS、库、表的关系
      1. 每个表是由多个字段和记录组成
      2. 库是由多个表组成
      3. 库是一个基本单位,同一个数据库放的是一个项目的表,比如A库房财务信息,B库放产品信息
      4. DBS可以管理多个数据库 ,为了性能等原因,推荐一个DBS放一个数据库
  • 数据库排名:
    https://db-engines.com/en/ranking

  • 实体-联系模型E-R

    1. 实体Entity
      1. 客观存在并可以相互区分的客观事物或抽象事件称为实体。
      2. 在E-R图中用矩形框表示实体,把实体名写在框内
    2. 属性
      实体所具有的特征或性质
    3. 联系
      联系是数据之间的关联集合,是客观存在的应用语义链
      1. 实体内部的联系
        指组成实体的各属性之间的联系。如职工实体中,职工号和部门经理号之间有一种关联关系
      2. 实体之间的联系
        指不同实体之间联系,用菱形框表示。例学生选课实体和学生基本信息实体之间
  • 联系的类型

    1. 一对一联系(1:1),如下所示A和B两张表格学员编号和姓名是一对一的

    表A:入学记录

    表B:毕业记录

    1. 一对多联系(1:n),一条信息对应多个对象,会用到外键(foreign key FK)

      1. 主键表:表格之间存在依赖关系,被依赖的表称为主键表,假设为A
      2. 外键表:依赖其它表格的表
      3. 外键字段:具体哪个字段依赖于主键,该字段被标记上(fk)
      4. 外键字段依赖于主键的哪个字段,表示为fk–>A.ID
      5. 主键表可以被当做依赖对象的字段,要求必须为PK或uniq key,fk受约束于被依赖字段的范围

    表A:主键表

    表B:外键表

    1. 多对多联系(m:n):学员可以报多个课程,一个课程可以对应多个学员,为了避免冗余信息,会采用再绘制学员与科目对应表

    表A:学员表(主键表)

    表B:课程分类(主键表)

    表C:报名表(外键表)

  • 数据的操作

    1. 数据提取:在数据集合中提取感兴趣的内容。SELECT(查询)
    2. 数据更新:变更数据库中的数据。INSERT(增)、DELETE(删)、UPDATE(改)
  • 数据的约束条件:是一组完整性规则的集合,来保证数据的完整性

    1. 实体(行)完整性Entity integrity:保证每行的数据都与众不同
    2. 域(列)完整性Domain Integrity:限制范围
    3. 参考完整性Referential Integrity:表格之间的关系,外键

2.2 数据库规划

  • 简易数据规划流程

    1. 第一阶段:收集数据,得到字段
      1. 收集必要且完整的数据项
      2. 转换成数据表的字段
    2. 第二阶段:把字段分类,归入表,建立表的关联
      1. 关联:表和表间的关系
      2. 分割数据表并建立关联的优点
      3. 节省空间
      4. 减少输入错误
      5. 方便数据修改
    3. 第三阶段:
      规范化数据库,根据数据库的一些规范条例,逐个去匹配数据库的内容,检测是否满足数据库的相关规范
  • 数据库的正规化分析

    1. RDMBS设计范式基础概念
      设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同范式,各种范式呈递次规范,越高的范式数据库冗余越小
    2. 目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴德斯科范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推,越高越规范,相对的也就越不灵活。一般说来,数据库只需满足第三范式(3NF)即可
  • 范式
    范式等级越高,可能带来的表关联越复杂,造成性能降低,很多时候会故意违反范式来提升性能

    1. 1NF

      1. 简介
        无重复的列,每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。
      2. 说明
        第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库
      3. 示例
        	| 作者|  书名1 | 书名2 |   <==不允许,即使用编号区分也不可以,因为数据内容相同
        	|  a  | linux | python|
        
        	|作者|      书名     |
        	|  a | linux、python|     <==不允许,同一列中不可有多值
        
        	|作者|  书名 |             <==解决方法,将书名列为多行处理
        	|  a| python|
        	|  a| linux |
        
    2. 2NF

      1. 简介
        属性完全依赖于主键,第二范式必须先满足第一范式,要求表中的每个行必须可以被唯一地区分。通常为表加上一个列,以存储各个实例的唯一标识PK,非PK的字段需要与整个PK有直接相关性
      2. 示例
        如下表所示,需要一个值来当主键,而姓名和城市都会重复,但是两项同时出现确保唯一性,一起定义为一个主键,称为复合主键。
        虽然确保了唯一性,但是citynumber,仅依赖于主键的一部分城市,所以这一项就违反了范式二的完全依赖性
        pk(name,city) <==复合主键
        |name|cityid| sex| phone|citynumber
        |  a |  bj  |           |   010   |
        |  a |  sh  |           |   021   |
        |  b |  bj  |           |   010   |
        '回避违反格式的做法,将区号单独拿出来再建立一个表格'
        |name|cityid| sex| phone|
        |  a |   1  |
        |  a |   2  |
        |  b |   1  |
        |cityid |  city |  citynumber|
        |1      |   bj 	|  	  010    |
        |2  	|   sh	|	  021    |
        
    3. 3NF

      1. 简介
        属性不依赖于其它非主属性,满足第三范式必须先满足第二范式。第三范式要求一个数据库表中不包含已在其它表中已包含的非主关键字信息,非PK的字段间不能有从属关系
      2. 示例
        依然是上个例子,不使用复合主键,为其构建一个ID项
        '这样就违反了第三范式,属性不依赖域其他非主属性,citynumber依赖于city'
        ID|name|city| sex| phone|citynumber
        1 |  a | bj |           |  010
        2 |  a | sh |           |  021
        3 |  b | bj |           |  010
        '规避方法相同,将违反项独立出来制表'
        |cityid |  city   | citynumber|
        |   1   |  bj     |	   010    |
        |   2	|  sh	  |	   021    |
        
  • 数据库对象命名

    1. 数据库的组件(对象):
      数据库、表、索引、视图、用户、存储过程、函数、触发器、事件调度器等
    2. 命名规则:
      1. 必须以字母开头
      2. 可包括数字和三个特殊字符(# _ $)
      3. 不要使用MySQL的保留字
      4. 同一database(Schema)下的对象不能同名,例如表和试图同名也是不允许的
  • 数据存储协议:应用层协议,C/S

    1. S:server(MySQL监听端口3306,不同数据库不同)
      监听于套接字,接收并处理客户端的应用请求
    2. C:Client
      客户端使用数据库方式
      1. 各厂商提供的客户端程序接口,需要熟悉SQL语句
        命令行界面CLI
        图形化界面GUI
      2. 开发应用编程接口,程序员为非专业用户开发简易界面
        不同语言有不同连接数据库的接口
        ODBC:Open Database Connectivity 微软
        JDBC:Java Data Base Connectivity java
  • 约束
    约束:constraint,表中的数据要遵守的限制

    1. 主键(Primary key)
      一个或多个字段的组合,填入的数据必须能在本表中唯一标识本行;必须提供数据,不能为空,即NOT NULL,一个表只能有一个
    2. 惟一键(uniq key)
      一个或多个字段的组合,填入的数据必须能在本表中唯一标识本行;允许为NULL,一个表可以存在多个
    3. 外键(foreign key)
      一个表中的某字段可填入的数据取决于另一个表的主键或唯一键已有的数据
    4. 检查:
      字段值在一定范围内
  • 索引
    将表中的一个或多个字段中的数据复制一份另存,并且按特定次序排序存储

    1. 优点:提高查询速度
    2. 缺点:增加索引带来空间占用,修改内容时,也要修改索引,带来额外负担
    3. 总结为,如果数据库查的多改的少,增加索引合适,如果改的多查的少,可以考虑不加索引
  • 关系运算:

    1. 选择:挑选出符合条件的行
    2. 投影:挑选出需要的字段
    3. 连接:表间字段的关联
  • 数据模型

    1. 物理层:数据存储格式,即RDBMS在磁盘上如何组织文件
    2. 逻辑层:DBA角度,描述存储什么数据,以及数据间存在什么样的关系
    3. 视图层:用户角度,描述DB中的部分数据,程序员挑选出可以展示给客户的数据
  • 关系模型的分类:

    1. 关系模型
    2. 基于对象的关系模型
    3. 半结构化的关系模型:XML数据
      例如centos6中,/etc/gconf/gconf.xml.defaults目录下很多XML文件
      其中%gconf-tree.xml可以修改登录用户列表显示,搜索user_list,修改bool值,默认为false,修改为true可以禁用用户列表显示

3 SQL简介

  • 概念
    SQL: Structure Query Language
    结构化查询语言,结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统, 可以使用相同的结构化查询语言作为数据输入与管理的接口。结构化查询语言语句可以嵌套,这使它具有极大的灵活性和强大的功能

  • SQL解释器:
    与使用linux相同,SQL会有一个类似bash的解释器翻译给计算机

  • SQL语言规范

    1. 在数据库系统中,SQL语句不区分大小写(建议SQL命令关键字大写),资源库名对大小写敏感
      MariaDB [(none)]>SELECT  user,host,possword FROM  mysql.user;
      
    2. SQL语句可单行或多行书写,以";"结尾
    3. 关键词不能跨多行或简写,例如上例中的FROM分为两行写
      MariaDB [(none)]> SELECT user,host FRO   <==错误
          -> M mysql.user
      
    4. 用空格和缩进来提高语句的可读性
    5. 子句通常位于独立行,便于编辑,提高可读性,以上例来说SELECT和FROM为两个子句,如果命令过于复杂,建议分为多行独立
      MariaDB [(none)]> SELECT user,host
       -> FROM mysql.user
      
    6. 注释:
      1. SQL标准:所有使用SQL语言的数据库都可以用
        /注释内容/ 多行注释
        取消脚本中的某项命令,注释掉的格式
        [root@localhost  ~]$cat test.sql
        /*show databases;
        select user,host,password from mysql.user;*/   <==多行注释,成对出现的,中间可以包含多个命令
        
        –注释内容单行注释,注意有空格
        [root@localhost  ~]$cat test.sql
        select ls ; -- from mysql.user;   <===单行注释,'--'后内容都注释掉,只会执行ls
        show databases;
        
      2. MySQL注释:#
  • SQL语句分类

    1. DDL(Data DefinationLanguage): 数据定义语言
      CREATE(创建数据库、表等),DROPE(删除数据库、表等),ALTERE(修改数据库、表结构等)
    2. DML(Data Manipulation Language): 数据操纵语言,针对数据库内容,即数据的增删改
      INSERT(增),DELETE(删),UPDATE(改)
    3. DCL(Data Control Language): 数据控制语言
      GRANT(授权),REVOKE(取消权限),COMMIT(提交),ROLLBACK(撤销)
    4. DQL(Data Query Language): 数据查询语言
      SELECT
  • SQL语句构成

    1. 构成
      Keyword+标识符–>组成子句(clause)
      多条clause组成语句
    2. 示例
      SELECT子句:SELECT *
      FROM子句:FROM products
      WHERE子句:WHERE price>400
      说明:一组SQL语句,由三个子句构成,SELECT,FROM和WHERE是关键字

4. MySQL和MariaDB

4.1 概述

  • 官方网址:
    https://www.mysql.com/
    http://mariadb.org/
  • 官方文档
    https://dev.mysql.com/doc/
    https://mariadb.com/kb/en/
    centos6,镜像文件带的是MySQL
    centos7,镜像文件带的是MariaDB
  • 数据库使用的端口号
    MYSQL:3306
    Oracle:端口1521,使用的语言为PL/SQL
    SQL Server:端口1433 ,使用的语言为T-SQL
    远程桌面mstsc:3389
  • MYSQL的特性
    1. 插件式存储引擎(MYSQL独有)
      也称为“表类型”,存储管理器有多种实现版本,功能和特性可能均略有差别;用户可根据需要灵活选择,Mysql5.5.5开始innoDB引擎是MYSQL默认引擎
      MyISAM==> Aria 5.5以前
      InnoDB==> XtraDB
    2. 单进程,多线程
    3. 诸多扩展和新特性
    4. 提供了较多测试组件
    5. 开源

4.2 Mariadb安装方式

  • 源代码:编译安装

    1. 获得源代码https://mariadb.org/,选择Downland,进入下载界面选择想要的版本,推荐滞后一个版本,点击图示位置
      linux学习36-MyAQL数据库1-LMLPHP

    2. 进入此版本下载界面,其中源码为下图所示,点击左边蓝色部分下载获取源码linux学习36-MyAQL数据库1-LMLPHP

    3. 创建用户:指定数据存放位置,指定家目录路径为/data/mysql
      不自动创建,后期手动创建,自动创建会生成系统默认文件,其中的隐藏文件会显示在数据库内

      '1. 创建账号'
      [root@hai7-8 data]$useradd -r -s /sbin/nologin -d /data/mysql  mysql
      '2. 创建目录,权限为755'
      [root@hai7-8 data]$mkdir /data/mysql
      '3. 修改所属者所属组'
      [root@hai7-8 data]$chown mysql.mysql /data/mysql/
      
    4. 安装编译需要工具

      [root@hai7-8 data]$yum  -y  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
      
    5. 解压缩源码包

      [root@hai7-8 data]$tar xvf mariadb-10.2.18.tar.gz
      
    6. 编译源码为可执行程序,这里比较特别的是使用cmake编译
      cmake的重要特性之一是其独立于源码(out-of-source)的编译功能,即编译工作可以在另一个指定的目录中而非源码目录中进行,这可以保证源码目录不受任何一次编译的影响,因此在同一个源码树上可以进行多次不同的编译,如针对于不同平台编译
      编译选项:https://dev.mysql.com/doc/refman/5.7/en/source-configuration-options.html

      [root@hai7-8 mariadb-10.2.18]$cmake . \
      -DCMAKE_INSTALL_PREFIX=/app/mysql \     <==安装路径
      -DMYSQL_DATADIR=/data/mysql/ \          <==数据库路径
      -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 \        <==是否启用debug
      -DWITH_READLINE=1 \     <==设置权限
      -DWITH_SSL=system \     <==设置权限
      -DWITH_ZLIB=system \    <==设置权限
      -DWITH_LIBWRAP=0 \      <==设置权限
      -DENABLED_LOCAL_INFILE=1 \    <==设置权限
      -DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock \    <==套接字,sock程序路径,确定要有写权限
      -DDEFAULT_CHARSET=utf8 \    <==是否支持utf8
      -DDEFAULT_COLLATION=utf8_general_ci
      
    7. 开始构建并安装

      [root@hai7-8 mariadb-10.2.18]$make -j 8 && make install &&{ for i in {1..10};do echo -e '-a'; sleep 0.5;done; }
      

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

    8. 生成数据库文件
      执行系统提供的生成脚本,来构建数据库的基本数据,此脚本必须在mysql程序bin所在目录下执行

      '1. 进入程序安装目录'
      [root@hai7-8 mysql]$cd /app/mysql/
      '2. 执行脚本mysql_install_db,指定生成路径,生成所属'
      [root@hai7-8 mysql]$scripts/mysql_install_db  --datadir=/data/mysql  --user=mysql
      '3. 查看数据库生成的文件'
      [root@hai7-8 mysql]$ls /data/mysql/
      aria_log.00000001  aria_log_control  ib_buffer_pool  ibdata1  ib_logfile0  ib_logfile1  mysql  performance_schema  test
      
    9. 建立配置文件,编译时指定放在/etc下, 拿系统提供的模板文件作为参考

      '1. 进入模板文件所在目录'
      [root@hai7-8 mysql]$cd /app/mysql/support-files/
      '2. 拷贝模板文件my-huge.cnf到编译时指定的路径,覆盖系统原文件'
      [root@hai7-8 support-files]$cp my-huge.cnf /etc/my.cnf
      '3. 修改配置文件,指定数据存放位置,sock文件路径'
      [root@hai7-8 ~]$vim /etc/my.cnf
      [mysqld]
      datadir=/data/mysql    <==数据存在路径
      
    10. 准备启动脚本

      '1. 拷贝系统提供的模板到/etc/init.d/下,改名为mysqld'
      [root@hai7-8 ~]$cp /app/mysql/support-files/mysql.server   /etc/init.d/mysqld
      '2. 将mysql服务加入服务列表'
      [root@hai7-8 support-files]$chkconfig --add mysqld
      '3. 启动服务'
      [root@hai7-8 support-files]$service mysqld start
      
    11. 准备环境变量,启动服务

      [root@hai7-8 ~]$echo 'PATH=/app/mysql/bin:$PATH' > /etc/profile.d/mysql.sh
      [root@hai7-8 ~]$. /etc/profile.d/mysql.sh
      
  • 二进制程序安装
    官方还提供了已经编译后的二进制程序,直接解压缩,稍微加以配置就可以使用
    安装思路可以参考yum安装包里的安装脚本rpm -q --scripts mariadb-server

    1. 下载压缩包,文件为下图所示
      linux学习36-MyAQL数据库1-LMLPHP

    2. 为了扩容方便,将数据目录放在逻辑卷中,先建一个逻辑卷分区(sda3)

      '1. 将sda3定义为物理卷'
      [root@localhost  ~]$pvcreate /dev/sda3
      '2. 创建卷组命名为vg_data,将sda3加入到卷组中'
      [root@localhost  ~]$vgcreate vg_data  /dev/sda3
      '3. 创建逻辑卷,将vg_data所有空间都加入到逻辑卷中'
      [root@localhost  ~]$lvcreate -n lv_musql -l  100%FREE vg_data
      '4. 格式化文件系统'
      [root@localhost  ~]$mkfs.xfs  /dev/vg_data/lv_musql
      '5. 建一个挂载点'
      [root@localhost  ~]$mkdir /mysql
      '6. 将挂载信息写入/etc/fstab中'
      [root@localhost  ~]$vim /etc/fstab
      UUID=b231db56-e07f-419e-b7b7-d2b280d0580a /mysql   xfs  defaults        0 0
      [root@localhost  ~]$mount -a
      
    3. 准备用户,指定但不生成家目录,家目录下的隐藏文件,会显示在数据库中;手动创建目录/mysql/data,需要有写权限,这里需要注意的是权限问题

      [root@localhost  ~]$useradd -r -s /sbin/nologin -M -d /mysql/data mysql
      
    4. 解包下载的二进制程序,解压路径必须为/usr/local,是官方编译时候指定的路径,解压后目录是带版本号的,如果在主机的主机上编译目录是不带版本号的,所以需要创建一个软连接mysql,指向解压目录

      [root@localhost  data]$tar xf mariadb-10.2.18-linux-x86_64.tar.gz -C /usr/local   <==文件的所属者、所属组有问题,需要修改
      '创建软连接'
      [root@localhost  local]$ln -s mariadb-10.2.18-linux-x86_64/ mysql
      '修改文件权限'
      [root@localhost  local]$chown -R root.mysql mysql/
      
    5. 准备配置文件,来指定数据库位置,解压后在/ mysql/support-files/目录下提供了几个模板文件,选my-huge.cnf。配置文件放置在/etc下自建目录/mysql/my.cnf,不去修改系统自带的/etc/my.cnf

      '1. 创建mysql配置文件目录'
      [root@localhost  support-files]$mkdir /etc/mysql
      '2. 拷贝模板文件到目录下,改名为my.cnf'
      [root@localhost  support-files]$cp my-huge.cnf /etc/mysql/my.cnf
      '3. 修改模板,在[mysqld]块里,加入数据存放路径,关闭反向解析等'
      [root@localhost  support-files]$vim /etc/mysql/my.cnf
      [mysqld]
      datadir=/mysql/data          <==指定数据存放路径
      innodb_file_per_table= on    <==数据库的每一个表都生成独立的文件10.2后版本,默认开启
      skip_name_resolve= on        <==禁止主机名解析(反向解析),可以提升访问速度,建议使用
      
    6. 创建数据库文件,基本的mysql数据库,二进制程序并不会生成,需要创建,使用解压缩后/mysql/scripts/下的脚本mysql_install_db

      [root@localhost  ~]$cd/usr/local/mysql/
      '运行脚本创建数据库,所有者为mysql'
      [root@localhost  mysql]$scripts/mysql_install_db --datadir=/mysql/data  --user=mysql
      '此脚本的执行路径必须为程序bin所在目录,即mariadb-10.2.18-linux-x86_64或者软连接mysql目录,加上脚本路径'
      
    7. 要管理mysql就要将其当成服务,需要准备服务脚本,并启动服务,系统提供了模板脚本供参考 /mysql/ support-files/mysql.server

      '1. 拷贝到 /etc/rc.d/init.d/并改名为mysqld,名字自定义,确保有执行权限'
      [root@localhost  support-files]$cp mysql.server    /etc/rc.d/init.d/mysqld
      '2. 将mysql服务脚本加入到服务列表中'
      [root@localhost  support-files]$chkconfig --add mysqld
      '3. 启动服务'
      [root@localhost  support-files]$service mysqld start
      
    8. 将程序写入PATH变量中,并执行一次安全加强脚本

      [root@localhost  bin]$echo PATH=/usr/local/mysql/bin:$PATH > /etc/profile.d/mysql
      [root@localhost  profile.d]$mysql_secure_installation
      
  • 官方提供的RPM包安装
    下载仓库配置工具,通过配置YUM源通过互联网安装

    1. 点击途中圈起来的地方
      linux学习36-MyAQL数据库1-LMLPHP
    2. 选择对应系统版本,架构后,官方会提供仓库配置文件,复制下来配置文件就可以
      linux学习36-MyAQL数据库1-LMLPHP
    3. 配置好仓库后,安装
      [root@hai7-8 ~]$yum repolist
      base             cd          9,911
      mariadb          MariaDB        69                   <==mariadb 的仓库
      [root@hai7-8 ~]$yum -y install MariaDB-server
      replacing  mariadb-libs.x86_64 1:5.5.56-2.el7    <==会自动将老版本替换掉
      
  • CentOS安装光盘

    [root@localhost  ~]$yum -y install mariadb-server
    

4.2 提高数据库安全性

  • 启动服务

    [root@localhost  ~]$systemctl start mariadb
    
  • 服务端相关文件

    1. 数据库配置文件
      /etc/my.cnf.d/server.cnf
    2. 服务文件
      /usr/lib/systemd/system/mariadb.service
  • 客户端相关文件

    1. 客户端配置文件
      /etc/my.cnf.d/client.cnf
    2. 客户端各种工具,主要的为
      /usr/bin/mysql
  • 首次使用数据库必要说明

    1. 客户端程序为交互式工具,其命令为mysql,默认会以mysql的本地root登录,界面如下
      [root@localhost  ~]$mysql
      Welcome to the MariaDB monitor.  Commands end with ; or \g.
      Your MariaDB connection id is 3
      Server version: 5.5.56-MariaDB MariaDB Server
      Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
      Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.    <==输入help或者\h获取帮助
      MariaDB [(none)]>
      
    2. 用户账号说明,进入mysql后,输入命令select user();,查看当前用户账号;
      这里的root是mysql的内建账号,和系统root是两回事
      [root@localhost  ~]$mysql
      MariaDB [(none)]> select user() ;    <==括号为系统函数
      +----------------+
      | user()         |
      +----------------+
      | root@localhost |     <==用户账号,两部分组成'USERNAME@HOST',
      +----------------+
      HOST:限制此用户可通过哪些远程主机连接mysql服务器,支持使用通配符x写法
      1. % 匹配任意长度的任意字符
      2. 172.16.0.0/255.255.0.0 或172.16.%.%
      3. _ 匹配任意单个字符;
      
    3. 查看当前系统现有数据库,命令为show databases;
      MariaDB [(none)]> show databases;
      +--------------------+
      | Database           |
      +--------------------+
      | information_schema |
      | mysql              |
      | performance_schema |
      | test               |     <==test为测试使用,其他3个为mysql使用,test可以删除
      +--------------------+
      
    4. 查看当前系统中的用户:select user,host,password from mysql.user;
      此命令的意思是查看来自mysql的数据中,从名为user的表,提取出user,host,password三个字段
      MariaDB [(none)]> select user,host,password from mysql.user;
      +------+-----------------------+----------+
      | user | host                  | password |
      +------+-----------------------+----------+
      | root | localhost             |          |   <==默认情况下数据库没有远程地址,只能本地访问
      | root | localhost.localdomain |          |   <==目前密码为空,所以刚安装好,不需要密码就可以登录
      | root | 127.0.0.1             |          |
      | root | ::1                   |          |
      |      | localhost             |          |   <==账户名为空的行,表示匿名账号登录
      |      | localhost.localdomain |          |
      +------+-----------------------+----------+
      
    5. 上例说明mysql是需要设置密码的,完整的登录格式应该为mysql -u[用户] -p[密码] -h[目标IP]
      那么来解释匿名账号登录,命令行登录mysql,输入mysql -umoli,并查看登录用户
      [root@localhost  ~]$mysql -umoli
      MariaDB [(none)]> select user();
      +----------------+
      | user()         |
      +----------------+
      | moli@localhost |   <==在可访问列表中没有moli账户,仍然可以登录,就是因为用户为空格的行
      
    6. 综上所述,我们可以考虑优化的地方为,口令设置、禁止匿名账户,删除测试数据库
  • 使用包里提供的脚本来完成优化mysql_secure_installation

    1. 设置数据库管理员root口令
    2. 禁止root远程登录
    3. 删除anonymous用户帐号
    4. 删除test数据库
      [root@localhost  ~]$mysql_secure_installation
      Enter current password for root (enter for none): <==输入当前root的口令,初次登录没有,直接回车
      Set root password? [Y/n]                          <==是否设置root的口令,y
      New password:  			                          <==输入新口令
      Re-enter new password:                            <==确认新口令
      Remove anonymous users? [Y/n]                     <==是否删除匿名账户,y删除n跳过
      Disallow root login remotely? [Y/n]               <==是否禁用远程root登录,y禁用,禁用后只能在本机管理
      Remove test database and access to it? [Y/n] y    <==是否删除test数据库,y删除
      Reload privilege tables now? [Y/n]                <==是否将改动立即生效,y同意
      
  • 优化成功后登录方法

    1. 需要提供账户和密码
      [root@localhost  ~]$mysql -uroot -pxxxxxx
      
    2. 不想在屏幕上显示密码
      [root@localhost  ~]$mysql -uroot -p   <==-p选项后不加密码,直接回车
      Enter password:                       <==交互式提交密码
      
    3. 优化后,再来查看用户列表,匿名账户被删除,密码栏会显示加密的密码
      MariaDB [(none)]> select user,host,password from mysql.user;
      +------+-----------+-------------------------------------------+
      | user | host      | password                                  |
      +------+-----------+-------------------------------------------+
      | root | localhost | *3E4714923D8151785EF57A14E39AAFB1EA424707 |
      | root | 127.0.0.1 | *3E4714923D8151785EF57A14E39AAFB1EA424707 |
      | root | ::1       | *3E4714923D8151785EF57A14E39AAFB1EA424707 |
      +------+-----------+-------------------------------------------+
      

5. MariaDB

  • 客户端程序

    1. mysql客户端程序其中常见的工具

      1. mysql: 交互式的CLI工具
      2. mysqldump:备份工具,基于mysql协议向mysqld发起查询请求,并将查得的所有数据转换成insert等写操作语句保存文本文件中
      3. mysql_secure_installation:安全加强工具
      4. mysql_install_db :创建数据库的程序
      5. mysqlimport:数据导入工具,将文本文件导入数据库,使用数据库管理
    2. MyISAM存储引擎的管理工具(已经逐渐淘汰,现在主流的是namoDB引擎)

      1. myisamchk:检查MyISAM库
      2. myisampack:打包MyISAM表,只读
  • 服务器端程序

    1. mysqld_safe:主进程
    2. mysqld:子进程
    3. mysqld_multi:多实例
      示例:mysqld_multi--example 需要准备多个mysqld安装程序,将配置文件加以修改,让各自的端口号不同可以实现多示例,也就是跑多个数据库,各实例之间没有联系

5.1 mysql客户端使用

  • mysql客户端命令行可用选项

    命令行可用选项示例

    1. -e选项
      [root@hai7-8 ~]$mysql -e "show databases"    <==-e选项可以在命令行直接执行sql命令
      +--------------------+
      | Database           |
      +--------------------+
      | information_schema |
      | mysql              |
      | performance_schema |
      | test               |
      +--------------------+
      
    2. -D选项
      [root@hai7-8 ~]$mysql -D mysql
      MariaDB [mysql]>     <==中括号中设置为显示当前数据库,指定后进入会跳转到指定数据库
      
    3. –print-defaults
      [root@hai7-8 ~]$mysql --print-defaults     <==执行此参数时,前面不需要加用户和密码
      mysql would have been started with the following arguments:
      
  • 交互式命令有两类:

    1. 客户端常用命令:
    1. 服务器端命令:
      获取帮助,例如show命令的帮助show help
      SQL, 需要语句结束符;
  • 脚本模式

    1. 将命令放到文件中,传给mysql
      mysql –uUSERNAME -pPASSWORD< /path/somefile.sql

      '1. 将show databases;和select...mysql.user;写入文件test.sql中'
      [root@localhost  ~]$cat test.sql
      show databases;
      select user,host,password from mysql.user;
      '2. 将文件内容传给mysql,批量执行'
      [root@localhost  ~]$mysql -uroot -pxxxxxx < test.sql
      Database
      information_schema
      mysql
      performance_schema
      user	host	password
      root	localhost	*3E4714923D8151785EF57A14E39AAFB1EA424707
      root	127.0.0.1	*3E4714923D8151785EF57A14E39AAFB1EA424707
      root	::1	*3E4714923D8151785EF57A14E39AAFB1EA424707
      
    2. 调用文件来执行,也可以通过交互式达成,命令为
      sourcemysql> source /path/from/somefile.sql

      [root@localhost  ~]$mysql -uroot -p
      Enter password
      MariaDB [(none)]> source test.sql
      
  • 修改提示符

    1. mysql的提示符如下所示
      [root@localhost  ~]$mysql -uroot -pfree7801336
      MariaDB [(none)]>          <==与bash命令行提示符类似,等待键入命令,可以修改
      
    2. 命令行修改选项为 --prompt=“参数”
      [root@hai7-8 /etc/yum.repos.d]$mysql --prompt="\u@\h \v [\y]"
      root@localhost 10.2.18-MariaDB [18]     <==修改后效果
      
    3. 保存为默认设置,需要写到目录/etc/profile.d/下,以.sh结尾的文件
      [root@hai7-8 /etc/profile.d]$vim v9.sh
      export MYSQL_PS1=" (\u@\h \v) [\d]> "
      [root@hai7-8 ~]$. /etc/profile.d/v9.sh
      
    4. 另一种保存方式是,将修改参数放入mysql客户端的配置文件/etc/my.cnf.d/mysql-clients.cnf中的[mysql]语句块内,优先级高于系统配置文件
      [root@localhost  ~]$vim /etc/my.cnf.d/mysql-clients.cnf
      [mysql]
      prompt="\\r:\\m:\\s [\y]>"      <==格式与放在系统中的格式不同
      
    5. 可用参数

5.2 服务端配置

  • 服务器监听的两种socket地址:

    1. ipsocket:
      监听在3306/tcp端口,支持远程通信
      侦听3306/tcp端口可以在绑定有一个或全部接口IP上
    2. unixsock: 监听在sock文件上,仅支持本机通信
      mysql连接本地数据库时,不走tcp协议,自动使用unixsock,减少封装解封装步骤,sock文件大小为0,只是个中转站,随服务启动生成,不小心删了,重启服务就会自动生成
    3. 配置示例,关闭网络连接,只侦听本地客户端,所有和服务器的交互都通过一个socket实现,socket的配置存放在/var/lib/mysql/mysql.sock)可在/etc/my.cnf修改
      [root@localhost  ~]$vim /etc/my.cnf
      [mysqld]
      skip-networking=1     <==值为1时关闭网络连接
      
  • 服务端命令
    通过mysql协议发往服务器执行并取回结果,每个命令都必须命令结束符号;默认为分号
    例如:SELECT VERSION();

  • 服务器端配置
    工作特性有多种配置方式

    1. 命令行选项
    2. 配置文件:类ini格式
      集中式的配置,能够为mysql的各应用程序提供配置信息,不同的设置要放在对应的语句块中
      1. 常见语句块
        [mysqld]
        [mysqld_safe]
        [mysqld_multi] :放多实例
        [mysql] :放客户端
        [mysqldump]:数据库备份
        [server]:放在某服务器上
        [client]:放在某客户端上
      2. 格式:parameter = value
      3. 说明:
        _和-相同,不区分;
        1,ON,TRUE意义相同;
        0,OFF,FALSE意义相同;
  • 配置文件
    后面覆盖前面的配置文件,顺序如下:

    1. Global选项全局生效:/etc/my.cnf
    2. Global选项全局生效:/etc/mysql/my.cnf
    3. Global选项全局生效:SYSCONFDIR/my.cnf
    4. Server-specific选项,针对特定实例生效:$MYSQL_HOME/my.cnf
    5. –defaults-extra-file=path
    6. User-specific 选项,针对特定用户生效:~/.my.cnf
  • 数据库迁移

    1. datadir和basedir分别可以查看安装路径和数据库路径,数据库迁移,思路就是改变数据库路径
      [root@hai7-8 ~]$mysql
      MariaDB [(none)]> show variables like 'datadir'   <==显示当前数据库路径
      +---------------+-----------------+
      | Variable_name | Value           |
      +---------------+-----------------+
      | datadir       | /var/lib/mysql/ |
      +---------------+-----------------+
      MariaDB [(none)]> show variables like 'basedir';   <==显示安装路径
      +---------------+------------------+
      | Variable_name | Value            |
      +---------------+------------------+
      | basedir       | /usr/local/mysql |
      +---------------+------------------+
      
    2. 先停止服务,这里以二进制安装为例,防止数据库内容变更
      [root@localhost  home]$service mysqld stop
      
    3. 将数据移动到其他目录下,然后修改配置文件,将数据库路径改为迁移后的路径
      迁移数据库
      [root@localhost  mysql]$cp /mysql/data /data/mysql -av
      修改配置文件
      [root@localhost  mysql]$vim /etc/mysql/my.cnf
      # The MySQL server
      [mysqld]
      datadir=/data/mysql    <==迁移后的路径
      
    4. 启动服务
      [root@localhost  mysql]$service mysqld start
      
    5. 查看迁移是否生效
      MariaDB [(none)]> show variables like 'datadir' ;
      +---------------+-----------+
      | Variable_name | Value     |
      +---------------+-----------+
      | datadir       | /data/my/ |     <==数据库路径确实已经修改
      +---------------+-----------+
      
10-05 15:10