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

文件管理系统的缺点

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

数据库管理系统的优势

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

数据库管理系统

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

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

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

数据库系统的架构

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

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

关系型数据库:效率较低

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

关系数据库

  • 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项,这样就不会出现错误信息。
    • 要注意外键连接到的另一张表的字段必须是主键字段(一张表只有一个)或者说是惟一字段(一张表可有多个),而不是随便的字段就能被外键连接的。
    • 注意上面的员工我的信息表是总的全部员工的信息表,部门表也是总的全部部门的表

image

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

image

  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)便可sql

范式

  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登录的时候只能手动输入用户名而不会显示用户名的列表能够鼠标点选了。shell

image

MySQL系列

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)
相关文章
相关标签/搜索