第十七章 MariaDB

17.1 MariaDB简介

MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区维护,采用GPL授权许可。MariaDB问世的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。在存储引擎方面,使用XtraDB来代替MySQL的InnoDB。MariaDB由MySQL的创始人Michael Widenius主导开发,他早前曾以10亿美元的价格,将自己创建的公司MySQL AB卖给了SUN,此后,随着SUN被甲骨文收购,MySQL的所有权也落入了Oracle的手中。

MariaDB基于事务的Maria存储引擎,替换了MySQL的MyISAM存储引擎,它使用了Percona的XtraDB,InnoDB的变体,分支的开发者希望提供访问即将到来的MySQL5.4 InnoDB性能。这个版本还包括了PrimeBase XT(PBXT)和FederatedX存储引擎。

17.1.1 MariaDB版本

MariaDB直到5.5版本,均依照MySQL的版本。因此,使用MariaDB5.5的人会从MySQL 5.5中了解到MariaDB的所有功能。

从2012年11月12日起发布的10.0.0版开始,不再依照MySQL的版号。10.0.x版以5.5版为基础,加上移植自MySQL 5.6版的功能和自行开发的新功能。

17.1.2 MariaDB的发展

MariaDB成立于2009年,MySQL之父Michael “Monty” Widenius用他的新项目MariaDB完成了对MySQL的“反戈一击”。开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL闭源的潜在风险,因此社区采用分支的方式来避开这个风险。

MariaDB虽然被视为MySQL数据库的替代品,但它在扩展功能、存储引擎以及一些新的功能改进方面都强过MySQL。而且从MySQL迁移到MariaDB也是非常简单的:

a) 数据和表定义文件(.frm)是二进制兼容的

b) 所有客户端API、协议和结构都是完全一致的

c) 所有文件名、二进制、路径、端口等都是一致的

d) 所有的MySQL连接器,比如PHP、Perl、Python、Java、NET、MyODBC、Ruby以及MySQL C connector等在MariaDB中都保持不变

e) mysql-client包在MariaDB服务器中也能够正常运行

f) 共享的客户端库与MySQL也是二进制兼容的

也就是说,在大多数情况下,你完全可以卸载MySQL然后安装MariaDB,然后就可以像之前一样正常的运行。

17.1.3 MariaDB起源

为何改了个名字呢,这其中也是有些典故的。

MySQL之父Widenius先生离开了Sun之后,觉得依靠Sun/Oracle来发展MySQL,实在很不靠谱,于是决定另开分支,这个分支的名字叫做MariaDB。

MariaDB跟MySQL在绝大多数据方面是兼容的,对于开发者来说,几乎感觉不到任何不同。目前MariaDB是发展最快的MySQL分支版本,新版本发布速度已经超过了Oracle官方的MySQL版本。

在Oracle控制下的MySQL开发,有两个主要问题:

a) MySQL核心开发团队是封闭的,完全没有Oracle之外的成员参加。很多高手即使有心做贡献,也没办法做到。

b) MySQL新版本的发布速度,在Oracle收购Sun之后大为减缓。Widenius有一个ppt,用数据比较了收购之前和之后新版本的发布速度。有很多bugfix和新的feature,都没有及时加入到发布版本之中。

以上这两个问题,导致了各个大公司,都开发了自己定制的MySQL版本,包括Yahoo!/Facebook/Google/阿里巴巴+淘宝网等。

MariaDB默认的存储引擎是Maria,不是MyISAM。Maria可以支持事务,但是默认情况下没有打开事务支持,因为事务支持对性能会有影响。

可以通过以下语句,转换为支持事务的Maria引擎:

ALTER TABLE `tablename` ENGINE=MARIA TRANSACTIONAL=1;

17.2 关系型数据库介绍

在讲MariaDB的搭建与语句之前,先来了解下关系型数据库。

17.2.1 数据结构模型

数据结构模型主要有层次模型、网状结构、关系模型等。

