30.1. MySQL数据库简介,客户端简单操作,安装

文件管理系统的缺点

编写应用程序不方便
数据冗余不可避免
应用程序依赖性
不支持对文件的并发访问
数据间联系弱
难以按用户视图表示数据
无安全控制功能

数据库管理系统的优点

相互关联的数据的集合
较少的数据冗余
程序与数据相互独立
保证数据的安全、可靠
最大限度地保证数据的正确性
数据可以并发使用并能同时保证一致性

数据库管理系统

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

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

数据定义
数据处理
数据安全
数据备份

数据库系统的架构

单机架构 :比如access,一些财务数据库
大型主机/终端架构:一个大型主机带多套键鼠显示屏设备(终端)
主从式架构(C/S):主流的客户端服务端架构
分布式架构 :集群

  • 网状数据库:数据量大时,过于混乱
  • 层次数据库: 数据容易冗余,占用更多空间
  • NOSQL : not only SQL 不仅仅是关系数据库,提升效率的新型数据库结构,例如redis,memcache

关系型数据库:效率较低

关系 :关系就是二维表,其中:表中的行、列次序并不重要
行row(record):表中的每一行,又称为一条记录
列column(field):表中的每一列,称为属性或字段
主键Primary key:用于惟一确定一个记录的字段,一张表只能一个主键,且主键(或者复合主键)的字段不能重复
域domain:属性的取值范围,如,性别只能是‘男’和‘女’两个值

关系数据库

  • RDBMS:(去IOE活动)
    MySQL: MySQL, MariaDB, Percona Server
    PostgreSQL: 简称为pgsql,EnterpriseDB
    Oracle
    MSSQL
    DB2
  • 数据库排名:
    https://db-engines.com/en/ranking

联系类型

  • 数据的操作:
    数据提取:在数据集合中提取感兴趣的内容。 SELECT
    数据更新:变更数据库中的数据。 INSERT、 DELETE、 UPDATE
  • 数据的约束条件 :是一组完整性规则的集合
    实体(行)完整性 Entity integrity
    域(列)完整性 Domain Integrity
    参考完整性 Referential Integrity
  • 联系的类型
    一对一联系(1:1)
    一对多联系(1:n)
    多对多联系(m:n)

注意点1:

  1. 1:n或者说n对1的关系:就比如一个部门有多个员工,员工所属的部门这一个field就应该重新再列另外一张表来进行存储,不然的话员工个人信息这张表上的部门field列中,就会存在很多的重复部门信息(部门的名称等各种信息,它字节数多,占的空间多,不如直接用ID来代表)
    • 此时员工的个人信息表中的这个部门field就是N:1中的多的关系,部门这张表的部门ID就是1的关系。
    • 因为员工的个人信息表的部门field中的记录都是来自于部门表中的部门(员工表部门field依赖于部门表ID),为了避免出现错误的部门(比如员工表中部门filed中写上了部门表中不存在的部门),要把员工表中的这一部门field设为外键(FK:foreign key),并链接到部门表中的ID的这一field中,代表着部门field的记录全部来自部门表的ID项,这样就不会出现错误信息。
    • 要注意外键链接到的另外一张表的字段必须是主键字段(一张表只有一个)或者说是唯一字段(一张表可有多个),而不是随便的字段就能被外键链接的。
    • 注意上面的员工个人信息表是总的所有员工的信息表,部门表也是总的所有部门的表

  1. n:n或者说多对多的关系:就比如大学选课,总的学生的个人信息表中选的课程一个学生可以选多个课程,而课程表中的一个课程也能被多个学生给选择。
    • 此时即不能把学生表中每个学生选了几门课就加几个record把课程给记录下来(这样的话学生ID的主键重复了,主键的field就不能指定为ID但也没有其他更好的指定位置)
    • 也不能把课程的field中添加多个课程,(违反了field中的最小原子单元不可再分的定义,不符合第一范式,这样就不是关系数据库)
    • 更不能把总的课程表中每个课程添加多个学生(这样和学生表中添加课程没有区别了)
    • 因此,这种情况下要比多对1的情况再增加出来第三章表格,用这个表格来记录。
    • 其中学生表中只记录学生信息,不记录课程的field;课程(班级)表中只记录课程信息,不记录学生field。而第三张表则吧学生ID和课程ID给相互对应起来即可,它的主键就是一个记录序号的的ID编号,它的两个field(学生ID和课程ID)则分别外键依赖于学生表和课程表的IDfield上即可。

