mariadb研究

目录

1概述 (2)

1.1.版本 (2)

1.2.兼容性 (2)

1.3.目标 (2)

2架构 (3)

3特性与优势 (6)

3.1.MariaDB 5.5特性 (6)

3.2.MariaDB 10的主要特性 (9)

4使用情况 (9)

5性能对比测试 (10)

5.1.测试环境 (10)

5.2.测试结果解析 (10)

5.3.测试总结 (12)

6处理非结构化数据 (13)

6.1.概述 (13)

6.2.使用语法 (13)

6.3.常见非结构化文件处理 (15)

6.3.1DOS、FIX和FMT类型文件 (15)

6.3.2CSV文件 (18)

6.3.3XML文件 (20)

6.3.4JSON (26)

1概述

MariaDB 数据库管理系统作为MySQL的一重要个分支,是一个向后兼容、替代MySQL的数据库管理系统,主要由MySQL的创始人Michael Widenius主导开发,目前由开源社区在维护,采用GPL授权许可;MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。存储引擎方面,默认使用基于事务的XtraDB(InnoDB的变体)来代替MySQL的InnoDB。

1.1. 版本

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

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

1.2. 兼容性

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

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

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

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

●所有的MySQL连接器,比如PHP、Perl、Python、Java、.NET、MyODBC、

Ruby以及MySQL C connector等在MariaDB中都保持不变。

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

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

这意味着对于大多数情况下,您可以卸载MySQL和安装MariaDB,可以工作的很好。并且MariaDB每月会与MySQL代码库合并来确保MariaDB的兼容性和得到任何Oracle修正的bug和所有特性。

1.3. 目标

提供一个由社区开发的、稳定的、总是免费的MySQL分支,在用户级别上兼

容主流版本。

2架构

整体上来说,MariaDB的体系结构可以分为三层。最上层负责处理客户端的连接请求;包括连接处理、授权认证、安全等。第二层是MariaDB的核心层,作为一个数据库,最基本最核心的功能都在这一层;这一层的主要功能有查询、分析优化和缓存。第三层则包含了存储引擎,一般来说,存储引擎负责数据的存放和提取;存储引擎更加面向底层,负责和底层的文件系统的交互。

用如下一张最简单的架构示意图来表示 MariaDB Server的基本架构:

各层详细介绍如下:

第一层:不同语言与SQL的交互,服务于C/S程序或者是这些程序所需要的:连接处理,身份验证,安全性等等。

在服务器内部,每个client连接都有自己的线程。这个连接的查询都在一个单独的线程中执行。这些线程轮流运行在某一个CPU内核(多核CPU)或者CPU中。服务器缓存了线程,因此不需要为每个client连接单独创建和销毁线程。

当Clients(相关应用程序)连接到了MariaDB服务器。服务器需要对它进行

认证。认证是基于用户名、主机和密码。对于使用了SSL(安全套接字层)的连接,还使用了X.509证书。Clients一连接上,服务器就验证它的权限。

第二层:是MariaDB的核心部分。通常叫做 SQL Layer。在 MariaDB数据库系统处理底层数据之前的所有工作都是在这一层完成的,包括权限判断,SQL解析,执行计划,优化,query cache 的处理以及所有内置的函数(如日期、时间、数学运算、加密)等等。各个存储引擎提供的功能都集中在这一层,如存储过程,触发器,视图等。

MariaDB会解析查询,并创建了一个内部数据结构(解析树)。然后对其进行各种优化。这些优化包括:查询语句的重写,读表的顺序,索引的选择等等。用户可以通过查询语句的关键词传递给优化器以便提示使用哪种优化方式,这样即影响了优化器的优化方式。另外,用户也可以请求服务器给出优化过程的各种说明,以获知服务器的优化策略,为用户提供了参数基准,以便用户可以重写查询,架构和修改相关服务器配置,便于MariaDB更高效的运行。

优化器并是不关心表使用了哪种存储引擎,但是存储引擎对服务器优化查询的方式是有影响的。优化器需要知道存储引擎的一些特性:具体操作的性能和开销方面的信息,以及表内数据的统计信息。例如,存储引擎支持哪些索引类型,这对于查询是非常有用的。

