day1-mysql介绍以及安装
引言:数据库介绍
什么是数据库?数据库是做什么用的?数据库有哪些?企业常用的数据库选择?
为什么需要数据库?数据是什么?各种类型的公司分别存储什么数据?
一、数据库简介
数据库概述
数据库从字面上的理解就是数据的仓库,其实我们平时说的数据库是指数据库管理系统(Database Management System),它是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,简称DBMS。严格来说数据库是数据库管理系统的实例,一个数据库管理系统可以有多个数据库实例。
数据库系统(Database System),是由数据库及其管理软件组成的系统。
数据库系统是为适应数据处理的需要而发展起来的一种较为理想的数据处理系统,也是一个为实际可运行的存储、维护和应用系统提供数据的软件系统,是存储介质 、处理对象和管理系统的集合体。
基本定义
数据库系统DBS(Data Base System,简称DBS)通常由软件、数据库和数据管理员组成。其软件主要包括操作系统、各种宿主语言、实用程序以及数据库管理系统。数据库由数据库管理系统统一管理,数据的插入、修改和检索均要通过数据库管理系统进行。数据管理员负责创建、监控和维护整个数据库,使数据能被任何有权使用的人有效使用。数据库管理员一般是由业务水平较高、资历较深的人员担任。
数据库系统有大小之分,大型数据库系统有SQL Server、Oracle、DB2等,中小型数据库系统有Foxpro、Access、MySQL。
数据库构成
数据库系统一般由4部分组成:
1.数据库(database,DB)是指长期存储在计算机内的,有组织,可共享的数据的集合。数据库中的数据按一定的数学模型组织、描述和存储,具有较小的冗余,较高的数据独立性和易扩展性,并可为各种用户共享。
2.硬件:构成计算机系统的各种物理设备,包括存储所需的外部设备。硬件的配置应满足整个数据库系统的需要。
3.软件:包括操作系统、数据库管理系统及应用程序。数据库管理系统(database management system,DBMS)是数据库系统的核心软件,是在操作系统的支持下工作,解决如何科学地组织和存储数据,如何高效获取和维护数据的系统软件。其主要功能包括:数据定义功能、数据操纵功能、数据库的运行管理和数据库的建立与维护。
4.人员:主要有4类。第一类为系统分析员和数据库设计人员:系统分析员负责应用系统的需求分析和规范说明,他们和用户及数据库管理员一起确定系统的硬件配置,并参与数据库系统的概要设计。数据库设计人员负责数据库中数据的确定、数据库各级模式的设计。第二类为应用程序员,负责编写使用数据库的应用程序。这些应用程序可对数据进行检索、建立、删除或修改。第三类为最终用户,他们利用系统的接口或查询语言访问数据库。第四类用户是数据库管理员(data base administrator,DBA),负责数据库的总体信息控制。DBA的具体职责包括:具体数据库中的信息内容和结构,决定数据库的存储结构和存取策略,定义数据库的安全性要求和完整性约束条件,监控数据库的使用和运行,负责数据库的性能改进、数据库的重组和重构,以提高系统的性能。
数据库特点
数据的结构化
数据的共享性好
数据的独立性好
数据存储粒度小
数据库管理系统为用户提供了友好的接口
数据库系统的核心和基础,是数据模型,现有的数据库系统均是基于某种数据模型的。
也可以说,数据库系统的核心就是数据库管理系统。
二、数据库分类
关键词
MySQL:The world's most popular open source database(全世界最流行的开源数据库)
postgresql: The World's Most Advanced Open Source Relational Database(全世界最先进的开源数据库)
热度排行
数据库种类很多,我们平时接触最多的恐怕就是Oracle数据库,或者MySQL数据。两者是应用最广泛的关系型数据。如图1是2020年12月份使用情况排名,从排名也可以看出上述两个数据库分别排第一名和第二名。
https://db-engines.com/en/ranking
数据库分类
如果仔细看图1的排名就可以看到,数据库不仅仅有我们平时学到的关系型数据库,还有键值(Key-Value)数据库、列存储数据库、文档数据库和搜索引擎等类型。下面本文将简单介绍一下各种类型的数据。
关系型数据库:
这种类型的数据库是最古老的数据库类型,关系型数据库模型是把复杂的数据结构归结为简单的二元关系(即二维表格形式), 如图2是一个二维表的实例。通常该表第一行为字段名称,描述该字段的作用,下面是具体的数据。在定义该表时需要指定字段的名称及类型。