30.1. MySQL数据库简介,客户端简单操作,安装_第1张图片

  1. 数据库的设计如果不完美,则会造成各种效率的低下。作为运维人员则需要检查数据库的标准和效率(它俩一般成反比)来进行优化,甩锅等操作。
  2. 第一范式中,每一列的属性都必须不同,这就是不能有重复字段的要求,比如部门filed在一个表中只能有这一个colume,不能是部门1,部门2这种多个field;当然也不能在一个部门field中的record中,写多于一个的记录,这样的话不符合原子不可再分性的要求。
    • 如果想要实现多个部门,可以再分出来第二张表专门存储部门信息,然后利用外键的方式链接这两张表即可。其中第二张表的外键就是员工的ID,主键是记录的ID(和后面员工的ID及部门无关),每一行的record中就是记录ID,员工ID和部门名字这种格式。
  3. 主键可以是多个列(字段)组合起来的复合字段,把这个复合字段当做主键。这种主键里面的内容如果某些列相同但是只要不全部相同,仍然被看做是不同的record.
    • 其中第二范式中的field属性不完全依赖于主键,就有一种情况就是某个field其属性只依赖于复合主键中的某一个field, 并不是依赖于整个复合主键(这样就可以把这个属性和它依赖的这一列分成另外一张表了)。
    • 同时第二范式要求属性和主键(复合主键整体)有直接相关性。
  4. 满足了第二范式之后,则第三范式要求一个数据库表中不包含已在其它表中已包含的非主键的列(这样就冗余了)
    • 第三范式和第二范式的区别就是:第二范式只要求列和主键之间的直接关系,不要求列之间的关系。而第三范式不仅要求它,还要求各个列之间没有任何关系。
  5. 数据库的范式虽然规范了,减少了数据冗余节约了数据库空间,但是会降低数据库的搜索查找效率。因此要根据实际情况来进行设计,第二三范式没有硬性要求。

简易数据规划流程

  1. 第一阶段:收集数据,得到字段
    • 收集必要且完整的数据项
    • 转换成数据表的字段
  2. 第二阶段:把字段分类,归入表,建立表的关联
    • 关联:表和表间的关系
    • 分割数据表并建立关联的优点
    • 节省空间
    • 减少输入错误
    • 方便数据修改
  3. 第三阶段:
    • 规范化数据库
数据库的正规化分析

数据库规范化,又称数据库或资料库的正规化、标准化,是数据库设计中的一系列原理和技术,以减少数据库中数据冗余,增进数据的一致性。关系模型的发明者埃德加·科德最早提出这一概念,并于1970年代初定义了第一范式、第二
范式和第三范式的概念
RDMBS设计范式基础概念:设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,不同的规范要求被称为不同范式,各种范式呈递次规范,越高的范式数据库冗余越小
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴德斯科范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。一般数据库只需满足第三范式(3NF)即可

范式

  1. 1NF:无重复的列,每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性,确保每一列的原子性。除去同类型的字段,就是无重复的列
    说明:第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库
  2. 2NF:属性完全依赖于主键,第二范式必须先满足第一范式,要求表中的每个行必须可以被唯一地区分。通常为表加上一个列,以存储各个实例的唯一标识PK,非PK的字段需要与整个PK有直接相关性
  3. 3NF:属性不依赖于其它非主属性,满足第三范式必须先满足第二范式。第三范式要求一个数据库表中不包含已在其它表中已包含的非主关键字信息,非PK的字段间不能有从属关系

SQL概念

  • SQL: Structure Query Language
    结构化查询语言
    SQL解释器:
    数据存储协议:应用层协议,C/S
    S:server, 监听于套接字,接收并处理客户端的应用请求:3306端口
    C:Client
  • 客户端程序接口
    CLI :命令行的MySQL软件接口
    GUI :还有图形化的软件接口
  • 应用编程接口
    ODBC:Open Database Connectivity
    JDBC:Java Data Base Connectivity
基本概念
  • 约束:constraint,表中的数据要遵守的限制
    1. 主键:一个或多个字段的组合,填入的数据必须能在本表中唯一标识本行;必须提供数据,即NOT NULL,一个表只能有一个
    2. 惟一键:一个或多个字段的组合,填入的数据必须能在本表中唯一标识本行;允许为NULL,一个表可以存在多个
    3. 外键:一个表中的某字段可填入的数据取决于另一个表的主键或唯一键已有的数据
    4. 检查:字段值在一定范围内
  • 索引:将表中的一个或多个字段中的数据复制一份另存,并且按特定次序排序存储
  • 关系运算:
    1. 选择:挑选出符合条件的行
    2. 投影:挑选出需要的字段
    3. 连接:表间字段的关联

数据模型

  • 数据抽象:
    物理层:数据存储格式,即RDBMS在磁盘上如何组织文件
    逻辑层:DBA角度,描述存储什么数据,以及数据间存在什么样的关系
    视图层:用户角度,描述DB中的部分数据,比如用户看到的网站界面抓取的各种信息
  • 关系模型的分类:
    关系模型
    基于对象的关系模型
    半结构化的关系模型:XML数据(目前不流行)

附加知识点: /etc/gconf/gconf.xml.gefaults中大部分都是xml文件(图形界面的xml文件)
其中有个%gconf-tree.xml文件,里面的文件代码格式就是xml格式。
在Cenots6中这个文件中的disable_user_list一行,这里的它下面的type 中的value改为true,则centos6登陆的时候只能手动输入用户名而不会显示用户名的列表可以鼠标点选了。

MySQL系列
  • 官方网址:
    https://www.mysql.com/
    http://mariadb.org/
    https://www.percona.com
  • 官方文档
    https://dev.mysql.com/doc/
    https://mariadb.com/kb/en/
    https://www.percona.com/software/mysql-database/percona-server
  • 版本演变:
    MySQL:5.1 --> 5.5 --> 5.6 --> 5.7 -->8.0
    MariaDB:5.5 -->10.0--> 10.1 --> 10.2 --> 10.3 --> 10.4
MYSQL的特性

插件式存储引擎:也称为“表类型”,存储管理器有多种实现版本,功能和特性可能均略有差别;用户可根据需要灵活选择,Mysql5.5.5开始innoDB引擎是MYSQL默认引擎
MyISAM ==> Aria
InnoDB ==> XtraDB
单进程,多线程
诸多扩展和新特性
提供了较多测试组件
开源

