01.1.什么是数据库?
数据库(Database)
是按照数据结构来组织、存储和管理数据的仓库,每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据。我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。所以,现在我们使用关系型数据库管理系统(RDBMS)
来存储和管理的大数据量。所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。我们简单形象的理解,比如我们人类这个大社会,我们的身份证,户口簿等等都和数据库有关。
RDBMS即关系数据库管理系统(Relational Database Management System)的特点:
-
1.数据以表格的形式出现
-
2.每行为各种记录名称
-
3.每列为记录名称所对应的数据域
-
4.许多的行和列组成一张表单
-
5.若干的表单组成database
产生发展
数据库产生于60多年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不再仅仅是存储和管理数据,而转变成用户所需要的各种数据管理的方式。数据库有很多种类型,从最简单的存储有各种数据的表格到能够进行海量数据存储的大型数据库系统都在各个方面得到了广泛的应用
01.2.数据库的分类
数据库通常分为层次式数据库
、网络式数据库
和关系式数据库
三种。而不同的数据库是按不同的数据结构来联系和组织的。而在当今的互联网中,最常见的数据库模型主要是两种,即关系型数据库
和非关系型数据库<NOSQL>
。
01.2.1.关系型数据库介绍
-
1)、关系型数据库的由来
虽然网状数据库和层次数据库已经很好的解决了数据的集中和共享问题,但是在数据库独立性和抽象级别上扔有很大欠缺。用户在对这两种数据库进行存取时,仍然需要明确数据的存储结构,指出存取路径。而关系型数据库就可以较好的解决这些问题。
-
2)、关系型数据库介绍
关系型数据库模型是把复杂的数据结构归结为简单的二元关系(即二维表格形式)。在关系型数据库中,对数据的操作几乎全部建立在一个或多个关系表格上,通过对这些关联的表格分类、合并、连接或选取等运算来实现数据库的管理。关系型数据库诞生40多年了,从理论产生发展到现实产品,例如:Oracle和MySQL,Oracle在数据库领域上升到霸主地位,形成每年高达数百亿美元的庞大产业市场。
-
3)、关系型数据库表格之间的关系举例
学生信息,图书信息
01.2.2.非关系型数据库介绍
-
1)、非关系型数据库诞生背景
NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库在特定的场景下可以发挥出难以想象的高效率和高性能,它是作为对传统关系型数据库的一个有效的补充。NoSQL(NoSQL = Not Only SQL )
,意即“不仅仅是SQL”
,是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。NoSQL的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。
-
2)、非关系型数据库种类
1)键值存储数据库(key-value)
键值数据库就类似传统语言中使用的哈希表。可以通过key来添加、查询或者删除数据库,因为使用key主键访问,所以会获得很高的性能及扩展性。
键值数据库主要使用一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。Key/value模型对于IT系统来说的优势在于简单、易部署、高并发。
典型产品:
Memcached
、Redis
、MemcacheDB
2)列存储(Column-oriented)数据库
列存储数据库将数据存储在列族中,一个列族存储经常被一起查询的相关数据,比如人类,我们经常会查询某个人的姓名和年龄,而不是薪资。这种情况下姓名和年龄会被放到一个列族中,薪资会被放到另一个列族中。这种数据库通常用来应对分布式存储海量数据。
典型产品:
Cassandra
、HBase
3)面向文档(Document-Oriented)数据库
文档型数据库的灵感是来自于Lotus Notes办公软件,而且它同第一种键值数据库类似。该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如JSON。文档型数据库可以看作是键值数据库的升级版,允许之间嵌套键值。而且文档型数据库比键值数据库的查询效率更高。
面向文档数据库会将数据以文档形式存储。每个文档都是自包含的数据单元,是一系列数据项的集合。每个数据项都有一个名词与对应值,值既可以是简单的数据类型,如字符串、数字和日期等;也可以是复杂的类型,如有序列表和关联对象。数据存储的最小单位是文档,同一个表中存储的文档属性可以是不同的,数据可以使用XML、JSON或JSONB等多种形式存储。
典型产品:
MongoDB
、CouchDB
4)图形数据库
图形数据库允许我们将数据以图的方式存储。实体会被作为顶点,而实体之间的关系则会被作为边。比如我们有三个实体,Steve Jobs、Apple和Next,则会有两个“Founded by”的边将Apple和Next连接到Steve Jobs。
典型产品:
Neo4J
、InforGrid
01.3.RDBMS 术语
在我们开始学习MySQL 数据库前,让我们先了解下RDBMS的一些术语:
-
数据库
: 数据库是一些关联表的集合。 -
数据表
: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。 -
列
: 一列(数据元素) 包含了相同的数据, 例如邮政编码的数据。 -
行
:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。 -
冗余
:存储两倍数据,冗余降低了性能,但提高了数据的安全性。 -
主键
:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。 -
外键
:外键用于关联两个表。 -
复合键
:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。 -
索引
:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
01.4.MySQL数据库
MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
-
MySQL 是开源的
,所以你不需要支付额外的费用。 -
MySQL 支持大型的数据库
。可以处理拥有上千万条记录的大型数据库。 -
MySQL 使用标准的SQL数据语言形式
。 -
MySQL 可以运行于多个系统上
,并且支持多种语言。这些编程语言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等。 -
MySQL 支持大型数据库
,支持5000万条记录的数据仓库,32位系统表文件最大可支持4GB,64位系统支持最大的表文件为8TB。 -
MySQL 是可以定制的
,采用了GPL协议,你可以修改源码来开发自己的 MySQL 系统。
01.5.YUM安装数据库
MySQL Yum仓库提供了用于在Linux平台上安装MySQL服务器,客户端和其他组件的RPM包。mysql-yum安装下载地址
注意使用MySQL Yum仓库时,默认选择
安装最新的MySQL版本
。如果需要使用低版本请按如下操作。
1.安装MySQL仓库源
[root@mysql-01 ~]# rpm -ivh https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm
2.选择并启用适合当前平台的发行包
//列出所有MySQL发行版仓库 [root@mysql-01 ~]# yum repolist all|grep mysql //禁用8.0发行版仓库, 启用5.7发行版仓库 [root@mysql-01 ~]# yum install yum-utils [root@mysql-01 ~]# yum-config-manager --disable mysql80-community [root@mysql-01 ~]# yum-config-manager --enable mysql57-community
注意可以手动编辑
/etc/yum.repos.d/mysql-community.repo
文件配置仓库
[mysql57-community] name=MySQL 5.7 Community Server baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/ enabled=1 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
3.通过以下命令安装MySQL, 并启动MySQL
[root@mysql-01 ~]# yum install -y mysql-community-server [root@mysql-01 ~]# systemctl start mysqld [root@mysql-01 ~]# systemctl enable mysqld
MySQL服务器初始化(`仅适用于MySQL 5.7)在服务器初始启动时,如果服务器的数据目录为空,则会发生以下情况:
-
服务器已初始化。
-
在数据目录中生成SSL证书和密钥文件。
-
validate_password插件
安装并启用。 -
超级用户帐户
'root'@'localhost'
已创建。
超级用户的密码被设置并存储在错误日志文件中。要显示它,请使用以下命令:
[root@mysql-01 ~]# grep "password" /var/log/mysqld.log 2018-07-23T17:21:12.151266Z 1 [Note] A temporary password is generated for root@localhost: <Dera:Dm)7Du
通过使用生成的临时密码登录并尽快更改root密码并为超级用户帐户设置自定义密码
[root@mysql-01 ~]# mysql -uroot -p'<Dera:Dm)7Du' mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Zhang789@51cto'; mysql> GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY "Zhang789@51cto"; mysql> flush privileges;
注意MySQL的validate_password
插件默认安装。将要求密码至少包含大写
、小写
、数字
、特殊字符
、并且总密码长度至少为8个字符
。
01.6.变更数据库密码
1.更改root密码
//第一种方式, 需要知道密码 [root@mysql-01 ~]# mysqladmin -uroot -pZhang789@51cto password '[email protected]' Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety. [root@mysql-01 ~]# mysql -uroot [email protected] mysql> //第二种方式, 登录MySQL, 修改相应表 mysql> update mysql.user set authentication_string=password('Zhang789@51cto') where user='root'; mysql> flush privileges; [root@mysql-01 ~]# mysql -uroot -pZhang789@51cto #登录测试 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 5 Server version: 5.7.22 MySQL Community Server (GPL) Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
2.忘记mysql root密码
[root@mysql-01 ~]# vim /etc/my.cnf [mysqld] skip-grant-tables # 新增跳过授权表 //重启数据库生效 [root@mysql-01 ~]# systemctl restart mysqld //查看表字段 mysql> select user,host,authentication_string from mysql.user; +---------------+-----------+-------------------------------------------+ | user | host | authentication_string | +---------------+-----------+-------------------------------------------+ | root | localhost | *818A16A5F7EC2B360571B69513BF73FA7FFA3E55 | | mysql.session | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | | mysql.sys | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | | root | % | *818A16A5F7EC2B360571B69513BF73FA7FFA3E55 | +---------------+-----------+-------------------------------------------+ 3 rows in set (0.00 sec) //5.7.6版本后更新密码方式 mysql> update mysql.user set authentication_string=password('[email protected]') where user='root'; mysql> exit //5.7.6版本前更新密码方式 mysql> update mysql.user set password=password('[email protected]') where user="root" and host="localhost"; [root@mysql-01 ~]# vim /etc/my.cnf [mysqld] #skip-grant-tables #注释 //重启数据库生效 [root@mysql-01 ~]# systemctl restart mysqld //使用新密码登录数据库 [root@mysql-01 ~]# mysql -uroot [email protected] mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.7.22 MySQL Community Server (GPL) Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>