在关系型数据库中,对数据的操作几乎全部建立在一个或多个关系表格上。在大型系统中通常有多个表,且表之间有各种关系。实际使用就是通过对这些关联的表格分类、合并、连接或选取等运算来实现数据库的管理。
键值存储数据库:
键值数据库是一种非关系数据库,它使用简单的键值方法来存储数据。键值数据库将数据存储为键值对集合,其中键作为唯一标识符。
3
如图是某公有云的键值存储示意图,其中键包含分区键和排序键,而值包含更多的实际信息。比如实际使用是可以以学号为键,姓名、性别、年龄和班级等信息为值进行存储。实际存储形式很灵活,是业务需求自行定义即可。
列存储数据库:
列式存储(column-based)是相对于传统关系型数据库的行式存储(Row-basedstorage)来说的。简单来说两者的区别就是对表中数据的存储形式的差异。

图3 列存储数据库
如图是传统行数据库和列数据库表中数据在磁盘上的存储形式的差异对比。对于行存储数据库,表中的数据是以行为单位逐行存储在磁盘上的;而对于列存储数据库,表中的数据则是以列为单位逐列存储在磁盘中。
列存储解决的主要问题是数据查询问题。我们知道,平时的查询大部分都是条件查询,通常是返回某些字段(列)的数据。对于行存储数据,数据读取时通常将一行数据完全读出,如果只需要其中几列数据的情况,就会存在冗余列,出于缩短处理时间的考量,消除冗余列的过程通常是在内存中进行的。而列存储,每次读取的数据是集合的一段或者全部,不存在冗余性问题。这样,通过这种存储方式的调整,使得查询性能得到极大的提升。
面向文档数据库:
此类数据库可存放并获取文档,可以是XML、JSON、BSON等格式,这些文档具备可述性(self-describing),呈现分层的树状结构(hierarchical tree data structure),可以包含映射表、集合和纯量值。数据库中的文档彼此相似,但不必完全相同。文档数据库所存放的文档,就相当于键值数据库所存放的“值”。文档数据库可视为其值可查的键值数据库。
图形数据库:
图形数据库顾名思义,就是一种存储图形关系的数据库。图形数据库是NoSQL数据库的一种类型,它应用图形理论存储实体之间的关系信息。关系型数据用于存储明确关系的数据,但对于复杂关系的数据存储却有些力不从心。如图这种人物之间的关系,如果用关系型数据库则非常复杂,用图形数据库将非常简单。

图4 图形数据库示例
搜索引擎存储:
搜索引擎数据库是应用在搜索引擎领域的数据存储形式,由于搜索引擎会爬取大量的数据,并以特定的格式进行存储,这样在检索的时候才能保证性能最优。
不同类型数据库常用软件
关系型数据库:
关系型数据库最为经典的开源软件就是MySQL,它是最流行的开源关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。

SUN被甲骨文收购后,MySQL 的原创人员有拉出另外一个分支,命名MariaDB 。该数据库被维基百科,Facebook 甚至 Google 等技术巨头使用。 MariaDB 是一种可为 MySQL 提供插件替换功能的数据库服务器。开发人员的首要关注点是安全性,在每个版本发布时,开发人员还会合并所有 MySQL 的安全修补程序,并在需要时对其进行增强。
除此之外,还有很多开源的关系型数据库,比如经典的文件数据库SQLite和针对Web服务进行优化的CUBRID 等。
键值存储数据库:
键值数据库目前应用最多的应该是Redis,Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。Redis通常最为普通关系型数据库的缓存层,用于降低数据库的访问压力,提升系统性能。

列存储数据库:
列存储数据库中最为出名的恐怕就是HBase了,HBase是 BigTable 的开源 java 版本。是建立在 HDFS 之上,提供高可靠性、高性能、列存储、 可伸缩、实时读写 NoSQL 的数据库系统。
面向文档数据库:
文档数据库种类繁多,包括MongoDB、CouchDB、 Terrastore、RavenDB和OrientDB等多大十几个。其中MongoDB是目前最为流行的文档数据库,其介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。其最大的特点是分布式部署,可以随着负载的增大动态扩容,从而满足企业业务增长的需求。

图形数据库:
图形种类很多,比如Neo4J、ArangoDB、OrientDB、FlockDB、GraphDB、InfiniteGraph、Titan和Cayley等。其中Neo4j 是目前最流行的图形数据库,支持完整的事务,在属性图中,图是由顶点(Vertex),边(Edge)和属性(Property)组成的,顶点和边都可以设置属性,顶点也称作节点,边也称作关系,每个节点和关系都可以由一个或多个属性。Neo4j创建的图是用顶点和边构建一个有向图,其查询语言cypher已经成为事实上的标准。