mariadb的简单使用

MariaDB程序
  • 客户端程序:
    mysql: 交互式的CLI工具
    mysqldump:备份工具,基于mysql协议向mysqld发起查询请求,并将查得的所有数据转换成insert等写操作语句保存文本文件中
    mysqladmin:基于mysql协议管理mysqld
    mysqlimport:数据导入工具
  • MyISAM存储引擎的管理工具:
    myisamchk:检查MyISAM库
    myisampack:打包MyISAM表,只读
  • 服务器端程序
    mysqld_safe
    mysqld
    mysqld_multi 多实例
    示例:mysqld_multi --example

用户账号

  • mysql用户账号由两部分组成:
    'USERNAME'@'HOST'
  • 说明:
    HOST限制此用户可通过哪些远程主机连接mysql服务器,它支持使用通配符:
    % 匹配任意长度的任意字符 (通配符中的*)
    172.16.0.0/255.255.0.0 或 172.16.%.%
    _ 匹配任意单个字符 (通配符中的?, 正则表达式中的.)

Mysql 客户端

mysql使用模式:

  1. 交互式模式:
    可运行命令有两类:
    客户端命令:
    \h, help
    \u,use
    \s,status
    \!,system
    服务器端命令:
    SQL语句, 需要语句结束符冒号;
  2. 脚本模式(重定向):
    mysql –uUSERNAME -pPASSWORD < /path/somefile.sql
    mysql> source /path/from/somefile.sql
  • mysql客户端可用选项:
    -A, --no-auto-rehash 禁止补全
    -u, --user= 用户名,默认为root
    -h, --host= 服务器主机,默认为localhost
    -p, --passowrd= 用户密码,建议使用-p,默认为空密码
    -P, --port= 服务器端口
    -S, --socket= 指定连接socket文件路径,前提是不能跨网络连接
    -D, --database= 指定默认数据库,可以不写-D
    -C, --compress 启用压缩
    -e “SQL“ 执行SQL命令
    -V, --version 显示版本
    -v --verbose 显示详细信息
    --print-defaults 获取程序默认使用的配置
socket地址

服务器监听的两种socket地址:
ip socket: 监听在tcp的3306端口,支持远程通信
unix sock: 监听在sock文件上,仅支持本机通信
如:/var/lib/mysql/mysql.sock)
说明:host为localhost,127.0.0.1时自动使用unix sock

执行命令

  • 运行mysql命令:默认空密码登录
    mysql>use mysql 用mysql数据库
    mysql>select user(); 查看当前用户
    mysql>select version(); 查看当前版本
    mysql>SELECT User,Host,Password FROM user;
  • 登录系统:mysql –uroot –p
  • 客户端命令:本地执行
    mysql> help
    每个命令都完×××式和简写格式
    mysql> status 或 \s
  • 服务端命令:通过mysql协议发往服务器执行并取回结果
    每个命令末尾都必须使用命令结束符号,默认为分号
    示例:SELECT VERSION();

