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;