解析查询之前,要查询缓存,这个缓存只能保存查询信息以及结果数据。如果请求一个查询在缓存中存在,就不需要解析,优化和执行查询了,直接返回缓存中所存放的这个查询的结果。

由以上MariaDB的逻辑架构图可知,SQL Layer主要由如下几个模块组成:

●Management Serveices & Utilities:系统管理和控制工具

主要用于数据库的备份恢复、安全、复制、集群的管理、配置、迁移,以及元数据的管理等。

●Connection Pool: 连接池。

负责处理和用户访问有关的各种用户登录认证、线程处理、连接限制、内存和进程缓存等需求。

●SQL Interface: SQL接口

接受用户SQL命令,例如执行用户的DML和DDL语句、存储过程、视图和触

发器等。

●Parser:解析器

对SQL语句进行语法分析、验证和解析,构造一个用来执行查询的数据结构,以后SQL语句传递和处理基于这个结构,若在分解中遇到错误,表示该SQL语句不合理。

●Optimizer:优化器

优化客户端请求的命令,根据客户端请求的命令语句,和数据库中的一些统计信息,在一系列算法的基础上进行分析,得出一个最优的策略,告诉后面的程序如何取得这个语句的结果。

●Caches & Buffers

如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。这个缓存机制是由一系列小缓存组成的,比如表缓存,记录缓存,key缓存,权限缓存等。

第三层:存储引擎层,通常叫做Storage engine layer,也就是底层数据存取操作实现部分,是MariaDB与文件打交道的子系统;用于文件访问层的一个抽象接口来定制一种文件访问机制;负责存储和获取所有存储在MariaDB中的数据。服务器是通过存储引擎API来与它们交互的,这个接口隐藏了各个存储引擎不同的地方,对于查询层尽可能的透明;同时这个API包含了很多底层的操作。如开始一个事物,或者取出有特定主键的行。MariaDB的存储引擎是插件式的,为存储引擎的加载和移出更为灵活方便;

MariaDB存储引擎主要包括MyISAM,Innodb(被Percona的XtraDB替代,原Innodb的加强版,并且整合Google、Fackebook、Taobao等公司补丁),Memory,Connect,CSV, SphinxSE,Archive,BLACKHOLE,FEDERATED等,同时也支持开源和第三方存储引擎,每个存储引擎都有自己的优点和缺陷,可根据自己的实际需求选择适合自己的存储引擎;最常用的是Innodb和MyISAM。

Innodb和MyISAM的主要特点介绍。

Innodb:

?支持事务

具有提交、回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎,并且实

现了SQL92标准所定义的四个级别(READ UNCOMMITTED,READ COMMITED,REPEATABLE READ和 SERIALIZABLE)。

?行锁

行级锁可以最大程度地支持并发处理(同时也带来了最大的锁开销);基于提升并发性能的考虑,MariaDB同时实现了多版本并发控制(MVCC),它为行级锁的一个变种,在很多情况下避免了加锁操作,因此开销更低。Innodb的MVCC,是通过在每行记录后面保存两个隐藏的列(系统版本号-SVN)来实现的;并且只在REPEATABLE READ 和 READ COMMITTED两个隔离级别下工作,其它两个隔离级别都和MVCC不兼容。

?支持外键

使在数据库端保证数据的完整性与一致性,主要用于存储在外键表中的数据。

?回滚和崩溃修复能力

回滚即对事务的撤销;在数据库异常关闭时,再启动时可以利用事务日志

进行快速的数据恢复。

?支持FULLTEXT类型的索引

在MariaDB 10中提供。

MyISAM:

?不支持事务、不支持外键

?每个表存储为三个文件,即.frm、.MYD、.MYI

?表锁

?支持全文索引、压缩、空间函数等

?支持静态表、动态表及压缩表

3特性与优势

3.1. MariaDB 5.5特性

MariaDB 5.5有,而MySQL5.6没有(或需付费使用)的功能包括:

●线程池

?降低MariaDB维护的线程数。

?对于短连接,CPU Bound来说,不需要客户端发起连接的时候,临时

申请一个新的线程,并且立刻就需要把这个连接的资源全部释放掉。

?节省MariaDB内存占用,可以把有限的内存让给更需要内存的buffer

pool或者key cache使用,减少磁盘IO,提高系统的响应时间。

?避免MariaDB连接数不够,当Mariadb连接数达到max_connections

时,会拒绝连接,使用线程池不用担心这个问题。

●组提交

为了降低commit时减少fsync()和fdatasync()的系统调用,缓解数据库对底层磁盘IO次数,使用group commit可以使多个事务同时commit,通过把多个fsync操作合并起来,提高系统并发度。

●非阻塞客户端库

该功能只需要替换客户端库,服务器端完全没有影响;阻塞client library和非阻塞IO有点类似,应用程序在提交一个查询或者进行一个数据库操作以后,就可以去做其他的事情了。当数据库把结果准备好以后,应用程序再回来处理数据就行了。避免用户请求由于数据库操作时间过长被阻塞,导致响应时间非常长。非阻塞API在客户端库中是独立的函数,完全不影响现有的应用程序,也不会带来任何性能上的降低。

●微秒扩展和类型支持

时间类型的值精确到微秒级,精度的数字可以从0到6,如果不指定,则认为为0,也就是最小到秒级别,以便跟MySQL兼容。对应的、配套的日期时间函数,information_schema,存储过程等都同样进行了修改。比如INFORMATION_SCHEMA.COLUMNS就增加 DATETIME_PRECISION字段来表示时间的精度。

●全文搜索引擎

集成炙手可热的开源搜索引擎SphinxSE,通过install plugin操作即可插入。MariaDB通过它向搜索引擎发送查询和获得查询结果。而应用程序透过MariaDB来向Sphinx获得数据,或者将MariaDB中的表和sphinx 结果进行Join,或者利用MariaDB进行过滤统计等操作。

●子查询优化

?半联接子查询优化,变换子查询到成半连接,实体类似于内部连接,

然后使用连接优化器选择最佳的半联接执行策略。

?非半联接优化,物化为非相关子查询,用高效的null自觉执行;以及

in到exists的转换。

●地理信息系统相关扩展

MariaDB提供了地理信息的创建,存储和分析,对于基本的二维地理信息,都可以支持。而且这些都可以用在几大通用的存储引擎上: MyISAM, InnoDB/XtraDB 和 ARCHIVE。

●MyISAM索引缓存分离

Maryiadb为避免Myisam中key cache的mutex资源争用,把key cache 隔离成一个一个的Segment,每个segment独立一个锁。谁需要key cache 的某个页,只需要获得这个页所在的 segment的锁,而没有必要去竞争整个key cache的锁。MariaDB引入了这个特性以后,使得MyISAM的性能提升了250%。

●授权插件

MariaDB的授权插件允许你登录了操作系统以后以同样的用户免密码直接登录MariaDB,避免了多次密码输入和设置各种密码的麻烦。MariaDB 另外还提供了“提问”和“三次试错”的授权插件。

●行限制

在检查的数据行数大于指定值之后就直接中断查询退出,节省数据库IO资源。

●进程进度报告

在做一个长时间操作时,MariaDB可以让用户看到一共有多少步,目前完成了哪些步,目前在这步上完成的百分比。用户就可以判断目前的进度和整个操作需要进行多少时间。

●存储引擎旁路查询

HandleSocket是MariaDB在NoSQL方面的扩展,它能够绕过SQL解析等步骤直接从InnoDB/XtraDB中获取数据,这样用户就可以把MariaDB当成一个NoSQL来使用。它能够接受TCP链接,并且执行客户端的请求,但是它并不支持SQL。正因如此,它会尽量优化批量操作,所以它的CPU消耗非常小;另外,协议相对mysql/libmysql会紧凑得多,所以网络上的

开销也会小的多。通过对比测试,比一般的NoSQL产品要快得多。

