IV MariaDB

IV MariaDB

 

MariaDB & MySQL

DBMS

 

RDBMSrelation DB management system

C/S,通過專有協議;

關係模型(表,行&列,二維關係);

範式(第一範式,第二範式,第三範式);

關係運算(選擇,投影);

數據庫(表,索引,視圖(虛表);SQLstructure query language;編程接口(UDFuser define function,存儲過程,存儲函數,觸發器,事件調度器event scheduler;過程式編程(選擇,循環));

三層模型(物理層,邏輯層,視圖層);

解決方案(oraclesybaseinfomixDB2MySQLMariaDBpostgresqlsqlite(嵌入式));

 

 

MariaDB

插件式存儲引擎,>SHOW ENGINES;

單進程多線程(連接線程,守護線程);

配置文件(集中式的配置,

能爲mysql的各應用程序提供配置信息,[mysqld],[mysqld_safe],[mysql_multi],[server],[mysql],[mysqldump]

parameter = value,大多數參數都支持-_,如skip-name-resolveskip_name_resolve,儘量統一用一種;

查找路徑,/etc/my.cnf-->/etc/mysql/my.cnf-->$MYSQL_HOME/my.cnf-->--default-extra-file=/PATH/TO/SOMEDIR/my.cnf-->~/.my.cnf);

 

安裝方法(

OS venderrpm);

MySQL官方(rpm,二進制包(展開即可用),源碼編譯安裝));

 

安裝後的設定(

1

爲所有root用戶設定密碼:

>SET PASSWORD  #方式1

>UPDATE mysql.user SET password=PASSWORD('your_pass') WHERE user='myuser';

>FLUSH PRIVILEGES;   #方式2

#mysqladmin  #方式3

2

刪除所有匿名用戶:

>DROP USER 'myuser'@'localhost';

3

建議關閉主機名反解功能:

skip_name_resolve

注:12在安裝完後運行#mysql_secure_installation命令會有提示操作

);

 

元數據數據庫(mysql庫,user,host等表);

 

mysql<-->mysqld

 

客戶端程序:

#mysql   #交互式CLI工具;

#mysqldump  #備份工具,基於mysql協議向mysqld發起查詢請求,並將查得的所有數據轉換成insert語句保存在文本文件中;

#mysqladmin  #基於mysql協議管理mysqld

#mysqlimport  #數據庫導入工具;

常用選項:

-u --user

-h --host

-p --password

-P --port

--protocol=tcp|sock

-S --socket

-D --database

-C --compress

-e "SQL",如#mysql -e"SHOW DATABASES";

 

非客戶端類的管理工具:

#myisamchk

#myisampack

 

如何獲取程序默認使用的配置:

#mysql --print-defaults

#mysql --verbose [--help]

 

mysql的使用模式:

交互式模式,可運行命令兩類(

客戶端命令,\h

服務器端命令,SQL,需要語句結束符

);

腳本模式(

#mysql -uUSERNAME -hHOST -pPASSWORD < /PATH/FROM/file.sql

>source /PATH/FROM/file.sql

);

 

服務器端:

mysql工作特性有多種定義方式:配置文件參數,命令行選項;

#mysql --verbose [--help]   #獲取可用參數列表;

>SHOW GLOBAL VARIABLES [LIKE '%sql%'];   #獲取運行中的mysql進程使用的服務器參數及值;其中有些參數支持運行時修改,會立即生效;有些參數不支持運行時修改,只能通過修改配置文件,並重啓服務才生效;有些參數作用域是全局的,不可改變;有些參數可爲單個用戶提供單獨的配置;

>SHOW [SESSION] VARIABLES;

 

修改服務器變量的值:

>help SET

>SET GLOBAL system_var_name=value;   #>SET@@GLOBAL.system_var_name=value;全局,需要修改權限,僅對修改後新創建的會話有效,對已經建立的會話無效;

>SET [SESSION] system_var_name=value;   #>SET@@[SESSION.]system_var_name=value;會話;

 

狀態變量:

用戶保存mysql運行中統計數據的變量;

>SHOW GLOBAL STATUS;

>SHOW [SESSION] STATUS;

 

 

SQL

ANSI SQL標準;SQL-86,SQL-89,SQL-92,SQL-99,SQL-03

 

MySQL數據類型:

字符型:

CHAR,BINARY  #(定長數據類型);

VARCHAR,VARBINARY  #(變長數據類型,需要結束符);

TINYTEXT,TEXT,MEDIUMTEXT,LONGTEXT   #2^8,2^16,2^24,2^32,字符個數);

TINYBLOB,BLOB,MEDIUMBLOB,LONGBLOB   #2^8,2^16,2^24,2^32);

ENUM,SET

數值型:

TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT   #(精確數值型,整型);

DECIMAL   #(十進制型);

FLOAT   #(近似數值型,浮點型);

DOUBLE

日期時間型:

DATE

TIME

DATETIME

TIMESTAMP

YEAR(2),YEAR(4)

 

字符型修飾符:

NOT NULL   #非空約束;

NULL

DEFAULT 'STRING'  #指明默認值;

CHARACTER SET ''  #使用的字符集,>SHOW CHARACTER SET;

COLLATION   #排序規則,>SHOWCOLLATON;

 

內建類型(ENUM,SET)修飾符:

NOT NULL

NULL

DEFAULT

 

整型數據修飾符:

NOT NULL

NULL

DEFAULT NUMBER

AUTO_INCREMENT  #內置LAST_INSERT_ID()UNSIGNED,PRIMARY KEY|UNIQUE KEY,NOT NULL

 

時期時間型修飾符:

NOT NULL

NULL

DEFAULT

 

 

SQL mode

定義mysql對約束的響應行爲;

>SET GLOBAL sql_mode='MODE';   #>SET@@GLOBAL.sql_mode='MODE';

 

MODE有:

TRADITIONAL

STRICT_TRANS_TABLES   #對事務的表嚴格約束;

STRICT_ALL_TABLES  #對所有表嚴格約束;

 

 

DB組件:

數據庫;

表;

索引;

視圖;

用戶;

存儲過程;

存儲函數;

觸發器;

事件調度器等;

 

 

DDLdata define language,數據定義語言,CREATE,ALTER,DROP

DMLdata manipulatelanguage,數據操作語言,CRUDINSERT,DELETE,UPDATE,SELECTDELETEUPDATE一定要有WHERE限制條件,否則將清空或修改所有數據;

DQLdata query languageSELECT

 

 

數據庫:

CREATE|ALTER|DROP {DATABASE|SCHEMA} [IF [NOT] EXISTS]

 

表:

二維關係;

設計表(遵循規範);

定義:字段,字段數據類型,修飾符;

 

