mysqld服務器程序工做特性的定義方式:node
1. 命令行選項:重啓失效,對當前會話有效。mysql
2. 配置文件參數:需重啓才能生效。sql
服務器參數/變量:設定MySQL的運行特性;數據庫
查看運行特性的方法:緩存
mysql> SHOW GLOBAL|[SESSION] VARIABLES [LIKE clause];安全
狀態(統計)參數/變量:保存MySQL運行中的統計數據或狀態數據,沒法更改,只能重置。服務器
查看狀態參數的方法:session
mysql> SHOW GLOBA|[SESSION] STATUS [LIKE clause];數據結構
顯示單個變量設定值的方法:架構
mysql> SELECT @@[global.|session.]system_var_name
%:匹配任意長度的任意字符;
_:匹配任意單個字符;
變量/參數級別:
全局:爲全部會話設定默認。管理員可修改。
會話:跟單個會話相關;會話創建會從全局繼承;
服務器變量的調整方式:
運行時修改:
global:僅對修改後新創建的會話有效。
session:僅對當前會話有效,且當即生效。
啓動前經過配置文件修改:
重啓後生效;
運行時修改變量值操做方法:
SET [GLOBAL | SESSION] system_var_name = expr
SET [@@global. | @@session. | @@]system_var_name = expr
例:
MariaDB [(none)]> SHOW VARIABLES LIKE 'innodb%';
MariaDB [(none)]> SHOW VARIABLES LIKE 'innodb_file%';
+--------------------------+----------+
| Variable_name | Value |
+--------------------------+----------+
| innodb_file_format | Antelope |
| innodb_file_format_check | ON |
| innodb_file_format_max | Antelope |
| innodb_file_per_table | OFF |
+--------------------------+----------+
4 rows in set (0.00 sec)
MariaDB [(none)]> SELECT @@global.innodb_file_per_table; #查看特定變量的值
+--------------------------------+
| @@global.innodb_file_per_table |
+--------------------------------+
| 0 |
+--------------------------------+
1 row in set (0.00 sec)
什麼是事務
一組原子性的SQL查詢、或者是一個或多個SQL語句組成的獨立工做單元;
通俗地講:假如一個操做分兩個步驟,兩個步驟都成功纔算一個事務執行成功。有一個不成功都不算成功。
事務日誌的保存位置:
磁盤上一段連續的空間。事務日誌有多個文件,必須成組出現,通常兩個,三個也能夠。一個文件寫滿寫第二個文件。第一個文件的內容當即寫入磁盤中。
事務先追加至事務日誌,操做所有完成後同步到磁盤上。
事務日誌定義:
放在mysqld配置段中,或者mariadb或者server配置段中。
innodb_log_files_in_group 事務日誌文件
innodb_log_group_home_dir 事務日誌存放路徑,默認存放在數據文件下。
innodb_log_file_size 事務日誌大小,字節爲單位
innodb_mirrored_log_groups 事務日誌有幾個境像組。默認1個,放在不一樣的存儲設備中。
若是一個存儲引擎知足ACID測試,則說明它支持事務:
A:AUTOMICITY,原子性;整個事務中的全部操做要麼所有成功執行,要麼所有失敗後回滾;
C:CONSISTENCY,一致性;數據庫老是應該從一個一致性狀態轉爲另外一個一致性狀態;
I:ISOLATION,隔離性;一個事務所作出的操做在提交以前,是否能爲其它事務可見;出於保證併發操做之目的,隔離有多種級別;
D:DURABILITY,持久性;事務一旦提交,其所作出的修改會永久保存;
事務的控制:
自動提交事務:
mysql默認自動啓動事務,每一個操做都是一個事務,這對服務器性能有所影響,一般須要關掉,本身顯式啓動事務,顯式關閉事務。
mysql> SELECT @@autocommit; #查詢當前事務級別
+------------------------+
| @@autocommit |
+------------------------+
| 1 |
+------------------------+
mysql> SET @@session.autocommit=0; #關閉單語句事務
MariaDB [mydb]> START TRANSACTION; #開啓事務
手動控制事務:
啓動:START TRANSACTION
提交:COMMIT 提交後沒法撤消
回滾:ROLLBACK
設置斷點:SAVEPOINT identifier
事務回滾:ROLLBACK [WORK] TO [SAVEPOINT] identifier
釋放斷點:RELEASE SAVEPOINT identifier
例:
MariaDB [mydb]> select * from tbl1;
+------+--------------+------+
| id | name | age |
+------+--------------+------+
| 1 | tom | 11 |
| 2 | jerry | 12 |
| 3 | obama | 10 |
| 4 | dasheng | 127 |
| 5 | bajie | 20 |
| 7 | xuedao Laozu | 67 |
+------+--------------+------+
6 rows in set (0.00 sec)
MariaDB [mydb]> DELETE FROM tbl1 WHERE name='bajie';
Query OK, 1 row affected (0.00 sec)
MariaDB [mydb]> select * from tbl1;
+------+--------------+------+
| id | name | age |
+------+--------------+------+
| 1 | tom | 11 |
| 2 | jerry | 12 |
| 3 | obama | 10 |
| 4 | dasheng | 127 |
| 7 | xuedao Laozu | 67 |
+------+--------------+------+
5 rows in set (0.00 sec)
MariaDB [mydb]> ROLLBACK;
Query OK, 0 rows affected (0.00 sec)
MariaDB [mydb]> select * from tbl1;
+------+--------------+------+
| id | name | age |
+------+--------------+------+
| 1 | tom | 11 |
| 2 | jerry | 12 |
| 3 | obama | 10 |
| 4 | dasheng | 127 |
| 5 | bajie | 20 |
| 7 | xuedao Laozu | 67 |
+------+--------------+------+
6 rows in set (0.00 sec)
MariaDB [mydb]> UPDATE tbl1 SET id=5 WHERE name=
-> 'bajie';
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1 Changed: 0 Warnings: 0
MariaDB [mydb]> SAVEPOINT first;
Query OK, 0 rows affected (0.00 sec)
MariaDB [mydb]> DELETE FROM tbl1 WHERE id=1;
Query OK, 1 row affected (0.00 sec)
MariaDB [mydb]> SAVEPOINT second;
Query OK, 0 rows affected (0.00 sec)
MariaDB [mydb]> DELETE FROM tbl1 WHERE id=2;
Query OK, 1 row affected (0.00 sec)
MariaDB [mydb]> select * from tbl1;
+------+--------------+------+
| id | name | age |
+------+--------------+------+
| 3 | obama | 10 |
| 4 | dasheng | 127 |
| 5 | bajie | 20 |
| 7 | xuedao Laozu | 67 |
+------+--------------+------+
4 rows in set (0.00 sec)
MariaDB [mydb]> ROLLBACK TO second;
Query OK, 0 rows affected (0.00 sec)
MariaDB [mydb]> select * from tbl1;
+------+--------------+------+
| id | name | age |
+------+--------------+------+
| 2 | jerry | 12 |
| 3 | obama | 10 |
| 4 | dasheng | 127 |
| 5 | bajie | 20 |
| 7 | xuedao Laozu | 67 |
+------+--------------+------+
5 rows in set (0.00 sec)
MariaDB [mydb]> ROLLBACK TO first;
Query OK, 0 rows affected (0.00 sec)
MariaDB [mydb]> select * from tbl1;
+------+--------------+------+
| id | name | age |
+------+--------------+------+
| 1 | tom | 11 |
| 2 | jerry | 12 |
| 3 | obama | 10 |
| 4 | dasheng | 127 |
| 5 | bajie | 20 |
| 7 | xuedao Laozu | 67 |
+------+--------------+------+
6 rows in set (0.00 sec)
事務隔離級別:
READ-UNCOMMITTED:讀未提交 --> 髒讀 隔離性最差,併發性最高,事務安全性沒法保證,儘可能不使用。
READ-COMMITTED:讀提交--> 不可重複讀;
REPEATABLE-READ:可重複讀 --> 幻讀;
SERIALIZABLE:串行化 只有別的用戶肯定後才能夠讀。最高隔離級別,併發性最低級別。
mysql> SELECT @@session.tx_isolation;
+----------------------------------+
| @@session.tx_isolation |
+----------------------------------+
| REPEATABLE-READ |
+----------------------------------+
查看InnoDB存儲引擎的狀態信息:
SHOW ENGINE innodb STATUS;
MariaDB [mydb]> SELECT @@session.tx_isolation; #查看當前事務隔離級別
+------------------------+
| @@session.tx_isolation |
+------------------------+
| REPEATABLE-READ |
+------------------------+
MariaDB [mydb]> SET @@session.tx_isolation='READ-UNCOMMITTED'; #設置事務隔離級別
Query OK, 0 rows affected (0.00 sec)
MariaDB [mydb]> SELECT @@session.tx_isolation;
+------------------------+
| @@session.tx_isolation |
+------------------------+
| READ-UNCOMMITTED |
+------------------------+
1 row in set (0.00 sec)
數據庫的存儲引擎:
InnoDB:InnoBase特性:
支持:Percona-XtraDB, Supports transactions(支持事務), row-level locking(行級鎖), and foreign keys(外鍵)
數據存儲於表空間(table space)中,有兩種存儲方式:
1. 全部數據庫中的全部類型爲InnoDB的表的數據和索引存儲於同一個表空間中。一個表空間對應磁盤中的一個文件,支持分散在多個文件中,通常是串行相加。
表空間是一個黑盒,用戶無須瞭解,也不須要知道內部怎麼運做。table space能夠理解爲建構在文件系統上的又一個文件系統。表空間內部可實現更爲強大的數據組織和編排邏輯,它把數據和索引保存在一塊兒,因此也能夠支持彙集索引(聚簇索引),所以它的主鍵索引也是一個是彙集索引,其它索引(輔助索引)都指向此索引來輔助工做。
2. 每表使用單獨的表空間文件
由innodb_file_per_table=ON定義。data和indexex都保存在一塊兒。更加高級的方式,也是innodb表空間的高級功能支持時的默認使用類型。也支持每一個表空間多個文件。
每表的數據文件(數據和索引,存儲於數據庫目錄)存儲於本身專用的表空間文件中,並存儲於數據庫目錄下: tbl_name.ibd
表結構的定義:在數據庫目錄,tbl_name.frm
事務型存儲引擎,適合對事務要求較高的場景中(在線事務處理,如電商);但較適用於處理大量短時間小事務(事務執行時間不宜太長,語句不能太多,太多有可能致使死鎖);
基於MVCC(Mutli Version Concurrency Control)支持高併發;支持四個隔離級別,默認級別爲REPEATABLE-READ;間隙鎖以防止幻讀;
使用匯集索引(主鍵索引)
彙集索引:數據和索引保存在一塊兒。數據存在索引所在處,找到索引就找到數據了。
非彙集索引:數據和索引分開存放。找到索引以後,只能找到數據所在處的指針,裝載數據所在的磁盤塊才找到數據
支持」自適應Hash索引「;
鎖粒度:行級鎖(只鎖定須要操做的行);間隙鎖(要操做行之間的間隙);
總結:
數據存儲:表空間;
併發實現:經過MVCC,間隙鎖,行級鎖;
支持的索引類型:彙集索引、輔助索引;
性能特性:預讀操做、內存數據緩衝、內存索引緩存、自適應Hash索引、插入操做緩存區;
備份:支持基於工具作熱備;
查看InnoDB存儲引擎的內部狀態信息:
SHOW ENGINE INNODB STATUS;
MyISAM特性:
支持全文索引(FULLTEXT index)、數據壓縮、空間函數(GIS,輻射索引,按空間,如附近的人);
不支持事務,不支持外鍵
鎖粒度:表級鎖 產生鎖競爭的機會少
崩潰後沒法保證表安全恢復
適用場景:只讀或讀多寫少的場景、較小的表(以保證崩潰後恢復的時間較短);
文件:每一個表有三個文件,存儲於數據庫目錄中
tbl_name.frm:表格式定義;
tbl_name.MYD:數據文件;
tbl_name.MYI:索引文件;
特性:
加鎖和併發:表級鎖;
修復:手動或自動修復、但可能會丟失數據;
索引:非彙集索引;
延遲索引更新;
表壓縮;壓縮後沒法更改。
行格式:
{DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}
mysql的索引:
索引:提取索引的建立在的表上字段中的數據,構建出一個獨特的數據結構
索引的做用:加速查詢操做;反作用:下降寫操做性能;
表中數據子集:把表中某個或某些字段的數據提取出來另存爲一個特定數據結構組織的數據;
某個字段或某些字段:WHERE子句中用到的字段;
索引類型: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索引;
日誌類型:
查詢日誌:general_log
慢查詢日誌:log_slow_queries
錯誤日誌:log_error, log_warnings
二進制日誌:binlog
中繼日誌:relay_log
事務日誌:innodb_log
1、查詢日誌(增刪改查都會涉及到查詢,通常不開啓,嚴重影響性能)
記錄查詢語句,日誌存儲位置支持兩種:
(1)文件:file
(2)表:table (mysql.general_log)
查詢日誌的定義:
general_log={ON|OFF}
general_log_file=HOSTNAME.log(相對路徑:一般相對數據目錄而言。或使用絕對路徑保存在指定位置)
log_output={FILE|TABLE|NONE} 也能夠保存在file和table中,對查詢日誌沒多大必要啓動。
FILE:記錄在文件中
TABLE:記錄在general_log表中
NONE:不記錄
FILE,TABLE:同時記錄在文件和表中
2、慢查詢日誌 一般爲了排查性能問題都應該記錄
慢查詢:運行時間超出指定時長的查詢(默認時長 10s);
long_query_time
存儲位置:
文件:FILE
表:TABLE,mysql.slow_log
慢查詢日誌的定義:
log_slow_queries={ON|OFF}建議修改配置文件永久生效
slow_query_log={ON|OFF}
slow_query_log_file= 保存位置
log_output={FILE|TABLE|NONE} 指明記錄的位置
log_slow_rate_limit 記錄日誌時的速度限制
log_slow_verbosity 記錄日誌的詳細程度
基於優化後經常使用選項,可用於排查定位故障
log_slow_filter=admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk
admin:基於管理
filesort:基於文件的排序
filesort on disk:基於磁盤的文件排序
full_join:全鏈接
full_scan:全表掃描
query_cache:查詢緩存
query_cache_miss:查詢緩存未命中
tmp_table:
tmp_table_on_disk:
MariaDB [(none)]> SELECT @@global.long_query_time; #慢查詢日誌默認時長
+--------------------------+
| @@global.long_query_time |
+--------------------------+
| 10.000000 |
+--------------------------+
1 row in set (0.00 sec)
3、錯誤日誌 rpm包安裝默認啓用
記錄信息:
(1) mysqld啓動和關閉過程 輸出的信息;
(2) mysqld運行中產生的錯誤信息;
(3) event scheduler運行時產生的信息;
(4) 主從複製架構中,從服務器複製線程啓動時產生的日誌;
錯誤日誌定義方法:
log_error=/var/log/mariadb/mariadb.log|OFF
log_warnings={ON|OFF}
4、二進制日誌
用於記錄引發數據改變或存在引發數據改變的潛在可能性的語句(STATEMENT)或改變後的結果(ROW),也多是兩者混合;極其重要的日誌。
強烈不建議和數據文件放一塊兒。
功用:「重放」
二進制日誌的格式定義(全局功能):
二進制日誌有三種格式:STATEMENT|ROW|MIXED
binlog_format={STATEMENT|ROW|MIXED}
STATEMENT:語句;
ROW:行;語句執行結果(有時語句的執行結果會變)
MIXED:混編;由mysql自動斷定使用哪一種格式
查看二進制日誌文件列表:
SHOW MASTER|BINARY LOGS;
mysql服務重啓一次會滾動一第二天志,不管上一個日誌寫入多少內容,都從新建立一個新的日誌文件。
flush logs;命令也會滾動日誌
單個日誌文件默認最大1G,達到最大後自動滾動新文件。
MariaDB [(none)]> SHOW BINARY LOGS; 查看當前使用哪一個二進制文件
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 601 |
| mysql-bin.000002 | 443 |
+------------------+-----------+
2 rows in set (0.00 sec)
MariaDB [(none)]> SHOW MASTER LOGS; 查看當前使用哪一個二進制文件
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 601 |
| mysql-bin.000002 | 443 |
+------------------+-----------+
2 rows in set (0.00 sec)
查看當前正在使用的二進制日誌文件:
SHOW MASTER STATUS;
MariaDB [mydb]> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 | 443 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
查看二進制 日誌文件中的事件:
SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
MariaDB [mydb]> SHOW BINLOG EVENTS; 查看二進制日誌事件
+------------------+-----+-------------+-----------+-------------+----------------------------------------------------------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+-----+-------------+-----------+-------------+----------------------------------------------------------------------------------------------------------+
| mysql-bin.000001 | 4 | Format_desc | 1 | 245 | Server ver: 5.5.56-MariaDB, Binlog ver: 4 |
| mysql-bin.000001 | 245 | Query | 1 | 424 | grant replication slave,replication client on *.* to 'master'@'192.168.200.%' identified by 'masterpass' |
| mysql-bin.000001 | 424 | Query | 1 | 499 | flush privileges |
| mysql-bin.000001 | 499 | Query | 1 | 582 | create database abcd |
| mysql-bin.000001 | 582 | Stop | 1 | 601 | |
+------------------+-----+-------------+-----------+-------------+----------------------------------------------------------------------------------------------------------+
5 rows in set (0.00 sec)
MariaDB [mydb]> SHOW BINLOG EVENTS in 'mysql-bin.000001'; 查看哪一個二進制日誌的事件
+------------------+-----+-------------+-----------+-------------+----------------------------------------------------------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+-----+-------------+-----------+-------------+----------------------------------------------------------------------------------------------------------+
| mysql-bin.000001 | 4 | Format_desc | 1 | 245 | Server ver: 5.5.56-MariaDB, Binlog ver: 4 |
| mysql-bin.000001 | 245 | Query | 1 | 424 | grant replication slave,replication client on *.* to 'master'@'192.168.200.%' identified by 'masterpass' |
| mysql-bin.000001 | 424 | Query | 1 | 499 | flush privileges |
| mysql-bin.000001 | 499 | Query | 1 | 582 | create database abcd |
| mysql-bin.000001 | 582 | Stop | 1 | 601 | |
+------------------+-----+-------------+-----------+-------------+----------------------------------------------------------------------------------------------------------+
5 rows in set (0.00 sec)
Pos:起始位置
End_log_pos:結束位置
MariaDB [mydb]> SHOW BINLOG EVENTS in 'mysql-bin.000001' FROM 499;
+------------------+-----+------------+-----------+-------------+----------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+-----+------------+-----------+-------------+----------------------+
| mysql-bin.000001 | 499 | Query | 1 | 582 | create database abcd |
| mysql-bin.000001 | 582 | Stop | 1 | 601 | |
+------------------+-----+------------+-----------+-------------+----------------------+
2 rows in set (0.00 sec)
MariaDB [mydb]> SHOW BINLOG EVENTS in 'mysql-bin.000001' FROM 499 LIMIT 1;
+------------------+-----+------------+-----------+-------------+----------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+-----+------------+-----------+-------------+----------------------+
| mysql-bin.000001 | 499 | Query | 1 | 582 | create database abcd |
+------------------+-----+------------+-----------+-------------+----------------------+
1 row in set (0.00 sec)
查詢二進制日誌是否啓動 select @@global.log_bin; 若查詢結果不爲空則是開啓。
服務器變量:
log_bin=/PATH/TO/BIN_LOG_FILE|OFF
只讀全局變量,只能修改配置文件重啓生效。
放在mysqld配置段
確保二進制日誌保存目錄屬於mysql用戶和組
session.sql_log_bin={ON|OFF}
控制某會話中的「寫」操做語句是否會被記錄於日誌文件中;
MariaDB [mydb]> SET @@session.sql_log_bin=0;
max_binlog_size=1073741824
日誌文件最大大小,建議能夠改的更小一些。根據需求定義。
sync_binlog={1|0}
每一個修改日誌的操做都是先保存到內存中,每隔一段時間同步到磁盤一次。
該選項控制只要有語句提交時,是否是當即同步到磁盤上。
當即同步:全部操做都會保存,對數據安全性很重要,可是會影響磁盤IO性能。
緩存後隔一段時間同步:會提高性能,但須要恢復數據庫數據時可能會丟失部分數據(保存到內存中,未保存到二進制日誌文件的那部分)。
命令提示符查看二進制日誌:
mysqlbinlog:
--start-datetime= 開始時間 時間定義:YYYY-MM-DD hh:mm:ss
--stop-datetime= 結束時間
-j, --start-position=# 起始位置
--stop-position=# 結束位置
查看其它服務器二進制日誌:
--user, --host, --password
二進制日誌事件格式:
# at 553
#160831 9:56:08 server id 1 end_log_pos 624 Query thread_id=2 exec_time=0 error_code=0
SET TIMESTAMP=1472608568/*!*/;
BEGIN
/*!*/;
事件的起始位置:# at 553
事件發生的日期時間:#160831 9:56:08
事件發生的服務器id:server id 1
事件的結束位置:end_log_pos 624
事件的類型:Query
事件發生時所在服務器執行此事件的線程的ID: thread_id=2
語句的時間戳與將其寫入二進制日誌文件中的時間差:exec_time=0 沒有小數的概念
錯誤代碼:error_code=0
事件內容:SET TIMESTAMP=1472608568/*!*/;
[root@node1 ~]# mysqlbinlog /data/mysql/logs/mysql-bin.000002
# at 313
#180603 12:42:43 server id 1 end_log_pos 416 Query thread_id=5 exec_time=0 error_code=0
use `mydb`/*!*/;
SET TIMESTAMP=1528000963/*!*/;
UPDATE tbl1 SET id=5 WHERE name=
'bajie'
/*!*/;
[root@node1 ~]# mysqlbinlog --start-datetime="2018-06-01 10:00:00" /data/mysql/logs/mysql-bin.000002
中繼日誌:支撐主從複製進行的支撐工具
從服務器上記錄下來從主服務器的二進制日誌文件同步過來的事件;重放完即清理。
事務日誌:只對事務型存儲引擎有用
事務型存儲引擎innodb用於保證事務特性的日誌文件:
redo log
undo log