注意点2(客户端):

  1. mysql登陆时的用户账号比较特殊,直接就是 “用户名@主机” 的方式,登陆之前需要建立好用户(注意这个用户是在mysql的服务器上建好的,而不是客户端上),这种登录方式可以限定哪些用户必须在哪些些主机上才能够登陆,在登陆的时候就已经开始有安全策略了。
  2. 注意mysql的默认自带的登录账号也有个root名字的,它的权限也是mysql的数据库管理员权限。但是它是管理mysql的用户账号名,而并非是linux的系统管理员root,注意它俩区分。
    • 这个软件用于登陆管理的用户被称为是它的虚拟用户
    • 附加知识点:比如数据库sqlserver 有个 自带管理员 sa ,就相当于mysql 的root .但是sa有个漏洞就是用它登陆数据库之后顺便也拥有了系统的管理员权限,而mysql的root登陆之后也不会获取系统的管理员权限,仍然是登陆数据库之前linux系统中正在登录使用的账号的权限(当然登陆之前就是root那就不用多说了)。
  3. 新装mysql安全风险很大,不论是哪个用户登录着本机(root,zhang,duan..),都可以直接执行mysql [-h127.0.0.1] [-uroot] [-p] 登陆数据库(因为不需要输入后面的主机,用户,密码,中括号里的都是默认的选项,以后也可以省略)。
  4. 注意进入数据库之后执行分成两类命令,用\h查看到的命令都是客户端命令可以直接执行,而其他的服务器端命令必须后面加上分号; 才能执行。
  5. mysql的默认提示符中间显示的是当前正在使用的数据库的名称(mysql可以装多个数据库,不仅仅一个。默认带有几个,其中的test数据库测试使用,没有用可以删除),其中有个mysql数据库,里面装着关于mysql自身的各种信息(meta元数据,包括mysql的用户账户等)
  6. 一个数据库可看作是一个文件夹,而实际上它本身的确就是一个文件夹,这些数据库就存放在/var/lib/mysql下(详细看下面的代码中),而其中的mysql数据库中的文件,每三个同名不同后缀的文件就代表一个表
    • 在这里有个user名字开头的三个文件就存放着mysql的登陆用户名和主机表。
    • 可以进入数据库之后用 show tables ; desc user ; select user,host,password from user; 一步一步查看到表中的用户信息。
  7. 由6中结果可见默认安装后只能在本机(远程也可以登录,直接在其他主机上mysql -h本机IP即可,也可以其他主机先SSH连接到本机,然后mysql即可)且用root这个mysql自带的虚拟用户身份(也可以匿名任意用户)连接mysql数据库。
    用户为空的项代表匿名用户,它表示任何用户名(随便输入)都可以登录这个数据库,比如说 mysql -u abc (-u 和 后面的名字之间可以有空格也可以不加空格,不过其他的命令比如-p不能加空格) 命令也可以登录(但是空用户不能登陆 必须得输入字符才可以)。
    但是此时再次执行show databases时看到的数据库信息不如root登陆时看到的多(少了mysql和 performance_schema),虽然能够匿名登陆,但是权限是普通用户,不是root的管理员的权限。
  8. 接3中所写,因此新装数据库最好先执行安全防护的专用脚本,(删除匿名账户,加上密码,删除test数据库,删除远程登录),注意这里的远程登录指的是不用ssh而是直接用客户端命令mysql 指定-h 本机IP 的方式登录数据库。
    这个脚本位置在/usr/bin/mysql_secure_installation,直接运行即可,如果刚开始没有密码则旧密码这一项直接回车即可(file它可见它就是一个shell脚本,yum或者二进制的话它也写好了路径,直接运行即可。注意它和数据库database生成的命令的区别,后者需要制定数据库生成的目标的dir位置)
  9. system 或者\! 是按照登陆数据库之前的linux中的账户的权限来执行登陆前shell中的命令的,不会因为用root登陆了数据库而获得了登陆前的linux中的root权限。(不过微软的 sqlserver 的sa账户就可以这样,不论在windows中用什么用户登陆这个sa,则都能在sqlserver中用sa 获得windows中的管理员权限,在数据库内操作windows,变相的提升了权限)
  10. 非交互式方式(文件重定向)貌似可以不用写;符号,不过建议还是按照标准格式来,一行一个命令,同时数据库的操作加上;
    • 还可以登录到数据库之后再用 'source 文件' 的方式来执行文件中所写的命令
    • 非交互式还可以直接命令中 mysql -e 'CMD' 来执行CMD的操作,其中不管是客户端还是服务器命令就要用;分隔开两个命令。
  11. -S指定socket文件时不能跨网络连接,只能本地。
    --print-defaults 命令可以查看当前已经使用的客户端配置,比如下面12中的配置如果写入客户端配置文件中之后,则在当前shell中执行mysql --print-defaults 就可以看到配置文件中的信息了。
  12. 客户端命令中有prompt命令可以修改提示符(登录数据库之后promt后面直接加格式即可),当然这样写下次登录会丢失配置,最好写在客户端配置文件中/etc/my.cnf.d/mysql-clients.cnf 的[mysql]栏下会永久保存。
    • prompt="Date:\\D Count:\\c \\n\\U[\\d] > "
    • 注意在配置文件中写的要用上两个反斜线,修改完之后直接就能生效(因为是客户端软件并不是服务,类似的直接生效的还有ssh的客户端配置等),具体的格式信息和说明可以查看man mysql
  13. mysqladmin 可以进行多种操作 --help查询
    • 注意在有密码的情况下必须要输入数据库的用户名和密码才可以进行mysqladmin的命令,一些例子写在下面
Administration program for the mysqld daemon.
Usage: mysqladmin [OPTIONS] command command....

Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf 

可看到配置文件顺序,这些文件不仅包括服务器端还包括客户端

mysqladmin password centos :修改密码为centos(如果没有旧密码)
mysqladmin -uroot -pOLDPSW passwpord centos :修改旧密码为centos
mysqladmin -uroot -pPSW ping|status|version :查看各种状态
mysqladmin -uroot -pPSW shutdown :可关闭数据库

下面为一些操作示例:

============================================刚装之后查看版本和已有用户,注意加分号:

MariaDB [(none)]> select user();
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.000 sec)

MariaDB [(none)]> select version();
+-----------------+
| version()       |
+-----------------+
| 10.3.14-MariaDB |
+-----------------+
1 row in set (0.000 sec)

MariaDB [(none)]> 

=====================================================刚装之后登陆查看状态
MariaDB [(none)]> status
--------------
mysql  Ver 15.1 Distrib 10.3.14-MariaDB, for Linux (x86_64) using readline 5.1

Connection id:      11
Current database:                  :当前正在使用的数据库,可见当前为空
Current user:       root@localhost
SSL:            Not in use
Current pager:      stdout
Using outfile:      ''
Using delimiter:    ;
Server:         MariaDB
Server version:     10.3.14-MariaDB MariaDB Server
Protocol version:   10
Connection:     Localhost via UNIX socket
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:        /var/lib/mysql/mysql.sock   :表示通过本机的socket套接字连接的本机的mysql,因为不走网络,因此不需要端口号。这个套接字文件就显示在这里。
Uptime:         26 min 29 sec

:线程
Threads: 7  Questions: 10  Slow queries: 0  Opens: 17  Flush tables: 1  Open tables: 11  Queries per second avg: 0.006
--------------

========================================================刚装之后查看数据库,注意加分号:
MariaDB [(none)]> show databases ;
+--------------------+
| Database           |
+--------------------+
| information_schema |  : 此数据库是在内存中的,动态数据库,其他3个默认自带数据库都在/var/lib/mysql下
| mysql              |  :
| performance_schema |  :
| test               |  :
+--------------------+
4 rows in set (0.002 sec)