●动态列

MariaDB为NoSQL的扩展提供的另外一个特性,使用动态列对表的每一行都可以有一个“虚拟列”,作为一个额外的字段存在blob中,该列

用于保存一个对象的不同属性,每个属性在各行之间可以完全不同,“虚

拟列”的个数和内容完全由应用程序来控制和解释。

3.2. MariaDB 10的主要特性

●复制改进

?MariaDB 10 在性能上树立了一个新的标准,比其它分支速度更快。

?通过多源复制功能,从多个主服务器中复制数据。

● NoSQL 特性

?CONNECT 引擎支持动态访问不同的数据源,包括非结构化的文件,比

如文件夹中的日志文件或任意 ODBC 数据库。

?更好的 ETL(Extraction、Transformation、Load)和实时分析能力。

?MariaDB 10 中,动态列(Dynamic Columns)存储表中每一行不同标

签的数据对象时的方式和 NoSQL 技术基本一致。

?可以直接访问 Cassandra 数据库中的数据,并可以直接与目前主流的

大数据技术进行交互。

●分片(Sharding)改进

MariaDB 10 内置了 SPIDER 引擎形式的分片功能,允许将大数据表跨多个服务器进行分割,与新的复制功能相结合,大大提升了可用性。

4使用情况

简单、免费、扩展性、相对成熟等一直都是MySQL的吸引所在,但被Oracle 收购后的日渐封闭与缓慢的更新,并随着自身脚步的放缓、各个竞争对手的追赶,这些杀手级特性已不在有吸力,众多Linux发行版、互联网公司、大型商业机构等开始逐渐抛弃了这个人气开源数据库,而转向了MariaDB:

Fedora:从Fedora 19开始,已经换用 MariaDB成为依赖软件的默认选择。

Slackware:最古老的linux发行版在2013年3月23日开始,在其发行中使用MariaDB替换Mysql。

Arch Linux:2013年3月25开始,在其发行版中使用MariaDB替代Mysql。

Redhat:2013年6月,Red Hat宣布企业版发行版RHEL 7将用MariaDB 替代MySQL。

维基百科:将其使用的MySQL迁移到MariaDB 5.5。

Google:将迁移上万台MySQL到MariaDB。

IBM、Rockspace、SUSE Linux、HP、Fusion-IO、tumblr、Mozilla基金会、京东云及Taobao等众多大公司都在大规模使用MariaDB。

5性能对比测试

5.1.测试环境

硬件型号HP Pro 2000

CPU Pentium Dual-Core E5800 3.20GHz

内存4G

硬盘WD3200AAJS-60Z0A0

数据库版本Mysql-5.5.43、Mariadb-5.5.42、Mysql-5.6.24、Mariadb-10.0.17

测试工具Sysbench-0.5

数据库主要配置参数max_connections = 500

innodb_file_per_table = true

innodb_data_file_path = ibdata1:500M:autoextend innodb_flush_log_at_trx_commit = 2

innodb_log_buffer_size = 200M

innodb_log_file_size = 600M

innodb_log_files_in_group = 5

innodb_buffer_pool_size = 3G

innodb_read_io_threads = 8

innodb_write_io_threads = 8

测试说明:此次性能对比测试主要采用Mysql和MariaDB的最新GA版本和5.5的版本(主要进行回归对比测试);而硬件采用了普通的PC,主要能说明性能优劣即可;而数据库参数配置方面,除了主要的且常规的影响性能的参数有修改外,其它无过多优化,采用各自默认的配置。

5.2.测试结果解析

首先是OLTP只读测试:

如上图所示,MariaDB 5.5的性能在所列版本中表现非常突出,并且在线程数为8以上时并发表现最佳;而同版本的Mysql 5.5甚至高版本的5.6在表现上要差一些。MariaDB 10相比对应版本的Mysql 5.6要稍好些,但没有那么明显。

对应的响应时间图表如下:

总体而言,结合上图的事务并发数,MariaDB的两个版本在响应时间上均比Mysql要低,意味着它们能更好地分配CPU周期和有效利用内存;但在线程数为128和256时,并不是太明显;在线程数为16以下时,MariaDB两个版本响应时间相差无几,线程数为16时有点小波动;而Mysql 5.5在线程数为128以下时,比Mysql 5.6表现要好。

其次是OLTP的读写测试:

如上图所示,在单线程时,所有版本表现相差无几,由图可知Mysql 5.6在起初有一小段“预热”的过程;但在多线程情况下,由图可知相差比较大,并且高版本的相比低版本的下滑不少。

与其对应的响应时间如下:

在线程数小于128时,响应时间差距较大,高版本的并无过多优势。在线程数大于32时,Mysql和MariaDB低版本的响应时间基本一致,结合事务数综合来看,MariaDB要比Mysql强一些,但在高并发下,并不是很明显。

5.3.测试总结

从测试结果来看,Mysql 5.6及MariaDB 10无论是只读还是读写,表现比各自的前一个版本要差,这与官方提供的测试结果不符;有可能本次测试的机器配置较低;根据Mysql官方的说法,5.6在CPU多核的利用上进行了优化,因此在高配的机器上会更能利用其新特性,体现其优势。

但不管版本高低,在相同硬件及配置上,从OLTP的读写测试及响应时间的测试数据结果来看,MariaDB都要比Mysql要快。

6处理非结构化数据

6.1.概述

相对于结构化数据(即行数据,存储在数据库里,可以用二维表结构来逻辑表达实现的数据)而言,不方便用数据库二维逻辑表来表现的数据即称为非结构化数据,包括所有格式的办公文档、文本、图片、标准通用标记语言下的子集XML、HTML、各类报表、图像和音频/视频信息等等;由此可见,其字段长度可变,并且每个字段的记录又可以由可重复或不可重复的子字段构成。

MariaDB 本身是关系型数据库,但借助MariaDB 10集成的CONNECT存储引擎来支持动态访问不同的数据源,及处理非结构化数据,比如文件夹中的日志文件或任意ODBC数据库等。

CONNECT主要功能如下:

不需要额外的SQL语言扩展

针对许多外部数据类型(例如文件、数据源等)的内嵌封装支持

有用于JSON、XML和HTML等文件的NoSQL查询工具

针对外部文件和众多数据源的读/写支持

适时下推where子句

特殊的虚拟列支持

多表并行执行

通过子文件和子表的分区支持(允许表分片)

支持MRR(Multi Range Read)的检索、更新和删除

提供远程、块、动态和虚拟变址的支持

能在远程服务器上执行复杂检索

提供API,通过C++来编写附加的FDW

6.2.使用语法

创建“CONNECT”表的语法同标准的创建表语法,除指定“engine=CONNECT”外,根据实际需要附加针对表和列的相关选项即可。以下列出常用的相关选项:

表选项类型描述AVG_ROW_LENGTH 整型帮助“CONNECT”预估可变记录的长度。

BLOCK_SIZE 整型每个FIX、BIN、DBF或者VEC表中每个块包含的行数,针对ODBC 表这是行集大小选项。

CATFUNC 字符串型目录表用的目录函数。

COLIST 字符串型OCCUR表的列列表。

COMPRESS 布尔型数据文件是否压缩,默认为NO。CONNECTION 字符串型指定ODBC or MYSQL 表的连接信息。DATA_CHARSET 字符串型外部文件或数据源所使用的字符集。

DBNAME 字符串型用于ODBC、MYSQL、catalog和PROXY 的数据库名,数据库的概念有时被认为是一种模式。

ENGINE 字符串型必须指定为CONNECT.

ENDING 整型行结尾长度,Unix/Linux 默认为1,Windows为2。

HEADER 整型应用于CSV、VEC和HTML文件,它的意思是依赖于表类型。

HUGE 布尔型指定一个表文件能够大于2G,对于MYSQL表,避免结果集保存在内存中。LRECL 整型文件记录大小(默认是计算的)。

MAPPED 布尔型指定处理表文件时是否使用文件映射。