約束;

 

創建表(

CREATE TABLE,直接創建;

通過查詢現存的表創建,新表會被直接插入查詢而來的數據;

通過複製現存的表的結構創建,不復制數據);

 

查看錶結構(

>DESCRIBE tbl_name;

>SHOW TABLES STATUS LIKE 'tbl'\G;);

 

修改表(>ALTER TABLE);

 

刪除表(>DROP TABLE);

 

>HELP CREATE TABLE

>HELP ALTER TABLE

>HELP SHOW INDEX

>use hellodb;

>SHOW INDEXES FROM students;

>EXPLAIN SELECT * FROM students WHERE sutID=3\G;   #(根據primarykey查詢,rows:1);

>EXPLAIN SELECT * FROM students WHERE Age=53\G;   #(非primary key則會掃描全表,rows=25);

>ALTER TABLE students ADD INDEX(Age);

>SHOW INDEXES FROM students;

>EXPLAIN SELECT * FROM students WHERE Age=53\G;   #rows:1

>CREATE INDEX name ON students(Name);

>SHOW INDEXES FROM students;

>EXPLAIN SELECT * FROM students WHERE Name LIKE'X%';   #rows:6,使用索引)

>EXPLAIN SELECT * FROM students WHERE Name LIKE'%X%';   #rows:25,全表掃描,未使用索引,mysql是最左前綴索引)

 

 

view視圖:

視圖中的數據事實上存儲於基表中,因此修改操作也是針對基表實現,受基表限制;

>HELP CREATE VIEW

>HELP DROP VIEW

>CREATE VIEW test AS SELECT stuID,Name,Age FROM students;

>SHOW TABLES;

>SHOW TABLE STATUS LIKE 'test'\G   #comment:VIEW,其它都爲NULL

>EXPLAIN SELECT * FROM test WHERE Age=22;   #(在基表students中查詢)

 

 

INSERT INTO3syntaxONDUMPLICATE KEY UPDATE有重複鍵時直接更新替換):

>INSERT INTO students (Name,Age,Gender) VALUES ('jinjiao',100,'M');

>INSERT INTO students SET Name='jinjiao',Age=100,Gender='M';

>INSERT INTO students (Name,Age,Gender) SELECT * FROM stu;

 

 

>HELP DELETE(要限制條件WHERE,LIMIT);

>DELETE FROM tbl_name WHERE CONDITION;

 

>HELP UPDATE

>UPDATE tbl_name SET col1=value1,col2=value2,WHERE CONDITION;

 

 

>SELECT now();

the clauses of the SELECT statement:

FROM clause-->WHERE clause-->GROUPBY-->HAVING clause-->ORDER BY-->SELECT-->LIMIT

wKiom1l1LLyjNARmAAAtueAN5Ac192.jpg

 

單表查詢:

DISTINCT   #(數據去重);

SQL_CACHE   #(顯示指定存儲查詢結果於緩存之中);

SQL_NO_CACHE  #(顯示查詢結果不予緩存);

注:

查詢緩存功能打開query_cache_type=ON時,SQL_CACHESQL_NO_CACHESELECT的結果符合緩存條件即會緩存,否則不予緩存;

query_cache_type=demand時,查詢緩存功能按需進行,顯式指定SQL_CACHESELECT語句纔會緩存,其它均不予緩存;

 

>SHOW GLOBAL VARIABLES LIKE 'query%';

query_cache_size

query_cache_type

>SHOW GLOBAL VARIABLES LIKE 'Qcache%';

Qcache_hits

>SHOW GLOBAL VARIABLES LIKE 'Com_select';

Com_select  #(查詢的次數);

注:

Com_selectQcache_hits結合查看;

 

字段顯示可使用別名:

col1 AS alias1,col2 AS alias2

 

WHERE子句:

指明過濾條件實現選擇功能;

過濾條件:布爾型表達式;

 

算術操作符:+-*/%

 

比較操作符:

=,>,>=,<,<=

!=<>表示不等於

<=>  #NULLsafe equal to

BETWEEN min_num AND max_num

IN(element1,element2,...)   #可理解於多值等於

IS NULL   #例如>SELECT... WHERE classID IS NULL,而不能用WHERE classID=NULLWHERE classID='NULL'

IS NOT NULL

LIKE  #使用通配符,%表示任意長度任意字符,_表示任意單個字符

RLIKE   #REGEXP,匹配字符串,可用正則書寫

 

邏輯操作符:

NOT

AND

OR

XOR

 

GROUP

根據指定的條件把查詢結果進行分組,以用於做聚合運算;

avg()

max()

min()

count()

sum()

 

HAVING

對分組聚合運算後的結果指定過濾條件;

 

ORDER BY

根據指定的字段對查詢結果進行排序;

ASC   #升序

DESC   #降序

 

LIMIT [[offset,]row_count]

對查詢結果進行輸出行數數量限制;

 

舉例:

>SELECT avg(Age),Gender FROM students GROUP BY Gender;

>SELECT avg(Age) AS AAge,Gender FROM students GROUP BY Gender HAVING AAge>20;

>SELECT count(stuID) AS NOS,classID FROM students GROUP BY classID HAVING NOS>2;

>SELECT Name,Age FROM students ORDER BY Age DESC;

>SELECT Name,Age FROM students ORDER BY Age DESC LIMIT 10,10;

 

對查詢結果中的數據請求施加鎖:

FOR UPDATE  #寫鎖,排它鎖;

LOCK IN SHARE MODE  #讀鎖,共享鎖;

 

 

多表查詢:

交叉連接   #笛卡爾乘積,最不高效;

>SELECT * FROM students,teachers;

 

等值連接   #常用

>SELECT * FROM students,teachers WHERE students.teacherID=teachers.TID;

>EXPLAIN SELECT s.Name AS stuName,t.Name AS teaName FROM students AS s,teachers AS t WHERE s.teacherID=t.TID;

>SELECT s.Name,c.Class FROM students AS s,Class AS c WHERE s.classID=c.classID;  #學生對班級;

 

不等值連接

自然連接

自連接   #一張表當兩張表用;

 

外連接:

左外連接,>... FROM tb1 LEFT JOIN tb2 ON tb1.col=tb2.col;,以左表爲準,有等值連接予以顯示,有不等值的右表字段留空即左表字段內容必須出現;

右外連接,>... FROM tb1 RIGHT JOIN tb2 ON tb1.col=tb2.col;,以右表爲準,有等值連接的予以顯示,有不等值連接的左表字段留空即右表字段內容必須出現;

>SELECT s.Name,c.Class FROM students AS s LEFT JOIN Class AS c ON s.classID=c.classID;

 

 

子查詢:

查詢語句中嵌套着查詢語句,基於某語句的查詢結果再次進行的查詢;

MySQL對子查詢的優化力度不夠,不建議使用;

 

用在WHERE子句中的子查詢,用於比較表達式中的子查詢,子查詢僅能返回單個值;

>EXPLAIN SELECT Name,Age FROM students WHERE Age> (SELECT avg(Age) FROM students);

 

用於在IN中的子查詢,子查詢要返回一個或多個值,從而構成一個列表;

>SELECT Name,Age FROM students WHERE Age IN(SELECT Age FROM teachers);

 

用於EXISTS

 

用在FROM子句中的子查詢;

格式:>SELECT tbl_alias.col1,... FROM (SELECT clause) AS tb_alias WHERE clause;

舉例:每一個班級的平均年齡大於30

>SELECT aage,classID FROM (SELECT avg(Age) AS aage,classID FROM students WHERE classID IS NOT NULL GROUP BY classID) AS s WHERE s.aage>30;

 

 

UNION聯合查詢:

>EXLAIN SELECT Name,Age FROM students UNION SELECT Name,Age FROM teachers;   #會顯示爲3個查詢語句;

 

 

注:

MySQL5.1-->5.5-->5.6-->5.7);

--no-auto-rehash  #命令行補全相關;

SQL語句執行後反饋信息有warning時,可用>SHOW WARNINGS;查看;

所有SHOW命令都支持通配符%

storage engine是指表類型,即在表創建時指明使用的storage engine,同一個庫中的表要使用同一種storage engine>SHOW GLOBAL VARIABLES LIKE 'default_storage_engine';

兩類認證(authenticationobject privilege);

MySQL索引,是[]左前綴索引,如果查詢時LIKE'%sql%'將不會使用索引,查詢時儘量避免使用'%sql%'

DELETEUPDATE一定要有WHERE限制條件,否則將清空或修改所有數據;

skip_name_resolve,關閉主機名反解,否則授權的用戶在登錄時有問題;

查詢語句任何字符上的不同(如大小寫),都會導致緩存不能命中;

若對某字段作算術運算將無法使用索引,如>SELECT * FROM students WHERE Age+20>50;

若某索引用不上,最好不要創建它,會降低寫性能;

複雜類型的查詢有三種:簡單子查詢,用於FROM中的子查詢,UNION聯合查詢;有UNION查詢的分析結果會出現一個額外的警鐘臨時表;

 

 

MySQL architecture

wKioL1l1LbzDPdjZAADHoIrqsWs420.jpg

 

MySQL數據文件類型:

數據文件;

索引文件;

redo log,undo log,binary log,error log,query log,slow query log,relay log

 

wKiom1l1LdaBIPXiAABCCZb5JZY473.jpg

wKioL1l1LfXQbepPAAEgN8AvYNw837.jpg

1、執行啓動MySQL 命令之後,MySQL的初始化模塊就從系統配置文件中讀取系統參數和命令行參數,並按照參數來初始化整個系統,如申請並分配buffer,初始化全局變量,以及各種結構等。同時各個存儲引擎也被啓動,並進行各自的初始化工作。

2、當整個系統初始化結束後,由連接管理模塊接手。連接管理模塊會啓動處理客戶端連接請求的監聽程序,包括tcp/ip的網絡監聽,還有unixsocket。這時,MySQL Server基本啓動完成,準備好接受客戶端請求。

3、當連接管理模塊監聽到客戶端的連接請求(藉助網絡交互模塊的相關功能),雙方通過Client & Server交互協議模塊所定義的協議“寒暄”幾句之後,連接管理模塊就會將連接請求轉發給線程管理模塊,去請求一個連接線程。

4、線程管理模塊馬上又會將控制交給連接線程模塊,告訴連接線程模塊:現在我這邊有連接請求過來了,需要建立連接,你趕快處理一下。

5、連接線程模塊在接到連接請求後,首先會檢查當前連接線程池中是否有被cache 的空閒連接線程,如果有,就取出一個和客戶端請求連接上,如果沒有空閒的連接線程,則建立一個新的連接線程與客戶端請求連接。

6、當然,連接線程模塊並不是在收到連接請求後馬上就會取出一個連接線程和客戶端連接,而是首先通過調用用戶模塊進行授權檢查,只有客戶端請求通過了授權檢查後,他纔會將客戶端請求和負責請求的連接線程連上。在MySQL 中,將客戶端請求分爲了兩種類型:一種是query,需要調用Parser也就是Query解析和轉發模塊的解析才能夠執行的請求;一種是command,不需要調用Parser就可以直接執行的請求。如果我們的初始化配置中打開了Full Query Logging 的功能,那麼Query解析與轉發模塊會調用日誌記錄模塊將請求計入日誌,不管是一個Query類型的請求還是一個command 類型的請求,都會被記錄進入日誌,所以出於性能考慮,一般很少打開Full Query Logging 的功能。

7、當客戶端請求和連接線程“互換暗號(互通協議)”接上頭之後,連接線程就開始處理客戶端請求發送過來的各種命令(或者query),接受相關請求。它將收到的query 語句轉給Query解析和轉發模塊,Query解析器先對Query進行基本的語義和語法解析,然後根據命令類型的不同,有些會直接處理,有些會分發給其他模塊來處理。

8、如果是一個Query 類型的請求,會將控制權交給Query解析器。Query 解析器首先分析看是不是一個select 類型的query,如果是,則調用查詢緩存模塊,讓它檢查該query query cache 中是否已經存在。如果有,則直接將cache 中的數據返回給連接線程模塊,然後通過與客戶端的連接的線程將數據傳輸給客戶端。如果不是一個可以被cache query類型,或者cache 中沒有該query 的數據,那麼query 將被繼續傳回query 解析器,讓query解析器進行相應處理,再通過query分發器分發給相關處理模塊。

9、如果解析器解析結果是一條未被cacheselect 語句,則將控制權交給Optimizer,也就是Query優化器模塊。

10、如果是DML 或者是DDL 語句,則會交給表變更管理模塊。表變更管理模塊根據所對應的處理請求的不同,是分別由insert處理器、delete處理器、update處理器、create處理器,以及alter處理器這些小模塊來負責不同的DMLDDL的。

11、如果是一些更新統計信息、檢測、修復和整理類的query 則會交給表維護模塊去處理。

12、複製相關的query則轉交給複製模塊去進行相應的處理。

13、請求狀態的query則轉交給了狀態收集報告模塊。

14、在各個模塊收到Query解析與分發模塊分發過來的請求後,首先會通過訪問控制模塊檢查連接用戶是否有訪問目標表以及目標字段的權限。