关系模型:

二维关系:row,column

数据库管理系统:DBMS

关系:Relational,RDBMS

17.2.2 RDBMS设计范式

RDBMS(关系型数据库管理系统)设计范式基础概念:

设计关系型数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。

目前关系型数据库有六种范式:

  第一范式(1NF):

所谓第一范式是指在关系模型中,对域添加的一个规范要求,所有的域都应该是原子性的,即数据库表的每一列都是不可分割的原子数据项,而不能是集合、数组、记录等非原子数据项。即实体中的某个属性有多个值时,必须拆分为不同的属性。在符合第一范式表中的每个域值只能是实体的一个属性的一部分。简而言之,第一范式就是无重复的域。

说明:

在任何一个关系数据库中,第一范式是对关系模式的设计基本要求,一般设计中都必须满足第一范式。不过有些关系模型中突破了1NF的限制,这种称为非1NF的关系模型。换句话说,是否必须满足1NF的最低要求,主要依赖于所使用的关系模型。

  第二范式(2NF):

第二范式是在第一范式的基础上建立起来的,即满足第二范式必须先满足第一范式。

第二范式要求数据库表中的每个实例或记录必须可以被唯一的区分。选取一个能区分每个实体的属性或属性组,作为实体的唯一标识。

第二范式要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实体的唯一标识。简而言之,第二范式就是在第一范式的基础上属性完全依赖于主键。

  第三范式(3NF):

第三范式是第二范式的一个子集,即满足第三范式必须满足第二范式。简而言之,第三范式要求一个关系中不包含已在其它关系中已包含的非主关键字信息。

简而言之,第三范式就是属性不依赖于其它非主属性,也就是在满足2NF的基础上,任何非主属性不得传递依赖于主属性。

  巴德斯科范式(BCNF)

  第四范式(4NF)

  第五范式(5NF,又称完美范式)

满足最低要求的范式是第一范式。在第一范式的基础上进一步满足更多规范要求的称为第二范式,其余范式以此类推。一般来说,数据库只需满足第三范式就行了。

17.2.3 RDBMS专业名词

常见的关系型数据库管理系统:

MySQL:MySQL,MariaDB,Percona-Server

PostgreSQL:简称为pgsql

Oracle

MSSQL

事务:多个操作被当作一个整体对待就称为一个事务

要看一个关系型数据库是否支持事务,需要看其是否支持并满足ACID测试

ACID:ACID是事务的一个基本标准

A:Automicity,原子性

C:一致性

I:隔离性

D:持久性

SQL:Structure Query Language,结构化查询语言

数据存储协议:应用层协议,基于C/S架构

S:Server,监听于套接字,接收并处理客户端的应用请求

C:Client

程序接口有两种:CLI和GUI

应用编程接口:ODBC(Open DataBase Connection,开放数据库连接)

约束:constraint,向数据表提供的数据要遵守的限制

主键约束:一个或多个字段的组合,填入的数据必须能在本表中唯一标识本行。且必须提供数据,不能为空(NOT NULL)。

一个表只能存在一个

惟一键约束:一个或多个字段的组合,填入的数据必须能在本表中唯一标识本行。允许为空(NULL)

一个表可以存在多个

外键约束:一个表中的某字段可填入数据取决于另一个表的主键已有的数据

检查性约束

索引:将表中的一个或多个字段中的数据复制一份另存,并且这些数据需要按特定次序排序存储

  关系运算:

选择:挑选出符合条件的行(部分行)

投影:挑选出需要的字段

连接

  数据抽象方式:

物理层:决定数据的存储格式,即RDBMS在磁盘上如何组织文件

逻辑层:描述DB存储什么数据,以及数据间存在什么样的关系

视图层:描述DB中的部分数据

17.2.4 关系模型的分类:

关系模型

实体-关系模型

基于对象的关系模型

半结构化的关系模型:支持XML格式解析数据

17.2.5 关系型数据库的常见组件

