1. 程式人生 > >第十七章 MariaDB

第十七章 MariaDB

mariadb mysql 關系型數據庫 rdbms 關系型數據庫範式

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用戶帳號由兩部分組成,[email protected],表示此USERNAME只能從此HOST上遠程登錄。

這裏([email protected])[email protected]l程序,其值可為:

支持使用通配符:

%:匹配任意長度的任意字符。如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 [email protected] [IDENTIFIED BY ‘password‘];    #創建數據庫用戶帳號並給定密碼
DROP USER [email protected];    #刪除數據庫用戶

數據庫:

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 [email protected] [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 [email protected];查看指定用戶的授權情況
SHOW GRANTS FOR CURRENT_USER;查看當前用戶的授權情況

取消授權:REVOKE

REVOKE priv_type,... ON db_name.table_name FROM [email protected];

註意:MariaDB服務進程啟動時會讀取mysql庫中的所有授權表至內存中:

a) GRANT或REVOKE等執行權限操作會保存於表中,MariaDB的服務進程會自動重讀授權表,並更新至內存中

b) 對於不能夠或不能及時重讀授權表的命令,可手動讓MariaDB的服務進程重讀授權表

mysql> FLUSH PRIVILEGES;


本文出自 “忘情居” 博客,請務必保留此出處http://itchentao.blog.51cto.com/5168625/1943508

第十七章 MariaDB