15、如果有,就會調用表管理模塊請求相應的表,並獲取對應的鎖。表管理模塊首先會查看該表是否已經存在於table cache中,如果已經打開則直接進行鎖相關的處理,如果沒有在cache中,則需要再打開表文件獲取鎖,然後將打開的表交給表變更管理模塊。

16、當表變更管理模塊“獲取”打開的表之後,就會根據該表的相關meta信息,判斷表的存儲引擎類型和其他相關信息。根據表的存儲引擎類型,提交請求給存儲引擎接口模塊,調用對應的存儲引擎實現模塊,進行相應處理。

17、當一條query或者一個command處理完成(成功或者失敗)之後,控制權都會交還給連接線程模塊。如果處理成功,則將處理結果(可能是一個Result set,也可能是成功或者失敗的標識)通過連接線程反饋給客戶端。如果處理過程中發生錯誤,也會將相應的錯誤信息發送給客戶端,然後連接線程模塊會進行相應的清理工作,並繼續等待後面的請求,重複上面提到的過程,或者完成客戶端斷開連接的請求。

18、如果在上面的過程中,相關模塊使數據庫中的數據發生了變化,而且MySQL 打開了binlog功能,則對應的處理模塊還會調用日誌處理模塊將相應的變更語句以更新事件的形式記錄到相關參數指定的二進制日誌文件中。

19、在上面各個模塊的處理過程中,各自的核心運算處理功能部分都會高度依賴整個MySQL的核心API 模塊,比如內存管理,文件I/O,數字和字符串處理等等。

wKiom1l1Lg_wkG2iAACK8gD2njY943.jpg

 

 

 

MySQL用戶和權限管理:

權限類別:

庫級別;表級別;字段級別;管理類;程序類;

 

管理類:

CREATE TEMPORARY TABLES

CRATE USER

FILE

SUPER

SHOW DATABASES

RELOAD

SHUTDOWN

REPLICATION SLAVE

REPLICATION CLIENT

LOCK TABLES

PROCESS

 

程序類:

CREATE

ALTER [FUNCTION|PROCEDURE|TRIGGER]

DROP

EXECUTE

 

DATABASE和表TABLE級別:

ALTER

CREATE

CREATE VIEW

DROP

INDEX

SHOW VIEW

GRANT OPTION  #能把自己獲得的權限贈給其他用戶一個副本;

 

數據操作:

SELECTINSERTDELETEUPDATE

 

字段級別:

SELECT (col1,col2,...)

UPDATE (col1,col2,...)

INSERT (col1,col2,...)

 

所有:

ALL PRIVILEGES

 

元數據數據庫:

mysql庫;

>USE mysql;

>SHOW TABLES;

 

授權表:

db,host,user

columns_priv,tables_priv,procs_priv,proxies_priv

 

用戶賬號:

'USERNAME'@'HOST'

@'HOST'   #主機名,ip地址,network,通配符%_

 

創建用戶:

>CREATE USER 'USERNAME'@'HOST' [IDENTIFIED BY'password'];

 

查看用戶獲得的授權:

>SHOW GRANTS FOR 'USERNAME'@'HOST';

 

重命名用戶:

>RENAME USER old_user_name TO new_user_name;

 

刪除用戶:

>DROP USER 'USERNAME'@'HOST';

 

修改密碼:

>SET PASSWORD FOR   #方式1

>UPDATE myql.user SET password=PASSWORD('your_password') WHERE clause;

>FLUSH PRIVILEGES;   #方式2

#mysqladmin [options] command   #方式3

 

忘記管理員密碼:

啓動mysqld進程時,使用--skip-grant-tables--skip-networking--skip-networking禁用遠程登錄;

使用UPDATE命令修改管理員密碼;

關閉mysqld進程,去掉--skip-grant-tables--skip-networking,再啓動mysqld

 

>HELP GRANT  #授權