关系型数据库的常见组件有:

数据库:database

表:table,由行(row)和列(column)组成

索引:index

视图:view

用户:user

权限:privilege

存储过程:procedure

存储函数:function

触发器:trigger

事件调度器:event scheduler

17.3 SQL语句

SQL语句有三种类型:

DDL:Data Defination Language,数据定义语言

CREATE:创建

DROP:删除

ALTER:修改

DML:Data Manipulation Language,数据操纵语言

INSERT:向表中插入数据

DELETER:删除表中数据

UPDATE:更新表中数据

SELECT:查询表中数据

DCL:Data Control Language,数据控制语言

GRANT:授权

REVOKE:移除授权

数据库操作:

CREATE DATABASE|SCHEMA [IF NOT EXISTS] ‘DB_NAME‘;
DROP DATABASE|SCHEMA [IF EXISTS] ‘DB_NAME‘;

表操作:

CREATE TABLE table_name (col1 datatype 修饰符,col2 datatype 修饰符) ENGINE=‘存储引擎类型‘;
如:CREATE TABLE tbl1 (id int NOT NULL,name VARCHAR(100) NOT NULL,age tinyint);

查看支持的所有字符集:SHOW CHARACTER SET;

查看支持的所有排序规则:SHOW COLLATIONS;

查看支持的所有存储引擎:SHOW ENGINES;

查看数据库:SHOW DATABASES;

查看表:SHOW TABLES [FROM db_name];

查看表结构:DESC [db_name.]table_name;

删除表:DROP TABLE [IF EXISTS] table_name;

查看创建命令:SHOW CREATE TABLE table_name;

查看表状态:SHOW TABLE STATUS LIKE ‘table_name’\G

获取命令使用帮助:

mysql> help keyword;

如:mysql> HELP CREATE TABLE;

  datatype:数据类型

字符型:

定长字符型:CHAR(#),BINARY(#)

CHAR不区分字符大小写

BINARY区分字符大小写

变长字符型:VARCHAR(#),VARBINARY(#)

VARCHAR不区分字符大小写

VARBINARY区分字符大小写

对象存储形式:当定长字符型和变长字符型无法存储时使用此形式存储,变长字符型最大支持255字符

TEXT:不区分大小写

BLOB:区分字符大小写

内置类型:

ENUM:枚举

SET:集合

数值型:

精确数值型:

整型:int

tinyint:1byte,数值范围为0-255或-128-127

smallint:2byte

mediumint:3byte

int:4byte

bigint:8byte

UNSIGNED:无符号整型,数值从0开始,不包含负数

十进制:decimal

近似数值型:

单精度浮点型:float

双精度浮点型:double

日期时间型:

日期:DATE

时间:TIME

日期时间:DATETIME

时间戳:TIMESTAMP

年份:YEAR(2),YEAR(4)

修饰符:

所有类型适用:

NOT NULL:非空约束

DEFAULT VALUE:设定默认值

PRIMARY KEY:主键

UNIQUE KEY:惟一键

数值型适用:

UNSIGNED:无符号类型,只表示正整数,不包含负数

AUTO_INCREMENT:自增长

17.4 MariaDB安装方式

MairaDB安装方式有三种:

源代码:编译安装

二进制格式的程序包:展开至特定路径,并经过简单配置后即可使用

程序包管理器管理的程序包:

rpm:有两种

OS Vendor:操作系统发行商提供的

项目官方提供的

deb

17.5 MariaDB的特性

插件式存储引擎:存储管理器有多种实现版本,功能和特性可能略有差别,用户可根据需要灵活选择

存储引擎也称之为“表类型”

  MariaDB的特性:

a) 更多的存储引擎

MyISAM(mysql) --> Aria(Maria)

InnoDB(mysql)--> XtraDB(Maria)

b) 诸多扩展和新特性

c) 提供了较多的测试组件

d) true open source

17.6 MariaDB的程序组成

客户端:

mysql:CLI交互式客户端程序

-uUSERNAME:用户名,默认为root

-hHOST:服务器主机,默认为localhost

-pPASSWORD:用户的密码,默认为空

注意:mysql用户帐号由两部分组成,如‘USERNAME‘@‘HOST‘,表示此USERNAME只能从此HOST上远程登录。

这里(‘USRNAME‘@‘HOST‘)的HOST用于限制此用户可通过哪些主机远程连接mysql程序,其值可为:

支持使用通配符:

%:匹配任意长度的任意字符。如172.16.0.0/16,172.16.%.%

_:匹配任意单个字符

可运行的命令有两种:

客户端命令:本地执行

mysql> help

每个命令都有完整形式和简写格式:

status,\s

服务端命令:通过mysql协议发往服务器执行并取回结果

每个命令都必须有命令结束符号,默认为分号

mysql_secure_installation:安全初始化,强烈建议安装完以后执行此命令

mysqldump,mysqladmin ...

服务器端:

mysqld_safe

mysqld

mysqld_multi

服务器监听的两种socket地址:

ip socket:监听在tcp的3306端口,支持远程通信

unix sock:监听在sock文件上(/tmp/mysql.sock,/var/lib/mysql/mysql.sock),仅支持本地通信

server地址只能是:localhost,127.0.0.1

17.7 MariaDB安装和使用

17.7.1 MariaDB安装

CentOS7直接提供,可以通过yum或dnf直接安装

CentOS6安装:通用二进制格式安装过程如下

a) 准备数据目录,这里以/mydata/data为例

b) 配置MariaDB

groupadd -r -g 306 mysql
useradd -r -g 306 -u 306 mysql
tar xf mariadb-VERSION.tar.xz -C /usr/local
ln -sv /usr/local/mariadb-VERSION /usr/local/mysql
chown -R root.mysql /usr/local/mysql
cd /usr/local/mysql
scripts/mysql_install_db --datadir=/mydata/data --user=mysql
cp support-files/mysql.server /etc/rc.d/init.d/mysqld
chkconfig --add mysqld

c) 准备配置文件

配置格式:类ini格式,为各程序均通过单个配置文件提供配置信息

[program_name]

配置文件查找次序:若在多个配置文件中均有设定,则最后找到的最终生效

/etc/my.cnf --> /etc/mysql/my.cnf --> --default-extra-file=/PATH/TO/CONF_FILE --> ~/.my.cnf
mkdir /etc/mysql
cp support-files/my-large.cnf /etc/mysql/my.cnf

添加三个选项:

datadir = /mydata/data
innodb_file_per_table = on
skip_name_resolve = on

17.7.2 MariaDB基础应用

DDL:CREATE,DROP,ALTER

用户:

CREATE USER ’username‘@‘host‘ [IDENTIFIED BY ‘password‘];    #创建数据库用户帐号并给定密码
DROP USER ‘username‘@‘host‘;    #删除数据库用户

数据库:

CREATE DATABASE db_name;

表:

CREATE TABLE [ IF NOT EXISTS ] ‘table_name‘ (col1 type1,col2,type2,...)
    col type1
    PRIMARY KEY(col1,...)
    INDEX(col1,...)
    UNIQUE KEY(col1,...)

表选项:

ENGINE [=] engine_name
ROW_FORMAT [=] {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}

SHOW ENGINES;

获取帮助:

mysql> HELP CREATE TABLE;

查看创建命令:

SHOW CREATE TABLE table_name;

查看表状态:

SHOW TABLE STATUS LIKE ‘table_name‘\G

删除表:

DROP TABLE [ IF EXISTS ] ‘table_name‘;

修改表:

ALTER TABLE ‘table_name‘

字段:

添加字段:add

ADD col1 data_type [FIRST|AFTER col_name]

删除字段:drop

修改字段:alter,change,modify

索引:

添加索引:add

删除索引:drop

查看表上的索引:

SHOW INDEXES FROM [db_name.]table_name;

索引:

索引是特殊数据结构,定义在查找时作为查找条件的字段上

索引要有索引名称

创建索引:

CREATE INDEX index_name ON table_name (index_col_name,...);

删除索引:

DROP INDEX index_name ON table_name;

DML:INSERT,DELETE,SELECT,UPDATE

INSERT INTO:

INSERT [INTO] table_name [(column_name,...)] {VALUES | VALUE} (value1,...),(...),...

SELECT:

SELECT column1,column2,... FROM table_name [WHERE clause] [ORDER BY ‘column_name‘ [DESC]] [LIMIT [m,]n];

字段(column)表示法:

*:所有字段

as:字段别名,如col1 AS alias1

WHERE clause:

操作符:

>,<,>=,<=,==,!=

BETWEEN column# AND column#

LIKE:模糊匹配

%:任意长度的任意字符

_:任意单个字符

RLIKE:基于正则表达式进行模式匹配

IS NOT NULL:非空

IS NULL:空

条件逻辑操作:

AND

OR

NOT

ORDER BY:排序,默认为升序(ASC)

ORDER BY ‘column_name‘:根据column_name进行升序排序
ORDER BY ‘column_name‘ DESC:根据column_name进行降序排序
ORDER BY ’column_name‘ LIMIT 2:根据column_name进行升序排序并只取前2个结果
ORDER BY ‘column_name‘ LIMIT 1,2:根据column_name进行升序排序并且略过第1个结果取后面的2个结果

DELETE:

DELETE FROM table_name [WHERE clause] [ORDER BY ‘column_name‘ [DESC]] [LIMIT [m,]n];

UPDATE:

UPDATE table_name SET column1 = new_value1[,column2 = new_value2,...] [WHERE clause] [ORDER BY ‘column_name‘ [DESC]] [LIMIT [m,]n];

DCL:GRANT,REVOKE

授权:GRANT。权限级别:管理权限、数据库、表、字段、存储例程。

GRANT priv_type,... ON [object_type] db_name.table_name TO ‘username‘@‘host‘ [IDENTIFIED BY ‘password‘] [WITH GRANT OPTION];

priv_type:ALL [PRIVILEGES]

db_name.table_name:

*.*:所有库的所有表和存储例程

db_name:指字库的所有表

db_name.table_name:指定库的指定表

db_name.routine_name:指定库的存储例程

WITH GRANT OPTION:被授权的用户可将自己的权限副本转赠给其他用户,说白点就是将自己的权限完全复制给另一个用户。不建议使用。

查看授权:SHOW

SHOW GRANTS FOR ’username‘@‘host‘;查看指定用户的授权情况
SHOW GRANTS FOR CURRENT_USER;查看当前用户的授权情况

取消授权:REVOKE

REVOKE priv_type,... ON db_name.table_name FROM ‘username‘@‘host‘;

注意:MariaDB服务进程启动时会读取mysql库中的所有授权表至内存中:

a) GRANT或REVOKE等执行权限操作会保存于表中,MariaDB的服务进程会自动重读授权表,并更新至内存中

b) 对于不能够或不能及时重读授权表的命令,可手动让MariaDB的服务进程重读授权表

mysql> FLUSH PRIVILEGES;
时间: 2024-10-28 22:06:53

第十七章 MariaDB的相关文章

个人:构建之法第十七章读后感

第十七章在开始讲一个项目中的三个角色: 猪:项目的所有者,成功了是最大收益者,失败了最大损失者 鸡:项目的参与者,成功了得到应得的酬劳,失败了也没什么损失 鹦鹉:项目的外援 这一节应该是给“猪”说的,猪需要弄清团队成员投入/承诺/责任,这很重要,也是猪的责任. 分配好角色后,完成项目的过程也会有各种各样的问题: 在做事上会分为:做事的,不做事的,不让别人做事的,做假事的,假装做事的 项目完成后,如何分配利益又是一个问题:比资历?平均?比效率?团队互评?比犯得过错? 书中提出的解决办法: 20%给