搜索引擎存储:
搜索引擎数据库最近比较火的包括Solr和Elasticsearch等。Solr是Apache 的一个开源项目,基于业界大名鼎鼎的java开源搜索引擎Lucene。在过去的十年里,solr发展壮大,拥有广泛的用户群体。solr提供分布式索引、分片、副本集、负载均衡和自动故障转移和恢复功能。如果正确部署,良好管理,solr就能够成为一个高可靠、可扩展和高容错的搜索引擎。
Elasticsearch构建在Apache Lucene库之上,同是开源搜索引擎。Elasticsearch在Solr推出几年后才面世的,通过REST和schema-free的JSON文档提供分布式、多租户全文搜索引擎。并且官方提供Java,Groovy,PHP,Ruby,Perl,Python,.NET和Javascript客户端。目前Elasticsearch与Logstash和Kibana配合,部署成日志采集和分析,简称ELK,它们都是开源软件。最近新增了一个FileBeat,它是一个轻量级的日志收集处理工具(Agent),Filebeat占用资源少,适合于在各个服务器上搜集日志后传输给Logstash。
三、不同类型数据库的区别以及特点
MySQL和Redis的对比
1)从数据存储格式上:
例如学生信息:
张三 性别:男 年龄:23 籍贯:上海 手机:1234567890
mysql存储格式:
uid 姓名 sex age home phone
001 张三 男 23 上海 1234567890
Redis存储格式:
name001:zhangsan
sex001:男
age001:23
home001:上海
phone001:1234567890
2)从分类上
MySQL是关系型数据库,主要用于存放持久化数据,将数据存储在硬盘中,读取速度较慢。
Redis是NOSQL,即非关系型数据库,也是缓存数据库,即将数据存储在缓存中,缓存的读取速度快,能够大大的提高运行效率,但是保存时间有限。
3)从运行机制上
mysql作为持久化存储的关系型数据库,相对薄弱的地方在于每次请求访问数据库时,都存在着I/O操作,如果反复频繁的访问数据库。第一:会在反复链接数据库上花费大量时间,从而导致运行效率过慢;第二:反复的访问数据库也会导致数据库的负载过高,那么此时缓存的概念就衍生了出来。
缓存就是数据交换的缓冲区(cache),当浏览器执行请求时,首先会对在缓存中进行查找,如果存在,就获取;否则就访问数据库。缓存的好处就是读取速度快。
redis数据库就是一款缓存数据库,用于存储使用频繁的数据,这样减少访问数据库的次数,提高运行效率。
4)从存储介质上
mysql用于持久化的存储数据到硬盘,功能强大,但是速度较慢。
redis用于存储使用较为频繁的数据到缓存中,读取速度快。
5)需求上
MySQL和Redis因为需求的不同,一般都是配合使用。
Redis存储在内存中,如果存储在内存中,存储容量肯定要比磁盘少很多,那么要存储大量数据,只能花更多的钱去购买内存,造成在一些不需要高性能的地方是相对比较浪费的,所以目前基本都是MySQL(主) + Redis(辅),在需要性能的地方使用Redis,在不需要高性能的地方使用MySQL,好钢用在刀刃上。
MySQL支持sql查询,可以实现一些关联的查询以及统计.
Redis对内存要求比较高,在有限的条件下不能把所有数据都放在Redis.
MySQL偏向于存数据,Redis偏向于快速取数据,但Redis查询复杂的表关系时不如MySQL,所以可以把热门的数据放Redis,MySQL存基本数据。
MySQL与mongdb对比
MySQL与MongoDB都是开源的常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数据库,也叫文档型数据库,是一种NoSQL的数据库。它们各有各的优点,关键是看用在什么地方。所以我们所熟知的那些SQL语句就不适用于MongoDB了,因为SQL语句是关系型数据库的标准语言。
(一)关系型数据库-MySQL
1、在不同的引擎上有不同的存储方式。
2、查询语句是使用传统的sql语句,拥有较为成熟的体系,成熟度很高。
3、开源数据库的份额在不断增加,mysql的份额也在持续增长。
4、缺点就是在海量数据处理的时候效率会显著变慢。
(二)非关系型数据库-MongoDB
非关系型数据库(nosql ),属于文档型数据库。先解释一下文档的数据库,即可以存放xml、json、bson类型系的数据。这些数据具备自述性,呈现分层的树状数据结构。数据结构由键值(key=>value)对组成。
1、存储方式:虚拟内存+持久化。
2、查询语句:是独特的MongoDB的查询方式。
3、适合场景:事件的记录,内容管理或者博客平台等等。
4、架构特点:可以通过副本集,以及分片来实现高可用。
5、数据处理:数据是存储在硬盘上的,只不过需要经常读取的数据会被加载到内存中,将数据存储在物理内存中,从而达到高速读写。
6、成熟度与广泛度:新兴数据库,成熟度较低,Nosql数据库中最为接近关系型数据库,比较完善的DB之一,适用人群不断在增长。
(三)MongoDB优势与劣势
优势:
1、在适量级的内存的MongoDB的性能是非常迅速的,它将热数据存储在物理内存中,使得热数据的读写变得十分快。
2、MongoDB的高可用和集群架构拥有十分高的扩展性。
3、在副本集中,当主库遇到问题,无法继续提供服务的时候,副本集将选举一个新的主库继续提供服务。
4、MongoDB的Bson和JSon格式的数据十分适合文档格式的存储与查询。
劣势:
1、 不支持事务操作。MongoDB本身没有自带事务机制,若需要在MongoDB中实现事务机制,需通过一个额外的表,从逻辑上自行实现事务。
2、 应用经验少,由于NoSQL兴起时间短,应用经验相比关系型数据库较少。
3、MongoDB占用空间过大。
(四)对比
| 数据库 | MongoDB | MySQL |
|---|---|---|
| 数据库模型 | 非关系型 | 关系型 |
| 存储方式 | 以类JSON的文档的格式存储 | 不同引擎有不同的存储方式 |
| 查询语句 | MongoDB查询方式(类似JavaScript的函数) | SQL语句 |
| 数据处理方式 | 基于内存,将热数据存放在物理内存中,从而达到高速读写 | 不同引擎有自己的特点 |
| 成熟度 | 新兴数据库,成熟度较低 | 成熟度高 |
| 广泛度 | NoSQL数据库中,比较完善且开源,使用人数在不断增长 | 开源数据库,市场份额不断增长 |
| 事务性 | 仅支持单文档事务操作,弱一致性 | 支持事务操作 |
| 占用空间 | 占用空间大 | 占用空间小 |
| join操作 | MongoDB没有join | MySQL支持join |
(五)企业选型
关系型数据库适合存储结构化数据,如用户的帐号、地址:
1)这些数据通常需要做结构化查询,比如join,这时候,关系型数据库就要胜出一筹
2)这些数据的规模、增长的速度通常是可以预期的
3)事务性、一致性
NoSQL适合存储非结构化数据,如文章、评论:
1)这些数据通常用于模糊处理,如全文搜索、机器学习
2)这些数据是海量的,而且增长的速度是难以预期的,
3)根据数据的特点,NoSQL数据库通常具有无限(至少接近)伸缩性
4)按key获取数据效率很高,但是对join或其他结构化查询的支持就比较差
四、DBA介绍
数据库管理员(Database Administrator,简称DBA),是从事管理和维护数据库管理系统(DBMS)的相关工作人员的统称,属于运维工程师的一个分支,主要负责业务数据库从设计、测试到部署交付的全生命周期管理。
DBA的核心目标是保证数据库管理系统的稳定性、安全性、完整性和高性能。
主要职责
据库管理员的主要职责有以下几个方面:
1.设计:
数据库设计,包括字段、表和关键字段;资源在辅助存储设备上是怎样使用的,怎样增加和删除文件及记录,以及怎样发现和补救损失。
2.监控
监控数据库的警告日志,定期做备份删除。
3.备份
对数据库的备份监控和管理数据库的备份至关重要,对数据库的备份策略要根据实际要求进行更改,数据的日常备份情况进行监控。
4.SQL语句
对SQL语句的书写规范的要求一个SQL语句,如果写得不理想,对数据库的影响是很大的。所以,每一个程序员或相应的工作人员在写相应的SQL语句时,应该严格按照《SQL书写规范》一文,最后要有DBA检查才可以正式运行。
5.最终用户服务和协调
数据库管理员规定用户访问权限和为不同用户组分配资源。如果不同用户之间互相抵触,数据库管理员应该能够协调用户以最优化安排。
6.数据库安全
数据库管理员能够为不同的数据库管理系统用户规定不同的访问权限,以保护数据库不被未经授权的访问和破坏。例如,允许一类用户只能检索数据,而另一类用户可能拥有更新数据和删除记录的权限。
五、数据库部署安装
数据库官网下载地址 https://downloads.mysql.com/archives/community/