>GRANT priv_type[,...] ON [{table|function|procedure}] db.{table|routine} TO 'USERNAME'@'HOST'[IDENTIFIED BY 'YOUR_PASSWORD' [REQUIRE SSL] [WITH with_option];

object type:

TABLE

FUNCTION   #存儲函數;

PROCEDURE   #存儲過程;

priv_level:

db_name.routine_name   #(存儲過程或存儲函數);

with_option:

GRANT OPTION

 

>REVOKE priv_type[,...] ON [{table|funciton|procedure}] db.{table|routine} FROM 'USERNAME'@'HOST';    #取消授權

 

 

caching with MySQL查詢緩存:

查詢的執行路徑:

組件:查詢緩存,解析器,預處理器,優化器,查詢執行引擎,存儲引擎;

wKiom1l1Lnih0m6pAACIMFU3mDc796.jpg

 

 

如何判斷是否命中:通過查詢語句的哈希值判斷;

哈希值考慮的因素包括:查詢本身,要查詢的DBclient使用的協議版本...

 

查詢語句任何字符上的不同(如大小寫),都會導致緩存不能命中;

 

哪些查詢可能不會被緩存:查詢中包含UDFuser define function,存儲函數,用戶自定義變量,臨時表,mysql庫的系統表,包含列級權限的表,有着不確定值的函數(如now());

 

查詢緩存相關的服務器變量:

>SHOW GLOBAL VARIABLES LIKE 'query%';

query_cache_min_res_unit   #resresult4096byte(查詢結果小於該值不緩存),查詢緩存中內存塊的最小分配單位,較小的值會減少浪費,但會導致更頻繁的內存分配操作,較大值會帶來浪費會導致碎片過多;

query_cache_limit  #能緩存的最大查詢結果,對於有着較大結果的查詢語句,建議在SELECT中使用SQL_NO_CACHE

query_cache_size  #查詢緩存總共可用的內存空間,單位字節,必須是1024的整數倍;

query_cache_type  #ONOFFDEMAND

query_cache_wlock_invalidate   #如果某表被其它的連接鎖定,是否仍可從查詢緩存中返回結果;默認OFF表示可在被其它連接鎖定的場景中繼續從緩存返回數據,ON表示不允許;

 

wKiom1l1Lo6wfh9HAACncBIsJTE263.jpg

 

緩存命中率的評估:

Qcache_hits/(Qcache_hits + Com_select)

 

 

MySQL中的index

基本法則:索引應構建在被用作查詢條件的字段上;

索引實現級別在storage engine

索引管理,按特定數據結構存儲的數據;

索引不需修改,創建&刪除,創建索引時不要在不驗證的情況下輕易的在生產上操作;

若對某字段作算術運算將無法使用索引,如>SELECT * FROM students WHERE Age+20>50;

若某索引用不上,最好不要創建它,會降低寫性能;

在查詢時儘量避免使用'%sql%'

 

 

管理索引的途徑(

1

創建表時指定,>CREATE INDEX;

2

通過修改表的命令,創建或刪除索引;

3

刪除索引,索引不需修改);

 

索引分類,索引類型(

稠密索引(字段中的所有記錄),稀疏索引(字段的部分數據,有一級、二級、三級、四級),是否索引了每一個數據項;

B+Tree索引(balance),hash索引,R-Tree空間索引(MyISAM支持空間索引),FULLTEXT全文索引(在文本中查找關鍵詞);

聚集索引(該索引存放實際數據),非聚集索引(該索引只是指針指向源數據),數據是否與索引存儲在一起;

簡單索引,組合索引;

主鍵索引(一對一查詢),輔助索引(額外輔助其它查詢操作);

 

常用索引類型:

B+Tree

順序存儲,每一個葉子節點到根節點的距離是相同的;

左前綴索引,適合查詢範圍類的數據;

可使用B+Tree索引的查詢類型(適用場景):

全鍵值,鍵值範圍或鍵前綴查找;

全值匹配,精確到某個值,如'jinjiao king'

匹配最左前綴,只精確匹配開頭部分,如'jin%'

匹配範圍值;

精確匹配某一列並範圍匹配另一列;

只訪問索引的查詢;

不適用場景:

如果不從最左列開始,索引無效,如(Age,Name)若根據Name查找則索引無效,(Name,Age)若根據Age查找則索引無效;

不能跳過索引中的列,如(stuID,Name,Age),不能跳過Name

如果查詢中某個列是範圍查詢,那麼右側的列都無法再使用索引優化查詢,如(stuID,Name)

 

hash索引:

基於哈希表實現,適用於精確匹配索引中的所有列;

只有memory存儲引擎支持顯示hash索引;

適用場景:

只支持等值比較查詢,如=,IN(),<=>

不適用場景:

不適用於順序查詢(值不是按順序存儲的);

不支持模糊匹配;

 

索引的優點:

可降低服務器需要掃描的數據量,減少了io次數;

可幫助服務器避免排序和使用臨時表;

可幫助將隨機io轉爲順序io

 

高性能索引策略:

獨立使用列(不要讓列參與運算),儘量避免參與運算;

左前綴索引,索引構建於字段的左側的多少個字符,要通過索引選擇性(不重複的索引值和數據表的記錄總數的比值)來評估;

多列索引(組合索引),順序很關鍵,AND操作時更適合使用多列索引;

選擇合適的索引列次序,將選擇性最高的放左側;

 

冗餘和重複索引:

不好的索引使用策略,如有(Name,Age)(Name)是多餘的;

 

 

EXPLAIN

通過EXPLAIN來分析索引的有效性,獲取查詢執行計劃信息,用來查看查詢優化器如何執行查詢:

>EXPLAIN SELECT clause\G

 

輸出:

id   #當前查詢語句中,每個SELECT語句的編號;複雜類型的查詢有三種:簡單子查詢,用於FROM中的子查詢,UNION聯合查詢;有UNION查詢的分析結果會出現一個額外的警鐘臨時表;

select_type  #SIMPLE簡單查詢,SUBQUERY簡單子查詢,DERIVED用於FROM中的子查詢,UNION表示UNION語句的第一個之後的SELECT語句,UNION RESULT匿名臨時表;

table  #SELECT語句關聯到的表;

type   #關聯類型,或訪問類型,即MySQL決定的如何去查詢表中行的方式,ALL(表示全表掃描),index(表示根據索引的次序進行全表掃描),如果在Extra列出現Using index表示使用和覆蓋索引,range(有範圍限制,根據索引實現範圍掃描,掃描位置始於索引中的某一點,結束於另一點),ref(根據索引,返回表中匹配某單個值的所有行),eq_ref(僅返回一個行,但需要與某個參考值作比較),cons|system(直接返回單個行,性能最好),NULLMySQL在優化器的分解查詢語句,在執行階段用得着才訪問表或索引,類似覆蓋索引);

possible_keys  #查詢可能會用到的索引;

key   #查詢中使用了的索引;

key_len   #在索引中使用的字節數;

ref   #在利用key字段所表示的索引完成查詢時,所用的列或某常量值;

rows   #MySQL估計爲找所有的目標行而需要讀取的行數;

Extra   #額外信息,UsingindexMySQL將會使用覆蓋索引,以避免訪問表),Using whereMySQL服務器將在storage engine檢索後,再進行一次過濾),Using temporaryMySQL對結果排序時會使用臨時表),Using filesortMySQL將對結果使用一個外部索引排序);

 

 

 

MaridaDB storage engine

pluggable storage engine;

MySQL5.1之前默認MyISAM5.5之後默認InnoDB

 

InnoDB

處理大量的短期事務;

數據存儲於table space表空間中(

所有InnoDB表的數據放置於同一個表空間中(表空間文件在datadir目錄下,ibdata{1,2,3,...}

每個表單獨使用一個表空間,存儲表的數據和索引,innodb_file_per_table=ON,數據文件(存儲數據和索引),tbl_name.ibdtbl_name.frmformat,表格式定義文件));

併發(基於MVCCmulti version concurrent control多版本併發控制)來支持高併發,支持所有隔離級別(四個),默認爲REPEATABLE READ(間隙鎖,防止幻讀));

索引(聚集索引,輔助索引);

性能(預讀操作,支持自適應hash索引,插入緩存區);

支持行級鎖(鎖粒度爲行級鎖);

備份(支持熱備,xtrabackup);

 

>CREATE TABLE ... ENGINE=   #表類型,storageengine在表級別指定;

>SHOW GLOBAL VARIABLES LIKE'innodb_file_per_table';

>SHOW ENGINES;

>SHOW TABLE STATUS\G

 

MyISAM

不支持事務;

加鎖和併發(表級鎖);

修復(手工或自動修復,但可能會丟失數據,崩潰後無法完全恢復);

Aria(由MyISAM演變而來,支持崩潰後安全恢復,crash-safe);

索引(支持FULLTEXT index,非聚集索引);

延遲更新索引鍵;

支持壓縮表;

空間函數(GIS);

適用場景(

只讀(或寫較少);

表較小(可接受長時間進行修復操作);

);

文件(

tbl_name.frm  #表格式定義;

tbl_name.MYD  #數據文件;

tbl_name.MYI  #索引文件;

);

行格式(

dynamic

fixed

compressed

compact

redundent

);

生產中用於數據倉庫,選MyISAMARCHIVE

 

其它的storage engine

CSV   #將普通的CSV文件(字段通過逗號分隔)作爲MySQL表使用;

MRG_MYISAM  #將多個MyISAM表合併成爲一個虛擬表;

BLACKHOLE   #類似於/dev/null

MEMORY   #所有數據都保存在內存中,內存表,支持hash索引,表級鎖,臨時表就是通過此存儲引擎實現;

PERFORMANCE_SCHEMA  #僞存儲引擎;

ARCHIVE   #只支持SELECTINSERT操作,支持行級鎖和專用緩衝區,不支持事務;

FEDERATED   #用於訪問其它遠程MySQL服務器一個代理,它通過創建一個到遠程MySQL服務器的客戶端連接,並將查詢輸出到遠程服務器執行,而後完成數據存取,在MariaDB上叫FederatedX

 

MariaDB支持的其它storage engine

OQGraph

sphinxSE   #用於構建searchengine

tokuDB

cassandra

connected

squence

 


 

併發控制:

鎖:

讀鎖,共享鎖;

寫鎖,獨佔鎖;

 

鎖粒度:

表級鎖,MyISAM

行級鎖,InnoDB

 

鎖策略:

在鎖粒度和數據安全性上尋求的平衡機制,每種storage engine都可自行實現其鎖策略和鎖粒度;

MySQL在服務器級也實現了鎖,是表級鎖,用戶可顯示請求(如下示例123),而InnoDB storage engine自身實現了行級鎖;

 

分類:

隱式鎖(建議使用,由存儲引擎自動施加鎖);

顯式鎖(如下示例23);

 

1

>HELP LOCK

>USE hellodb

>LOCK TABLES students READ;   #在另一終端>SELECT *FROM students;

>UNLOCK TABLES;

>LOCK TABLES students WRITE;   #在另一終端>UPDATEstudents SET Age=102 WHERE stuID=26;

>SELECT * FROM students;

2

>FLUSH TABLES tbl_name[,...] [WITH READLOCK];

3

>SELECT clause [FOR UPDATE] [WITH READLOCK];

 

 

MySQL transaction

一組原子性的SQL查詢,或者說一個獨立工作單元;

 

事務日誌:

通常也被稱爲write ahead logging預寫式日誌;

事務日誌的寫入類型爲追加,因此其操作爲“順序IO”;

]# ll -h /mydata/data/