MariaDB [(none)]> Ctrl-C -- exit!

===============================================切换数据库:
MariaDB [(none)]> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [mysql]> 

======================================================/var/lib/mysql/mysql 中文件:

21:49[root@centos7 /var/lib/mysql/mysql]# ls
columns_priv.frm  general_log.CSM     help_topic.MYD          proc.frm           slow_log.CSM               time_zone_name.frm
columns_priv.MYD  general_log.CSV     help_topic.MYI          proc.MYD           slow_log.CSV               time_zone_name.MYD
columns_priv.MYI  general_log.frm     host.frm                proc.MYI           slow_log.frm               time_zone_name.MYI
column_stats.frm  gtid_slave_pos.frm  host.MYD                procs_priv.frm     tables_priv.frm            time_zone_transition.frm
column_stats.MYD  gtid_slave_pos.ibd  host.MYI                procs_priv.MYD     tables_priv.MYD            time_zone_transition.MYD
column_stats.MYI  help_category.frm   index_stats.frm         procs_priv.MYI     tables_priv.MYI            time_zone_transition.MYI
db.frm            help_category.MYD   index_stats.MYD         proxies_priv.frm   table_stats.frm            time_zone_transition_type.frm
db.MYD            help_category.MYI   index_stats.MYI         proxies_priv.MYD   table_stats.MYD            time_zone_transition_type.MYD
db.MYI            help_keyword.frm    innodb_index_stats.frm  proxies_priv.MYI   table_stats.MYI            time_zone_transition_type.MYI
event.frm         help_keyword.MYD    innodb_index_stats.ibd  roles_mapping.frm  time_zone.frm              transaction_registry.frm
event.MYD         help_keyword.MYI    innodb_table_stats.frm  roles_mapping.MYD  time_zone_leap_second.frm  transaction_registry.ibd
event.MYI         help_relation.frm   innodb_table_stats.ibd  roles_mapping.MYI  time_zone_leap_second.MYD  user.frm
func.frm          help_relation.MYD   plugin.frm              servers.frm        time_zone_leap_second.MYI  user.MYD
func.MYD          help_relation.MYI   plugin.MYD              servers.MYD        time_zone.MYD              user.MYI
func.MYI          help_topic.frm      plugin.MYI              servers.MYI        time_zone.MYI

=============================================================进入数据库中查看数据库中的表(数据)命令,注意加分号:

MariaDB [mysql]> show tables;
+---------------------------+
| Tables_in_mysql           |
+---------------------------+
| column_stats              |
| columns_priv              |
| db                        |
| event                     |
| func                      |
| general_log               |
| gtid_slave_pos            |
| help_category             |
| help_keyword              |
| help_relation             |
| help_topic                |
| host                      |
| index_stats               |
| innodb_index_stats        |
| innodb_table_stats        |
| plugin                    |
| proc                      |
| procs_priv                |
| proxies_priv              |
| roles_mapping             |
| servers                   |
| slow_log                  |
| table_stats               |
| tables_priv               |
| time_zone                 |
| time_zone_leap_second     |
| time_zone_name            |
| time_zone_transition      |
| time_zone_transition_type |
| transaction_registry      |
| user                      |
+---------------------------+
31 rows in set (0.001 sec)

=========================================================查看user中的字段(field),注意加分号:

MariaDB [mysql]> desc user ;
+------------------------+-----------------------------------+------+-----+----------+-------+
| Field                  | Type                              | Null | Key | Default  | Extra |
+------------------------+-----------------------------------+------+-----+----------+-------+
| Host                   | char(60)                          | NO   | PRI |          |       |
| User                   | char(80)                          | NO   | PRI |          |       |
| Password               | char(41)                          | NO   |     |          |       |
| Select_priv            | enum('N','Y')                     | NO   |     | N        |       |
| Insert_priv            | enum('N','Y')                     | NO   |     | N        |       |
| Update_priv            | enum('N','Y')                     | NO   |     | N        |       |
| Delete_priv            | enum('N','Y')                     | NO   |     | N        |       |
| Create_priv            | enum('N','Y')                     | NO   |     | N        |       |
| Drop_priv              | enum('N','Y')                     | NO   |     | N        |       |
| Reload_priv            | enum('N','Y')                     | NO   |     | N        |       |
| Shutdown_priv          | enum('N','Y')                     | NO   |     | N        |       |
| Process_priv           | enum('N','Y')                     | NO   |     | N        |       |
| File_priv              | enum('N','Y')                     | NO   |     | N        |       |
| Grant_priv             | enum('N','Y')                     | NO   |     | N        |       |
| References_priv        | enum('N','Y')                     | NO   |     | N        |       |
| Index_priv             | enum('N','Y')                     | NO   |     | N        |       |
| Alter_priv             | enum('N','Y')                     | NO   |     | N        |       |
| Show_db_priv           | enum('N','Y')                     | NO   |     | N        |       |
| Super_priv             | enum('N','Y')                     | NO   |     | N        |       |
| Create_tmp_table_priv  | enum('N','Y')                     | NO   |     | N        |       |
| Lock_tables_priv       | enum('N','Y')                     | NO   |     | N        |       |
| Execute_priv           | enum('N','Y')                     | NO   |     | N        |       |
| Repl_slave_priv        | enum('N','Y')                     | NO   |     | N        |       |
| Repl_client_priv       | enum('N','Y')                     | NO   |     | N        |       |
| Create_view_priv       | enum('N','Y')                     | NO   |     | N        |       |
| Show_view_priv         | enum('N','Y')                     | NO   |     | N        |       |
| Create_routine_priv    | enum('N','Y')                     | NO   |     | N        |       |
| Alter_routine_priv     | enum('N','Y')                     | NO   |     | N        |       |
| Create_user_priv       | enum('N','Y')                     | NO   |     | N        |       |
| Event_priv             | enum('N','Y')                     | NO   |     | N        |       |
| Trigger_priv           | enum('N','Y')                     | NO   |     | N        |       |
| Create_tablespace_priv | enum('N','Y')                     | NO   |     | N        |       |
| Delete_history_priv    | enum('N','Y')                     | NO   |     | N        |       |
| ssl_type               | enum('','ANY','X509','SPECIFIED') | NO   |     |          |       |
| ssl_cipher             | blob                              | NO   |     | NULL     |       |
| x509_issuer            | blob                              | NO   |     | NULL     |       |
| x509_subject           | blob                              | NO   |     | NULL     |       |
| max_questions          | int(11) unsigned                  | NO   |     | 0        |       |
| max_updates            | int(11) unsigned                  | NO   |     | 0        |       |
| max_connections        | int(11) unsigned                  | NO   |     | 0        |       |
| max_user_connections   | int(11)                           | NO   |     | 0        |       |
| plugin                 | char(64)                          | NO   |     |          |       |
| authentication_string  | text                              | NO   |     | NULL     |       |
| password_expired       | enum('N','Y')                     | NO   |     | N        |       |
| is_role                | enum('N','Y')                     | NO   |     | N        |       |
| default_role           | char(80)                          | NO   |     |          |       |
| max_statement_time     | decimal(12,6)                     | NO   |     | 0.000000 |       |
+------------------------+-----------------------------------+------+-----+----------+-------+
47 rows in set (0.002 sec)

