MariaDB or MySQL:php
RDBMS:html
範式:第一範式、第二範式、第三範式;前端
表:row, column;node
關係運算:mysql
選擇git
投影github
數據庫:表、索引、視圖(虛表)、SQL、存儲過程、存儲函數、觸發器、事件調度器;sql
DDL:CREATE,ALTER,DROPshell
DML:INSERT/UPDATE/DELETE/SELECT數據庫
約束:
主鍵約束:唯1、非空;一張表只能有一個;
唯一鍵約束:唯一,能夠存在多個;
外鍵約束:參考性約束;
檢查性約束:check;
三層模型:
物理層 --> SA
邏輯層 --> DBA
視圖層 --> Coder
實現:
Oracle, DB2, Sybase, Infomix, SQL Server;
MySQL, MariaDB, PostgreSQL, SQLite;
MySQL:
5.1 --> 5.5 --> 5.6 --> 5.7 --> 8.0
MariaDB:5.5.x --> 10.x
特性:
插件式存儲引擎
單進程多線程
安裝MySQL:
OS Vendor:rpm
MySQL:
source code:cmake
binary package:
i686, x86_64;
glibc VERSION
prepackage:rpm, deb
os, arch,
服務端程序:
mysqld, mysqld_safe, mysqld_multi
客戶端程序:
mysql, mysqldump, mysqlbinlog, mysqladmin, ...
非客戶端類管理程序:
myisamchk, myisampack, ...
mysqld-5.7
建立數據目錄,屬主屬組屬於運行者用戶身份mysql;
初始化:
mysqld --initilize-insecure --basedir=/usr/local/mysql --datadir=/data/mysql --user=mysql
查看配置文件路徑,修改配置文件:/usr/local/mysql/etc/my.cnf
datadir
socket
includedir
pid
準備錯誤日誌文件:
複製啓動腳本:/usr/local/mysql/support-files/mysql.server --> /etc/init.d/mysqld
配置文件:
讀取多處的多個配置文件,並且會以指定的次序的進行;
# my_print_defaults
Default options are read from the following files in the given order:
/etc/mysql/my.cnf /etc/my.cnf ~/.my.cnf
不一樣的配置文件中出現同一參數且擁有不一樣值時,後讀取將爲最終生效值;
修改默認讀取的配置文件(mysqld_safe命令):
--defaults-file=file_name
於讀取的默認配置文件以外再加載一個文件:
--defaults-extra-file=path
程序文件:
服務端程序:mysqld_safe, mysqld_multi
客戶端程序:mysql, mysqldump, mysqladmin
工具程序:myisampack, ...
mysql --> mysql protocol --> mysqld
mysql:交互式CLI工具;
mysql [options] db_name
經常使用選項:
--host=host_name, -h host_name:服務端地址;
--user=user_name, -u user_name:用戶名;
--password[=password], -p[password]:用戶密碼;
--port=port_num, -P port_num:服務端端口;
--protocol={TCP|SOCKET|PIPE|MEMORY}:
本地通訊:基於本地迴環地址進行請求,將基於本地通訊協議;
Linux:SOCKET
Windows:PIPE,MEMORY
非本地通訊:使用非本地迴環地址進行的請求; TCP協議;
--socket=path, -S path
--database=db_name, -D db_name:
--compress, -C:數據壓縮傳輸
--execute=statement, -e statement:非交互模式執行SQL語句;
--vertical, -E:查詢結果縱向顯示;
命令:
客戶端命令:於客戶端執行;
服務端命令:SQL語句,須要一次性完整地發往服務端;語句必須有結束符;
? (\?) Synonym for `help'.
clear (\c) Clear the current input statement.
connect (\r) Reconnect to the server. Optional arguments are db and host.
delimiter (\d) Set statement delimiter.
edit (\e) Edit command with $EDITOR.
ego (\G) Send command to mysql server, display result vertically.
exit (\q) Exit mysql. Same as quit.
go (\g) Send command to mysql server.
help (\h) Display this help.
nopager (\n) Disable pager, print to stdout.
notee (\t) Don't write into outfile.
pager (\P) Set PAGER [to_pager]. Print the query results via PAGER.
print (\p) Print current command.
prompt (\R) Change your mysql prompt.
quit (\q) Quit mysql.
rehash (\#) Rebuild completion hash.
source (\.) Execute an SQL script file. Takes a file name as an argument.
status (\s) Get status information from the server.
system (\!) Execute a system shell command.
tee (\T) Set outfile [to_outfile]. Append everything into given outfile.
use (\u) Use another database. Takes database name as argument.
charset (\C) Switch to another charset. Might be needed for processing binlog with multi-byte charsets.
warnings (\W) Show warnings after every statement.
nowarning (\w) Don't show warnings after every statement.
mysql命令的使用幫助:
# man mysql
# mysql --help --verbose
sql腳本運行:
mysql [options] [DATABASE] < /PATH/FROM/SOME_SQL_SCRIPT
mysqld服務器程序:工做特性的定義方式
命令行選項
配置文件參數
SHOW [GLOBAL | SESSION] VARIABLES [like_or_where]
服務器參數/變量:設定MySQL的運行特性;
mysql> SHOW GLOBAL|[SESSION] VARIABLES [LIKE clause];
狀態(統計)參數/變量:保存MySQL運行中的統計數據或狀態數據;
mysql> SHOW GLOBA|[SESSION] STATUS [LIKE clause];
顯示單個變量設定值的方法:
mysql> SELECT @@[global.|session.]system_var_name
%:匹配任意長度的任意字符;
_:匹配任意單個字符;
變量/參數級別:
全局:爲全部會話設定默認;
會話:跟單個會話相關;會話創建會從全局繼承;
服務器變量的調整方式:
運行時修改:
global:僅對修改後新創建的會話有效;
session:僅對當前會話有效,且當即生效;
啓動前經過配置文件修改:
重啓後生效;
運行時修改變量值操做方法:
mysql> HELP SET
SET [GLOBAL | SESSION] system_var_name = expr
SET [@@global. | @@session. | @@]system_var_name = expr
注:GLOBAL值的修改要求用戶擁有管理權限;
安裝完成後的安全初始化:
mysql_secure_installation
運行前常修改的參數:
innodb_file_per_table=ON
skip_name_resolve=ON
...
MySQL的數據類型:
字符型
數值型
日期時間型
內建類型
字符型:
CHAR(#), BINARY(#):定長型;CHAR不區分字符大小寫,而BINARY區分;
VARCHAR(#), VARBINARY(#):變長型
TEXT:TINYTEXT,TEXT,MEDIUMTEXT,LONGTEXT
BLOB:TINYBLOB,BLOB,MEDIUMBLOB, LONGBLOB
數值型:
浮點型:近似
FLOAT
DOUBLE
REAL
BIT
整型:精確
INTEGER:TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT
DECIMAL
日期時間型:
日期:DATE
時間:TIME
日期j時間:DATETIME
時間戳:TIMESTAMP
年份:YEAR(2), YEAR(4)
內建:
ENUM:枚舉
ENUM('Sun','Mon','Tue','Wed')
SET:集合
類型修飾符:
字符型:NOT NULL,NULL,DEFALUT ‘STRING’,CHARACET SET ‘CHARSET’,COLLATION ‘collocation'
整型:NOT NULL, NULL, DEFALUT value, AUTO_INCREMENT, UNSIGNED
日期時間型:NOT NULL, NULL, DEFAULT
SQL MODE:定義mysqld對約束等違反時的響應行爲等設定;
經常使用的MODE:
TRADITIONAL
STRICT_TRANS_TABLES
STRICT_ALL_TABLES
修改方式:
mysql> SET GLOBAL sql_mode='MODE';
mysql> SET @@global.sql_mode='MODE';
SQL:DDL,DML
DDL:
mysql> HELP Data Definition
CREATE, ALTER, DROP
DATABASE, TABLE
INDEX, VIEW, USER
FUNCTION, FUNCTION UDF, PROCEDURE, TABLESPACE, TRIGGER, SERVER
DML:
mysql> HELP Data Manipulation
INSERT/REPLACE, DELETE, SELECT, UPDATE
數據庫:
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name CHARACTER SET [=] charset_name COLLATE [=] collation_name
ALTER {DATABASE | SCHEMA} [db_name] CHARACTER SET [=] charset_name COLLATE [=] collation_name
DROP {DATABASE | SCHEMA} [IF EXISTS] db_name
表:
CREATE
(1) CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
(create_definition,...)
[table_options]
[partition_options]
CREATE TABLE [IF NOT EXISTS] tble_name (col_name data_typ|INDEX|CONSTRAINT);
table_options:
ENGINE [=] engine_name
查看支持的全部存儲引擎:
mysql> SHOW ENGINES;
查看指定表的存儲引擎:
mysql> SHOW TABLE STATUS LIKE clause;
ROW_FORMAT [=] {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}
(2) CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
[(create_definition,...)]
[table_options]
[partition_options]
select_statement
直接建立表,並將查詢語句的結果插入到新建立的表中;
(3) CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
{ LIKE old_tbl_name | (LIKE old_tbl_name) }
複製某存在的表的結構來建立新的空表;
DROP:
DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name];
ALTER:
ALTER TABLE tbl_name
[alter_specification [, alter_specification] ...]
可修改內容:
(1) table_options
(2) 添加定義:ADD
字段、字段集合、索引、約束
(3) 修改字段:
CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST|AFTER col_name]
MODIFY [COLUMN] col_name column_definition [FIRST | AFTER col_name]
(4) 刪除操做:DROP
字段、索引、約束
表重命名:
RENAME [TO|AS] new_tbl_name
查看錶結構定義:
DESC tbl_name;
查看錶定義:
SHOW CREATE TABLE tbl_name
查看錶屬性信息:
SHOW TABLE STATUS [{FROM | IN} db_name] [LIKE 'pattern' | WHERE expr]
索引類型:
彙集索引、非彙集索引:索引是否與數據存在一塊兒;
主鍵索引、輔助索引
稠密索引、稀疏索引:是否索引了每個數據項;
BTREE(B+)、HASH、R Tree、FULLTEXT
BTREE:左前綴;
EXPLAIN:分析查詢語句的執行路徑;
索引:
建立:
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [index_type] ON tbl_name (index_col_name,...)
查看:
SHOW {INDEX | INDEXES | KEYS} {FROM | IN} tbl_name [{FROM | IN} db_name] [WHERE expr]
刪除:
DROP INDEX index_name ON tbl_name
視圖:VIEW
虛表:存儲下來的SELECT語句;
建立:
CREATE VIEW view_name [(column_list)] AS select_statement
修改:
ALTER VIEW view_name [(column_list)] AS select_statement
刪除:
DROP VIEW [IF EXISTS] view_name [, view_name] ...
DML:
INSERT/REPLACE,DELETE,UPDATE,SELECT
INSERT:
單行插入
批量插入
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name [(col_name,...)]
{VALUES | VALUE} ({expr | DEFAULT},...),(...),...
[ ON DUPLICATE KEY UPDATE
col_name=expr
[, col_name=expr] ... ]
Or:
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name
SET col_name={expr | DEFAULT}, ...
[ ON DUPLICATE KEY UPDATE
col_name=expr
[, col_name=expr] ... ]
Or:
INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name [(col_name,...)]
SELECT ...
[ ON DUPLICATE KEY UPDATE
col_name=expr
[, col_name=expr] ... ]
DELETE:
DELETE FROM tbl_name [WHERE where_condition] [ORDER BY ...] [LIMIT row_count]
注意:必定要有限制條件,不然將清空整個表;
限制條件:
[WHERE where_condition]
[ORDER BY ...] [LIMIT row_count]
UPDATE:
UPDATE table_reference SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
注意:必定要有限制條件,不然將修改整個表中指定字段的數據;
限制條件:
[WHERE where_condition]
[ORDER BY ...] [LIMIT row_count]
注意:sql_safe_updates變量可阻止不帶條件更新操做;
SELECT:
Query Cache:緩存查詢的執行結果;
key:查詢語句的hash值;
value:查詢語句的執行結果;
SQL語句的編寫方式:
SELECT name FROM tbl2;
select name from tbl2;
查詢執行路徑:
請求-->查詢緩存
請求-->查詢緩存-->解析器-->預處理器-->優化器-->查詢執行引擎-->存儲引擎-->緩存-->響應
SELECT語句的執行流程:
FROM --> WHERE --> Group By --> Having --> Order BY --> SELECT --> Limit
單表查詢:
SELECT
[ALL | DISTINCT | DISTINCTROW ]
[SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
select_expr [, select_expr ...]
[FROM table_references
[WHERE where_condition]
[GROUP BY {col_name | expr | position}
[ASC | DESC], ... [WITH ROLLUP]]
[HAVING where_condition]
[ORDER BY {col_name | expr | position}
[ASC | DESC], ...]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
用法:
SELECT col1, col2, ... FROM tble_name; 極其危險,慎用;
SELECT col1, col2, ... FROM tble_name WHERE clause;
SELECT col1, col2, ... FROM tble_name [WHERE clause] GROUP BY col_name [HAVING clause];
DISTINCT:數據去重;
SQL_CACHE:顯式指定緩存查詢語句的結果;
SQL_NO_CACHE:顯式指定不緩存查詢語句的結果;
query_cache_type服務器變量有三個值:
ON:啓用;
SQL_NO_CACHE:不緩存;默認符合緩存條件都緩存;
OFF:關閉;
DEMAND:按需緩存;
SQL_CACHE:緩存;默認不緩存;
字段可使用別名 :
col1 AS alias1, col2 AS alias2, ...
WHERE子句:指明過濾條件以實現「選擇」功能;
過濾條件:布爾型表達式;
[WHERE where_condition]
算術操做符:+, -, *, /, %
比較操做符:=, <>, !=, <=>, >, >=, <, <=
IS NULL, IS NOT NULL
區間:BETWEEN min AND max
IN:列表;
LIKE:模糊比較,%和_;
RLIKE或REGEXP
邏輯操做符:
AND, OR, NOT
GROUP BY:根據指定的字段把查詢的結果進行「分組」以用於「聚合」運算;
avg(), max(), min(), sum(), count()
HAVING:對分組聚合後的結果進行條件過濾;
ORDER BY:根據指定的字段把查詢的結果進行排序;
升序:ASC
降序:DESC
LIMIT:對輸出結果進行數量限制
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
多表查詢:
鏈接操做:
交叉鏈接(cross join):笛卡爾乘積;沒有任何條件限制的鏈接方式
示例:select * from tb1,tb2;
select * from tb1 cross join tb2;
內鏈接(inner join):多張表中同時符合某種條件的數據記錄的組合;官方建議標準寫法:select * from tb1 inner join tb2 on tb1.tid=tb2.bid;
等值鏈接:使用「=」做爲鏈接條件鏈接兩張表;
示例:select * from tb1,tb2 where tb1.tid=tb2.bid;
不等值鏈接:沒有使用「=」做爲鏈接條件鏈接兩張表;
示例:select * from tb1,tb2 where tb1.tid>tb2.bid;
示例:select * from tb1,tb2 where tb1.tid<tb2.bid;
自鏈接:鏈接的表爲一張表,即本身鏈接本身;
示例:select * from tb1,tb1 where tb1.tid=tb1.id;
天然鏈接(natural join):經過MySql本身的判斷完成鏈接過程,不須要指定鏈接條件。MySql會使用表內的,相同的字段,做爲鏈接條件。
示例:select * from tb1 natural join tb2;
外鏈接:
左外鏈接:以左表爲基準鏈接兩表,即左表的全部數據都展現出來,符合條件的相互鏈接,不符合條件記錄跟右側的「空記錄」鏈接
FROM tb1 LEFT JOIN tb2 ON tb1.col = tb2.col
右外鏈接:以右表爲基準鏈接兩表,即右表的全部數據都展現出來,符合條件的相互鏈接,不符合條件記錄跟左側的「空記錄」鏈接
FROM tb1 RIGHT JOIN tb2 ON tb1.col = tb2.col
全鏈接(full join):會把兩個表全部的行都顯示在結果表中;mariadb不能直接使用full join實現全鏈接;變相實現方式爲left join、union、right join組合來實現;
示例:select * from tb1 left join tb2 on tb1.tid=tb2.id union select * from tb1 right join tb2 on tb1.tid=tb2.id;
子查詢:在查詢中嵌套查詢;
用於WHERE子句中的子查詢;
(1) 用於比較表達式中的子查詢:子查詢僅能返回單個值;
(2) 用於IN中的子查詢:子查詢能夠返回一個列表值;
(3) 用於EXISTS中的子查詢:
用於FROM子句中的子查詢;
SELECT tb_alias.col1, ... FROM (SELECT clause) AS tb_alias WHERE clause;
聯合查詢:將多個查詢語句的執行結果相合並;
UNION:重複的數據會被合併爲一條;
SELECT clause UNION SELECT cluase;
UNION ALL:不合並重復的數據;
SELECT clause UNION ALL SELECT cluase;
MySQL用戶和權限管理
用戶帳號:user@host
user:帳戶名稱;
host:此帳戶可經過哪些客戶端主機請求建立鏈接線程;
%:任意長度牟任意字符;
_:任意單個字符;
skip_name_resolve=ON
MySQL權限類別:
庫級別:
表級別:
字段級別:
管理類:
程序類:
管理類:
CREATE USER
RELOAD
LOCK TABLES
REPLICATION CLIENT, REPLICATION SLAVE
SHUTDOWN
FILE
SHOW DATABASES
PROCESS
SUPER
程序類:
FUNCTION,PROCEDURE,TRIGGER
操做:CREATE,ALTER,DROP,EXECUTE
庫和表級別:
CREATE,ALTER,DROP
INDEX
CREATE VIEW
SHOW VIEW
GRANT:可以把本身得到的權限生成一個副本轉贈給其它用戶;
OPTION
數據操做:
表:
INSERT/DELETE/UPDATE/SELECT
字段:
SELECT(col1,col2,...)
UPDATE(col1,col2,...)
INSERT(col1,col2,...)
全部權限:ALL, ALL PRIVILEGES
元數據數據庫(數據字典):mysql
受權:
db, host, user
tables_priv, column_priv, procs_priv, proxies_priv
MySQL用戶管理:
'user'@'host';
host:
IP
主機名
NETWORK
%, _
skip_name_resolve={ON|OFF}
建立用戶:
CREATE USER 'user'@'host' [IDENTIFIED BY [PASSWORD] 'password'] [,'user'@'host' [IDENTIFIED BY [PASSWORD] 'password']...]
重命名:RENAME USER
RENAME USER old_user TO new_user[, old_user TO new_user] ...
刪除用戶:
DROP USER 'user'@'host' [, 'user'@'host'] ...
讓MySQL從新加載受權表:
FLUSH PRIVILEGES
修改用戶密碼:
(1) SET PASSWORD [FOR 'user'@'host'] = PASSWORD('cleartext password');
(2) UPDATE mysql.user SET Password=PASSWORD('cleartext password') WHERE User='USERNAME' AND Host='HOST';
(3) mysqladmin -uUSERNAME -hHOST -p password 'NEW_PASS'
生效:FLUSH PRIVILEGES
忘記管理員密碼的解決辦法:
(1) 啓動mysqld進程時,使用--skip-grant-tables和--skip-networking選項;
CentOS 7:mariadb.service
CentOS 6:/etc/init.d/mysqld
(2) 經過UPDATE命令修改管理員密碼;
(3) 以正常 方式啓動mysqld進程;
受權:GRANT
GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ...
ON [object_type] priv_level
TO user_specification [, user_specification] ...
[REQUIRE {NONE | ssl_option [[AND] ssl_option] ...}]
[WITH with_option ...]
object_type:
TABLE
| FUNCTION
| PROCEDURE
priv_level:
*
| *.*
| db_name.*
| db_name.tbl_name
| tbl_name
| db_name.routine_name
ssl_option:
SSL
| X509
| CIPHER 'cipher'
| ISSUER 'issuer'
| SUBJECT 'subject'
with_option:
GRANT OPTION
| MAX_QUERIES_PER_HOUR count
| MAX_UPDATES_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count
| MAX_USER_CONNECTIONS count
查看受權:SHOW GRANTS
SHOW GRANTS [FOR 'user'@'host']
取消受權:REVOKE
REVOKE priv_type [(column_list)][, priv_type [(column_list)]] ...
ON [object_type] priv_level
FROM 'user'@'host' [, 'user'@'host'] ...
REVOKE ALL PRIVILEGES, GRANT OPTION
FROM user [, user] ...
查詢緩存:徹底存儲於內存中;
緩存:k/v
key:查詢語句的hash值
value:查詢語句的執行結果
如何判斷緩存是否命中:
經過查詢語句的哈希值判斷:哈希值考慮的因素包括
查詢自己、要查詢數據庫、客戶端使用的協議版本、...
查詢語句在任何字符上的不一樣,都會致使緩存不命中;
哪些查詢可能不會被緩存?
查詢語句中包含UDF
存儲函數
用戶自定義變量
臨時表
mysql系統表或者是包含列級別權限的查詢
有着不肯定結果值的函數(now());
查詢緩存相關的服務器變量:
query_cache_limit:可以緩存的最大查詢結果;(單語句結果集大小上限)
有着較大結果集的語句,建議在SELECT中顯式使用SQL_NO_CACHE,以免先緩存再移出;
query_cache_min_res_unit:內存塊的最小分配單位;緩存太小的查詢結果集會浪費內存空間;
較小的值會減小空間浪費,但會致使更頻繁地內存分配及回收操做;
較大值的會帶來空間浪費,致使碎片過多;
query_cache_size:查詢緩存空間的總共可用的大小;單位是字節,必須是1024的整數倍;
query_cache_strip_comments
query_cache_type:緩存功能啓用與否;
ON:啓用;
OFF:禁用;
DEMAND:按需緩存,僅緩存SELECT語句中帶SQL_CACHE的查詢結果;
query_cache_wlock_invalidate:若是某表被其它鏈接鎖定,是否仍然能夠從查詢緩存中返回查詢結果;默認爲OFF,表示能夠;ON則表示不能夠;
狀態變量:
mysql> SHOW GLOBAL STATUS LIKE 'Qcache%';
+-------------------------+----------+
| Variable_name | Value |
+-------------------------+----------+
| Qcache_free_blocks | 1 |
| Qcache_free_memory | 16759688 |
| Qcache_hits | 0 |
| Qcache_inserts | 0 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 0 |
| Qcache_queries_in_cache | 0 |
| Qcache_total_blocks | 1 |
+-------------------------+----------+
命中率:
Qcache_hits/(Qcache_hits+Com_select)
MySQL中的索引:
基本法則:索引應該構建在被用做查詢條件的字段上;
索引類型:B+ TREE,HASH
B+ TREE:順序存儲,每個葉子結點到根結點的距離相同;左前綴索引,適合於範圍類型的數據查詢;
適用於B+ TREE索引的查詢類型:全鍵值、鍵值範圍或鍵前綴;
全值匹配:精確匹配某個值;
WHERE COLUMN = 'value';
匹配最左前綴:只精確起頭的部分;
WEHRE COLUMN LIKE 'PREFIX%';
匹配範圍值:
精確匹配某一列,範圍匹配另外一列;
只用訪問索引的查詢:覆蓋索引;
index(Name)
SELECT Name FROM students WHERE Name LIKE 'L%';
不適用B+ TREE索引:
若是查條件不是從最左側列開始,索引無效;
index(age,Fname), WHERE Fname='Jerry'; , WHERE age>30 AND Fname='Smith';
不能跳過索引中的某列;
index(name,age,gender)
WHERE name='black' and age > 30;
WHERE name='black' AND gender='F';
若是查詢中的某個列是爲範圍查詢,那麼其右側的列都沒法再使用索引優化查詢;
WHERE age>30 AND Fname='Smith';
Hash索引:基於哈希表實現,特別適用於值的精確匹配查詢;
適用場景:
只支持等值比較查詢,例如=, IN(), <=>
不用場景:
全部非精確值查詢;MySQL僅對memory存儲引擎支持顯式的hash索引;
索引優勢:
下降須要掃描的數據量,減小IO次數;
能夠幫助避免排序操做,避免使用臨時表;
幫助將隨機IO轉爲順序IO;
高性能索引策略:
(1) 在WHERE中獨立使用列,儘可能避免其參與運算;
WHERE age+2 > 32 ;
(2) 左前綴索引:索引構建於字段的最左側的多少個字符,要經過索引選擇性來評估
索引選擇性:不重複的索引值和數據表的記錄總數的比值;
(3) 多列索引:
AND鏈接的多個查詢條件更適合使用多列索引,而非多個單鍵索引;
(4) 選擇合適的索引列次序:選擇性最高的放左側;
EXPLAIN來分析索引有效性:
EXPLAIN [explain_type] SELECT select_options
explain_type:
EXTENDED
| PARTITIONS
輸出結果:
id: 1
select_type: SIMPLE
table: students
type: const
possible_keys: PRIMARY
key: PRIMARY
key_len: 4
ref: const
rows: 1
Extra:
id:當前查詢語句中,第個SELECT語句的編號;
複雜的查詢的類型主要三種:
簡單子查詢
用於FROM中的子查詢
聯合查詢
注意:聯合查詢的分析結果會出現一個額外的匿名臨時表;
select_type:查詢類型:
簡單查詢:SIMPLE
複雜查詢:
簡單子查詢:SUBQUERY
用於FROM中的子查詢:DERIVED
聯合查詢中的第一個查詢:PRIMARY
聯合查詢中的第一個查詢以後的其它查詢:UNION
聯合查詢生成的臨時表:UNION RESULT
table:查詢針對的表;
type:關聯類型,或稱爲訪問類型,即MySQL如何去查詢表中的行
ALL:全表掃描;
index:根據索引的順序進行的全表掃描;但同時若是Extra列出現了"Using index」表示使用了覆蓋索引;
range:有範圍限制地根據索引實現範圍掃描;掃描位置始於索引中的某一項,結束於另外一項;
ref:根據索引返回的表中匹配到某單個值的全部行(匹配給定值的行不止一個);
eq_ref:根據索引返回的表中匹配到某單個值的單一行,僅返回一個行,但須要與某個額外的參考值比較,而不是常數;
const,system:與某個常數比較,且只返回一行;
possiable_keys:查詢中可能會用到的索引;
key:查詢中使用的索引;
key_len:查詢中用到的索引長度;
ref:在利用key字段所顯示的索引完成查詢操做時所引用的列或常量值;
rows:MySQL估計出的爲找到全部的目標項而須要讀取的行數;
Extra:額外信息
Using index:使用了覆蓋索引進行的查詢;
Using where:拿到數據後還要再次進行過濾;
Using temporary:使用了臨時表以完成查詢;
Using filesort:對結果使用了一個外部索引排序;
存儲引擎:
表類型:也稱爲「表類型」,表級別概念,不建議在同一個庫中的表上使用不一樣的ENGINE;
CREATE TABLE ... ENGINE[=]STORAGE_ENGINE_NAME ...
SHOW TABLE STATUS
常見的存儲引擎:
MyISAM, Aria, InnoDB, MRG_MYISAM, CSV, BLACKHOLE, MEMORY, PERFORMANCE_SCHEMA, ARCHIVE, FEDERATED
InnoDB:InnoBase
Percona-XtraDB, Supports transactions, row-level locking, and foreign keys
數據存儲於「表空間(table space)"中:
(1) 全部數據庫中的全部類型爲InnoDB的表的數據和索引存儲於同一個表空間中;
表空間文件:datadir定義的目錄中
文件:ibdata1, ibdata2, ...
(2) innodb_file_per_table=ON,意味着每表使用單獨的表空間文件;
每表的數據文件(數據和索引,存儲於數據庫目錄)存儲於本身專用的表空間文件中,並存儲於數據庫目錄下: tbl_name.ibd
表結構的定義:在數據庫目錄,tbl_name.frm
事務型存儲引擎,適合對事務要求較高的場景中;但較適用於處理大量短時間事務;
基於MVCC(Mutli Version Concurrency Control)支持高併發;支持四個隔離級別,默認級別爲REPEATABLE-READ;間隙鎖以防止幻讀;
使用匯集索引(主鍵索引);
支持」自適應Hash索引「;
鎖粒度:行級鎖;間隙鎖;
總結:
數據存儲:表空間;
併發:MVCC,間隙鎖,行級鎖;
索引:彙集索引、輔助索引;
性能:預讀操做、內存數據緩衝、內存索引緩存、自適應Hash索引、插入操做緩存區;
備份:支持熱備;
SHOW ENGINE INNODB STATUS;
MyISAM:
支持全文索引(FULLTEXT index)、壓縮、空間函數(GIS);
不支持事務
鎖力度:表級鎖
崩潰沒法保證表安全恢復
適用場景:只讀或讀多寫少的場景、較小的表(以保證崩潰後恢復的時間較短);
文件:每一個表有三個文件,存儲於數據庫目錄中
tbl_name.frm:表格式定義;
tbl_name.MYD:數據文件;
tbl_name.MYI:索引文件;
特性:
加鎖和併發:表級鎖;
修復:手動或自動修復、但可能會丟失數據;
索引:非彙集索引;
延遲索引更新;
表壓縮;
行格式:
{DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}
其它的存儲引擎:
CSV:將CSV文件(以逗號分隔字段的文本文件)做爲MySQL表文件;
MRG_MYISAM:將多個MyISAM表合併成的虛擬表;
BLACKHOLE:相似於/dev/null,不真正存儲數據;
MEMORY:內存存儲引擎,支持hash索引,表級鎖,經常使用於臨時表;
FEDERATED: 用於訪問其它遠程MySQL服務器上表的存儲引擎接口;
MariaDB額外支持不少種存儲引擎:
OQGraph、SphinxSE、TokuDB、Cassandra、CONNECT、SQUENCE、...
搜索引擎:
lucene, sphinx
lucene:Solr, ElasticSearch
併發控制:
鎖:Lock
鎖類型 :
讀鎖:共享鎖,可被多個讀操做共享;
寫鎖:排它鎖,獨佔鎖;
鎖粒度:
表鎖:在表級別施加鎖,併發性較低;
行鎖:在行級別施加鎖,併發性較高;維持鎖狀態的成本較大;
鎖策略:在鎖粒度及數據安全性之間尋求一種平衡機制;
存儲引擎:級別以及什麼時候施加或釋放鎖由存儲引擎自行決定;
MySQL Server:表級別,可自行決定,也容許顯式請求;
鎖類別:
顯式鎖:用戶手動請求的鎖;
隱式鎖:存儲引擎自行根據須要施加的鎖;
顯式鎖的使用:
(1) LOCK TABLES
LOCK TABLES tbl_name read|write, tbl_name read|write, ...
UNLOCK TABLES
(2) FLUSH TABLES
FLUSH TABLES tbl_name,... [WITH READ LOCK];
UNLOCK TABLES;
(3) SELECT cluase
[FOR UPDATE | LOCK IN SHARE MODE]
事務:
事務:一組原子性的SQL查詢、或者是一個或多個SQL語句組成的獨立工做單元;
事務日誌:
innodb_log_files_in_group
innodb_log_group_home_dir
innodb_log_file_size
innodb_mirrored_log_groups
ACID測試:
A:AUTOMICITY,原子性;整個事務中的全部操做要麼所有成功執行,要麼所有失敗後回滾;
C:CONSISTENCY,一致性;數據庫老是應該從一個一致性狀態轉爲另外一個一致性狀態;
I:ISOLATION,隔離性;一個事務所作出的操做在提交以前,是否能爲其它事務可見;出於保證併發操做之目的,隔離有多種級別;
D:DURABILITY,持久性;事務一旦提交,其所作出的修改會永久保存;
自動提交:單語句事務 autocommit={0|1};
mysql> SELECT @@autocommit;
+------------------------+
| @@autocommit |
+------------------------+
| 1 |
+------------------------+
mysql> SET @@session.autocommit=0;
手動控制事務:
啓動:START TRANSACTION
提交:COMMIT
回滾:ROLLBACK
事務支持savepoints:
SAVEPOINT identifier 設置一個保存點
ROLLBACK [WORK] TO [SAVEPOINT] identifier 回滾到特定保存點
RELEASE SAVEPOINT identifier 刪除特定保存點
事務隔離級別:
READ-UNCOMMITTED:讀未提交 --> 髒讀;
READ-COMMITTED:讀提交--> 不可重複讀;
REPEATABLE-READ:可重複讀 --> 幻讀; mysql默認事務隔離級別;
SERIALIZABLE:串行化;
mysql> SELECT @@session.tx_isolation;
+----------------------------------+
| @@session.tx_isolation |
+----------------------------------+
| REPEATABLE-READ |
+----------------------------------+
查看InnoDB存儲引擎的狀態信息:
SHOW ENGINE innodb STATUS;
centos 7:手動編譯安裝mariadb
開發環境:
# yum groupinstall "development tools" -y
1、安裝其餘所需;
# yum install ncurses-devel openssl-devel libevent-devel jemalloc-devel cmake
2、下載mariadb源碼包,編譯安裝
# groupadd -r mysql
# useradd -g mysql -r -d /mydata/data mysql
# tar xf mysql-5.5.33.tar.gz
# cd mysql-5.5.33
# cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/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
3、手動建立systemv文件,樣例以下:/usr/lib/systemd/system/mariadb.service
[Unit]
Description=MariaDB database server
After=syslog.target
After=network.target
[Service]
Type=simple
User=mysql
Group=mysql
ExecStartPre=/usr/libexec/mariadb-prepare-db-dir %n
# Note: we set --basedir to prevent probes that might trigger SELinux alarms,
# per bug #547485
ExecStart=/usr/bin/mysqld_safe --basedir=/usr
ExecStartPost=/usr/libexec/mariadb-wait-ready $MAINPID
# Give a reasonable amount of time for the server to start up/shut down
TimeoutSec=300
# Place temp files in a secure directory, not /tmp
PrivateTmp=true
[Install]
WantedBy=multi-user.target
4、手動執行# systemctl daemon-reload加載;
指定安裝文件的安裝路徑時經常使用的選項:
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql
-DMYSQL_DATADIR=/data/mysql
-DSYSCONFDIR=/etc
默認編譯的存儲引擎包括:csv、myisam、myisammrg和heap。若要安裝其它存儲引擎,可使用相似以下編譯選項:
-DWITH_INNOBASE_STORAGE_ENGINE=1
-DWITH_ARCHIVE_STORAGE_ENGINE=1
-DWITH_BLACKHOLE_STORAGE_ENGINE=1
-DWITH_FEDERATED_STORAGE_ENGINE=1
若要明確指定不編譯某存儲引擎,可使用相似以下的選項:
-DWITHOUT_<ENGINE>_STORAGE_ENGINE=1
好比:
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1
-DWITHOUT_FEDERATED_STORAGE_ENGINE=1
-DWITHOUT_PARTITION_STORAGE_ENGINE=1
如若要編譯進其它功能,如SSL等,則可以使用相似以下選項來實現編譯時使用某庫或不使用某庫:
-DWITH_READLINE=1
-DWITH_SSL=system
-DWITH_ZLIB=system
-DWITH_LIBWRAP=0
其它經常使用的選項:
-DMYSQL_TCP_PORT=3306
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock
-DENABLED_LOCAL_INFILE=1
-DEXTRA_CHARSETS=all
-DDEFAULT_CHARSET=utf8
-DDEFAULT_COLLATION=utf8_general_ci
-DWITH_DEBUG=0
-DENABLE_PROFILING=1
若是想清理此前的編譯所生成的文件,則須要使用以下命令:
make clean
rm CMakeCache.txt
mariadb日誌:
查詢日誌:query log;
記錄查詢操做; 記錄於文件file、表table;
general_log=on | off 日誌開啓與否
log_output=file | table 日誌保存格式
general_log_file=HOSTNAME.log 日誌文件位置及名稱
慢查詢日誌:slow query log;
執行時長超過指定時長的查詢操做;long_query_time以秒爲單位
slow_query_log=on | off
log_slow_queries
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_rate_limit 慢查詢記錄的速率
log_slow_verbosity 慢查詢記錄的詳細程度
錯誤日誌:error log;
記錄mysqld啓動和關閉過程當中輸出的事件信息、mysqld運行中產生的錯誤信息、event scheduler運行一個event時產生的日誌信息、在主從複製架構中的從服務器上啓動從 服務器線程產生的信息;
log_error=/var/log/mariadb/mariadb.log
log_warnings=1 | 0 是否記錄警告信息至錯誤日誌文件中
二進制日誌:binary log;
記錄致使數據改變或潛在致使數據改變的sql語句;
功能:用於經過「重放」日誌文件中的事件來生成數據副本;
相關內置查詢命令:
SHOW {BINARY | MASTER} LOGS 查看使用的二進制日誌文件列表
SHOW MASTER STATUS 查看正在使用中的二進制日誌文件
SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count] 查看具體二進制文件中的事件
二進制日誌記錄格式:
基於「語句」記錄:statement
基於「行」記錄:row
混合模式:mixed,讓系統自行斷定該基於哪一種方式進行;
二進制日誌文件構成:兩類文件:
日誌文件:mysql-bin.文件名後綴
索引文件:mysql-bin.index
服務器變量:
sql_log_bin=ON | OFF 是否記錄二進制日誌;
log_bin=/PATH/TO/BIN_LOG_FILE 二進制日誌記錄文件位置;建議設置爲mysql-bin
binlog_format=STATEMENT 二進制日誌文件的格式
max_binlog_size 單個二進制日誌文件的最大致積;默認爲1G;注意:(1)到達最大值會自動滾動;(2)文件達到上限時的大小未必爲精確值;
sync_binlog= 1 | 0 是否啓用二進制日誌同步功能;
expire_logs_days 多久自動刪除
二進制日誌查看命令: mysqlbinlog [options] log_file ...
中繼日誌:reley log;
複製架構中,從服務器用於保存從主服務器的二進制中讀取到事件;
relay_log
relay_log_index
relay_log_info_file
relay_log_purge
relay_log_recovery
relay_log_space_limit
sync_relay_log
sync_relay_log_info
事務日誌:transaction log;
事務型存儲引擎自行管理和使用;
innodb_log_group_home_dir 事務日誌文件位置
innodb_log_files_in_group 組內文件數量
innodb_log_file_size 文件大小
備份和恢復
數據備份通常備份:數據、二進制日誌、innodb事務日誌、服務器的配置文件、代碼(存儲過程、存儲函數、觸發器、事件調度器);
備份:徹底備份、增量備份、差別備份;
熱備:讀寫操做都可進行;
溫備:讀操做可執行,但不可寫操做;
冷備:讀寫操做均不可進行;
設計備份方案:
數據集:徹底+增量;
備份手段:物理,邏輯;
備份工具的選擇:
mysqldump+複製binlog:
mysqldump:徹底備份;
複製binlog中指定時間範圍的event:增量備份;
lvm2快照+複製binlog:
lvm2快照:使用cp或tar等作物理備份;徹底備份;
複製binlog中指定時間範圍的event:增量備份;
xtrabackup:
由percona提供的支持對innodb作熱備份(物理備份)的工具;徹底備份、增量備份;
邏輯備份工具:mysqldump、mydumper、phpMyAdmin
mysqldump:通常適用於G級別如下的備份;
shell> mysqldump [options] db_name [tbl_name ...] 區別:不會建立數據庫自己,只是備份數據庫信息,還原時需自行建立該數據庫;
shell> mysqldump [options] --databases db_name ...
shell> mysqldump [options] --all-databases
MyISAM引擎:支持溫備:鎖定備份庫,然後啓動備份操做;對innodb引擎的表同樣生效,實現溫備;
鎖定方法:
--lock-all-tables:鎖定全部庫的全部表;
--lock-tables:對於每一個單獨的數據庫,在啓動備份以前鎖定全部表,非同時鎖定全部庫的全部表;
InnoDB:支持熱備;
--single-transaction
其餘選項:
-E,--events:備份指定數據庫相關的全部event scheduler;
-R,--routines:備份指定數據庫相關的全部存儲函數和存儲過程;
--triggers:備份表相關的觸發器;
--master-data=2:記錄爲註釋的CHANGE MASTER TO語句;
--flush-logs:鎖定表完成後,執行flush logs命令;
注意:二進制日誌文件不該該與數據文件放在同一磁盤;
基於lvm2的數據庫備份:
(1)請求鎖定全部表:
mysql> flush tables with read lock;
(2)記錄二進制日誌文件及事件位置;
mysql> flush logs;
mysql -e 'show master status' > /root/pos.`date +%F`
(3)建立快照
lvcreate -L 10G -s -n data-snap -p r /dev/mydata/data
(4)釋放全局鎖;
mysql> unlock tables;
(5)掛載快照卷,執行數據備份;
mount -r /dev/mydata/data-snap /mnt
cp -a /mnt/* /tmp
(6)備份完成後,刪除快照卷;
(7)制定好策略,經過原卷備份二進制日誌(建議備份前滾動下二進制日誌);
基於lvm2的數據庫還原:
(1)建議還原前臨時關閉二進制日誌:
mysql> SET sql_bin_log=0;
(2)恢復數據庫文件,除二進制日誌文件;
cp -a /tmp/mysql/* /data/mysql
(3)啓動數據庫,並查找對應的二進制日誌文件的記錄位置,進行選擇性重放;
systemctl start mariadb
cat /root/pos 查看得知具體position
mysqlbinlog --start-position=245 mysql-bin.000004
xtrabackup備份:最小權限的備份用戶只需擁有reload,lock tables,replication client權限便可;
注意:僅對innodb引擎支持徹底、增量備份,且不少功能須要開啓innodb_file_per_table;
一、徹底備份;BASEDIR爲徹底備份路徑;
innobackupex --user=DBUSER --password=SECRET BASEDIR
二、增量備份;需指明針對一個徹底備份或者增量備份作備份;即--incremental-basedir
innobackupex --user=DBUSER --password=SECRET --incremental /backup --incremental-basedir=BASEDIR
三、還原備份步驟:
a、準備(prepare),需合併增量到徹底備份上,先合併第一個增量,而後遞歸一直到最後一個;BASEDIR爲徹底備份路徑;
innobackupex --apply-log --redo-only BASEDIR
innobackupex --apply-log --redo-only BASEDIR --incremental-dir=INCREMENTAL-DIR-1
innobackupex --apply-log --redo-only BASEDIR --incremental-dir=INCREMENTAL-DIR-2 ......
b、中止mysql,並還原備份
systemctl stop mariadb
innobackupex --copy-back /path/to/backup/dir
c、確保數據庫文件屬主屬組正確,並啓動數據庫
mysql主從複製架構:
複製的功用:
數據分佈
負載均衡
備份
高可用和故障切換
mysql升級測試
主從複製:
從節點:
I/O thread:從master請求二進制日誌事件,並保存於中繼日誌中:
SQL thread:從中繼日誌中讀取日誌事件,在本地完成重發;
主節點:
DUMP thread:爲每一個slave的I/O thread啓動一個dump線程,用於向其發送二進制日誌事件;
特色:
一、異步複製;
二、主從數據不一致比較常見;
複製架構:
M/S,M/M
一主多從:從服務器還能夠再有從服務器;
二進制日誌事件格式:
statement、row、mixed
主從複製配置:
主節點:
(1)啓動二進制日誌;
# vim /etc/my.cnf
log_bin=master-bin
(2)爲當前節點設置一個全局惟一的ID號;
server_id=1
(3)建立有複製權限(replication slave、replication client)的用戶帳號;
# systemctl start mariadb
# mysql -uroot -p
mysql> grant replication slave,replication client on *.* to 'repluser'@'172.20.120.%' identified by 'replpass';
mysql> flush privileges;
從節點:
(1)啓動中繼日誌;
# vim /etc/my.cnf
relay_log=relay-log
relay_log_index=relay_log.index
(2)爲當前節點設置一個全局惟一的ID號;
server_id=3
(3)使用有複製權限的用戶帳號鏈接至主服務器,並啓動複製線程;
# mysql -uroot -p
mysql> change master to master_host='172.20.120.10',master_user='repluser',master_password='replpass', master_log_file='master-bin.000003',master_log_pos=245;
mysql> start slave;
查看slave信息:mysql> show slave status\G;
複製架構中應該注意的問題:
一、限制從服務器爲只讀;read_only=ON;此限制對擁有super權限的用戶均無效;
阻止全部用戶:mysql> flush tables with read lock;
二、如何保證主從複製的事務安全?
在master節點啓用參數:sync_binlog=ON、sync_master_info=ON
若是用到的爲innodb存儲引擎:
innodb_flush_logs_at_trx_commit=ON
innodb_support_xa=ON
在slave節點啓用參數:skip_slave_start=ON、sync_relay_log=ON、sync_relay_log_info=ON
若是主節點已經運行一段時間,且有大量數據時,如何配置並啓動從節點?
一、經過備份恢復數據到從服務器;
二、複製起始位置爲備份時的二進制日誌文件及其pos。即
mysql> change master to master_host='172.20.120.10',master_user='repluser',master_password='replpass', master_log_file='master-bin.000003',master_log_pos=245;
mysql> start slave;
主主複製配置:
互爲主從:
一、數據不一致:所以,慎用;
二、自動增加id:
配置一個節點使用奇數id,auto_increment_offset=1,auto_increment_increment=2
另外一節點使用偶數id,auto_increment_offset=2,auto_increment_increment=2
配置步驟:
一、各節點使用一個惟一server_id;
二、都啓用log_bin和relay_log;
三、都得建立擁有複製權限(replication slave、replication client)的用戶帳號;
四、自定義自動增加id;
五、均把對方指定爲主節點,並啓動複製線程;
半同步複製 相關查看命令:show global variables like '%semi%'; show global status like '%semi%';
master:
一、mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
二、mysql> set global variables rpl_semi_sync_master_enabled=1;
mysql> start slave;
slave:
一、mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
二、mysql> set global variables rpl_semi_sync_slave_enabled=1;
mysql> start slave;
複製過濾器:
讓從節點僅複製指定的數據庫,或指定數據庫的指定表;
有兩種實現方式:
一、主服務器僅向二進制日誌中記錄與特定數據庫(特定表)相關的事件;
問題:時間點還原沒法實現,不建議使用;
具體實施方案:
binlog_do_db= :數據庫白名單列表,逗號隔開
binlog_ignore_db= :數據庫黑名單列表,逗號隔開
二、從服務器SQL_THREAD在replay中繼日誌中的事件時,僅讀取特定的數據庫(特定表)相關的事件並應用於本地;
問題:會形成網絡及磁盤IO浪費;
具體實施方案:
replicate_do_db=
replicate_ignore_db=
replicate_do_table=
replicate_ignore_table=
replicate_wild_do_table=
replicate_wild_ignore_table=
基於ssl複製:
前提:支持ssl;
(1)master端配置證書和私鑰:而且建立一個要求必須使用ssl鏈接的複製帳號;
grant replication slave,replication client on *.* to 'repluser'@'172.20.120.%' identified by 'replpass' require ssl;
(2)slave端使用change master to 命令時指明ssl相關選項;
跟複製功能相關的文件:
master.info:用於保存slave鏈接至master時的相關信息;例如帳號、密碼、服務器地址等等;
relay-log.info:保存在當前slave節點上已經複製的當前二進制日誌和本地replay log日誌的對應關係;
複製的監控和維護:
(1)清理日誌:請保證已備份;
MySQL> purge binary log to 'mysql-bin.000002'; 清理具體某個二進制日誌以前的全部
MySQL> purge binary log before '2018-04-12 10:00:00';
(2)複製監控;
MySQL> show master status;
MySQL> show binlog events;
MySQL> show binary logs;
MySQL> show slave status;
MySQL> show processlist;
(3)從服務器是否落後於主服務器;
從服務器:MySQL> show slave status; ----------> Seconds_Behind_Master: 0 具體查看指標
(4)如何肯定主從節點數據是否一致;
安裝percona-tools包
(5)數據不一致如何修復;
肯定以主節點爲準,從新複製;
mysql分佈式系統:
cap:一致性,可用性、網絡分區容錯性;
切分:cobar、gizzard
一、垂直切分:俗稱分庫;
二、水平切分: 分表,sharding
主節點高可用方案:
MMM:多主
MHA:master HA:經過對主節點進行監控,可實現自動故障轉移至其餘從節點;經過提高某一從節點爲新的主節點;
galera cluster:wresp;經過wresp協議,在全局實現複製,任何一節點均可讀寫;
高可用mysql常見方案:
heartbeat+drbd
mysql cluster
半同步複製
全局事務ID
MHA:master HA:開源的mysql的高可用程序;爲mysql主從複製架構提供automating master failover功能;
MHA服務的兩種角色:
MHA manager:一般單獨部署在一個獨立機器上管理多個master/slave集羣;
MHA node:運行在每臺mysql服務器上(master/slave/manager),經過監控具有解析和清理logs功能的腳原本加快故障轉移;
MHA環境中主機ssh互信:
ssh-keygen -t rsa -P ''
cat .ssh/id_rsa.pub >> .ssh/authorized_keys
chmod 600 .ssh/authorized_keys
scp -p .ssh/id_rsa .ssh/authorized_keys node2:/root/.ssh
scp -p .ssh/id_rsa .ssh/authorized_keys node3:/root/.ssh
scp -p .ssh/id_rsa .ssh/authorized_keys node4:/root/.ssh
MHA配置文件:
global配置,爲各application提供默認配置;
application配置:
server
centos7下mha環境搭建:
mha4mySQL-manager和mha4mysql-node
https://github.com/yoshinorim/mha4mysql-manager
https://github.com/yoshinorim/mha4mysql-node
使用版本分別是:mha4mysql-manager-0.58-0.el7.centos.noarch.rpm、mha4mysql-node-0.58-0.el7.centos.noarch.rpm
步驟:
1:MHA環境中主機ssh互信;
2:搭建好mysql的主從複製;
3:配置好配置文件;
具體操做可查閱馬哥教育的MHA.PDF文檔;
複製的問題和解決方案:
一、數據損壞或丟失:
master:MHA + SEMI repl(半同步複製)
slave:從新複製
二、混合使用存儲引擎:
myisam:不支持事務
innodb:支持事務
三、不惟一的server id
從新複製
四、複製延遲
須要額外的監控工具輔助
數據庫服務衡量指標:測試工具:sysbench
qps:query per second:每秒查詢量
use information_schema;
select VARIABLE_VALUE into @num_queries from GLOBAL_STATUS where VARIABLE_NAME ='QUESTIONS';
select VARIABLE_VALUE into @uptime from GLOBAL_STATUS where VARIABLE_NAME ='UPTIME';
select @num_queries/@uptime;
tps:transaction per second:每秒事務量
use information_schema;
select VARIABLE_VALUE into @num_com from GLOBAL_STATUS where VARIABLE_NAME ='COM_COMMIT';
select VARIABLE_VALUE into @num_roll from GLOBAL_STATUS where VARIABLE_NAME ='COM_ROLLBACK';
select VARIABLE_VALUE into @uptime from GLOBAL_STATUS where VARIABLE_NAME ='UPTIME';
select (@num_com+@num_roll)/@uptime;
基於galera cluster構建多主模型的複製集羣:無需前端動靜分離,可直接負載均衡便可;動靜分離(mysql-proxy等目前不成熟),不少時候需自研工具;
wresp協議;
percona-cluster
mariadb-cluster:對應的軟件由https://downloads.mariadb.org官網提供下載
優勢:網絡狀態可用狀況下,節點間基本實時數據同步,完勝MHA的日誌可能不一樣步;
特色:分擔讀操做,前端不必讀寫分離、只需作負載均衡便可。
條件:一、至少要三個節點;二、不能安裝mariadb-server。
配置文件參數解釋:注意配置文件需節點都設置;
# cat /etc/my.cnf.d/server.cnf
[galera]
# Mandatory settings
wsrep_provider= "/usr/lib64/galera/libgalera_smm.so"#插件;
wsrep_cluster_address="gcomm://172.20.120.67,172.20.120.68,172.20.120.69"
wsrep_cluster_name=my_galera_cluster
#wsrep_node_address=#節點地址,可省略;
#wsrep_node_name=#節點名,可省略;
binlog_format=row#二進制日誌格式;
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2#鎖格式;
bind-address=0.0.0.0#工做時監聽的地址;
首次啓動時,須要初始化集羣,在其中任意節點上執行以下命令:
/etc/init.d/mysql start --wsrep-new-cluster [--wsrep_cluster_name=my_galera_cluster]
然後正常啓動其餘節點:
/etc/init.d/mysql start
中間件實現mysql讀寫分離:
mysql-proxy----->atlas(奇虎)
amoeba