-rw-rw---- 1 mysql mysql 5.0M Jul 24 10:29ib_logfile0

-rw-rw---- 1 mysql mysql 5.0M Jul 24 10:29ib_logfile1

 

ACID

atomicity  #原子性,整個事務中的所有操作要麼全部成功執行,要麼失敗後全部回滾;

consitency  #數據庫總是從一個一致性狀態轉爲另一個一致性狀態;

isolation  #一個事務作出的操作在提交之前,是不能爲其它所見,隔離有多種隔離級別;

durability  #一旦事務提交,其所作的修改會永久保存於數據庫中;

 

事務隔離級別:

READ-UNCOMMITTED   #讀未提交,產生髒讀(別人未提交的數據)、不可重複讀、幻讀問題;

READ-COMMITTED   #讀提交,建議使用;

REPEATABLE-READ   #可重讀,默認;

SERIALIZABLE   #可串行化,併發能力最弱但數據最安全,阻塞,修改的記錄未提交將不予顯示;

注:

可能存在的問題:

髒讀,讀別人未提交的數據;

不可重複讀;

幻讀;

加鎖讀;

MariaDB [hellodb]> SHOW GLOBAL VARIABLESLIKE 'tx_isolation';   #可在SESSION級修改;

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

| Variable_name | Value           |

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

| tx_isolation  | REPEATABLE-READ |

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

1 row in set (0.00 sec)

 

transaction life cycle

wKioL1l3DFKhH1ZmAABLxjf4Jnc195.jpg

注:

僅事務型storage engine才支持此類操作;

建議顯式請求和提交事務,而不要使用autocommit自動提交功能;

支持savepoing

>START TRANSACTION;   #啓動事務;

>COMMIT;   #結束事務;

>ROLLBACK;   #結束事務;

>HELP contents

#sed -i 's@ENGINE=MyISAM@ENGINE=InnoDB@ig' hellodb.sql

]# mysql -uroot -pehrapp02 < hellodb.sql

]# mysql -uroot -pehrapp02

MariaDB [(none)]> USE hellodb;

MariaDB [hellodb]> SHOW TABLE STATUS\G

        Engine: InnoDB

MariaDB [hellodb]> SHOW GLOBAL VARIABLES LIKE 'autocommit';

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

| Variable_name | Value |

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

| autocommit    | ON   |

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

1 row in set (0.00 sec)

MariaDB [hellodb]> SET SESSION autocommit=0;

Query OK, 0 rows affected (0.00 sec)

MariaDB [hellodb]> SHOW SESSION VARIABLES LIKE 'autocommit';

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

| Variable_name | Value |

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

| autocommit    | OFF  |

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

1 row in set (0.00 sec)

MariaDB [hellodb]> SELECT * FROM students;

……

MariaDB [hellodb]> DELETE FROM students WHERE StuID IN (18,23);

Query OK, 2 rows affected (0.00 sec)

MariaDB [hellodb]> SELECT * FROM students;

……

MariaDB [hellodb]> DELETE FROM students WHERE StuID IN (1,2);

……

MariaDB [hellodb]> SAVEPOINT sp2;

Query OK, 0 rows affected (0.00 sec)

MariaDB [hellodb]> ROLLBACK TO sp1;   #(僅能先恢復最近的savepoint,如sp2,如果直接恢復之前的savepointsp1,在其後的savepointsp2將不存在);

 

 

MariaDB日誌:

1

query log

查詢日誌,記錄查詢操作,一般不啓用,可保存在FILETABLE中;

MariaDB [hellodb]> SHOW GLOBAL VARIABLES LIKE '%log%';

general_log = ON|OFF

general_log_file = HOSTNAME.log

log_output = FILE|TABLE|NONE

2

slow query log

慢查詢日誌,查詢時長超出指定時長的查詢操作,未必是查詢語句慢,有可能是鎖;

long_query_time = 10.000000

slow_query_log = OFF|ON

slow_query_log_file = HOSTNAME-slow.log

log_slow_filter = admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk

log_slow_queries = OFF|ON

log_slow_rate_limit = 1   #按速率記錄

log_slow_verbosity

MariaDB [hellodb]> SHOW GLOBAL VARIABLES LIKE 'long%';

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

| Variable_name   | Value    |

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

| long_query_time | 10.000000 |

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

1 row in set (0.00 sec)

 

MariaDB [hellodb]> SELECT @@GLOBAL.long_query_time;

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

| @@GLOBAL.long_query_time |

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

|                10.000000 |

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

1 row in set (0.00 sec)

3

error log