================================================================从这个user表中field(字段)中挑出特定的字段来查看里面的内容,注意加分号:
由6中结果可见默认安装后只能在本机(远程不行)且用root虚拟用户身份(也可以匿名任意用户)连接mysql数据库。
用户为空的项代表匿名用户,它表示任何用户名(随便输入)都可以登录这个数据库,比如说 mysql -u abc 命令也可以登录(但是空用户不能登陆 必须得输入字符才可以)

MariaDB [mysql]> select user,host,password from user;
+------+---------------+----------+
| user | host          | password |
+------+---------------+----------+
| root | localhost     |          |  :指的是本机网段127开头
| root | centos7.6test |          |  :指的是本机IP 192.168.36.102(或者其他网卡上的IP)
| root | 127.0.0.1     |          |  
| root | ::1           |          |  :IPV6上本机IP
|      | localhost     |          |  :匿名用户
|      | centos7.6test |          |  :匿名用户
+------+---------------+----------+
6 rows in set (0.001 sec)

========================================默认安装后匿名用户直接登陆,以及用它查看数据库信息(权限不如root大,看到的信息不如root多):

22:07[root@centos7 /var/lib/mysql]# mysql -u abc
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 17
Server version: 10.3.14-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> select user() ;
+---------------+
| user()        |
+---------------+
| abc@localhost |
+---------------+
1 row in set (0.000 sec)

MariaDB [(none)]> show databases ;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| test               |
+--------------------+
2 rows in set (0.001 sec)

==========================================执行安全加固安装脚本之后:

MariaDB [mysql]> select user,host,password from user 
    -> ;
+------+-----------+-------------------------------------------+
| user | host      | password                                  |
+------+-----------+-------------------------------------------+
| root | localhost | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| root | 127.0.0.1 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| root | ::1       | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+------+-----------+-------------------------------------------+
3 rows in set (0.001 sec)

======================================查看写入配置文件中的设定:
11:38[root@centos7 ~]# mysql --print-defaults
mysql would have been started with the following arguments:
--prompt=Date:\D Count:\c \n\U[\d] >  
socket地址

服务器监听的两种socket地址:
ip socket: 监听在tcp的3306端口,支持远程通信
unix sock: 监听在sock文件上,仅支持本机通信
如:/var/lib/mysql/mysql.sock)
说明:host为localhost,127.0.0.1时自动使用unix sock

服务器端配置

服务器端(mysqld):工作特性有多种配置方式

  1. 命令行选项:
  2. 配置文件:类ini格式
    集中式的配置,能够为mysql的各应用程序提供配置信息
    [mysqld]
    [mysqld_safe]
    [mysqld_multi]
    [mysql]
    [mysqldump]
    [server]
    [client]
    格式:parameter = value
    说明:_和- 相同
    1,ON,TRUE意义相同, 0,OFF,FALSE意义相同
配置文件

配置文件:
后面覆盖前面的配置文件,顺序如下:

  1. /etc/my.cnf Global选项(注意它包含了/etc/my.cnf.d/下的文件) : 可参考它修改实例中的配置文件
  2. /etc/mysql/my.cnf Global选项
  3. SYSCONFDIR/my.cnf Global选项
  4. $MYSQL_HOME/my.cnf Server-specific 选项
  5. --defaults-extra-file=path
  6. ~/.my.cnf User-specific 选项
  • 从上到下优先级越来越高(后面覆盖前面的文件)