1.源码安装数据库(自定义目录安装)
1)上传或下载代码包
[root@db01 ~]# rz mysql-5.6.46.tar.gz
2)安装依赖
[root@db01 ~]# yum install -y ncurses-devel libaio-devel gcc gcc-c++ glibc cmake autoconf openssl openssl-devel
3)解压
[root@db01 ~]# tar xf mysql-5.6.46.tar.gz
4)创建目录
[root@db01 ~]# mkdir /service
5)生成cmake
[root@db01 ~]# cd mysql-5.6.46/
[root@db01 ~]# cmake . -DCMAKE_INSTALL_PREFIX=/service/mysql-5.6.46 \
-DMYSQL_DATADIR=/service/mysql-5.6.46/data \
-DMYSQL_UNIX_ADDR=/service/mysql-5.6.46/tmp/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \
-DWITH_ZLIB=bundled \
-DWITH_SSL=system \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_EMBEDDED_SERVER=1 \
-DENABLE_DOWNLOADS=1 \
-DWITH_DEBUG=0
#程序存放位置
cmake . -DCMAKE_INSTALL_PREFIX=/service/mysql-5.6.46 \
#数据存放位置
-DMYSQL_DATADIR=/service/mysql-5.6.46/data \
#socket文件存放位置
-DMYSQL_UNIX_ADDR=/service/mysql-5.6.46/tmp/mysql.sock \
#使用utf8字符集
-DDEFAULT_CHARSET=utf8 \
#校验规则
-DDEFAULT_COLLATION=utf8_general_ci \
#使用其他额外的字符集
-DWITH_EXTRA_CHARSETS=all \
#支持的存储引擎
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
#禁用的存储引擎
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \
#启用zlib库支持(zib、gzib相关)
-DWITH_ZLIB=bundled \
#启用SSL库支持(安全套接层)
-DWITH_SSL=bundled \
#启用本地数据导入支持
-DENABLED_LOCAL_INFILE=1 \
#编译嵌入式服务器支持
-DWITH_EMBEDDED_SERVER=1 \
# mysql5.6支持了google的c++mock框架了,允许下载,否则会安装报错。
-DENABLE_DOWNLOADS=1 \
#禁用debug(默认为禁用)
-DWITH_DEBUG=0
#编译
5)编译 make
[root@db01 mysql-5.6.46]# make
6)安装 make install
[root@db01 mysql-5.6.46]# make install
7)做软连接
[root@db01 ~]# ln -s /service/mysql-5.6.46 /service/mysql
8)创建数据库用户
[root@db01 ~]# useradd mysql -s /sbin/nologin -M
9)拷贝配置文件和启动文件
#1.进入配置文件和脚本的目录
[root@db01 ~]# cd /service/mysql/support-files/
#2.拷贝配置文件
[root@db01 support-files]# cp my-default.cnf /etc/my.cnf
10)配置system管理MySQL服务
#1.配置system管理MySQL
[root@db01 ~]# vim /usr/lib/systemd/system/mysql.service
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=https://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/service/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE = 5000
#2.重新加载启动文件列表
[root@db01 ~]# systemctl daemon-reload
11)初始化数据库
#1.进入初始化目录
[root@db01 support-files]# cd /service/mysql/scripts/
#2.执行初始化命令
[root@db01 scripts]# ./mysql_install_db --user=mysql --basedir=/service/mysql --datadir=/service/mysql/data
12)创建socket文件目录(二进制安装没有)
#先创建tmp目录
[root@db01 ~]# mkdir /service/mysql/tmp
13)授权数据库目录
[root@db01 ~]# chown -R mysql.mysql /service/mysql
[root@db01 ~]# chown -R mysql.mysql /service/mysql-5.6.46
14)system管理启动MySQL
[root@db01 ~]# systemctl start mysql
[root@db01 ~]# ps -ef | grep [m]ysql
mysql 23509 1 3 22:36 ? 00:00:01 /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
[root@db01 ~]# netstat -lntp | grep 3306
tcp6 0 0 :::3306 :::* LISTEN 23509/mysqld
15)配置环境变量直接使用mysql
[root@db01 ~]# vim /etc/profile.d/mysql.sh
export PATH=/service/mysql/bin:$PATH
[root@db01 ~]# source /etc/profile
16)修改root用户密码
[root@db01 ~]# mysql -u root -p #默认root用户密码为空,有多种方式重置root密码
第一种:
MySQL > SET PASSWORD=PASSWORD('123456');
Query OK, 0 rows affected (0.00 sec)
第二种:
MySQL > grant all privileges on *.* to root@'%' identified by 'oldboy';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
注意:两种重置密码方式有区别。
第三种:
[root@localhost ~]# mysqladmin -u root -p旧密码 password 新密码
17)忘记mysql密码
[root@localhost ~]# systemctl stop mariadb.service
[root@localhost ~]# vim /etc/my.cnf
[mysqld]
skip-grant-tables #在mysqld组加入此句
[root@localhost ~]# systemctl start mariadb.service #重启mysql服务
[root@localhost ~]# mysql
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 5.5.68-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)]>
#修改为新的密码
MariaDB [(none)]> update mysql.user set password=password("123") where user='root' and host='localhost';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> exit
Bye
#然后修改回原来的配置文件
[mysqld]
[root@localhost ~]# vim /etc/my.cnf
#skip-grant-tables
[root@localhost ~]# systemctl restart mariadb.service
#使用新密码登陆
[root@localhost ~]# mysql -u root -p123
备注:可以讲密码写入配置文件
[root@localhost ~]# cat /etc/my.cnf
[mysql]
user=root
password='123'
[mysqld_safe]
#更改客户端配置,不需要重启服务
#此时不需要输入密码即可登陆,不推荐
18)修改字符集
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
[mysql]
default-character-set=utf8mb4
[client]
default-character-set=utf8mb4
#备注:mysql在client里面,但客户端不仅仅只有mysql
[root@localhost ~]# systemctl restart mariadb.service
MariaDB [(none)]> show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
19)清空表
清空表不要这么做
delete from db1.t1;
用下面的
truncate dbl.t1;
2.二进制安装(自定义安装目录)