第十四——十七章作业

                                                                                                     第十四章 15.3.1 有些成功人士或公司认为不需要独立的测试角色(Test),你怎么看? 在一些软件公司中,QA的工作中包含了Test的角色,负责验证程序是否符合预先设计的功能和特性.但是QA的工作量是很多的,一个好的QA不仅需要对程序架构有着很好的理解,对程序功能和性能都有着较深的理解,并且要

CSS3秘笈复习:十三章&amp;十四章&amp;十五章&amp;十六章&amp;十七章

第十三章 1.在使用浮动时,源代码的顺序非常重要.浮动元素的HTML必须处在要包围它的元素的HTML之前. 2.清楚浮动: (1).在外围div的底部添加一个清除元素:clear属性可以防止元素包围浮动元素.关键字:left.right或both. (2).浮动外围元素:让包含浮动元素的<div>也浮动.选择这种方法一定要在浮动容器后面的任何元素中添加一个clear属性,确保浮动元素落到容器的下方. (3).利用overflow : hidden.另一种常见的方法是在外围的样式中添加以下属性:

《构建之法》第十七章读后感

通过阅读<构建之法>第十七章,不能说对我造成了什么深远的影响,但是还是感触颇深: 第一,工作分配的重要性,说道工作分配,不得不说我们个小组的组长们,组长不仅仅是一个团队的领导者,更是这个团队的灵魂.它不仅需要了解随时掌握各组员的动向,更重要的是,他需要了解各组员的能力,然后根据个人的能力,然后再去非陪相应的任务,只要这样才能做到“物尽其用”,才能更好的完成我们的项目,有时甚者能更创造出以外的效果,达到更完美的状态.这不仅是组长的能力  其实其无时无刻也体现着我们这个小组的团结力和创造力.当初选

第十七章 路由交换机编程

                第十七章    路由交换机编程 MTU = 64KB 毕竟是理想,现阶段实现起来还是有难度:牵涉到较多问题,与大网同步.流量平衡.时隙交换等.所以,APO还是决定MTU = 48E = 1536B,包含头部2E.帧同步头8B.尾部CRC的4B等:数据包的有效内容(不含头部)为45E = 1440B.头部2E = 64B,其中MAC头14B.IP头18B.TCP/UDP/ICMP头32B. 二层交换机是以存储转发为主设计,三层以上的交换机是以256位差分总线的时隙交

Gradle 1.12 翻译——第十七章. 从 Gradle 中调用 Ant

有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com/1.12/userguide/userguide.html 本文原创,转载请注明出处:http://blog.csdn.net/maosidiaoxian/article/details/41204073 关于我对Gradle的翻译,以Github上的项目及http://gradledoc.qin

2017.2.16 开涛shiro教程-第十七章-OAuth2集成

原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398 根据下载的pdf学习. 开涛shiro教程-第十七章-OAuth2集成 1.OAuth2介绍 (1)应用场景 很多开放平台,比如新浪微博开放平台,都在使用开发API接口供开发者使用.即带来了,第三方应用要到开放平台授权的问题.OAuth就是做这个的. 1 OAuth2官网:http://oauth.net/2/ 2 OAuth2协议:http://tools.ietf.org/html/

Gradle 1.12用户指南翻译——第四十七章. Build Init 插件

文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://github.com/msdx/gradledoc 本文翻译所在分支: https://github.com/msdx/gradledoc/tree/1.12. 直接浏览双语版的文档请访问: http://gradledoc.qiniudn.com/1.12/usergu

Gradle 1.12用户指南翻译——第三十七章. OSGi 插件

本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://github.com/msdx/gradledoc/tree/1.12. 直接浏览双语版的文档请访问: http://gradledoc.qiniudn.com/1.12/userguide/userguide.html. 另外,Android 手机用户可通过我写的一个