Mariadb简单配置
  • 侦听3306/tcp端口可以在绑定有一个或全部接口IP上
    vim /etc/my.cnf
    [mysqld]
    skip-networking=1
    关闭网络连接,只侦听本地客户端, 所有和服务器的交互都通过一个socket实现,socket的配置存放在/var/lib/mysql/mysql.sock) 可在/etc/my.cnf修改MairaDB配置
  • 注意修改完之后要重启服务

注意点3(服务器端):

  1. SOCKET如果监听的端口3306被关闭则可以阻止远程的直接连接(但可以先用SSH连接上去再连接数据库,变相的利用了本地的链接方式。)
    • 注意当使用mysql客户端连接服务器时,host为localhost,127.0.0.1时自动使用unix sock(本地socket文件),默认不写@host的时候走的就是localhost因此也就是用的unix socket连接的。可以用status命令查看。
  2. mysqld服务是以mysql的用户来执行的,而这个用户如果用yum安装的方式会自动生成,是一个系统用户且家目录就在/var/lib/mysql,这也就是数据库存放的位置。
    • 利用rpm -q --scripts MariaDB-server(client) 可以看到创建用户的过程命令和修改文件权限如下:
12:28[root@centos7 ~]# ps aux | grep mysql
root        403  0.0  0.0 112708   976 pts/2    S+   12:29   0:00 grep --color=auto mysql
mysql     66126  0.0  3.7 1768932 70740 ?       Ssl  Apr28   0:42 /usr/sbin/mysqld
root     125855  0.0  0.1 119868  2552 pts/0    S+   11:08   0:00 man mysql
12:29[root@centos7 ~]# getent passwd mysql
mysql:x:988:982:MySQL server:/var/lib/mysql:/sbin/nologin
12:30[root@centos7 ~]# 

创建用户preinstallscript中的创建mysql系统用户以及修改数据库文件的权限命令:

 # Create a MySQL user and group. Do not report any problems if it already
  # exists.
  groupadd -r mysql 2> /dev/null || true
  useradd -M -r --home $datadir --shell /sbin/nologin --comment "MySQL server" --gid mysql mysql 2> /dev/null || true 
  # The user may already exist, make sure it has the proper group nevertheless (BUG#12823)
  usermod --gid mysql mysql 2> /dev/null || true

  # Change permissions so that the user that will run the MySQL daemon
  # owns all database files.
  chown -R mysql:mysql $datadir

  if [ ! -e $datadir/mysql ]; then
    # Create data directory
    mkdir -p $datadir/{mysql,test}

    # Initiate databases
    /usr/bin/mysql_install_db --rpm --user=mysql
  fi

  # Change permissions again to fix any new files.
  chown -R mysql:mysql $datadir

  # Fix permissions for the permission database so that only the user
  # can read them.
  chmod -R og-rw $datadir/mysql
fi

安装MYSQL

Mariadb安装方式:

  1. 源代码:编译安装
  2. 二进制格式的程序包:展开至特定路径,并经过简单配置后即可使用(最多最好的方式)
  3. 程序包管理器管理的程序包

CentOS 安装光盘:可安装但是版本太老
项目官方:https://downloads.mariadb.org/mariadb/repositories/
国内镜像:https://mirrors.tuna.tsinghua.edu.cn/mariadb/yum/
https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/

通用二进制格式安装过程

  1. 准备用户(可参考yum包中的官方写的命令,要注意先确认mysql用户是否存在,),这里可以直接创建用户不创建组也可(组会自动创建了一并)
    groupadd -r [-g 306] mysql :要确保这个ID没人用,下同
    useradd -r -g mysql[|306] [-u 306] –d /data/mysql -s /sbin/nologin mysql
  2. 准备数据库的目录,建议使用逻辑卷(同样可参考官方)
    mkdir /data/mysql
    chown -R mysql:mysql /data/mysql
  3. 准备二进制程序
    tar xf mariadb-VERSION-linux-x86_64.tar.gz -C /usr/local
    cd /usr/local
    ln -sv mariadb-VERSION mysql
    chown -R root:mysql /usr/local/mysql/ :注意它和上面数据库的所属的区别
  4. 准备配置文件
    mkdir /etc/mysql/
    cp support-files/my-huge.cnf /etc/mysql/my.cnf
    • [mysqld]中添加三个选项:
      datadir = /data/mysql
      innodb_file_per_table = on
      skip_name_resolve = on :禁止主机名解析,建议使用
  5. 创建数据库文件:注意一定要在mysql文件夹中执行,不能进入script中,同时要指定用户(保证属主属组)和目录
    cd /usr/local/mysql/
    ./scripts/mysql_install_db --datadir=/data/mysql --user=mysql
    chown -R mysql:mysql /data/mysql
  6. 准备服务脚本,并启动服务,(改名)
    cp ./support-files/mysql.server /etc/rc.d/init.d/mysqld
    chkconfig --add mysqld
    service mysqld start
  7. PATH路径(这个是为了客户端以及服务器的各种脚本执行用,别忘了)
    echo ‘PATH=/user/local/mysql/bin:$PATH’ > /etc/profile.d/mysql
  8. 安全初始化
    /user/local/mysql/bin/mysql_secure_installation