MODULE 字符串型执行访问非标准表类型时dll或共享库(路径)名。

MULTIPLE 整型用于指定复杂的文件表。

OPTION_LIST 字符串型用于指定所有其它选项,非直接指定。

QCHAR 字符串型用于指定引用CSV表时一些字段的字符集或ODBC表时的标识符。QUOTED 整型用于CSV表文件时的引用级别。

READONLY 布尔型如果数据文件不必修改或删除时为真。

SEP_CHAR 字符串型用于指定CSV文件的字段分隔符。

SEPINDEX 布尔型为真时,在分隔文件时索引被保存。

SPLIT 布尔型针对VEC表,当每个字段都在分隔的文件里时为真。

SRCDEF 字符串型经过ODBC或Mysql API或一个PIVOT表检索时的源定义。SUBTYPE 字符串型OEM表的子类型。

TABLE_LIST 字符串型TBL表的逗号分隔列表。

TABLE_TYPE 字符串型外部表类型: DOS、FIX、BIN、CSV、FMT、XML、JSON、INI、DBF、VEC、ODBC、MYSQL、TBL、PROXY、XCOL、OCCUR、PIVOT、VIR、DIR、WMI、MAC 和OEM。

TABNAME 字符串型针对ODBC、MYSQL、PROXY或者catalog的表类型;或者XML的顶级节点名。

列选项类型描述

DATE_FORMAT 字符串型用于指定存储于文件中日期的格式。

DISTRIB Enum 字段所允许的值。

FIELD_FORMAT 字符串型一些表类型的字段格式。

FIELD_LENGTH 整型针对字符列设置其内部字段长度。

FLAG 整型整型值,意味着其所依赖的表类型。

MAX_DIST 整型这个字段列中不同值的最大数。

SPECIAL 字符串型设置列字段值的特殊名称。

6.3.常见非结构化文件处理

以下针对最常用的几种非结构化文件类型,研究“CONNECT”是如何处理的。

6.3.1DOS、FIX和FMT类型文件

基于常规的文本文件,其格式相对固定,即每行记录,字段域位置的偏移量都是固定的,如下例所示:

[root@maxDB test]# cat /root/test/dept.dat

0318 Chain 70012 SALES Manager/header

0021 American 87777 CHQ Engineer/IT

0319 Japan 40567 SALES Coder It

2452 India 31416 DEVELOPMENT Sales & development

[root@maxDB test]#

按文件中各列属性创建一个常规表,并指定“engine”、“table_type”、“file_name”值。

MariaDB [test]> create table department (number char(4) not null,

-> location char(15) not null flag=5,

-> director char(5) not null flag=20,

-> function char(12) not null flag=26,

-> name char(22) not null flag=38)

-> engine=CONNECT table_type=DOS file_name='/root/test/dept.dat';

查看“department”表,即为“dept.dat”文件内容。

MariaDB [test]> select * from department;

+--------+----------+----------+-------------+---------------------+

| number | location | director | function | name |

+--------+----------+----------+-------------+---------------------+

| 0318 | Chain | 70012 | SALES | Manager/header |

| 0021 | American | 87777 | CHQ | Engineer/IT |

| 0319 | Japan | 40567 | SALES | Coder It |

| 2452 | India | 31416 | DEVELOPMENT | Sales & development |

+--------+----------+----------+-------------+---------------------+

4 rows in set (0.00 sec)

同时通过数据库DML语句对其进行更新、删除和插入等操作,如下对号码为2432的行进行更新。

MariaDB [test]> update department set location='Australia' where number='2452';

Query OK, 1 row affected (0.04 sec)

Rows matched: 1 Changed: 1 Warnings: 0

查看原文,即可看出数据已发生更改。

[root@maxDB test]# cat /root/test/dept.dat

0318 Chain 70012 SALES Manager/header

0021 American 87777 CHQ Engineer/IT

0319 Japan 40567 SALES Coder It

2452 Australia 31416 DEVELOPMENT Sales & development

[root@maxDB test]#

