1 数据库介绍
1.1 什么是数据库
数据库就是一个存放计算机数据的仓库,这个仓库是按照一定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来对数据进行组织和存储的,可以通过数据库提供的多种方法来管理其中的数据。
1.2 数据库的种类
关系型数据库和非关系型数据库。
1.3 常用数据库
- 关系型数据库: Oracle、Microsoft SQL Server、MySQL/MariaDB等。
- 非关系型数据库: MongoDB Memcached Redis
1.4、关系型数据库
关系型数据库模型是把复杂的数据结构归结为简单的二元关系(即二维表格形式)。在关系型数据库中,对数据的操作几乎全部建立在一个或多个关系表格上,通过这些关联的表格分类、合并、连接或选取等运算来实现数据的管理。 关系型数据可以很好地存储一些关系模型的数据,比如一个老师对应多个学生的数据(“一对多”),一本书对应多个作者(“一对多”),一本书对应一个出版日期(“一对一”) 关系型数据库诞生距今已有 40 多年了,从理论产生到发展到实现产品,例如:常见的 MySQL 和 Oracle 数据库,Oracle 在数据库领域里上升到了霸主地位,形成每年高达数百亿美元的庞大产业市场,而 MySQL 也是不容忽视的数据库,以至于被 Oracle 重金收购了。
1.5、非关系型数据库
非关系型数据库也被称为 NoSQL 数据库,NoSQL 的本意是 “Not Only SQL”,指的是非关系型数据库,而不是“NO SQL”的意思,NoSQL 的产生并不是要彻底否定关系型数据库,而是作为传统数据库的一个有效补充。NoSQL 数据库在特定的场景下可以发挥难以想象的高效率和高性能。特别是对于规模日益扩大的海量数据,超大规模和高并发的微博、微信、SNS 类型的纯动态网站已经显得力不从心,暴露了很多难以克服的问题,例如:传统的关系型数据库IO瓶颈、性能瓶颈都难以有效突破,于是开始出现了大批针对特定场景,以高性能和使用便利为目的功能特异化的数据库产品。NoSQL(非关系型)类的数据库就是这样的情景中诞生并得到了非常迅速的发展。
NoSQL 是非关系型数据库的广义定义。它打破了长久以来关系型数据库与ACID理论大一统的局面。NoSQL数据存储不需要固定的表结构,通常也不存在连续操作。
1.键值(Key-Value)存储数据库
- 键值数据库就类似传统语言中使用的哈希表。可以通过key来添加、查询或者删除数据,因为使用key主键访问,所以会获得很高的性能及扩展性。这个表中有一个特定的键和一个指针指向特定的数据。Key-Value模型对于IT系统来说的优势在于简单、易部署、高并发。
- 典型产品:Memcached、Redis、MemcachedB
2、列存储(Column-Oriented)数据库
- 列存储数据库将数据存储存在列族(Column Family)中,一个列族存储经常被一起查询的相关数据。举个例子,如果有一个 Person 类,通常会一起查询他们的姓名和年龄而不是薪资。这种情况下,姓名和年龄就会被放入一个列族中,而薪资则在另一个列族中。这部分数据库通常用来应对分布式存储的海量数据。键仍然存在,但是他们的特点是指向了多个列。这些列是由列家族来安排的。
- 典型产品:Cassandra,HBase
3、面向文档(Document-Oriented)的数据库
- 面向文档数据库会将数据以文档的形式存储,数据存储的最小单位是文档,同一个表中存储的文档属性可以是不同的,数据可以使用XML、JSON等多种形式存储。
- 典型产品:MongDB、CouchDB
4、图形(Graph)数据库
- 图形数据库允许我们将数据以图的方式存储。图形结构的数据库同其他行列以及刚性结构的 SQL 数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上。
- 典型产品:Neo4J、InfoGr id
2 MySQL数据库
2.1 MySQL简介
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。
RDBMS即关系数据库管理系统(Relational Database Management System)
2.2 MySQL安装方式
略
2.3 MySQL数据库存储引擎
数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引、锁表等功能,使用不同的存储引擎,还可以 获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。MySQL的核心就是存储引擎。
1、InnoDB存储引擎:默认引擎,最常用的。 InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定;InnoDB是默认的MySQL引擎
InnoDB特点: 支持事务处理,支持崩溃修复和并发控制。如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有很大的优势。如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交(commit)和回滚(rollback)。
2、MyISAM存储引擎:(了解)MyISAM基于ISAM存储引擎,并对其进行扩展。它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。MyISAM拥有较高的插入、查询速度,但不支持事务。
MyISAM特点: 插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。如果应用的完整性、并发性要求比较低,也可以使用。
12306查询 只生成一条数据这种适合。
3、MEMORY内存型引擎(了解)MEMORY存储引擎将表中的数据存储到内存中,为查询和引用其他表数据提供快速访问
MEMORY特点: 所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMOEY。它对表的大小有要求,不能建立太大的表。所以,这类数据库只使用在相对较小的数据库表。
4、Archive(归档引擎)
如何选择引擎:如果要提供提交、回滚、并要求实现并发控制,InnoDB是一个好的选择;如果数据表主要用来插入和查询记录,则MyISAM引擎能提供较高的处理效率;如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的Memory引擎;MySQL中使用该引擎作为临时表,存放查询的中间结果;
使用哪一种引擎需要灵活选择,一个数据库中多个表可以使用不同引擎以满足各种性能和实际需求,使用合适的存储引擎,将会提高整个数据库的性能。
3 MySQL数据类型
MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。
3.1 MySQL数值类型
MySQL支持所有标准SQL数值数据类型。
这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。
关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。
BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。
作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。下面的表显示了需要的每个整数类型的存储和范围。
|
类型
|
大小
|
范围(有符号)
|
范围(无符号)
|
用途
|
|
TINYINT
|
1 字节
|
(-128,127)
|
(0,255)
|
小整数值
|
|
SMALLINT
|
2 字节
|
(-32 768,32 767)
|
(0,65 535)
|
大整数值
|
|
MEDIUMINT
|
3 字节
|
(-8 388 608,8 388 607)
|
(0,16 777 215)
|
大整数值
|
|
INT或INTEGER
|
4 字节
|
(-2 147 483 648,2 147 483 647)
|
(0,4 294 967 295)
|
大整数值
|
|
BIGINT
|
8 字节
|
(-9,223,372,036,854,775,808,9 223 372 036 854 775 807)
|
(0,18 446 744 073 709 551 615)
|
极大整数值
|
|
FLOAT
|
4 字节
|
(-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38)
|
0,(1.175 494 351 E-38,3.402 823 466 E+38)
|
单精度 浮点数值
|
|
DOUBLE
|
8 字节
|
(-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)
|
0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)
|
双精度 浮点数值
|
|
DECIMAL
|
对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2
|
依赖于M和D的值
|
依赖于M和D的值
|
小数值
|
3.2 MySQL日期和时间类型
表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。
每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。
TIMESTAMP类型有专有的自动更新特性,将在后面描述。
|
类型
|
大小(字节)
|
范围
|
格式
|
用途
|
|
DATE
|
3
|
1000-01-01/9999-12-31
|
YYYY-MM-DD
|
日期值
|
|
TIME
|
3
|
'-838:59:59'/'838:59:59'
|
HH:MM:SS
|
时间值或持续时间
|
|
YEAR
|
1
|
1901/2155
|
YYYY
|
年份值
|
|
DATETIME
|
8
|
1000-01-01 00:00:00/9999-12-31 23:59:59
|
YYYY-MM-DD HH:MM:SS
|
混合日期和时间值
|
|
TIMESTAMP
|
4
|
1970-01-01 00:00:00/2038
结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07
|
YYYYMMDD HHMMSS
|
混合日期和时间值,时间戳
|
3.3 MySQL字符串类型
字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。
|
类型
|
大小
|
用途
|
|
CHAR
|
0-255字节
|
定长字符串
|
|
VARCHAR
|
0-65535 字节
|
变长字符串
|
|
TINYBLOB
|
0-255字节
|
不超过 255 个字符的二进制字符串
|
|
TINYTEXT
|
0-255字节
|
短文本字符串
|
|
BLOB
|
0-65 535字节
|
二进制形式的长文本数据
|
|
TEXT
|
0-65 535字节
|
长文本数据
|
|
MEDIUMBLOB
|
0-16 777 215字节
|
二进制形式的中等长度文本数据
|
|
MEDIUMTEXT
|
0-16 777 215字节
|
中等长度文本数据
|
|
LONGBLOB
|
0-4 294 967 295字节
|
二进制形式的极大文本数据
|
|
LONGTEXT
|
0-4 294 967 295字节
|
极大文本数据
|
CHAR 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。
BINARY 和 VARBINARY 类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。
BLOB 是一个二进制大对象,可以容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同。
有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。对应的这 4 种 BLOB 类型,可存储的最大长度不同,可根据实际情况选择。
4 MySQL表完整性约束
- PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录,不可以为空 UNIQUE + NOT NULL
- FOREIGN KEY (FK) 标识该字段为该表的外键,实现表与表之间的关联
- NULL 标识是否允许为空,默认为NULL。
- NOT NULL 标识该字段不能为空,可以修改。
- UNIQUE KEY (UK) 标识该字段的值是唯一的,可以为空,一个表中可以有多个UNIQUE KEY
- AUTO_INCREMENT 标识该字段的值自动增长(整数类型,而且为主键)
- DEFAULT 为该字段设置默认值
- UNSIGNED 无符号,正数
5 MySQL 索引
5.1 MySQL 索引的分类
- 普通索引(INDEX):索引列值可重复
- 唯一索引(UNIQUE):索引列值必须唯一,可以为NULL
- 主键索引(PRIMARY KEY):索引列值必须唯一,不能为NULL,一个表只能有一个主键索引
- 全文索引(FULL TEXT):给每个字段创建索引
5.2 MySQL 不同类型索引用途和区别
- 普通索引常用于过滤数据。例如,以商品种类作为索引,检索种类为“手机”的商品。
- 唯一索引主要用于标识一列数据不允许重复的特性,相比主键索引不常用于检索的场景。
- 主键索引是行的唯一标识,因而其主要用途是检索特定数据。
- 全文索引效率低,常用于文本中内容的检索。
5.3 MySQL 索引操作
5.3.1 创建索引
5.3.1.1 普通索引(INDEX)
# 在创建表时指定
mysql> create table student1(id int not null, name varchar(100) not null, birthdy date, sex char(1) not null, index nameindex (name(50)));
Query OK, 0 rows affected (0.02 sec)基于表结构创建
mysql> create table student2(id int not null, name varchar(100) not null, birthday date, sex char(1) not null);
Query OK, 0 rows affected (0.01 sec)mysql> create index nameindex on student2(name(50));
修改表结构创建
mysql> create table student3(id int not null, name varchar(100) not null, birthday date, sex char(1) not null);
Query OK, 0 rows affected (0.01 sec)mysql> ALTER TABLE student3 ADD INDEX nameIndex(name(50));
mysql> show index from student3; //查看某个表格中的索引
5.3.1.2 唯一索引(UNIQUE)
# 在创建表时指定
mysql> create table student4(id int not null, name varchar(100) not null, birthday date, sex char(1) not null, unique index id_idex (id));
Query OK, 0 rows affected (0.00 sec)基于表结构创建
mysql> create table student5(id int not null, name varchar(100) not null, birthday date, sex char(1) not null);
Query OK, 0 rows affected (0.00 sec)mysql> CREATE unique INDEX idIndex ON student5(id);
基于表结构创建
mysql> create table student18(id int not null, name varchar(100) not null, birthday date, sex char(1) not null);
mysql> alter table student18 add unique index idIndex(id);
Query OK, 0 rows affected (0.02 sec)
5.3.1.3 主键索引(PRIMARY KEY)
# 创建表时时指定
mysql> create table student6(id int not null, name varchar(100) not null, birthday date, sex char(1) not null, primary key (id));
Query OK, 0 rows affected (0.01 sec)修改表结构创建
mysql> create table student7(id int not null, name varchar(100) not null, birthday date, sex char(1) not null);
Query OK, 0 rows affected (0.01 sec)mysql> ALTER TABLE student7 ADD PRIMARY KEY (id);
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
5.3.2 删除索引
5.3.2.1 普通索引(INDEX)
# 直接删除
mysql> DROP INDEX nameIndex ON student1;修改表结构删除
mysql> ALTER TABLE student2 DROP INDEX nameIndex;
5.3.2.2 唯一索引(UNIQUE)
# 直接删除
mysql> drop index id_idex on student4;修改表结构删除
mysql> ALTER TABLE student5 DROP INDEX idIndex;
5.3.2.3 主键索引(PRIMARY KEY)
mysql> ALTER TABLE student7 DROP PRIMARY KEY;
主键不能采用直接删除的方式删除。
5.3.3 查看索引
mysql> SHOW INDEX FROM tab_name;
5.4 选择索引的原则
- 常用于查询条件的字段较适合作为索引,例如WHERE语句和JOIN语句中出现的列
- 唯一性太差的字段不适合作为索引,例如性别,年龄
- 更新过于频繁(更新频率远高于检索频率)的字段不适合作为索引
- 使用索引的好处是索引通过一定的算法建立了索引值与列值直接的联系,可以通过索引直接获取对应的行数据,而无需进行全表搜索,因而加快了检索速度
- 但由于索引也是一种数据结构,它需要占据额外的内存空间,并且读取索引也加会大IO资源的消耗,因而索引并非越多越好,且对过小的表也没有添加索引的必要
6 MySQL 数据备份与恢复
备份:能够防止由于机械故障以及人为误操作带来的数据丢失,例如将数据库文件保存在了其它地方。
冗余: 数据有多份冗余,但不等备份,只能防止机械故障带来的数据丢失,例如主备模式、数据库集群。
6.1 数据库备份内容
备份内容 databases Binlog my.cnf
所有备份数据都应放在非数据库本地,而且建议有多份副本。
测试环境中做日常恢复演练,恢复较备份更为重要。
6.2 数据库备份类型
1.物理备份: 直接复制数据库文件,适用于大型数据库环境,不受存储引擎的限制,但不能恢复到不同的MySQL版本。1、热备(hot backup)
在线备份,数据库处于运行状态,这种备份方法依赖于数据库的日志文件
- 对应用基本无影响(但是性能还是会有下降,所以尽量不要在主库上做备份,在从库上做)
2、冷备(cold backup)
备份数据文件,需要停机,是在关闭数据库的时候进行的
- 备份 datadir 目录下的所有文件
3、温备(warm backup)
- 针对myisam的备份(myisam不支持热备),备份时候实例只读不可写,数据库锁定表格(不可写入但可读)的状态下进行的
- 对应用影响很大
- 通常加一个读锁
2.逻辑备份: 备份的是建表、建库、插入等操作所执行SQL语句(DDL DML DCL),适用于中小型数据库,效率相对较低。
3.物理和逻辑备份的区别
逻辑备份 | 物理备份 | |
---|---|---|
备份方式 | 备份数据库建表、建库、插入sql语句 | 备份数据库物理文件 |
优点 | 备份文件相对较小,只备份表中的数据与结构 | 恢复速度比较快 |
缺点 | 恢复速度较慢(需要重建索引,存储过程等) | 备份文件相对较大(备份表空间,包含数据与索引) |
对业务影响 | I/O负载加大 | I/O负载加大 |
代表工具 | mysqldump | ibbackup、xtrabackup,mysqlbackup |
6.3 MySQL 备份工具
6.3.1 ibbackup
- 官方备份工具
- 收费
- 物理备份
6.3.2 xtrabackup
- 开源社区备份工具
- 开源免费,上面的免费版本(老版本有问题,备份出来的数据可能有问题)
- 物理备份
6.3.3 mysqldump
- 官方自带备份工具 开源免费
- 逻辑备份(速度慢)
6.3.4 mysqlbackup
- mysql 官方备份工具
- innodb 引擎的表mysqlbackup可以进行热备
- 非innodb表mysqlbackup就只能温备
- 物理备份,备份还原速度快
- 适合大规模数据使用
6.4 备份数据库
语法:*mysqldump -h 主机 -P 端口 -u 用户名 -p 密码 --databases 数据库 > 文件名.sql*
mysqldump命令参数
|
参数
|
描述
|
备注
|
|
-h
|
目标主机
|
可选参数
|
|
-P
|
端口
|
可选参数,默认3306
|
|
-u
|
用户名
| |
|
-p
|
密码
| |
|
-database
|
指定单个数据库
|
高版本可能会废弃,使用databases替代
|
|
--databases
|
指定多个数据库
|
导出SQL文件支持库操作语法,多个库之间使用空格分隔
|
|
--socket
|
mysql.sock路径
|
执行命令提示sock错误时,通过netstat命令获取mysql.sock路径
|
|
--add-drop-table
|
表操作语法
|
可省略,使用--databases参数即可
|
|
|
备份文件
|
指定备份文件路劲及文件名
|
6.4.1 普通备份
导出可执行SQL脚本文件
mysqldump -uroot -proot --databases db_test > db_back.sql
6.4.2 压缩备份
导出GZIP压缩格式SQL脚本文件
mysqldump -uroot -proot --databases db_test | gzip > db_back.sql.gz
6.4.3 多库备份
多个库脚本导出到一个SQL文件,多个库之间使用空格分隔
mysqldump -uroot -proot --databases db_test db_test1 > db_back.sql
6.4.4 多表备份
备份数据库中的指定表,多个表之间使用空格分隔
mysqldump -uroot -proot db_test tb_user tb_admin > back_user_admin.sql
6.4.5 备份所有库
备份服务器上所有数据库
mysqldump -uroot -proot --all-databases > db_back.sql
6.4.6 备份表结构
仅备份表结构,不备份数据
mysqldump -uroot -proot --no-data --databases db_test > db_back.sql
6.5 还原数据库
语法:*mysql -h 主机 -P 端口 -u 用户名 -p 密码 数据库名称 < SQL文件*
6.5.1 普通还原
还原原备份SQL文件,如果数据库不存在需要先创建
mysql -uroot -proot db_test < db_back.sql
6.5.2 数据库还原
使用source命令还原数据库,不需要先创建数据库,首先使用mysql命令登陆mysql,然后执行source命令还原数据库
source /home/data/db_back.sql
6.5.3 GZIP还原
还原GZIP压缩SQL文件,如果数据库不存在需要先创建
gunzip < db_back.sql.gz | mysql -uroot -proot db_test