1)上传二进制包
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.6.46-linux-glibc2.12-x86_64.tar.gz
[root@db01 ~]# rz mysql-5.6.46-linux-glibc2.12-x86_64.tar.gz
2)安装依赖
[root@db01 ~]# yum install -y ncurses-devel libaio-devel gcc gcc-c++ glibc cmake autoconf
3)解压安装包
[root@db01 ~]# tar xf mysql-5.6.46-linux-glibc2.12-x86_64.tar.gz
4)创建自定义目录
[root@db01 ~]# mkdir /service
5)移动目录并改名
[root@db01 ~]# mv mysql-5.6.46-linux-glibc2.12-x86_64 /service/mysql-5.6.46
6)做软连接
[root@db01 ~]# ln -s /service/mysql-5.6.46 /service/mysql
7)创建数据库用户
[root@db01 ~]# useradd mysql -s /sbin/nologin -M
8)拷贝配置文件和启动文件
#1.进入配置文件和脚本的目录
[root@db01 ~]# cd /service/mysql/support-files/
#2.拷贝配置文件
[root@db01 support-files]# cp my-default.cnf /etc/my.cnf
cp: overwrite ‘/etc/my.cnf’? y
#3.拷贝启动脚本
[root@db01 support-files]# cp mysql.server /etc/init.d/mysqld
9)初始化数据库
#1.进入初始化目录
[root@db01 support-files]# cd /service/mysql/scripts/
#2.执行初始化命令
[root@db01 scripts]# ./mysql_install_db --user=mysql --basedir=/service/mysql --datadir=/service/mysql/data
10)启动数据库
[root@db01 scripts]# /etc/init.d/mysqld start
/etc/init.d/mysqld: line 244: my_print_defaults: command not found
/etc/init.d/mysqld: line 264: cd: /usr/local/mysql: No such file or directory
Starting MySQL ERROR! Couldn't find MySQL server (/usr/local/mysql/bin/mysqld_safe)
11)如果是二进制安装到自定义目录下需要修改脚本目录
[root@db01 scripts]# sed -i 's#/usr/local#/service#g' /etc/init.d/mysqld /service/mysql/bin/mysqld_safe
12)授权数据库目录
[root@db01 ~]# chown -R mysql.mysql /service/mysql
[root@db01 ~]# chown -R mysql.mysql /service/mysql-5.6.46
13)再次启动
[root@db01 scripts]# /etc/init.d/mysqld start
Starting MySQL.Logging to '/service/mysql/data/db04.err'.
SUCCESS!
[root@db01 scripts]#
14)检查进程和端口
[root@db01 scripts]# ps -ef | grep [m]ysql
root 23083 1 0 20:36 pts/0 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/usr/local/mysql/data --pid-file=/usr/local/mysql/data/db02.pid
mysql 23191 23083 0 20:36 pts/0 00:00:00 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=db02.err --pid-file=/usr/local/mysql/data/db02.pid
[root@db01 scripts]# netstat -lntp | grep 3306
tcp6 0 0 :::3306 :::* LISTEN 23191/mysqld
[root@db01 scripts]#
15)配置system管理MySQL服务
#1.配置system管理MySQL
[root@db01 ~]# vim /usr/lib/systemd/system/mysql.service
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=https://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/service/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE = 5000
#2.重新加载启动文件列表
[root@db01 ~]# systemctl daemon-reload
16)system管理启动mysql
#1.system管理启动MySQL
[root@db01 ~]# systemctl start mysql
[root@db01 ~]# ps -ef | grep [m]ysql
#一定是启动失败的,因为不只有启动脚本里面指定了/usr/local,很多都有
[root@db01 scripts]# grep -r '/usr/local' /service/mysql/*
#怎么办?一个一个修改吗?
17)查看MySQL配置文件检索顺序
[root@db01 mysql]# /service/mysql/bin/mysql --help|grep 'my.cnf'
order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf
18)配置my.cnf
#1.配置指定数据库安装目录与数据目录
[root@db01 scripts]# vim /etc/my.cnf
[mysqld]
basedir=/service/mysql
datadir=/service/mysql/data
#2.再次启动
[root@db01 scripts]# systemctl start mysql
#3.一定成功
19)配置环境变量直接使用mysql
[root@db01 ~]# vim /etc/profile.d/mysql.sh
export PATH=/service/mysql/bin:$PATH
[root@db01 ~]# source /etc/profile
3.YUM安装
1)配置MySQL的yum源
[root@db01 ~]# cat /etc/yum.repos.d/mysql-community.repo
# Enable to use MySQL 5.6
[mysql56-community]
name=MySQL 5.6 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.6-community/el/6/$basearch/
enabled=1
gpgcheck=0
2)检查存储库是否正确配置
[root@db01 ~]# yum repolist enabled | grep mysql
3)禁用默认的MySQL模块
[root@db01 ~]# sudo yum module disable mysql
4)安装MySQL
[root@db01 ~]# sudo yum install mysql-community-server
5)启动MySQL
[root@db01 ~]# sudo service mysqld start
Starting mysqld (via systemctl): [ OK ]
6)检查MySQL运行状态
[root@db01 ~]# sudo service mysqld status
7)保护运行MySQL
[root@db01 ~]# mysql_secure_installation
六、mysql体系结构管理
1.客户端与服务器模型
1)mysql是一个典型的C/S服务结构
1.mysql自带的客户端程序(/service/mysql/bin)
mysql
mysqladmin
mysqldump
2.mysqld一个二进制程序,后台的守护进程
单进程
多线程
2)MySQL的两种连接方式
1.TCP/IP的连接方式
2.套接字连接方式,socket连接
#查看连接方式
mysql> status;
--------------
Connection: Localhost via UNIX socket
3.举例:
3.1.TCP/IP连接
mysql -uroot -p -h127.0.0.1
mysql -uroot -p -h127.0.0.1 -S /tmp/mysql.sock
3.2.socket连接
mysql -uroot -p -hlocalhost
mysql -uroot -p123(默认连接方式,socket)
4.注意:
4.1.因为使用TCP/IP连接,需要建立三次握手
4.2.不一定-h都是tcp,-hlocalhost是socket连接
七、mysql服务构成
1.实例
1.MySQL的后台进程+线程+预分配的内存结构。
2.MySQL在启动的过程中会启动后台守护进程,并生成工作线程,预分配内存结构供MySQL处理数据使用。
1.什么是实例?
一个进程 + 多个线程 + 预分配内存空间
2.多实例?
多个进程 + 多个线程 + 多个预分配的内存空间
2.mysqld服务器程序构成
mysqld是一个守护进程但是本身不能自主启动
[root@db04 ~]# /etc/init.d/mysqld start
1)连接层
1.验证用户的合法性
2.提供两种连接方式(TCP/IP socket)
3.建立一个与SQL层交互的线程
2)sql层
1.接收连接层传来的SQL语句
2.验证语法
3.验证语义(DML,DDL,DCL,DQL) 检查你输入的SQL语句是 select insert update delete... grant
4.解析器:解析你的SQL语句,生成多种执行计划
5.优化器:接收解析器传来的多种执行计划,选择最优的一种
6.执行器:将优化器选择出的最优的SQL,执行
6.1 建立一个与存储引擎层 交互的线程
6.2 将执行语句交给存储引擎层,取数据 接收存储引擎层,结构化成表的数据结果
7.如果你的前端有缓存,写缓存
8.记录日志(binlog)
3)存储引擎层
1.接收到SQL层传来的SQL语句
2.与磁盘交互,取数据,结构化成表的形式,返回给SQL层
3.建立一个与SQL层交互的线程
八、mysql相关命令
1.启动数据库
/etc/init.d/mysqld start ------> mysql.server ------> mysqld_safe ------> mysqld
systemctl start mysql ------> mysqld_safe ------> mysqld
mysqld_safe --defaults-file=/etc/my.cnf ------> mysqld_safe ------> mysqld
2.停止数据库
/etc/init.d/mysqld stop
systemctl stop mysqld
mysqladmin -uroot -p123 shutdown
#不建议使用
kill -9 pid
killall mysqld
pkill mysqld
#出现问题:
1.如果在业务繁忙的情况下,数据库不会释放pid和sock文件
2.号称可以达到和Oracle一样的安全性,但是并不能100%达到
3.在业务繁忙的情况下,丢数据(补救措施,高可用)
3、设置密码
1.mysqladmin -uroot -p123 password '1'
2.update mysql.user set password=password('123') where user='root' and host='localhost';
3.set password=password('1'); 修改当前用户的密码
4.grant all on *.* to 'root'@'localhost' identified by '123';
九、mysql连接管理
1、mysql自带的连接命令 mysql
mysql
#常见的特定于客户机的连接选项:
-u: 指定用户 mysql -uroot
-p: 指定密码 mysql -uroot -p567
-h: 指定主机域 mysql -uroot -p567 -h127.0.0.1
-P: 指定端口 mysql -uroot -p567 -h127.0.0.1 -P3307
-S: 指定socket文件 mysql -uroot -p567 -S /tmp/mysql.sock
-e: 指定SQL语句(库外执行SQL语句) mysql -uroot -p567 -e "show databases;"
#--protocol: 指定连接方式 mysql --protocol=TCP --protocol=socket
2、第三方的连接工具
1.sqlyog
2.navicat
#注意:数据库是没有外网的,想连接可以使用通道
3.heidisql
4.应用程序连接MySQL
#注意:需要加载对应语言程序的API
十、mysql多实例部署
NGINX多实例就是多个配置文件
mysql多实例:
1.多个数据目录
2.多个端口
3.多个socket文件
4.多个日志文件
1.创建多个数据目录
[root@db01 ~]# mkdir /data/{3307,3308,3309} -p
[root@db01 scripts]# chown -R mysql.mysql /data
2.准备多个配置文件
[root@db01 data]# vim /data/3307/my.cnf
[mysqld]
basedir=/service/mysql
datadir=/data/3307/data
port=3307
socket=/data/3307/mysql.sock
log-error=/data/3307/data/mysql.err
log-bin=/data/3307/data/mysql-bin
server_id=7
-------------------------------------------
[root@db01 data]# vim /data/3308/my.cnf
[mysqld]
basedir=/service/mysql
datadir=/data/3308/data
port=3308
socket=/data/3308/mysql.sock
log-error=/data/3308/data/mysql.err
log-bin=/data/3308/data/mysql-bin
server_id=8
--------------------------------------------
[root@db01 data]# vim /data/3309/my.cnf
[mysqld]
basedir=/service/mysql
datadir=/data/3309/data
port=3309
socket=/data/3309/mysql.sock
log-error=/data/3309/data/mysql.err
log-bin=/data/3309/data/mysql-bin
server_id=9
3.初始化多套数据目录
[root@db01 scripts]# ./mysql_install_db --defaults-file=/data/3307/my.cnf --user=mysql --basedir=/service/mysql --datadir=/data/3307/data
[root@db01 scripts]# ./mysql_install_db --defaults-file=/data/3308/my.cnf --user=mysql --basedir=/service/mysql --datadir=/data/3308/data
[root@db01 scripts]# ./mysql_install_db --defaults-file=/data/3309/my.cnf --user=mysql --basedir=/service/mysql --datadir=/data/3309/data
#使用tree可以查看
[root@db01 scripts]# tree -L 3 /data
4.授权目录
[root@db01 scripts]# chown -R mysql.mysql /data
5.启动数据库
[root@db01 scripts]# mysqld_safe --defaults-file=/data/3307/my.cnf &
[root@db01 scripts]# mysqld_safe --defaults-file=/data/3308/my.cnf &
[root@db01 scripts]# mysqld_safe --defaults-file=/data/3309/my.cnf &
6.检查启动
[root@db01 scripts]# netstat -lntup|grep 330
tcp6 0 0 :::3307 :::* LISTEN 25550/mysqld
tcp6 0 0 :::3308 :::* LISTEN 25722/mysqld
tcp6 0 0 :::3309 :::* LISTEN 25894/mysqld
7.多实例设置密码
[root@db01 scripts]# mysqladmin -uroot -S /data/3307/mysql.sock password '3307'
[root@db01 scripts]# mysqladmin -uroot -S /data/3308/mysql.sock password '3308'
[root@db01 scripts]# mysqladmin -uroot -S /data/3309/mysql.sock password '3309'
8.多实例验证
[root@db01 scripts]# mysql -uroot -p3307 -S /data/3307/mysql.sock -e "show variables like 'server_id';"
Warning: Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 7 |
+---------------+-------+
[root@db01 scripts]# mysql -uroot -p3308 -S /data/3308/mysql.sock -e "show variables like 'server_id';"
Warning: Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 8 |
+---------------+-------+
[root@db01 scripts]# mysql -uroot -p3309 -S /data/3309/mysql.sock -e "show variables like 'server_id';"
Warning: Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 9 |
+---------------+-------+
9.连接多实例小技巧
[root@db01 scripts]# vim /usr/bin/mysql3309
mysql -uroot -p3309 -S /data/3309/mysql.sock
[root@db01 scripts]# vim /usr/bin/mysql3308
mysql -uroot -p3308 -S /data/3308/mysql.sock
[root@db01 scripts]# vim /usr/bin/mysql3307
mysql -uroot -p3307 -S /data/3307/mysql.sock
[root@db01 scripts]# chmod +x /usr/bin/mysql*
[root@mysql tmp]# mysql3307
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
连接方式
mysql -u root -p123 -h 127.0.0.1 -P 3307
or
mysql -uroot -p123 -S /data/3307/mysql.sock
f

浙公网安备 33010602011771号