錯誤日誌,mysql啓動和關閉過程中輸出的事件信息,mysql運行過程中產生的錯誤信息,event scheduler運行一個event時產生的日誌信息,在master-slave架構中的slave server上啓動線程時產生的信息;

log_error = $datadir/HOSTNAME.err  

log_warning = 1|0   #是否記錄警告信息至錯誤日誌文件中,1記錄,0不記錄;

4

binary log

二進制日誌,記錄導致數據改變或潛在導致數據改變的SQL語句;

功能,用於通過重放日誌文件中的事件來生成數據副本;

log_bin = ON|OFF|/PATH/TO/BIN_LOG_FILE   #此項啓用纔可記錄binary log記錄功能;

sql_log_bin = ON|OFF   #是否記錄binary log

bin_log_format = MIXED|STATEMENT|ROW   #binary log記錄的格式;

max_binlog_size = 1073741824   #單位byte,單個二進制文件的最大大小,默認1G,到達最大值會自動滾動,文件達到上限時的大小未必爲指定的精確值;

expire_logs_days

sync_binlog = 0|1   #設定是否啓用二進制日誌同步功能;

binlog_cache_size

max_binlog_cache_size

max_binlog_stmt_cache_size

binlog_optimize_thread_scheduling

 

二進制日誌記錄格式:

statement基於語句記錄;

row基於行記錄(記錄數據更改的結果,數據量最大);

mixed混合模式(讓系統自行判定基於哪種方式進行);

二進制日誌文件的構成:

日誌文件(mysql-bin.000001binary文件格式);

索引文件(mysql-bin.indextext文件格式);

]# file mysql-bin.000001

mysql-bin.000001: MySQL replication log

MariaDB [(none)]> HELP SHOW

SHOW {BINARY | MASTER} LOGS

SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]

SHOW MASTER STATUS

MariaDB [(none)]> SHOW BINARY LOGS;   #查看mariadb自行管理使用中的binarylog列表;

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

| Log_name         | File_size |

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

| mysql-bin.000001 |     16717 |

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

1 row in set (0.00 sec)

MariaDB [(none)]> SHOW MASTER STATUS;   #查看正在使用中的binary log文件;

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

| File             | Position | Binlog_Do_DB |Binlog_Ignore_DB |

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

| mysql-bin.000001 |    16717 |              |                  |

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

1 row in set (0.00 sec)

MariaDB [(none)]> SHOW BINLOG EVENTS IN 'mysql-bin.000001';   #查看binary log文件內容,不能用cat直接打開文件,可能會導致文件損壞;

 

客戶端工具:

mysqlbinlog [options] log_file ...

options:

--start-position=

--stop-position=

--start-datetime=

--stop-datetime=

 

二進制日誌事件的格式:

# at 15762

#170724 17:30:18 server id 1  end_log_pos 15961     Query       thread_id=14   exec_time=0    error_code=0

SET TIMESTAMP=1500888618/*!*/;

INSERT INTO `teachers` VALUES (1,'SongJiang',45,'M'),(2,'Zhang Sanfeng',94,'M'),(3,'Miejue Shitai',77,'F'),(4,'LinChaoying',93,'F')

/*!*/;

注:

#170724 17:30:18   #事件發生的日期和時間;

server id 1   #事件發生的服務器標識;

end_log_pos 15961   #事件的結束位置;

Query  #事件的類型,廣義講所有語句都是查詢語句;

thread_id=14   #事件發生時所在服務器執行此事件的線程的ID

exec_time=0   #語句的時間戳與將其寫入二進制文件中的時間差;

error_code=0   #錯誤代碼;

其餘爲事件內容;

5

relay log

中繼日誌,複製架構中slave server用於保存從master serverbinary log中讀取到的事件;

relay_log

relay_log_index

relay_log_info_file

relay_log_purge

relay_log_recovery

relay_log_space_limit

6

transaction log

事務日誌,事務型storage engine自行管理和使用;

事務日誌由多個文件組成一組,默認是2個文件;

建議事務日誌和數據文件分開,各自在不同的disk上;

redo log重做日誌,undo log撤銷日誌;

innodb_log_files_in_group = 2

innodb_log_group_home_dir = ./

innodb_log_file_size = 5242880

 

 

backup & recovery

備份:

災難恢復:硬件故障,軟件故障,自然災害,******,誤操作;

非鏡像數據副本;binary log用於時間點恢復;

 

要點:

能容忍最多丟失多少數據;

恢復數據需要在多長時間內完成;

需要恢復哪些數據;

 

做還原測試,用於測試備份的可用性;

還原演練;

 

備份類型:

完全備份,部分備份;

完全備份,增量備份,差異備份(僅備份最近一次完全備份以來差異的數據);

熱備(rw可執行),溫備(r可執行,w不可執行),冷備(rw都不可執行);

物理備份(直接複製數據文件),邏輯備份(從數據庫中導出數據另存爲,對於float會丟失精度,與storage engine無關);

 

考慮的因素:

持有鎖多長時間(溫備);

備份過程的時長;

備份負載;

恢復過程的時長;

 

備份什麼:

數據;

binary log

InnoDB的事務日誌;

代碼(存儲過程,存儲函數,觸發器,事件調度器);

服務器配置文件;

 

設計備份方案:

數據集(完全+增量);

備份手段(物理,邏輯);

 

備份工具:

mysqldump  #邏輯備份工具,適用於所有storage engine,支持溫備,對於InnoDB支持熱備,完全&部分;

cp&tar   #物理備份工具,適用於所有storageengine,僅支持冷備,完全&部分;

lvm快照   #可實現幾乎熱備,是藉助FS管理工具進行備份;

mysqlhotcopy   #幾乎冷備,僅適用於MyISAM

 

備份工具的選擇:

mysqldump + binary log   #完全 + 指定時間範圍的event增量;

lvm快照 + binary log   #完全(物理cp&tar + 增量;

xtrabackup  #percona提供,對InnoDB作熱備,完全&增量;

 

 

cmake的重要特性之一是其獨立於源碼out-of-source的編譯功能,即編譯工作可在另一個指定的目錄中,而非源碼目錄中進行,之可保證源碼目錄不受任何一次編譯的影響,因此在同一個源碼樹上可進行多次不同的編譯,如針對不同平臺編譯;

#cmake .  #相當於./configure

#cmake . -LH   #ccmake .相當於./configure--help

#make clean   #清理此前編譯生成的文件;

#rm -f CMakeCache.txt

]# yum info cmake

Loaded plugins: product-id, security,subscription-manager

This system is not registered to Red HatSubscription Management. You can use subscription-manager to register.

Available Packages

Name       : cmake

Arch       : x86_64

Version    : 2.6.4

Release    : 5.el6

Size       : 5.1 M

Repo       : rhel-anedc