源码编译安装mariadb

  1. 安装包
    yum install bison bison-devel zlib-devel libcurl-devel libarchive-devel boostdevel gcc gcc-c++ cmake ncurses-devel gnutls-devel libxml2-devel openssl devel libevent-devel libaio-devel
  2. 做准备用户和数据目录以及存放mysql主体的目录
    useradd –r –s /sbin/nologin –d /data/mysql/ mysql :直接生成用户的同时相对应的组也生成了
    mkdir /data/mysql -p
    chown mysql.mysql /data/mysql
    mkdir /app/mysql/ -p
    mkdir /etc/mysql -p
    tar xvf mariadb-10.2.18.tar.gz
  3. cmake 编译安装
    cmake的重要特性之一是其独立于源码(out-of-source)的编译功能,即编译工作可以在另一个指定的目录中而非源码目录中进行,这可以保证源码目录不受任何一次编译的影响,因此在同一个源码树上可以进行多次不同的编译,如针对于不同平台编译
    编译选项:https://dev.mysql.com/doc/refman/5.7/en/source-configuration-options.html

提前做好前两步操作,然后

cd mariadb-10.2.18/
cmake . \
-DCMAKE_INSTALL_PREFIX=/app/mysql \
-DMYSQL_DATADIR=/data/mysql/ \
-DSYSCONFDIR=/etc/mysql \
-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=/data/mysql/mysql.sock \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_general_ci

然后make && make install
提示:如果出错,执行rm -f CMakeCache.txt

  1. 准备环境变量
    echo 'PATH=/app/mysql/bin:$PATH' > /etc/profile.d/mysql.sh
    source /etc/profile.d/mysql.sh
  2. 生成数据库文件
    cd /app/mysql/
    scripts/mysql_install_db --datadir=/data/mysql/ --user=mysql
  3. 准备配置文件
    cp /app/mysql/support-files/my-huge.cnf /etc/mysql/my.cnf (在mysqld添加datadir一项)
  4. 准备启动脚本
    cp /app/mysql/support-files/mysql.server /etc/init.d/mysqld
  5. 启动服务
    chkconfig --add mysqld ;service mysqld start
  6. 安全初始化
    /app/mysql/bin/mysql_secure_installation

注意点4(安装):

  1. rpm光盘安装mysql版本太老,可以用yum安装,不过缺点就是不能控制安装的路径(数据库的文件夹位置);注意选择amd-64架构,因为早期64位就是amd率先提出的。官网也可以直接拷贝它的仓库配置工具中的代码来yum安装,不过是在国外网速可能慢,还是手工写国内的比较好:yum install mariadb-server
  2. rpm -ql MariaDB-server 查看文件
  3. yum中和自定义的mysql包各种路径的区别(就相当于把yum中的/usr系统目录 和二进制中的/usr/local/mysql 生成的目录 作为同一个级别来看待,同时yum安装的分散到系统中各个文件夹下,而二级制和源码安装的数据库主体集中在一个目录中了,这个目录自己指定即可)
    • 注意二进制安装(它相当于编译之后的直接能运行的可执行脚本,类似于windos中的绿色免安装,已经定义好了路径)必须放在这个/usr/local/mysql下
    • 执行命令的时候直接解压tar -C /usr/local 。 注意tar命令中不需要带mysql目录。
    • 执行完之后最好是用软连接的方式创建一个mysql文件指向这个解压后的文件夹(因为解压后的文件夹带有版本号等,必须要更名为mysql才可以,用软连接的方式就可以下次再装其他的目录或者更新版本之后直接更改软链接的指向即可)
  4. 二进制安装默认没有执行用户,因此要创建用户,参考上面所写。
    • 同时注意二进制安装后的/usr/local/mysql文件夹的所属主和所属组都应该是root(参考yum安装的属性),因为这里面的都是mysql这个服务本身(包括客户端服务器端),都是需要执行启动的服务,并非是用于操作数据库的mysql用户
    • 而数据库的文件夹/data/mysql的属主属组才是mysql,注意它俩之前的区分,别混淆
  5. 特别注意:注意centos6和7都自带/etc/my.cnf文件,不论装没装mysqlf服务都带的有。而在二进制安装中这个文件不符合要求,因此不能用它。
    • 但是根据前面的分析可知,/etc/mysql/my.cnf的优先级它要高,因此我们可以创建这个文件(利用二进制自带的模板文件并拷贝过去稍加修改即可,参考上面步骤中所写)
    • 默认自带的/etc/my.conf文件如下(目前经过测试得知,如果yum安装之后再undo 它,这个文件会被清空掉,可能是mariadb本身会把它清空,也有可能不纯净的原因):
===============================================centos7:

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd

[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

===============================================centos6:

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
  1. 注意添加启动服务脚本的时候的mysql可执行脚本文件需要执行权限同时所属主所属组都是root,基本上只需要拷贝更名为mysqld(也可以其他名字)不需要其他操作。
  2. 注意用户mysql的家目录里面不要添加其他的文件(创建的时候不能创建家目录内的隐藏文件)不然的话数据库会把这里面的文件夹给当作一个数据库从而产生问题。
  3. 源码编译安装的时候利用cmake,其中前三行分别代表1.masql脚本和主体目录,2.数据库database目录,和3.配置文件目录,最后两行代表默认字符集。
    • 因为在这里用源码编译安装的,所以文件位置都可以自己定义位置(不过配置文件最好还是按照系统自定义的顺序来放置文件目录,建议/etc/mysql目录下的my.cof)

转载于:https://blog.51cto.com/14228129/2388605

你可能感兴趣的:(数据库)