CentOS安裝光盤
項目官方:
https://downloads.mariadb.org/mariadb/repositories/
安裝和使用MariaDB
CentOS 7直接提供
CentOS 6
MariaDB的特性
1.MariaDB的特性:
單進(jìn)程矗钟,多線程
插件式存儲引擎:存儲管理器有多種實現(xiàn)版本唆香,功能和特性可能均略有差別;用戶可根據(jù)需要靈活選擇存儲引擎也稱之為“表類型”
(1) 更多的存儲的存儲引擎
MyISAM ==> Aria
InnoDB ==> XtraDB
Mysql5.5.8開始innoDB引擎是MYSQL默認(rèn)引擎吨艇,
InnoDB對比MyISAM的最大特點就是InnoDB支持事務(wù)
2) 諸多擴展和新特性
(3) 提供了較多測試組件
(4) 開源
(1)Centos7的MariaDB數(shù)據(jù)庫包括兩個包組:
Mariadb mariadb -client
(2)mariadb組包括下面包:
mariadb -server:mandatory package
mariadb -bench:optional package
mariadb -test :optional package
(3)mariadb -client組包括下面包
Mariadb:mandatory package
MySQL -python:default package
mysql -connector-odbc:default package
libdbi-dbd-mysql:optional package
mysql-connector-java:optional package
perl-DBD-MySQL:optional package
配置文件: /etc/my.cnf和/etc/my.cnf.d/ *.cnf
2. 安裝
yum groupinstall mariadb mariadb-client
systemctl start mariadb
systemctl enable mariadb
(1)提高安全性
mysql_secure_installation
? 設(shè)置數(shù)據(jù)庫管理員root口令
? 禁止root遠(yuǎn)程登錄
? 刪除anonymous用戶帳號
? 刪除test數(shù)據(jù)庫
? 偵聽3306/tcp端口可以在綁定有一個或全部接口IP上
(2)Vim /etc/my.cnf
[mysqld]加一行:(忽略名字反向解析躬它,加速訪問)
skip-networking=1忽略名字解析
只偵聽本地客戶端, 所有和服務(wù)器的交互都通過一個socket實現(xiàn)东涡,socket的配置存放在/var/lib/mysql/mysql.sock) 可在/etc/my.cnf修改
? firewall-cmd --permanent --add-service=mysql
? firewall-cmd --reload
3.MairaDB配置: 二進(jìn)制格式安裝過程
(1) 準(zhǔn)備用戶
groupadd -r -g 306 mysql
useradd -r -g 306 -u 306 –m –d /app/data mysql -s /sbin/nologin
-m -d /app/data指定放置家目錄,只是存放數(shù)據(jù)
-r制定系統(tǒng)用戶
-g 306指定用戶組及其編號
-s /sbin/login安全
(2) 準(zhǔn)備數(shù)據(jù)目錄
以/app/data為例,建議使用邏輯卷
chown mysql:mysql /app/data
(3) 準(zhǔn)備二進(jìn)制程序
? tar xf mariadb-VERSION-linux-x86_64.tar.gz -C
/usr/local
? cd /usr/local;ln -sv mariadb-VERSION mysql
? chown -R root:mysql /usr/local/mysql/
(4) 準(zhǔn)備配置文件
配置格式:
類ini格式冯吓,各程序由單個配置文件提供配[prog_name]
配置文件查找次序:后面覆蓋前面的配置文件
/etc/my.cnf --> /etc/mysql/my.cnf --> --default extrafile=/PATH/TO/CONF_FILE--> ~/.my.cnf
mkdir /etc/mysql/
cp support-files/my-large.cnf /etc/mysql/my.cnf
[mysqld]中添加三個選項:
datadir = /app/data
innodb_file_per_table = on
skip_name_resolve = on 禁止主機名解析
(5)創(chuàng)建數(shù)據(jù)庫文件
cd/usr/local/mysql/
./scripts/mysql_install_db --datadir=/app/data --user=mysql
(6)準(zhǔn)備日志文件
touch /var/log/mysqld.log
chown mysqld /var/log/mysqld.log
(7)準(zhǔn)備服務(wù)腳本,并啟動服務(wù)
cp ./support-files/mysql.server /etc/rc.d/init.d/mysqld
chkconfig --add mysqld
service mysqld start
(8)安全初始化
/user/local/mysql/bin/mysql_secure_installation
4.mysql:CLI交互式客戶端程序
服務(wù)器監(jiān)聽的兩種socket地址:
ip socket: 監(jiān)聽在tcp的3306端口疮跑,支持遠(yuǎn)程通信
unix sock: 監(jiān)聽在sock文件上(/tmp/mysql.sock客戶端,/var/lib/mysql/mysql.sock服務(wù)器端)组贺,僅支持本機通信
server: localhost, 127.0.0.1 自動使用unix sock
5.命令行交互式客戶端程序:mysql
(1)mysql選項:
-u USERNAME: 用戶名;默認(rèn)為root
-h HOST: 服務(wù)器主機; 默認(rèn)為localhost
-p PASSWORD:用戶的密碼;建議使用-p,默認(rèn)為空密碼
(2)mysql用戶賬號由兩部分組成:
'USERNAME'@'HOST'
HOST用于限制此用戶可通過哪些遠(yuǎn)程主機連接mysql服務(wù)
(3)支持使用通配符:
% 匹配任意長度的任意字符
172.16.0.0/16 或 172.16.%.%
_ 匹配任意單個字符
6.執(zhí)行命令
(1)運行mysql命令:默認(rèn)空密碼登錄
mysql>use mysql
mysql>select user();查看當(dāng)前用戶
mysql>SELECT User,Host,Password FROM user;
(2)安全初始化
/usr/local/mysql/bin/mysql_secure_installatoin
(3)登錄系統(tǒng):mysql –uroot –p
(4)客戶端命令:本地執(zhí)行
mysql> help
每個命令都完整形式和簡寫格式
mysql> status 或 \s
(5)服務(wù)端命令:通過mysql協(xié)議發(fā)往服務(wù)器執(zhí)行并取回結(jié)果
每個命令都必須命令結(jié)束符號祖娘;默認(rèn)為分號
SELECT VERSION();
7.關(guān)系型數(shù)據(jù)庫的常見組件
? 數(shù)據(jù)庫:database
? 表:table
行:row
列:column
? 索引:index
? 視圖:view
? 用戶:user
? 權(quán)限:privilege
? 存儲過程:procedure失尖,過程無返回值
? 存儲函數(shù):function,過程有返回值
? 觸發(fā)器:trigger
? 事件調(diào)度器:event scheduler,任務(wù)計劃
8.SQL語句構(gòu)成
? Keyword組成clause
? 多條clause組成語句
? SELECT * SELECT子句
? FROM products FROM子句
? WHERE price>400 WHERE子句
? 這是一組語句掀潮,由三個子句構(gòu)成菇夸,SELECT,FROM和WHERE都是關(guān)鍵字
9.SQL語句分類
DDL: Data Defination Language
CREATE, DROP, ALTER
DML: Data Manipulation Language
INSERT, DELETE, UPDATE
DCL:Data Control Language
GRANT, REVOKE
DQL:Data Query Language
SELECT
10.SQL語言規(guī)范
? 在數(shù)據(jù)庫系統(tǒng)中,SQL語句不區(qū)分大小寫(建議用大寫)
? 但字符串常量區(qū)分大小寫
? SQL語句可單行或多行書寫胧辽,以“;”結(jié)尾
? 關(guān)鍵詞不能跨多行或簡寫
? 用空格和縮進(jìn)來提高語句的可讀性
? 子句通常位于獨立行峻仇,便于編輯,提高可讀性
11.注釋
SQL標(biāo)準(zhǔn):
/*注釋內(nèi)容*/ 多行注釋
-- 注釋內(nèi)容 單行注釋邑商,注意有空格
? MySQL注釋:
#
12.數(shù)據(jù)庫對象的命名規(guī)則
? 必須以字母開頭
? 可包括數(shù)字和三個特殊字符(# _ $)
? 不要使用MySQL的保留字
? 同一Schema下的對象不能同名
13.數(shù)據(jù)庫操作
(1) 創(chuàng)建數(shù)據(jù)庫:
CREATE DATABASE|SCHEMA [IF NOT EXISTS] 'DB_NAME';
CHARACTER SET 'character set name'
COLLATE 'collate name'
(2)刪除數(shù)據(jù)庫
DROP DATABASE|SCHEMA [IF EXISTS] 'DB_NAME';
(3)查看支持所有字符集:
SHOW CHARACTER SET;
(4)查看支持所有排序規(guī)則:
SHOW COLLATION;
(5)獲取命令使用幫助:
mysql> HELP KEYWORD;
? 查看數(shù)據(jù)庫列表:
mysql> SHOW DATABASES;
14.創(chuàng)建表
(1) CREATE TABLE [IF NOT EXISTS] ‘tbl_name’ (col1 type1 修飾符, col2 type2 修飾符, ...)
(2)字段信息
? col type1
? PRIMARY KEY(col1,...)
? INDEX(col1, ...)
? UNIQUE KEY(col1, ...)
(3)表選項:
? ENGINE [=] engine_name
SHOW ENGINES;查看支持的engine類型
? ROW_FORMAT [=]
{DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}
獲取幫助:mysql> HELP CREATE TABLE;
(4) 表操作
? 查看所有的引擎:SHOW ENGINES;
? 查看表:SHOW TABLES [FROM db_name];
? 查看表結(jié)構(gòu):DESC [db_name.]tb_name;
? 刪除表:DROP TABLE [IF EXISTS] tb_name摄咆;
? 查看表創(chuàng)建命令:SHOW CREATE TABLE tbl_name;
? 查看表狀態(tài):SHOW TABLE STATUS LIKE 'tbl_name'\G
15.數(shù)據(jù)類型
(1) 整型
? tinyint(m) 1個字節(jié) 范圍(-128~127)
? smallint(m) 2個字節(jié) 范圍(-32768~32767)
? mediumint(m) 3個字節(jié) 范圍(-8388608~8388607)
? int(m) 4個字節(jié) 范圍(-2147483648~2147483647)
? bigint(m) 8個字節(jié) 范圍(+-9.22*10的18次方)
取值范圍如果加了unsigned,則最大值翻倍人断,如tinyint unsigned的取值范圍為(0~255)
int(m)里的m是表示SELECT查詢結(jié)果集中的顯示寬度吭从,并不影響實際的取值范圍
MySQL可以為整型類型指定寬度,例如Int(11)恶迈,對絕大多數(shù)應(yīng)用這是沒有意義的:它不會限制值的合法范圍涩金,只是規(guī)定了MySQL的一些交互工具(例如MySQL命令行客戶端)用來顯示字符的個數(shù)。對于存儲和計算來說暇仲,Int(1)和Int(20)是相同的
(2)浮點型(float和double)步做,近似值
? float(m,d) 單精度浮點型 8位精度(4字節(jié)) m總個數(shù),d小數(shù)位
? double(m,d) 雙精度浮點型 16位精度(8字節(jié)) m總個數(shù)奈附,d小數(shù)位
? 設(shè)一個字段定義為float(6,3)全度,如果插入一個123.45678,實際數(shù)據(jù)庫里存的是123.457,但總個數(shù)還以實際為準(zhǔn)斥滤,即6位
(3)定點數(shù)
? 在數(shù)據(jù)庫中存放的是精確值,存為十進(jìn)制
? decimal(m,d) 參數(shù)m<65 是總個數(shù)将鸵,d<30且 d<m 是小數(shù)位
? MySQL5.0和更高版本將數(shù)字打包保存到一個二進(jìn)制字符串中(每4個字節(jié)存9個數(shù)字)。例如佑颇,decimal(18,9)小數(shù)點兩邊將各存儲9個數(shù)字顶掉,一共使用9個字節(jié):小數(shù)點前的數(shù)字用4個字節(jié),小數(shù)點后的數(shù)字用4個字節(jié)挑胸,小數(shù)點本身占1個字節(jié)
? 浮點類型在存儲同樣范圍的值時洲愤,通常比decimal使用更少的空間玩荠。float使用4個字節(jié)存儲见擦。double占用8個字節(jié)
? 因為需要額外的空間和計算開銷孵淘,所以應(yīng)該盡量只在對小數(shù)進(jìn)行精確計算時才使用decimal——例如存儲財務(wù)數(shù)據(jù)。但在數(shù)據(jù)量比較大的時候闷沥,可以考慮使用bigint代替decimal
(4)字符串(char,varchar,_text)
? char(n) 固定長度萎战,最多255個字符
? varchar(n)可變長度,最多65535個字符
? tinytext 可變長度舆逃,最多255個字符
? text 可變長度蚂维,最多65535個字符
? mediumtext 可變長度戳粒,最多2的24次方-1個字符
? longtext 可變長度,最多2的32次方-1個字符
? BINARY(M) 固定長度虫啥,可存二進(jìn)制或字符蔚约,允許長度為0-M字節(jié),
? VARBINARY(M) 可變長度涂籽,可存二進(jìn)制或字符苹祟,允許長度為0-M字節(jié)
? 內(nèi)建類型:ENUM枚舉, SET集合
(5)char和varchar:
? 1.char(n) 若存入字符數(shù)小于n,則以空格補于其后评雌,查詢之時再將空格去掉树枫。所以char類型存儲的字符串末尾不能有空格,varchar不限于此景东。
? 2.char(n) 固定長度砂轻,char(4)不管是存入幾個字符,都將占用4個字節(jié)斤吐,varchar是存入的實際字符數(shù)+1個字節(jié)(n< n>255)搔涝,所以varchar(4),存入3個字符將占用4個字節(jié)。
? 3.char類型的字符串檢索速度要比varchar類型的快
(6)varchar和text:
? 1.varchar可指定n和措,text不能指定庄呈,內(nèi)部存儲varchar是存入的實際字符數(shù)+1個字節(jié)(n< n>255),text是實際字符數(shù)+2個字節(jié)派阱。
? 2.text類型不能有默認(rèn)值
? 3.varchar可直接創(chuàng)建索引诬留,text創(chuàng)建索引要指定前多少個字符。
varchar查詢速度快于text
(7)二進(jìn)制數(shù)據(jù):BLOB
? BLOB和text存儲方式不同颁褂,TEXT以文本方式存儲故响,英文存儲區(qū)分大小寫傀广,而Blob是以二進(jìn)制方式存儲颁独,不分大小寫
? BLOB存儲的數(shù)據(jù)只能整體讀出
? TEXT可以指定字符集,BLOB不用指定字符集
(8)日期時間類型
? date 日期 '2008-12-2'
? time 時間 '12:25:36'
? datetime 日期時間 '2008-12-2 22:06:44'
? timestamp 自動存儲記錄修改時間
? YEAR(2), YEAR(4):年份
若定義一個字段為timestamp伪冰,這個字段里的時間數(shù)據(jù)會隨其他字段修改的時候自動刷新誓酒,這個數(shù)據(jù)類型的字段可以存放這條記錄最后被修改的時間
16.修飾符
(1)所有類型:
? NULL 數(shù)據(jù)列可包含NULL值
? NOT NULL 數(shù)據(jù)列不允許包含NULL值
? DEFAULT 默認(rèn)值
? PRIMARY KEY 主鍵
? UNIQUE KEY 唯一鍵
? CHARACTER SET name 指定一個字符集
(2)數(shù)值型
? AUTO_INCREMENT 自動遞增,適用于整數(shù)類型
? UNSIGNED 無符號
示例
CREATE TABLE students (id int UNSIGNED NOT NULL PRIMARY KEY,
name VARCHAR(20)NOT NULL,
age tinyint UNSIGNED);
? DESC students;
? CREATE TABLE students2 (id int UNSIGNED NOT NULL ,
name VARCHAR(20)NOT NULL,
age tinyint UNSIGNED,
PRIMARY KEY(id,name));
17.表操作
? DROP TABLE [IF EXISTS] 'tbl_name';
? ALTER TABLE 'tbl_name'
添加字段:add
ADD col1 data_type [FIRST|AFTER col_name]
刪除字段:drop
修改字段:
alter(默認(rèn)值), change(字段名), modify(字段屬性)
? 查看表上的索引:
SHOW INDEXES FROM [db_name.]tbl_name;
? 查看幫助:
Help ALTER TABLE
修改表示例
? ALTER TABLE students RENAME s1;
? ALTER TABLE s1 ADD phone varchar(11) AFTER
name;
? ALTER TABLE s1 MODIFY phone int;
? ALTER TABLE s1 CHANGE COLUMN phone mobile
char(11);
? ALTER TABLE s1 DROP COLUMN mobile;
? Help ALTER TABLE 查看幫助
? ALTER TABLE students ADD gender ENUM('m','f')
? ALETR TABLE students CHANGE id sid int UNSIGNED
NOT NULL PRIMARY KEY;
? ALTER TABLE students ADD UNIQUE KEY(name);
? ALTER TABLE students ADD INDEX(age);
? DESC students;
? SHOW INDEXES FROM students;
? ALTER TABLE students DROP age;
18.索引
什么是索引贮聂?優(yōu)缺點靠柑?
索引是特殊數(shù)據(jù)結(jié)構(gòu);定義在查找時作為查找條件的字段
? 優(yōu)點:提高查詢速度
? 缺點:占用額外空間吓懈,影響插入速度
(1)創(chuàng)建索引:
創(chuàng)建索引必須要有索引名稱
CREATE INDEX index_name ON tbl_name
(index_col_name,...);
help CREATE INDEX
(2)刪除索引:
DROP INDEX index_name ON tbl_name;
(3)查看索引:
SHOW INDEXES FROM [db_name.]tbl_name;
19.DML語句
? DML: INSERT, DELETE, UPDATE
? INSERT
INSERT [INTO] tbl_name [(col_name,...)] {VALUES | VALUE} (val1,...),(...),...
? UPDATE:
UPDATE tbl_name SET col1=val1, col2=val2, ... [WHERE clause] [ORDER BY 'col_name' [DESC]] [LIMIT [m,]n];
? DELETE:
DELETE FROM tbl_name [WHERE clause] [ORDER BY 'col_name' [DESC]] [LIMIT [m,]n];
可先排序再指定刪除的行數(shù)
? TRUNCATE TABLE tbl_name; 清空表
20.DQL語名
(1)SELECT
? SELECT col1,col2,... FROM tbl_name [WHERE clause] [ORDER BY 'col_name' [DESC]] [LIMIT [m,]n];
Limit m,n 跳過m個歼冰,要n個
(2) 字段表示法:
*: 所有字段
as:字段別名,col1 AS alias1
(3)WHERE clause:
操作符:
>, <, >=, <=, ==, !=
BETWEEN ... AND ...
LIKE:
%:任意長度的任意字符
_:任意單個字符耻警;
RLIKE:正則表達(dá)式模式匹配
IS NULL 隔嫡,IS NOT NULL
IN (val1,val2,…)
條件邏輯操作:
and甸怕,or,not
示例
? DESC students;
? INSERT INTO students VALUES(1,'tom'腮恩,'m'),(2,'alice','f');
? INSERT INTO students(id,name) VALUES(3,'jack'),(4,'allen');
? SELECT * FROM students WHERE id < 3;
? SELECT * FROM students WHERE gender='m';
? SELECT * FROM students WHERE gender IS NULL;
? SELECT * FROM students WHERE gender IS NOT NULL;
? SELECT * FROM students ORDER BY name DESC LIMIT 2;
? SELECT * FROM students ORDER BY name DESC LIMIT 1,2;
? SELECT * FROM students WHERE id >=2 and id <=4
? SELECT * FROM students WHERE BETWEEN 2 AND 4
? SELECT * FROM students WHERE name LIKE ‘t%’
? SELECT * FROM students WHERE name RLIKE '.*[lo].*';
? SELECT id stuid,name as stuname FROM students
21.用戶賬號
(1)用戶賬號:'user'@'host'
user: 用戶名
host: 允許用戶通過哪些主機遠(yuǎn)程連接mysqld服務(wù)IP梢杭、網(wǎng)絡(luò)地址、主機名秸滴、通配符(%和_)
(2)創(chuàng)建用戶:
CREATE USER 'username'@'host' [IDENTIFIED
BY 'password'];
(3)查看當(dāng)前用戶:
SELECT user();
(4)查看用戶:
SELECT User,Host,Password FROM user;
(5)刪除用戶:DROP USER 'username'@'host';
示例:刪除默認(rèn)的空用戶
DROP USER ''@'localhost';
(1)更改口令:
1.SET PASSWORD FOR 'user'@'host' =
PASSWORD(‘password');
2.UPDATE user SET password=PASSWORD('magedu')
WHERE User='root' ;
注意:上面修改表的命令不會馬上生效武契,需執(zhí)行FLUSH PRIVILEGES生效
- /usr/local/mysql/bin/mysqladmin -u root –poldpassword
password 'newpassword‘
22.授權(quán)
(1)權(quán)限級別:管理權(quán)限、數(shù)據(jù)庫荡含、表咒唆、字段、存儲例程
? Help GRANT
? GRANT priv_type,... ON [object_type] db_name.tb_name
TO 'user'@'host' [IDENTIFIED BY 'password'] [WITH
GRANT OPTION];
? priv_type: ALL [PRIVILEGES]
? db_name.tb_name:
*.*: 所有庫的所表
db_name.*: 指定庫的所有表
db_name.tb_name: 指定庫的指定表
db_name.routine_name:指定庫的存儲過程和函數(shù)
? 示例:
GRANT SELECT,DELETE on testdb.* TO
'testuser'@'%'IDENTIFIED BY 'testpass‘;
(2)查看指定用戶獲得的授權(quán):
Help SHOW GRANTS
SHOW GRANTS FOR 'user'@'host';
SHOW GRANTS FOR CURRENT_USER[()];
(3)回收授權(quán):
REVOKE priv_type, ... ON db_name.tb_name FROM 'user'@'host
eg:
REVOKE DELETE ON testdb.* FROM 'testuser'@'%‘
注意:MariaDB服務(wù)進(jìn)程啟動時會讀取mysql庫中所有授權(quán)表至內(nèi)存
(1) GRANT或REVOKE等執(zhí)行權(quán)限操作會保存于系統(tǒng)表中释液,MariaDB的服務(wù)進(jìn)程通常會自動重讀授權(quán)表钧排,使之生效
(2) 對于不能夠或不能及時重讀授權(quán)表的命令,可手動讓MariaDB的服務(wù)進(jìn)程重讀授權(quán)表:mysql> FLUSH PRIVILEGES;