虽然在表文件中的域通常代表着文本,你也可以根据其内容在数据库中自由地定义其相应类型,如字符串、日期、整型、单精度等等;如下例所示:

[root@maxDB test]# cat /root/test/max.txt

12345,'Isoft',#200;5009.13

56, 'King' ,#4256 ;18009

345 ,'Store' , #67; 19000.25

[root@maxDB test]#

这个文件中各列都不相同,有空格、单引号、警号、分号等,因此在创建表时需要指定各列域的规则,使其用数据库检索时自动匹配相应列值,这类表需使用FMT表类型。

MariaDB [test]> create table maxfm(

ID Integer(5) not null field_format=' %n%d%n',

NAME Char(16) not null field_format=' , ''%n%[^'']%n''', DEPNO Integer(4) not null field_format=' , #%n%d%n',

SALARY Double(12,2) not null field_format=' ; %n%f%n') Engine=CONNECT table_type=FMT file_name='/root/test/max.txt';

Query OK, 0 rows affected (0.09 sec)

备注:根据文件各列属性,使用“field_format”参数指定本列格式;示例中其每列有一前导空格,但无尾随空格;%n指定列值的起止标记,%d代表整型,方括号内为匹配其单引号,%f为十进制数。

查询其表内容,和源文件中一模一样:

MariaDB [test]> select * from maxfm;

+-------+-------+-------+----------+

| ID | NAME | DEPNO | SALARY |

+-------+-------+-------+----------+

| 12345 | Isoft | 200 | 5009.13 |

| 56 | King | 4256 | 18009.00 |

| 345 | Store | 67 | 19000.25 |

+-------+-------+-------+----------+

3 rows in set (0.05 sec)

MariaDB [test]>

如下示例展示如何通过数据库的方式来查看http后台日志。

[root@maxDB test]# cat /root/test/access_log

192.168.35.168 - - [27/May/2015:09:48:05 -0400] - "GET /iSoft-3.0/x86_64/repodata/repomd.xml HTTP/1.1" 302

192.168.35.31 - - [17/Jul/2001:00:01:13 -0400] - "GET /usnews/home.htm HTTP/1.1" 302

127.0.0.1 - - [25/May/2015:09:02:36 -0400] - "GET /initLog.php HTTP/1.1" 404 127.0.0.1 - - [25/May/2015:09:02:36 -0400] - "GET /GetFile HTTP/1.1" 404 [root@maxDB test]#

由于access_log文件内容比较有规律,如第一列为IP,需定义其为字符串型;后接两个减号,和中括号内的日期时间格式,定义两个域格式,即“field_format”和“date_format”即可;双引号中以“GET”开头,后接一个文件的绝对路径和相应“HTTP”,指定其域格式。创建表时其语法和标准的SQL类似,不同之处在于,需要找出其规律和各列共有的属性,定义相关域格式即可。

MariaDB [test]> create table WEBSAMP (

IP char(15) not null field_format='%n%s%n',

DATE datetime not null field_format=' - - [%n%s%n -0400]' date_format='DD/MMM/YYYY:hh:mm:ss' field_length=20,

FILE char(128) not null field_format=' - "GET %n%s%n',

HTTP double(4,2) not null field_format=' HTTP/%n%f%n"',

NBONE int(5) not null field_format=' %n%d%n')

Engine=CONNECT table_type=FMT lrecl=400 file_name='/root/test/access_log';

MariaDB [test]> select * from WEBSAMP;

+--------------+-----------------+-------------------+------+-------+

| IP | DATE | FILE | HTTP | NBONE | +--------------+-----------------+-------------------+------+-------+

|192.168.35.168|2015-05-27 09:48:05 | /iSoft-3.0/x86_64/repodata/repomd.xml | 1.10 | 302 |

|192.168.35.31|2001-07-17 00:01:13 | /usnews/home.htm | 1.10 | 302 | | 127.0.0.1 | 2015-05-25 09:02:36 | /initLog.php | 1.10 | 404 | | 127.0.0.1 | 2015-05-25 09:02:36 | /GetFile | 1.10 | 404 |

+--------------+-----------------+-------------------+------+-------+