Summary    : Cross-platform make system

URL        : http://wwwNaNake.org

License    : BSD

Description : CMake is used to control the software compilation process using simple

           : platform and compiler independent configuration files. CMake generates

           : native makefiles and workspaces that can be used in the compiler

           : environment of your choice. CMake is quite sophisticated: it ispossible

           : to support complex environments requiring system configuration,pre-processor

           : generation, code generation, and template instantiation.

 

注:

創建LVM作爲mariadb的數據目錄;

#fdisk /dev/sda   #t8e

#partx -a /dev/sda

#pvcreate /dev/sda3

#vgcreate myvg /dev/sda3

#lvcreate -L 10G -n mylv myvg

#lvs

#mke2fs -t ext4 /dev/myvg/mylv

#mkdir /mydata

#vim /etc/fstab

/dev/myvg/mylv /mydata ext4 defaults 0 0

#mount -a

 

 

 

操作:

]# cat /etc/redhat-release

Red Hat Enterprise Linux Server release 6.5(Santiago)

]# uname -rm

2.6.32-431.el6.x86_64 x86_64

 

]# yum -y groupinstall "DevelopmentTools" "Server Platform Development"

 

]# yum -y install cmake

 

]# groupadd -r -g 306 mysql

]# useradd -r -g 306 -u 306 mysql

]# mkdir -pv /mydata/data   #(生產中使用LVM

mkdir: created directory `/mydata'

mkdir: created directory `/mydata/data'

]# chown -R mysql.mysql /mydata/

 

]# tar xf mariadb-5.5.57.tar.gz

]# cd mariadb-5.5.57

]# cmake .-DCMAKE_INSTALL_PREFIX=/ane/mysql -DMYSQL_DATADIR=/mydata/data-DSYSCONFDIR=/etc -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1-DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DWITH_SSL=system-DWITH_ZLIB=system -DWITH_LIBWRAP=0 -DMYSQL_UNIX_ADDR=/tmp/mysql.sock-DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci

]# make && make install

 

]# chown -R root.mysql /ane/mysql/

]# cd /ane/mysql/

]# scripts/mysql_install_db --user=mysql --datadir=/mydata/data/

]# ll -h /mydata/data/

total 32K

-rw-rw---- 1 mysql mysql  16K Jul 24 10:23 aria_log.00000001

-rw-rw---- 1 mysql mysql   52 Jul 24 10:23 aria_log_control

drwx------ 2 mysql root  4.0K Jul 24 10:23 mysql

drwx------ 2 mysql mysql 4.0K Jul 24 10:23performance_schema

drwx------ 2 mysql root  4.0K Jul 24 10:23 test

]# cp support-files/my-large.cnf /etc/my.cnf

cp: overwrite `/etc/my.cnf'? y

]# vim /etc/my.cnf

[mysqld]

datadir = /mydata/data

innodb_file_per_table = ON

skip_name_resolve = ON

]# cp support-files/mysql.server/etc/init.d/mysqld

]# chkconfig --add mysqld

]# chkconfig --list mysqld

mysqld            0:off 1:off 2:on 3:on 4:on 5:on 6:off

]# /etc/init.d/mysqld start

Starting MySQL.170724 10:29:35 mysqld_safeLogging to '/mydata/data/EHRAPP02.err'.

170724 10:29:35 mysqld_safe Starting mysqlddaemon with databases from /mydata/data

.                                                          [  OK  ]

]# vim /etc/profile.d/mysql.sh

export PATH=$PATH:/ane/mysql/bin

]# . !$

. /etc/profile.d/mysql.sh

]# mysql_secure_installation

/ane/mysql/bin/mysql_secure_installation:line 393: find_mysql_client: command not found

 

NOTE: RUNNING ALL PARTS OF THIS SCRIPT ISRECOMMENDED FOR ALL MariaDB

     SERVERS IN PRODUCTION USE!  PLEASEREAD EACH STEP CAREFULLY!

 

In order to log into MariaDB to secure it,we'll need the current

password for the root user.  If you've just installed MariaDB, and

you haven't set the root password yet, thepassword will be blank,

so you should just press enter here.

 

Enter current password for root (enter fornone):

OK, successfully used password, movingon...

 

Setting the root password ensures thatnobody can log into the MariaDB

root user without the proper authorisation.

 

Set root password? [Y/n]Y    

New password:

Re-enter new password:

Password updated successfully!

Reloading privilege tables..

 ...Success!

 

 

By default, a MariaDB installation has ananonymous user, allowing anyone

to log into MariaDB without having to havea user account created for

them. This is intended only for testing, and to make the installation

go a bit smoother.  You should remove them before moving into a

production environment.

 

Remove anonymous users?[Y/n] Y

 ...Success!

 

Normally, root should only be allowed toconnect from 'localhost'.  This

ensures that someone cannot guess at theroot password from the network.

 

Disallow root loginremotely? [Y/n] Y

 ...Success!

 

By default, MariaDB comes with a databasenamed 'test' that anyone can

access. This is also intended only for testing, and should be removed

before moving into a productionenvironment.

 

Remove test database andaccess to it? [Y/n] Y

 -Dropping test database...

 ...Success!

 -Removing privileges on test database...

 ...Success!

 

Reloading the privilege tables will ensurethat all changes made so far

will take effect immediately.

 

Reload privilege tablesnow? [Y/n] Y

 ...Success!

 

Cleaning up...

 

All done! If you've completed all of the above steps, your MariaDB

installation should now be secure.

 

Thanks for using MariaDB!

 

]# mysql -uroot -pehrapp02

MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE '%ssl%';

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

| Variable_name | Value    |

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

| have_openssl  | DISABLED |

| have_ssl      | DISABLED |

| ssl_ca        |          |

| ssl_capath    |         |

| ssl_cert      |         |

| ssl_cipher    |         |

| ssl_key       |          |

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

7 rows in set (0.00 sec)

 

注:

centos7.1安裝MariaDB

#localectl set-locale.UTF-8

#localectl list-locale

#yum -y groupinstall "Development Tools"

#yum -y install ncurses-devel openssl-devel libevent-devel jemalloc-devel cmake

mariadb編譯安裝同rhel6.5

#vim/usr/lib/systemd/system/mariadb.service  #systemd service unit file

[unit]

Description=MariaDB database server

After=syslog.target

After=network.target

[Service]

Type=simple

User=mysql

Group=mysql

ExecStart=/ane/mysql/bin/mysql_safe--basedir=/ane/mysql

TimeoutSec=300

PrivateTmp=false

[Install]

WantedBy=mult-user.target

#systemctl daemon-reload

#systemctl start mariadb.service

 

 

 

 


 

 

 

 

 

 

 

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章