文章目录
- 选型之初:NoSQL VS SQL
- 选型确认:各种数据库存储系统的使用场景
- 关系数据库的特点
- 关系型数据库的适用场景
- 非关系数据库的特点
- 非关系型数据库的适用场景
- 关系数据库选型原则
- 数据库使用的广泛性
- MySQL数据库的可扩展性
- MySQL数据库的安全性和稳定性
- MySQL所支持的系统
- MySQL的使用成本
- 选型之终:构建MySQL开发环境
- 部署CentOS虚拟机
- 准备虚拟服务器
- 安装MySQL服务
- 启动MySQL
- 配置my.cnf
- 初始化MySQL
- 启动MySQL
- 查看初始化的用户名密码
- 登录MySQL
开发人员具备的SQL知识,至少是下图:
选型之初:NoSQL VS SQL
SQL指的是使用SQL语言来对数据库中数据进行操作的数据库系统,通常所指的是关系型数据库系统,如我们常见的:
- MySQL
- Oracle
- SQLServer
- PostGreSQL
NoSQL指的是不用用SQL语言对数据库操作数据的系统,NoSQL的含义是“No Only SQL”——不仅仅有SQL的意思,但是这类系统大多数并不是使用SQL语言来操作数据库的,并且这类系统通常都是非关系型数据库,如:
- HBase
- MongoDB
- Redis
- Hadoop
近几年,NoSQL大行其道,并且有一种说法,NoSQL最终将会替代SQL数据库,成为数据存储的主力。不过,从目前来说两者的使用情况,SQL类系统还是处于绝对的霸主地位。
选型确认:各种数据库存储系统的使用场景
这两种数据库都有自身的特点,我们使用它们用于不同的场景
关系数据库的特点
- 数据结构化存储在二维表中
数据是按照一定的结构来进行存储的,也就是说在存储数据之前,先定好数据存储的结构。存储在表中的数据都具有相同的列属性,表的定义都是标准的二维表
姓名 | 性别 | 生日 | 注册时间 |
张三 | 男 | 1980-1-28 | 2018-12-12 |
李四 | 男 | 1991-2-3 | 2018-11-21 |
王二 | 男 | 1998-3-6 | 2018-05-08 |
值得注意的是,现在很多关系型数据库都支持一种列属性——JSON,在JSON列中可以存储非结构化的数据,这就是关系型数据库也有了一些非关系型数据库的特点,可以存储非关系型数据。但是,这也仅限使用JSON类型的这种列,从整体上来看,关系型数据库存储还是这种结构化的
- 支持事务的原子性A,一致性C,隔离性I,持久性D特性
- 支持使用SQL语言对存储在其中的数据进行操作
关系型数据库的适用场景
- 数据之间存在一定关系,需要关联查询数据的场景
什么是数据库数据之间的关系呢?
举个例子:订单和订单商品之间存在什么样的关系——一个订单可以包含多个商品,而某一个订单中的商品只能属于某个订单。
再举个例子:一个博客只能属于一个博主,一个博主可以有多个博客,这就是博主的博客和博主的关系 - 需要事务支持的业务场景
比如在金融类、电商类的数据库中,我们谁也不希望自己账号中的钱某明奇妙的减少,因此一定要使用关系型数据库 - 需要使用SQL语言灵活操作数据的场景
非关系数据库的特点
- 存储结构灵活,没有固定的结构
以mongodb为例,它就是以json格式来存储数据,可以使用非结构来存储数据,也就是说每一行可以存储不同的列,像下面的例子:
{"姓名":"张三","性别":"男","出生日期":"1980-01-28","注册时间":"2018-12-12"}
{"姓名":"李四","性别":"男"}
{"姓名":"王二","性别":"男","电话":"13800000001"}
我们可以看到张三、李四、王二这几个人可以具有不同的属性,这相对于关系型数据库系统来说,要灵活的多,不用一开始就把数据结构固定下来。但是,也又一些问题,就是每一行都要列数据之外还要包括我们的列名,所以如果不考虑压缩的情况下,从数据空间占用来说,存储相同的数据非关系型数据库占用更多的空间。
- 对事务的支持比较弱,但对数据的并发处理性能高
由于非关系数据库大都不支持事务的所有特性的,所以读写效率上通常要比关系型数据库高 - 大多不是使用SQL语言来进行操作数据
比如,mongodb使用JavaScript来操作数据的,而hadoop则使用MapReduce来处理数据
非关系型数据库的适用场景
- 数据结构不固定的场景
比如要存储产品的属性数据,由于每类产品存储的数据都是不完全相同的,有些产品可能具有产地呀、重量呀、长宽呀这些属性,而有的产品可能会有诸如颜色呀、味道呀这些属性,所以比较适合使用mongodb这样的数据库来进行存储 - 对事务要求不高,但读写并发比较大的场景
对事务要求不是十分严格的这种应用场景,如果这种场景下读写并发也非常大,那就更加适合使用这种非关系型数据库了,比如用户行为分析的应用。这类应用的特点是对数据的完整性要求不高,我们偶尔丢失一些数据也并不会对用户的整个行为带来太大的影响,同时在用户的操作行为比较频繁的情况下,数据量并发量比较大,这就显然不适合使用关系型数据库来进行存储了 - 对数据的操作比较简单的场景
由于非关系型数据库大都是不支持SQL语言的,所以无法做到对数据的灵活处理,比较适合用在对数据处理比较简单的情况下。
关系数据库选型原则
- 数据库使用的广泛性
因为只有被使用的广泛了,当出现问题的时候,我们才能更容易的找到足够的资料来处理,其实就跟我们买车一样,只有一款车有足够的市场占有率,那我们修车的时候才能够容易的找到修车的地方。而另一方面,如果这个数据库系统被使用的多,说明这个系统稳定性、性能呢已经被大家所认可 - 数据库的可扩展性
数据库在系统中,是一个非常关键的部分,数据库的性能,也决定了整个应用的性能,所以一个数据库是否有足够的稳定性和可扩展性就显得很重要了 - 数据库的安全性和稳定性
数据呢是我们企业的重要的资产,我们保留在数据库中,并不希望我们的数据可以随意的被人获取,所以是否能够有效的来保证使用中数据的安全就成为了一个选择数据库系统的重要的条件 - 数据库所支持的系统
数据库是否能够支持我们使用的操作系统的版本,因为毕竟一些操作系统是收费的,有些是免费的,如果我们并不想支付这种大量的软件费用,那么我们可能只能选择那种免费的,像linux系统下的数据库系统 - 数据库的使用成本
数据库是否可以免费使用,是否可以找到数据库熟悉的运维和开发人员,也就是我们在选择一款软件系统时,所必须考虑的一个因素。
如果一个系统本身是免费的,但市场上很难找到相关的运维和开发人员,那么它的使用成本就会相当的高
数据库使用的广泛性
我们可以使用数据库排行榜来看下
前三名是Oracle、MySQL、SQL Server,从评分来看,要比PostgreSQL高出2倍,前四名都是关系型数据库,而MongoDB属于第五位的,也是排名最高的非关系型数据库,这也反映出了关系型和非关系型数据库的使用情况。同时,在前三名中只有MySQL是开源的,让我们免费来使用,所以在项目中不考虑软件成本的话,可以考虑Oracle或SQL Server,否则MySQL绝对是最佳的选择
MySQL数据库的可扩展性
- 支持基于二进制日志的逻辑复制
- 存在多种第三方数据库中间件,支持读写分离及分库分表
MySQL数据库的安全性和稳定性
- MySQL主从复制集群可达到99%的可用性
- 配合主从复制高可用架构可以达到99.99%的可用性
如MMM/MHA高可用架构:
通过一个套件来实现,MMM提供了MySQL主主复制配置的监控,故障转移和管理的一套可伸缩的脚本套件。该架构典型应用是双主多从架构,通过replication技术可以实现两个服务器互为主从,且在任何时候只有一个节点可以写入,避免多点写入的数据冲突。同时当可写的主节点发生故障时,MMM套件可以立刻监控到,然后将服务自动切换到另一个主节点,继续提供服务。从而实现MySQL高可用。 - 支持对存储在MySQL的数据进行分级安全控制
支持对数据的加密存储,同时还支持多级别的用户授权,我们可以对实例、对数据库、对表,某一类进行权限的控制,来保证数据的安全性
MySQL所支持的系统
- 支持Linux系统
- 支持Windows系统
MySQL的使用成本
- 社区版本免费
大家并不担心社区版本的稳定性,同时社区版本和企业版本区别在于一些附加的功能和工具上面,主要功能上还没太大的区别 - 使用人员众多,可以方便的获取技术支持
随着MySQL的发展,MySQL数据库的运维和开发人员也多了起来,可以很容易找到数据库的运维和开发人员,更可以方便的获取技术支持
选型之终:构建MySQL开发环境
部署CentOS虚拟机
准备虚拟服务器
- 创建
名称 | 系统 | 版本 | 内存大小 |
MySQL | Linux | Red-Hat(64-bit) | 512M |
- 选择虚拟磁盘位置
位置 | 文件大小 | 分配 |
自定义 | 20G | 动态分配(不会立即分配20G) |
- 设置
网络 | 存储 | 分配 |
桥接网卡(可使用内网ip连虚拟机) | 选择iso文件位置 | 动态分配(不会立即分配20G) |
- 安装centOS服务器
选择语言 | 编解 | 创建root密码 | 点击Reboot重启 | 登录 |
英语 | 将灰色icon点亮(选择默认就可以) | 创建 | 重启耗时约1分钟 | 使用root账号密码 |
- 配置虚拟机
网络
- 进入到目录/etc/sysconfig/network-scripts ,使用命令ifconfig看网卡
就使用ip addr命令查看
使用vi命令对其进行配置,vi ifcfg-enp0s3
修改主机名,因为当前主机名localhost不容易标识。进入 /etc目录,修改hostname文件,清空,写上自定义的主机名
重启reboot,看到主机名已经配置成功
IP地址也生效了
连接
上一步网络没有配置好,由于有其它的解决方法来替代,如docker或本机安装windows版,因此就没有再使用virtualbox
安装MySQL服务
启动MySQL
我们不能使用root账号来启动服务,因此需要给MySQL服务创建一个账号
adduser mysql
配置my.cnf
在mysql目录下建立目录
mkdir data sql_log undo
data | sql_log | undo |
存放数据 | sql执行日志 | undo文件 |
该变创建目录的属主,让mysql用户拥有写权限
chown mysql:mysql -R data/ sql_log/ undo/
为了使用方便,需要在系统变量中添加
export PATH=$PATH:/user/local/mysql/bin
这样就可以在系统的任何目录执行MySQL的命令了,还需要对系统参数进行应用
source /etc/profile
初始化MySQL
在MySQL5.7之后,初始化需要使用mysqld命令了
mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
启动MySQL
需要将mysql目录下的support-files目录mysql.server 复制到/etc/init.d/目录下并命名为mysqld
cd support-files;
cp mysql.server /etc/init.d/mysql
接下来,可以使用脚本启动服务了
/etc/init.d/mysqld start
Starting MySQL... SUCCESS!
可以使用ps查看MySQL服务是否存在
ps -ef | grep mysql
查看初始化的用户名密码
在sql_log目录下的mysql-error.log文件中查看初始化的用户名密码
cd sql_log;
grep password mysql-error.log
2019-02-20T05:57:46 5 [Note] [MY-010454] A temporary password is generated for root@localhost: &oz2ZhelBvi
登录MySQL
mysql -uroot -p
Enter password:
修改初始的密码
alter user user() identified by '123456';
Query OK, 0 rows affected(0.11 sec)
退出
exit
重新登陆就要使用新的密码了