4 rows in set (0.00 sec)

到目前为止,FMT格式的表只能读,还不能进行相关的修改操作。

6.3.2CSV文件

CSV是一种通用的、相对简单的文件格式,被用户、商业和科学广泛应用。最

广泛的应用是在程序之间转移表格数据,而这些程序本身是在不兼容的格式上进

行操作的(往往是私有的和/或无规范的格式)。因为大量程序都支持某种CSV变体,至少是作为一种可选择的输入/输出格式。

例如,一个用户可能需要交换信息,从一个以私有格式存储数据的数据库程序,到一个数据格式完全不同的电子表格。最可能的情况是,该数据库程序可以导出

数据为“CSV”,然后被导出的CSV文件可以被电子表格程序导入。

CSV文件规则:

开头是不留空,以行为单位。

可含或不含列名,含列名则居文件第一行。

一行数据不跨行,无空行。

以半角逗号(即,)作分隔符,列为空也要表达其存在。

列内容如存在半角逗号(即,)则用半角双引号(即"")将该字段值包含起来。

列内容如存在半角引号(即")则应替换成半角双引号("")转义,并用半角引号(即"")将该字段值包含起来。

文件读写时引号,逗号操作规则互逆。

内码格式不限,可为ASCII、Unicode 或者其他。

不支持特殊字符

示例:

[root@maxDB test]# cat /root/test/max.csv

Name;stime;company

"Isoft";17/05/08;8

"Redhat";12/08/96;8

"Suse";12/01/98;1

"Redflag";12/06/01;1

[root@maxDB test]#

CSV格式的文件,创建表较简单,一般只需要使用“sep_char”参数指定其分隔符即可。

MariaDB [test]> create table maxcsv(

name varchar(12) not null,

stime date not null date_format='DD/MM/YY',

company smallint(2) not null)

engine=connect table_type=csv file_name='/root/test/max.csv' header=1 sep_char=';' quoted=1;

Query OK, 0 rows affected (0.18 sec)

MariaDB [test]> select * from maxcsv;

+---------+------------+---------+

| name | stime | company |

+---------+------------+---------+

| Isoft | 2008-05-17 | 3 |

| Redhat | 1996-08-12 | 8 |

| Suse | 1998-01-12 | 1 |

| Redflag | 2001-06-12 | 1 |

+---------+------------+---------+

4 rows in set (0.03 sec)

针对CSV文件,同样可以使用DML语句对其进行修改,并且直接反应到源文件。

MariaDB [test]> update maxcsv set company=8 where name='Isoft';

Query OK, 1 row affected (0.02 sec)

Rows matched: 1 Changed: 1 Warnings: 0

MariaDB [test]> select * from maxcsv;

+---------+------------+---------+

| name | stime | company |

+---------+------------+---------+

| Isoft | 2008-05-17 | 8 |

| Redhat | 1996-08-12 | 8 |

| Suse | 1998-01-12 | 1 |

| Redflag | 2001-06-12 | 1 |

+---------+------------+---------+

4 rows in set (0.00 sec)

MariaDB [test]>

6.3.3XML文件

XML(Extensible Markup Language)即扩展标记语言,是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具。并且是一种简单的数据存储语言,使用一系列简单的标记描述数据;其是SGML的子集,其目标是允许普通的SGML在Web上以目前HTML的方式被服务、接收和处理。XML被设计成易于实现,且可在SGML和HTML之间互相操作。

目前XML已应用在设计置标语言、数据交换、替代传统的EDI、智能代理和精确搜索、Web应用、集成不同数据源、本地计算、数据的多种显示和网络出版、支持Web应用的互操作和集成、文件保值等诸多领域。

CONNECT支持XML文件,对于这类表,并非使用操作系统自身的I/O函数,而是使用特殊的库。当前使用两种库,即“DOMDOC”和“libxml2”,前者主要用于Windows,后者用在其它操作系统上,如UNIX/Linux等。

示例如下:

[root@maxDB test]# cat /root/test/max.xml

相关主题
相关文档
最新文档