日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

Mysql笔记总结

發(fā)布時(shí)間:2024/4/19 数据库 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mysql笔记总结 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Mysql筆記

1.架構(gòu)

1.概念

MySQL Server架構(gòu)自頂向下大致可以分網(wǎng)絡(luò)連接層、服務(wù)層、存儲(chǔ)引擎層和系統(tǒng)文件層

  • 網(wǎng)絡(luò)連接層

    客戶端連接器(Client Connectors):提供與MySQL服務(wù)器建立的支持。

  • 服務(wù)層

    服務(wù)層是MySQL Server的核心,主要包含系統(tǒng)管理和控制工具、連接池、SQL接口、解析器、查詢優(yōu)化器和緩存六個(gè)部分。

    • 連接池(Connection Pool):負(fù)責(zé)存儲(chǔ)和管理客戶端與數(shù)據(jù)庫(kù)的連接,一個(gè)線程負(fù)責(zé)管理一個(gè)連接。
    • 系統(tǒng)管理和控制工具(*Management Services & Utilities):例如備份恢復(fù)、安全管理、集群管理
    • SQL接口(SQL Interface)用于接受客戶端發(fā)送的各種SQL命令,并且返回用戶需要查詢的結(jié)果。比如DML、DDL、存儲(chǔ)過(guò)程、視圖、觸發(fā)器等。
    • 解析器(Parser):負(fù)責(zé)將請(qǐng)求的SQL解析生成一個(gè)"解析樹(shù)"。然后根據(jù)一些MySQL規(guī)則進(jìn)一步檢查解析樹(shù)是否合法。
    • 查詢優(yōu)化器(Optimizer):當(dāng)“解析樹(shù)”通過(guò)解析器語(yǔ)法檢查后,將交由優(yōu)化器將其轉(zhuǎn)化成執(zhí)行計(jì)劃,然后與存儲(chǔ)引擎交互。
  • 存儲(chǔ)引擎層

    存儲(chǔ)引擎負(fù)責(zé)MySQL中數(shù)據(jù)的存儲(chǔ)與提取,與底層系統(tǒng)文件進(jìn)行交互。

  • 系統(tǒng)文件層

    將數(shù)據(jù)庫(kù)的數(shù)據(jù)和日志存儲(chǔ)在文件系統(tǒng)之上,并完成與存儲(chǔ)引擎的交互,是文件的物理存儲(chǔ)層

    • 日志文件
    • 配置文件
    • 數(shù)據(jù)文件
    • pid 文件
    • socket 文件

2.執(zhí)行流程

通訊機(jī)制:

  • 全雙工:能同時(shí)發(fā)送和接收數(shù)據(jù),例如平時(shí)打電話。

  • 半雙工:指的某一時(shí)刻,要么發(fā)送數(shù)據(jù),要么接收數(shù)據(jù),不能同時(shí)。例如早期對(duì)講機(jī)

  • 單工:只能發(fā)送數(shù)據(jù)或只能接收數(shù)據(jù)。例如單行道

? 查詢緩存

show variables like '%query_cache%'; show status like '%Qcache%';

3.存儲(chǔ)引擎

存儲(chǔ)引擎在MySQL的體系架構(gòu)中位于第三層,負(fù)責(zé)MySQL中的數(shù)據(jù)的存儲(chǔ)和提取,是與文件打交道的子系統(tǒng),它是根據(jù)MySQL提供的文件訪問(wèn)層抽象接口定制的一種文件訪問(wèn)機(jī)制,這種機(jī)制就叫作存儲(chǔ)引擎。

查詢命令

show engines #查詢當(dāng)前數(shù)據(jù)庫(kù)支持的引擎

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-dR4xfYhm-1599925202767)(D:\拉鉤筆記\lagouNode\4Stage\Mysql(上)]\pic\引擎查詢.png)

  • InnoDB:支持事務(wù),具有提交,回滾和崩潰恢復(fù)能力,事務(wù)安全

  • MyISAM:不支持事務(wù)和外鍵,訪問(wèn)速度快

  • Memory:利用內(nèi)存創(chuàng)建表,訪問(wèn)速度非常快,因?yàn)閿?shù)據(jù)在內(nèi)存,而且默認(rèn)使用Hash索引,但是一旦關(guān)閉,數(shù)據(jù)就會(huì)丟失

1.InnoDB和MyISAM對(duì)比

InnoDBMyISAM是使用MySQL時(shí)最常用的兩種引擎類型

  • 事務(wù)和外鍵

    InnoDB支持事務(wù)和外鍵,具有安全性和完整性,適合大量insert或update操作

    MyISAM不支持事務(wù)和外鍵,它提供高速存儲(chǔ)和檢索,適合大量的select查詢操作

  • 鎖機(jī)制

    InnoDB支持行級(jí)鎖,鎖定指定記錄。基于索引來(lái)加鎖實(shí)現(xiàn)

    MyISAM支持表級(jí)鎖,鎖定整張表

  • 索引結(jié)構(gòu)

    InnoDB使用聚集索引(聚簇索引),索引和記錄在一起存儲(chǔ),既緩存索引,也緩存記錄。

    MyISAM使用非聚集索引(非聚簇索引),索引和記錄分開(kāi)

  • 并發(fā)處理能力

    MyISAM使用表鎖,會(huì)導(dǎo)致寫(xiě)操作并發(fā)率低,讀之間并不阻塞,讀寫(xiě)阻塞。

    InnoDB讀寫(xiě)阻塞可以與隔離級(jí)別有關(guān),可以采用多版本并發(fā)控制(MVCC)來(lái)支持高并發(fā)

  • 存儲(chǔ)文件

    InnoDB表對(duì)應(yīng)兩個(gè)文件,一個(gè).frm表結(jié)構(gòu)文件,一個(gè).ibd數(shù)據(jù)文件。InnoDB表最大支持64TB;

    MyISAM表對(duì)應(yīng)三個(gè)文件,一個(gè).frm表結(jié)構(gòu)文件,一個(gè)MYD表數(shù)據(jù)文件,一個(gè).MYI索引文件。從MySQL5.0開(kāi)始默認(rèn)限制是256TB。

2.InnoDB和MyISAM的適用場(chǎng)景

  • MyISAM

    • 不需要事務(wù)支持(不支持)

    • 并發(fā)相對(duì)較低(鎖定機(jī)制問(wèn)題)

    • 數(shù)據(jù)修改相對(duì)較少,以讀為主

    • 數(shù)據(jù)一致性要求不高

  • InnoDB

    • 需要事務(wù)支持(具有較好的事務(wù)特性)
    • 行級(jí)鎖定對(duì)高并發(fā)有很好的適應(yīng)能力
    • 數(shù)據(jù)更新較為頻繁的場(chǎng)景
    • 數(shù)據(jù)一致性要求較高
    • 硬件設(shè)備內(nèi)存較大,可以利用InnoDB較好的緩存能力來(lái)提高內(nèi)存利用率,減少磁盤IO

3.InnoDB和MyISAM的總結(jié)

是否需要事務(wù)? 有,InnoDB是否存在并發(fā)修改? 有,InnoDB是否追求快速查詢,且數(shù)據(jù)修改少?是,MyISAM在絕大多數(shù)情況下,推薦使用InnoDB

4.InnoDB存儲(chǔ)結(jié)構(gòu)

1.內(nèi)存結(jié)構(gòu)

內(nèi)存結(jié)構(gòu)主要包括Buffer Pool、Change Buffer、Adaptive Hash Index和Log Buffer四大組件

  • Buffer Pool緩存池
  • Change Buffer:寫(xiě)緩沖區(qū),簡(jiǎn)稱CB
  • Adaptive Hash Index:自適應(yīng)哈希索引,用于優(yōu)化對(duì)BP數(shù)據(jù)的查詢。
  • Log Buffer:日志緩沖區(qū)

Buffer Pool

BP的底層采用鏈表數(shù)據(jù)結(jié)構(gòu)管理Page。在InnoDB訪問(wèn)表記錄和索引時(shí)會(huì)在Page頁(yè)中緩存,以后使用可以減少磁盤IO操作,提升效率

Buffer Pool配置參數(shù)

show variables like '%innodb_page_size%'; //查看page頁(yè)大小 show variables like '%innodb_old%'; //查看lru list中old列表參數(shù) show variables like '%innodb_buffer%'; //查看buffer pool參數(shù) #建議:將innodb_buffer_pool_size設(shè)置為總內(nèi)存大小的60%-80%,innodb_buffer_pool_instances可以設(shè)置為多個(gè),這樣可以避免緩存爭(zhēng)奪。

Change Buffer

ChangeBuffffer占用BufffferPool空間,默認(rèn)占25%,最大允許占50%,可以根據(jù)讀寫(xiě)業(yè)務(wù)量來(lái)進(jìn)行調(diào)整。參數(shù)innodb_change_buffffer_max_size;

Adaptive Hash Index

自適應(yīng)哈希索引,用于優(yōu)化對(duì)BP數(shù)據(jù)的查詢。InnoDB存儲(chǔ)引擎會(huì)監(jiān)控對(duì)表索引的查找,如果觀察到建立哈希索引可以帶來(lái)速度的提升,則建立哈希索引,所以稱之為自適應(yīng)。InnoDB存儲(chǔ)引擎會(huì)自動(dòng)根據(jù)訪問(wèn)的頻率和模式來(lái)為某些頁(yè)建立哈希索引

Log Buffer

日志緩沖區(qū),用來(lái)保存要寫(xiě)入磁盤上log文件(Redo/Undo)的數(shù)據(jù),日志緩沖區(qū)的內(nèi)容定期刷新到磁盤log文件中。日志緩沖區(qū)滿時(shí)會(huì)自動(dòng)將其刷新到磁盤,當(dāng)遇到BLOB或多行更新的大事務(wù)操作時(shí),增加日志緩沖區(qū)可以節(jié)省磁盤I/O。

2.磁盤結(jié)構(gòu)

InnoDB磁盤主要包含Tablespaces,InnoDB Data Dictionary,Doublewrite Buffffer、Redo Log和Undo Logs。

Tablespaces

用于存儲(chǔ)表結(jié)構(gòu)和數(shù)據(jù)。表空間又分為系統(tǒng)表空間、獨(dú)立表空間、通用表空間、臨時(shí)表空間、Undo表空間等多種類型;

  • 系統(tǒng)表空間 默認(rèn)包含任何用戶在系統(tǒng)表空間創(chuàng)建的表數(shù)據(jù)和索引數(shù)據(jù)。系統(tǒng)表空間是一個(gè)共享的表空間因?yàn)樗潜欢鄠€(gè)表共享的。

  • 獨(dú)立表空間 默認(rèn)開(kāi)啟,獨(dú)立表空間是一個(gè)單表表空間,該表創(chuàng)建于自己的數(shù)據(jù)文件中,而非創(chuàng)建于系統(tǒng)表空間中。

  • 通用表空間 通用表空間為通過(guò)create tablespace語(yǔ)法創(chuàng)建的共享表空間。通用表空間可以創(chuàng)建于mysql數(shù)據(jù)目錄外的其他表空間,其可以容納多張表,且其支持所有的行格式。

  • 撤銷表空間 由一個(gè)或多個(gè)包含Undo日志文件組成。

  • 臨時(shí)表空間 mysql服務(wù)器正常關(guān)閉或異常終止時(shí),臨時(shí)表空間將被移除,每次啟動(dòng)時(shí)會(huì)被重新創(chuàng)建

InnoDB Data Dictionary

InnoDB數(shù)據(jù)字典由內(nèi)部系統(tǒng)表組成,這些表包含用于查找表、索引和表字段等對(duì)象的元數(shù)據(jù)。元數(shù)據(jù)物理上位于InnoDB系統(tǒng)表空間中。由于歷史原因,數(shù)據(jù)字典元數(shù)據(jù)在一定程度上與InnoDB表元數(shù)據(jù)文件(.frm文件)中存儲(chǔ)的信息重疊。

Doublewrite Buffffer

在BufffferPage的page頁(yè)刷新到磁盤真正的位置前,會(huì)先將數(shù)據(jù)存在Doublewrite 緩沖區(qū)。

Redo Log

重做日志是一種基于磁盤的數(shù)據(jù)結(jié)構(gòu),用于在崩潰恢復(fù)期間更正不完整事務(wù)寫(xiě)入的數(shù)據(jù)。

Undo Logs

撤消日志是在事務(wù)開(kāi)始之前保存的被修改數(shù)據(jù)的備份,用于例外情況時(shí)回滾事務(wù)。

5.InnoDB數(shù)據(jù)文件

1.InnoDB文件存儲(chǔ)結(jié)構(gòu)

InnoDB數(shù)據(jù)文件存儲(chǔ)結(jié)構(gòu):分為一個(gè)ibd數(shù)據(jù)文件–>Segment(段)–>Extent(區(qū))–>Page(頁(yè))–>Row(行)

  • Tablesapce 表空間,用于存儲(chǔ)多個(gè)ibd數(shù)據(jù)文件,用于存儲(chǔ)表的記錄和索引。一個(gè)文件包含多個(gè)段

  • Segment 段,用于管理多個(gè)Extent

  • Extent 區(qū),一個(gè)區(qū)固定包含64個(gè)連續(xù)的頁(yè),大小為1M。

  • Page 頁(yè),用于存儲(chǔ)多個(gè)Row行記錄,大小為16K。

  • Row行,包含了記錄的字段值,事務(wù)ID(Trx id)、滾動(dòng)指針(Roll pointer)、字段指針(Fieldpointers)等信息

SHOW TABLE STATUS #查看命令

通過(guò) information_schema 查看指定表的文件格式

select * from information_schema.innodb_sys_tables;

如果某些字段信息過(guò)長(zhǎng),無(wú)法存儲(chǔ)在B樹(shù)節(jié)點(diǎn)中,這時(shí)候會(huì)被單獨(dú)分配空間,此時(shí)被稱為溢出頁(yè),該字段被稱為頁(yè)外列。

REDUNDANT 行格式

使用REDUNDANT行格式,表會(huì)將變長(zhǎng)列值的前768字節(jié)存儲(chǔ)在B樹(shù)節(jié)點(diǎn)的索引記錄中,其余的存儲(chǔ)在溢出頁(yè)上。對(duì)于大于等于786字節(jié)的固定長(zhǎng)度字段InnoDB會(huì)轉(zhuǎn)換為變長(zhǎng)字段,以便能夠在頁(yè)外存儲(chǔ)。

COMPACT 行格式

與REDUNDANT行格式相比,COMPACT行格式減少了約20%的行存儲(chǔ)空間,但代價(jià)是增加了某些操作的CPU使用量。如果系統(tǒng)負(fù)載是受緩存命中率和磁盤速度限制,那么COMPACT格式可能更快。如果系統(tǒng)負(fù)載受到CPU速度的限制,那么COMPACT格式可能會(huì)慢一些。

DYNAMIC 行格式

使用DYNAMIC行格式,InnoDB會(huì)將表中長(zhǎng)可變長(zhǎng)度的列值完全存儲(chǔ)在頁(yè)外,而索引記錄只包含指向溢出頁(yè)的20字節(jié)指針。大于或等于768字節(jié)的固定長(zhǎng)度字段編碼為可變長(zhǎng)度字段。DYNAMIC行格式支持大索引前綴,最多可以為3072字節(jié),可通過(guò)innodb_large_prefifix參數(shù)控制。

COMPRESSED 行格式

COMPRESSED行格式提供與DYNAMIC行格式相同的存儲(chǔ)特性和功能,但增加了對(duì)表和索引數(shù)據(jù)壓縮的支持

在創(chuàng)建表和索引時(shí),文件格式都被用于每個(gè)InnoDB表數(shù)據(jù)文件(其名稱與*.ibd匹配)。修改文件格式的方法是重新創(chuàng)建表及其索引,最簡(jiǎn)單方法是對(duì)要修改的每個(gè)表使用以下命令:

ALTER TABLE 表名 ROW_FORMAT=格式類型;

6.Undo Log

介紹

Undo:意為撤銷或取消,以撤銷操作為目的,返回指定某個(gè)狀態(tài)的操作。

Undo Log:數(shù)據(jù)庫(kù)事務(wù)開(kāi)始之前,會(huì)將要修改的記錄存放到 Undo 日志里,當(dāng)事務(wù)回滾時(shí)或者數(shù)據(jù)庫(kù)崩潰時(shí),可以利用 Undo 日志,撤銷未提交事務(wù)對(duì)數(shù)據(jù)庫(kù)產(chǎn)生的影響。

Undo Log產(chǎn)生和銷毀:Undo Log在事務(wù)開(kāi)始前產(chǎn)生;事務(wù)在提交時(shí),并不會(huì)立刻刪除undolog,innodb會(huì)將該事務(wù)對(duì)應(yīng)的undo log放入到刪除列表中,后面會(huì)通過(guò)后臺(tái)線程purge thread進(jìn)行回收處理。Undo Log屬于邏輯日志,記錄一個(gè)變化過(guò)程。例如執(zhí)行一個(gè)delete,undolog會(huì)記錄一個(gè)insert;執(zhí)行一個(gè)update,undolog會(huì)記錄一個(gè)相反的update。

show variables like '%innodb_undo%';

Undo Log作用

  • 實(shí)現(xiàn)事務(wù)的原子性
  • 實(shí)現(xiàn)多版本并發(fā)控制(MVCC)

事務(wù)A手動(dòng)開(kāi)啟事務(wù),執(zhí)行更新操作,首先會(huì)把更新命中的數(shù)據(jù)備份到 Undo Buffffer 中。

事務(wù)B手動(dòng)開(kāi)啟事務(wù),執(zhí)行查詢操作,會(huì)讀取 Undo 日志數(shù)據(jù)返回,進(jìn)行快照讀

7.Redo Log和Binlog

Redo Log介紹

Redo:顧名思義就是重做。以恢復(fù)操作為目的,在數(shù)據(jù)庫(kù)發(fā)生意外時(shí)重現(xiàn)操作

Redo Log:指事務(wù)中修改的任何數(shù)據(jù),將最新的數(shù)據(jù)備份存儲(chǔ)的位置(Redo Log),被稱為重做日志。

Redo Log 的生成和釋放:隨著事務(wù)操作的執(zhí)行,就會(huì)生成Redo Log,在事務(wù)提交時(shí)會(huì)將產(chǎn)生

Redo Log寫(xiě)入Log Buffer,并不是隨著事務(wù)的提交就立刻寫(xiě)入磁盤文件。等事務(wù)操作的臟頁(yè)寫(xiě)入到磁盤之后,Redo Log 的使命也就完成了,Redo Log占用的空間就可以重用(被覆蓋寫(xiě)入)。

show variables like '%innodb_log%';

Binlog日志

Redo Log 是屬于InnoDB引擎所特有的日志,而MySQL Server也有自己的日志,即 Binarylog(二進(jìn)制日志),簡(jiǎn)稱Binlog。

Binlog是記錄所有數(shù)據(jù)庫(kù)表結(jié)構(gòu)變更以及表數(shù)據(jù)修改的二進(jìn)制日志不會(huì)記錄SELECT和SHOW這類操作

Binlog兩個(gè)最重要的使用場(chǎng)景

  • 主從復(fù)制:在主庫(kù)中開(kāi)啟Binlog功能,這樣主庫(kù)就可以把Binlog傳遞給從庫(kù),從庫(kù)拿到Binlog后實(shí)現(xiàn)數(shù)據(jù)恢復(fù)達(dá)到主從數(shù)據(jù)一致性。
  • 數(shù)據(jù)恢復(fù):通過(guò)mysqlbinlog工具來(lái)恢復(fù)數(shù)據(jù)。

Binlog文件操作

Binlog狀態(tài)查看

show variables like 'log_bin';

開(kāi)啟Binlog功能

mysql> set global log_bin=mysqllogbin;

需要修改my.cnf或my.ini配置文件,在[mysqld]下面增加log_bin=mysql_bin_log,重啟

MySQL服務(wù)。

#log-bin=ON #log-bin-basename=mysqlbinlog binlog-format=ROW log-bin=mysqlbinlog

使用show binlog events命令

show binary logs; //等價(jià)于show master logs; show master status; show binlog events; show binlog events in 'mysqlbinlog.000001';

使用mysqlbinlog 命令

mysqlbinlog “文件名”

mysqlbinlog “文件名” > “test.sql”

使用 binlog 恢復(fù)數(shù)據(jù)

//按指定時(shí)間恢復(fù) mysqlbinlog --start-datetime="2020-04-25 18:00:00" --stop- datetime="2020-04-26 00:00:00" mysqlbinlog.000002 | mysql -uroot -p1234 //按事件位置號(hào)恢復(fù) mysqlbinlog --start-position=154 --stop-position=957 mysqlbinlog.000002 | mysql -uroot -p1234

mysqldump:定期全部備份數(shù)據(jù)庫(kù)數(shù)據(jù)。mysqlbinlog可以做增量備份和恢復(fù)操作。

刪除Binlog文件

purge binary logs to 'mysqlbinlog.000001'; //刪除指定文件 purge binary logs before '2020-04-28 00:00:00'; //刪除指定時(shí)間之前的文件 reset master; //清除所有文件

通過(guò)設(shè)置expire_logs_days參數(shù)來(lái)啟動(dòng)自動(dòng)清理功能。默認(rèn)值為0表示沒(méi)啟用。設(shè)置為1表示超出1天binlog文件會(huì)自動(dòng)刪除掉。

Redo Log和Binlog區(qū)別

  • Redo Log是屬于InnoDB引擎功能,Binlog是屬于MySQL Server自帶功能,并且是以二進(jìn)制文件記錄。

  • Redo Log屬于物理日志,記錄該數(shù)據(jù)頁(yè)更新?tīng)顟B(tài)內(nèi)容,Binlog是邏輯日志,記錄更新過(guò)程。

  • Redo Log日志是循環(huán)寫(xiě),日志空間大小是固定,Binlog是追加寫(xiě)入,寫(xiě)完一個(gè)寫(xiě)下一個(gè),不會(huì)覆蓋使用。

  • Redo Log作為服務(wù)器異常宕機(jī)后事務(wù)數(shù)據(jù)自動(dòng)恢復(fù)使用,Binlog可以作為主從復(fù)制和數(shù)據(jù)恢復(fù)使用。Binlog沒(méi)有自動(dòng)crash-safe能力。

2.索引

1.索引類型

索引可以提升查詢速度,會(huì)影響where查詢,以及order by排序。MySQL索引類型如下:

  • 從索引存儲(chǔ)結(jié)構(gòu)劃分:B Tree索引、Hash索引、FULLTEXT全文索引、R Tree索引

  • 從應(yīng)用層次劃分:普通索引、唯一索引、主鍵索引、復(fù)合索引

  • 從索引鍵值類型劃分:主鍵索引、輔助索引(二級(jí)索引)

  • 從數(shù)據(jù)存儲(chǔ)和索引鍵值邏輯關(guān)系劃分:聚集索引(聚簇索引)、非聚集索引(非聚簇索引)

普通索引

基于普通字段建立的索引,沒(méi)有任何限制。

  • CREATE INDEX <索引的名字> ON tablename (字段名);

  • ALTER TABLE tablename ADD INDEX [索引的名字] (字段名);

  • CREATE TABLE tablename ( […], INDEX [索引的名字] (字段名) );

唯一索引

索引字段的值必須唯一,但允許有空值 。在創(chuàng)建或修改表時(shí)追加唯一約束,就會(huì)自動(dòng)創(chuàng)建對(duì)應(yīng)的唯一索引。

  • CREATE UNIQUE INDEX <索引的名字> ON tablename (字段名);

  • ALTER TABLE tablename ADD UNIQUE INDEX [索引的名字] (字段名);

  • CREATE TABLE tablename ( […], UNIQUE [索引的名字] (字段名) ;

主鍵索引

特殊的唯一索引,不允許有空值。在創(chuàng)建或修改表時(shí)追加主鍵約束即可,每個(gè)表只能有一個(gè)主鍵

  • CREATE TABLE tablename ( […], PRIMARY KEY (字段名) );

  • ALTER TABLE tablename ADD PRIMARY KEY (字段名);

復(fù)合索引

單一索引是指索引列為一列的情況,即新建索引的語(yǔ)句只實(shí)施在一列上;用戶可以在多個(gè)列上建立索引,這種索引叫做組復(fù)合索引(組合索引)。復(fù)合索引可以代替多個(gè)單一索引,相比多個(gè)單一索引復(fù)合索引所需的開(kāi)銷更小。

索引同時(shí)有兩個(gè)概念叫做窄索引和寬索引,窄索引是指索引列為1-2列的索引,寬索引也就是索引列超過(guò)2列的索引,設(shè)計(jì)索引的一個(gè)重要原則就是能用窄索引不用寬索引,因?yàn)檎饕冉M合索引更有效

  • CREATE INDEX <索引的名字> ON tablename (字段名1,字段名2…);
  • ALTER TABLE tablename ADD INDEX [索引的名字] (字段名1,字段名2…);
  • CREATE TABLE tablename ( […], INDEX [索引的名字] (字段名1,字段名2…) );

復(fù)合索引使用注意事項(xiàng):

  • 何時(shí)使用復(fù)合索引,要根據(jù)where條件建索引,注意不要過(guò)多使用索引,過(guò)多使用會(huì)對(duì)更新操作效率有很大影響。

  • 如果表已經(jīng)建立了(col1,col2),就沒(méi)有必要再單獨(dú)建立(col1);如果現(xiàn)在有(col1)索引,如果查詢需要col1和col2條件,可以建立(col1,col2)復(fù)合索引,對(duì)于查詢有一定提高。

全文索引

查詢操作在數(shù)據(jù)量比較少時(shí),可以使用like模糊查詢,但是對(duì)于大量的文本數(shù)據(jù)檢索,效率很低。如果使用全文索引,查詢速度會(huì)比like快很多倍

創(chuàng)建全文索引的方法如下:

  • CREATE FULLTEXT INDEX <索引的名字> ON tablename (字段名);

  • ALTER TABLE tablename ADD FULLTEXT [索引的名字] (字段名);

  • CREATE TABLE tablename ( […], FULLTEXT KEY [索引的名字] (字段名) ;

select * from user where match(name) against('aaa');

全文索引使用注意事項(xiàng)

  • 全文索引必須在字符串、文本字段上建立。

  • 全文索引字段值必須在最小字符和最大字符之間的才會(huì)有效。(innodb:3-84;myisam:4-84)

  • 全文索引字段值要進(jìn)行切詞處理,按syntax字符進(jìn)行切割,例如b+aaa,切分成b和aaa

  • 全文索引匹配查詢,默認(rèn)使用的是等值匹配,例如a匹配a,不會(huì)匹配ab,ac。如果想匹配可以在布爾模式下搜索a*

2.索引原理

MySQL官方對(duì)索引定義:是存儲(chǔ)引擎用于快速查找記錄的一種數(shù)據(jù)結(jié)構(gòu)。需要額外開(kāi)辟空間和數(shù)據(jù)維護(hù)工作。

  • 索引是物理數(shù)據(jù)頁(yè)存儲(chǔ),在數(shù)據(jù)文件中(InnoDB,ibd文件),利用數(shù)據(jù)頁(yè)(page)存儲(chǔ)。

  • 索引可以加快檢索速度,但是同時(shí)也會(huì)降低增刪改操作速度,索引維護(hù)需要代價(jià)。

二分查找法

二分查找法也叫作折半查找法,它是在有序數(shù)組中查找指定數(shù)據(jù)的搜索算法。它的優(yōu)點(diǎn)是等值查詢、范圍查詢性能優(yōu)秀,缺點(diǎn)是更新數(shù)據(jù)、新增數(shù)據(jù)、刪除數(shù)據(jù)維護(hù)成本高

Hash結(jié)構(gòu)

Hash底層實(shí)現(xiàn)是由Hash表來(lái)實(shí)現(xiàn)的,是根據(jù)鍵值 <key,value> 存儲(chǔ)數(shù)據(jù)的結(jié)構(gòu)。非常適合根據(jù)key查找value值,也就是單個(gè)key查詢,或者說(shuō)等值查詢。

InnoDB自適應(yīng)哈希索引:在使用Hash索引訪問(wèn)時(shí),一次性查找就能定位數(shù)據(jù),等值查詢效率要優(yōu)于B+Tree。

自適應(yīng)哈希索引的建立使得InnoDB存儲(chǔ)引擎能自動(dòng)根據(jù)索引頁(yè)訪問(wèn)的頻率和模式自動(dòng)地為某些熱點(diǎn)頁(yè)建立哈希索引來(lái)加速訪問(wèn)

show engine innodb status \G; show variables like '%innodb_adaptive%';

B+Tree結(jié)構(gòu)

MySQL數(shù)據(jù)庫(kù)索引采用的是B+Tree結(jié)構(gòu),在B-Tree結(jié)構(gòu)上做了優(yōu)化改造。

聚簇索引和輔助索引

聚簇索引和非聚簇索引:B+Tree的葉子節(jié)點(diǎn)存放主鍵索引值和行記錄就屬于聚簇索引;如果索引值和行記錄分開(kāi)存放就屬于非聚簇索引。

主鍵索引和輔助索引:B+Tree的葉子節(jié)點(diǎn)存放的是主鍵字段值就屬于主鍵索引;如果存放的是非主鍵值就屬于輔助索引(二級(jí)索引)。

在InnoDB引擎中,主鍵索引采用的就是聚簇索引結(jié)構(gòu)存儲(chǔ)

  • 聚簇索引(聚集索引)

聚簇索引是一種數(shù)據(jù)存儲(chǔ)方式,InnoDB的聚簇索引就是按照主鍵順序構(gòu)建 B+Tree結(jié)構(gòu)。B+Tree的葉子節(jié)點(diǎn)就是行記錄,行記錄和主鍵值緊湊地存儲(chǔ)在一起。 這也意味著 InnoDB 的主鍵索引就是數(shù)據(jù)表本身,它按主鍵順序存放了整張表的數(shù)據(jù),占用的空間就是整個(gè)表數(shù)據(jù)量的大小。通常說(shuō)的主鍵索引就是聚集索引

  • 輔助索引

InnoDB輔助索引,也叫作二級(jí)索引,是根據(jù)索引列構(gòu)建 B+Tree結(jié)構(gòu)。但在 B+Tree 的葉子節(jié)點(diǎn)中只存了索引列和主鍵的信息。二級(jí)索引占用的空間會(huì)比聚簇索引小很多, 通常創(chuàng)建輔助索引就是為了提升查詢效率。一個(gè)表InnoDB只能創(chuàng)建一個(gè)聚簇索引,但可以創(chuàng)建多個(gè)輔助索引。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-IiZRHApa-1599925202779)(D:\拉鉤筆記\lagouNode\4Stage\Mysql(上)]\pic\聚簇索引.png)

  • 非聚簇索引

與InnoDB表存儲(chǔ)不同,MyISAM數(shù)據(jù)表的索引文件和數(shù)據(jù)文件是分開(kāi)的,被稱為非聚簇索引結(jié)構(gòu)

3.索引分析與優(yōu)化

MySQL 提供了一個(gè) EXPLAIN 命令,它可以對(duì) SELECT 語(yǔ)句進(jìn)行分析,并輸出 SELECT 執(zhí)行的詳細(xì)信息,供開(kāi)發(fā)人員有針對(duì)性的優(yōu)化。

EXPLAIN SELECT * from user WHERE id < 3;

  • select_type

表示查詢的類型。常用的值如下:

  • SIMPLE : 表示查詢語(yǔ)句不包含子查詢或union

  • PRIMARY:表示此查詢是最外層的查詢

  • UNION:表示此查詢是UNION的第二個(gè)或后續(xù)的查詢

  • EXPLAIN SELECT * from user WHERE id < 3;DEPENDENT UNION:UNION中的第二個(gè)或后續(xù)的查詢語(yǔ)句,使用了外面查詢結(jié)果

  • UNION RESULT:UNION的結(jié)果

  • SUBQUERY:SELECT子查詢語(yǔ)句

  • DEPENDENT SUBQUERY:SELECT子查詢語(yǔ)句依賴外層查詢的結(jié)果。

最常見(jiàn)的查詢類型是SIMPLE,表示我們的查詢沒(méi)有子查詢也沒(méi)用到UNION查詢。

  • type

表示存儲(chǔ)引擎查詢數(shù)據(jù)時(shí)采用的方式。比較重要的一個(gè)屬性,通過(guò)它可以判斷出查詢是全表掃描還是基于索引的部分掃描。常用屬性值如下,

從上至下效率依次增強(qiáng)。

ALL:表示全表掃描,性能最差。

index:表示基于索引的全表掃描,先掃描索引再掃描全表數(shù)據(jù)。

range:表示使用索引范圍查詢。使用>、>=、<、<=、in等等。

ref:表示使用非唯一索引進(jìn)行單值查詢。

eq_ref:一般情況下出現(xiàn)在多表join查詢,表示前面表的每一個(gè)記錄,都只能匹配后面表的一行結(jié)果。

const:表示使用主鍵或唯一索引做等值查詢,常量查詢。

NULL:表示不用訪問(wèn)表,速度最快。

  • possible_keys

表示查詢時(shí)能夠使用到的索引。注意并不一定會(huì)真正使用,顯示的是索引名稱

  • key

表示查詢時(shí)真正使用到的索引,顯示的是索引名稱

  • rows

MySQL查詢優(yōu)化器會(huì)根據(jù)統(tǒng)計(jì)信息,估算SQL要查詢到結(jié)果需要掃描多少行記錄。原則上rows是越少效率越高,可以直觀的了解到SQL效率高低。

  • Extra

Extra表示很多額外的信息,各種操作會(huì)在Extra提示相關(guān)信息,常見(jiàn)幾種如下:

Using where

表示查詢需要通過(guò)索引回表查詢數(shù)據(jù)。

Using index

表示查詢需要通過(guò)索引,索引就可以滿足所需數(shù)據(jù)。

Using filesort

表示查詢出來(lái)的結(jié)果需要額外排序,數(shù)據(jù)量小在內(nèi)存,大的話在磁盤,因此有Using fifilesort建議優(yōu)化。

Using temprorary

查詢使用到了臨時(shí)表,一般出現(xiàn)于去重、分組等操作。

4.回表查詢

通過(guò)索引查詢主鍵值,然后再去聚簇索引查詢記錄信息

5.覆蓋索引

只需要在一棵索引樹(shù)上就能獲取SQL所需的所有列數(shù)據(jù),無(wú)需回表,速度更快,這就叫做索引覆蓋

實(shí)現(xiàn)索引覆蓋最常見(jiàn)的方法就是:將被查詢的字段,建立到組合索引。

6.最左前綴原則

復(fù)合索引使用時(shí)遵循最左前綴原則,最左前綴顧名思義,就是最左優(yōu)先,即查詢中使用到最左邊的列,那么查詢就會(huì)使用到索引,如果從索引的第二列開(kāi)始查找,索引將失效。

7.面試題

1.LIKE查詢

面試題:MySQL在使用like模糊查詢時(shí),索引能不能起作用?

回答:MySQL在使用Like模糊查詢時(shí),索引是可以被使用的,只有把%字符寫(xiě)在后面才會(huì)使用到索引。

select * from user where name like ‘%o%’; //不起作用

select * from user where name like ‘o%’; //起作用

select * from user where name like ‘%o’; //不起作用

2.NULL查詢

面試題:如果MySQL表的某一列含有NULL值,那么包含該列的索引是否有效?

對(duì)MySQL來(lái)說(shuō),NULL是一個(gè)特殊的值,從概念上講,NULL意味著“一個(gè)未知值”,它的處理方式與其他值有些不同。比如:不能使用=,<,>這樣的運(yùn)算符,對(duì)NULL做算術(shù)運(yùn)算的結(jié)果都是NULL,count時(shí)不會(huì)包括NULL行等,NULL比空字符串需要更多的存儲(chǔ)空間等。

雖然MySQL可以在含有NULL的列上使用索引,但NULL和其他數(shù)據(jù)還是有區(qū)別的,不建議列上允許為NULL。最好設(shè)置NOT NULL,并給一個(gè)默認(rèn)值,比如0和 ‘’ 空字符串等,如果是datetime類型,也可以設(shè)置系統(tǒng)當(dāng)前時(shí)間或某個(gè)固定的特殊值,例如’1970-01-01 00:00:00’。

8.索引與排序

MySQL查詢支持filesort和index兩種方式的排序。

filesort是先把結(jié)果查出,然后在緩存或磁盤進(jìn)行排序操作,效率較低

index是指利用索引自動(dòng)實(shí)現(xiàn)排序,不需另做排序操作,效率會(huì)比較高

如果我們Explain分析SQL,結(jié)果中Extra屬性顯示Using filesort,表示使用了filesort排序方式,需要優(yōu)化。

如果Extra屬性顯示Using index時(shí),表示覆蓋索引,也表示所有操作在索引上完成,也可以使用index排序方式,建議大家盡可能采用覆蓋索引

Sql會(huì)使用index方式的排序

  • ORDER BY 子句索引列組合滿足索引最左前列

    explain select id from user order by id; //對(duì)應(yīng)(id)、(id,name)索引有效
  • WHERE子句+ORDER BY子句索引列組合滿足索引最左前列

    explain select id from user where age=18 order by name; //對(duì)應(yīng) (age,name)索引

Sql會(huì)使用fifilesort方式的排序

  • 對(duì)索引列同時(shí)使用了ASC和DESC
explain select id from user order by age asc,name desc; //對(duì)應(yīng) (age,name)索引
  • WHERE子句和ORDER BY子句滿足最左前綴,但where子句使用了范圍查詢(例如>、<、in等)
explain select id from user where age>10 order by name; //對(duì)應(yīng) (age,name)索引
  • ORDER BY或者WHERE+ORDER BY索引列沒(méi)有滿足索引最左前列
explain select id from user order by name; //對(duì)應(yīng)(age,name)索引
  • 使用了不同的索引,MySQL每次只采用一個(gè)索引,ORDER BY涉及了兩個(gè)索引
explain select id from user order by name,age; //對(duì)應(yīng)(name)、(age)兩個(gè)索引
  • WHERE子句與ORDER BY子句,使用了不同的索引
explain select id from user where name='tom' order by age; //對(duì)應(yīng) (name)、(age)索引
  • WHERE子句或者ORDER BY子句中索引列使用了表達(dá)式,包括函數(shù)表達(dá)式
explain select id from user order by abs(age); //對(duì)應(yīng)(age)索引

9.查詢優(yōu)化

慢查詢定位

查看 MySQL 數(shù)據(jù)庫(kù)是否開(kāi)啟了慢查詢?nèi)罩竞吐樵內(nèi)罩疚募拇鎯?chǔ)位置的命令如下:

SHOW VARIABLES LIKE 'slow_query_log%'

通過(guò)如下命令開(kāi)啟慢查詢?nèi)罩?#xff1a;

SET global slow_query_log = ON; SET global slow_query_log_file = 'OAK-slow.log'; SET global log_queries_not_using_indexes = ON; SET long_query_time = 10;
  • long_query_time:指定慢查詢的閥值,單位秒。如果SQL執(zhí)行時(shí)間超過(guò)閥值,就屬于慢查詢記錄到日志文件中。

  • log_queries_not_using_indexes:表示會(huì)記錄沒(méi)有使用索引的查詢SQL。前提是slow_query_log的值為ON,否則不會(huì)奏效。

查看慢查詢?nèi)罩?/h3>
  • 文本方式查看

  • 使用mysqldumpslow查看

慢查詢優(yōu)化

  • 索引和慢查詢

    • 如何判斷是否為慢查詢?

    MySQL判斷一條語(yǔ)句是否為慢查詢語(yǔ)句,主要依據(jù)SQL語(yǔ)句的執(zhí)行時(shí)間,它把當(dāng)前語(yǔ)句的執(zhí)行時(shí)間跟 long_query_time 參數(shù)做比較

    • 如何判斷是否應(yīng)用了索引?

    通過(guò) explain命令分析查看,檢查結(jié)果中的 key 值,是否為NULL。

    • 應(yīng)用了索引是否一定快?

    select * from user where id>0; 從主鍵索引的最左邊的葉節(jié)點(diǎn)開(kāi)始向右掃描整個(gè)索引樹(shù),進(jìn)行了全表掃描,此時(shí)索引就失去了意義。

    select * from user where id = 2 ; 使用了索引的快速搜索功能,并且有效地減少了掃描行數(shù)。

  • 提高索引過(guò)濾性

    案例:

    表:student 字段:id,name,sex,age 造數(shù)據(jù):insert into student (name,sex,age) select name,sex,age from student; SQL 案例:select * from student where age=18 and name like '張%';(全表掃 描)

    優(yōu)化一:

    alter table student add index(name); //追加name索引

    優(yōu)化二:

    alter table student add index(age,name); //追加age,name索引

    優(yōu)化三:

    index condition pushdown 優(yōu)化的效果還是很不錯(cuò)的。再進(jìn)一步優(yōu)化,我們可以把名 字的第一個(gè)字和年齡做一個(gè)聯(lián)合索引,這里可以使用 MySQL 5.7 引入的虛擬列來(lái)實(shí)現(xiàn)。//為user表添加first_name虛擬列,以及聯(lián)合索引(first_name,age) alter table student add first_name varchar(2) generated always as (left(name, 1)), add index(first_name, age); explain select * from student where first_name='張' and age=18;
  • 慢查詢?cè)蚩偨Y(jié)

    • 全表掃描:explain分析type屬性all
    • 全索引掃描:explain分析type屬性index
    • 索引過(guò)濾性不好:靠索引字段選型、數(shù)據(jù)量和狀態(tài)、表設(shè)計(jì)
    • 頻繁的回表查詢開(kāi)銷:盡量少用select *,使用覆蓋索引

分頁(yè)查詢優(yōu)化

  • 一般性分頁(yè)
SELECT * FROM 表名 LIMIT [offset,] rows

第一個(gè)參數(shù)指定第一個(gè)返回記錄行的偏移量,注意從0開(kāi)始;

第二個(gè)參數(shù)指定返回記錄行的最大數(shù)目;

如果只給定一個(gè)參數(shù),它表示返回最大的記錄行數(shù)目;

思考1:如果偏移量固定,返回記錄量對(duì)執(zhí)行時(shí)間有什么影響?

select * from user limit 10000,1; select * from user limit 10000,10; select * from user limit 10000,100; select * from user limit 10000,1000; select * from user limit 10000,10000;

結(jié)果:在查詢記錄時(shí),返回記錄量低于100條,查詢時(shí)間基本沒(méi)有變化,差距不大。隨著查詢記錄量越大,所花費(fèi)的時(shí)間也會(huì)越來(lái)越多。

思考2:如果查詢偏移量變化,返回記錄數(shù)固定對(duì)執(zhí)行時(shí)間有什么影響?

select * from user limit 1,100; select * from user limit 10,100; select * from user limit 100,100; select * from user limit 1000,100; select * from user limit 10000,100;

結(jié)果:在查詢記錄時(shí),如果查詢記錄量相同,偏移量超過(guò)100后就開(kāi)始隨著偏移量增大,查詢時(shí)間急劇的增加。(這種分頁(yè)查詢機(jī)制,每次都會(huì)從數(shù)據(jù)庫(kù)第一條記錄開(kāi)始掃描,越往后查詢?cè)铰?#xff0c;而且查詢的數(shù)據(jù)越多,也會(huì)拖慢總查詢速度。)

分頁(yè)優(yōu)化方案

第一步:利用覆蓋索引優(yōu)化

select * from user limit 10000,100; select id from user limit 10000,100;

第二步:利用子查詢優(yōu)化

select * from user limit 10000,100; select * from user where id>= (select id from user limit 10000,1) limit 100;

原因:使用了id做主鍵比較(id>=),并且子查詢使用了覆蓋索引進(jìn)行優(yōu)化。

3.MySQL事務(wù)和鎖

ACID 特性

一個(gè)邏輯工作單元要成為事務(wù),必須滿足這 4 個(gè)特性,即所謂的 ACID:

原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)和持久性(Durability)

原子性

原子性:事務(wù)是一個(gè)原子操作單元,其對(duì)數(shù)據(jù)的修改,要么全都執(zhí)行,要么全都不執(zhí)行。

持久性

持久性:指的是一個(gè)事務(wù)一旦提交,它對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)的改變就應(yīng)該是永久性的,后續(xù)的操作或故障不應(yīng)該對(duì)其有任何影響,不會(huì)丟失。

隔離性

隔離性:指的是一個(gè)事務(wù)的執(zhí)行不能被其他事務(wù)干擾,即一個(gè)事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對(duì)其他的并發(fā)事務(wù)是隔離的

一致性

事務(wù)開(kāi)始之前和事務(wù)結(jié)束之后,數(shù)據(jù)庫(kù)的完整性限制未被破壞。一致性包括兩方面的內(nèi)容,分別是約束一致性和數(shù)據(jù)一致性。

一致性也可以理解為數(shù)據(jù)的完整性。數(shù)據(jù)的完整性是通過(guò)原子性、隔離性、持久性來(lái)保證的,而這3個(gè)特性又是通過(guò) Redo/Undo 來(lái)保證的。

事務(wù)控制的演進(jìn)

并發(fā)事務(wù)

事務(wù)并發(fā)處理可能會(huì)帶來(lái)一些問(wèn)題,比如:更新丟失、臟讀、不可重復(fù)讀、幻讀等。

  • 更新丟失

    當(dāng)兩個(gè)或多個(gè)事務(wù)更新同一行記錄,會(huì)產(chǎn)生更新丟失現(xiàn)象。可以分為回滾覆蓋和提交覆蓋。

    回滾覆蓋:一個(gè)事務(wù)回滾操作,把其他事務(wù)已提交的數(shù)據(jù)給覆蓋了。

    提交覆蓋:一個(gè)事務(wù)提交操作,把其他事務(wù)已提交的數(shù)據(jù)給覆蓋了。

  • 臟讀

    一個(gè)事務(wù)讀取到了另一個(gè)事務(wù)修改但未提交的數(shù)據(jù)。

  • 不可重復(fù)讀

    一個(gè)事務(wù)中多次讀取同一行記錄不一致,后面讀取的跟前面讀取的不一致。

  • 幻讀

    一個(gè)事務(wù)中多次按相同條件查詢,結(jié)果不一致。后續(xù)查詢的結(jié)果和面前查詢結(jié)果不同,多了或少了幾行記錄。

排隊(duì)

完全順序執(zhí)行所有事務(wù)的數(shù)據(jù)庫(kù)操作,不需要加鎖,簡(jiǎn)單的說(shuō)就是全局排隊(duì)。序列化執(zhí)行所有的事務(wù)單元,數(shù)據(jù)庫(kù)某個(gè)時(shí)刻只處理一個(gè)事務(wù)操作,特點(diǎn)是強(qiáng)一致性,處理性能低。

排他鎖

引入鎖之后就可以支持并發(fā)處理事務(wù),如果事務(wù)之間涉及到相同的數(shù)據(jù)項(xiàng)時(shí),會(huì)使用排他鎖,或叫互斥鎖,先進(jìn)入的事務(wù)獨(dú)占數(shù)據(jù)項(xiàng)以后,其他事務(wù)被阻塞,等待前面的事務(wù)釋放鎖。

讀寫(xiě)鎖

讀和寫(xiě)操作:讀讀、寫(xiě)寫(xiě)、讀寫(xiě)、寫(xiě)讀。

讀寫(xiě)鎖就是進(jìn)一步細(xì)化鎖的顆粒度,區(qū)分讀操作和寫(xiě)操作,讓讀和讀之間不加鎖,這樣下面的兩個(gè)事務(wù)就可以同時(shí)被執(zhí)行了

MVCC

多版本控制MVCC,也就是Copy on Write的思想。MVCC除了支持讀和讀并行,還支持讀和寫(xiě)、寫(xiě)和讀的并行,但為了保證一致性,寫(xiě)和寫(xiě)是無(wú)法并行的。

概念

MVCC(Multi Version Concurrency Control)被稱為多版本控制,是指在數(shù)據(jù)庫(kù)中為了實(shí)現(xiàn)高并發(fā)的數(shù)據(jù)訪問(wèn),對(duì)數(shù)據(jù)進(jìn)行多版本處理,并通過(guò)事務(wù)的可見(jiàn)性來(lái)保證事務(wù)能看到自己應(yīng)該看到的數(shù)據(jù)版本。

MVCC實(shí)現(xiàn)原理

MVCC最大的好處是讀不加鎖,讀寫(xiě)不沖突。在讀多寫(xiě)少的系統(tǒng)應(yīng)用中,讀寫(xiě)不沖突是非常重要的,極大的提升系統(tǒng)的并發(fā)性能,這也是為什么現(xiàn)階段幾乎所有的關(guān)系型數(shù)據(jù)庫(kù)都支持 MVCC 的原因,不過(guò)目前MVCC只在 Read Commited 和 Repeatable Read 兩種隔離級(jí)別下工作

MVCC只在 Read Commited 和 Repeatable Read 兩種隔離級(jí)別下工作。

在 MVCC 并發(fā)控制中,讀操作可以分為兩類: 快照讀(Snapshot Read)與當(dāng)前讀 (Current Read)

  • 快照讀:讀取的是記錄的快照版本(有可能是歷史版本),不用加鎖。(select)

  • 當(dāng)前讀:讀取的是記錄的最新版本,并且當(dāng)前讀返回的記錄,都會(huì)加鎖,保證其他事務(wù)不會(huì)再并發(fā)修改這條記錄。(select… for update 或lock in share mode,insert/delete/update)

事務(wù)隔離級(jí)別

隔離級(jí)別類型

  • 讀未提交

Read Uncommitted 讀未提交:解決了回滾覆蓋類型的更新丟失,但可能發(fā)生臟讀現(xiàn)象,也就是可能讀取到其他會(huì)話中未提交事務(wù)修改的數(shù)據(jù)。

  • 已提交讀

Read Committed 讀已提交:只能讀取到其他會(huì)話中已經(jīng)提交的數(shù)據(jù),解決了臟讀。但可能發(fā)生不可重復(fù)讀現(xiàn)象,也就是可能在一個(gè)事務(wù)中兩次查詢結(jié)果不一致。

  • 可重復(fù)度

Repeatable Read 可重復(fù)讀:解決了不可重復(fù)讀,它確保同一事務(wù)的多個(gè)實(shí)例在并發(fā)讀取數(shù)據(jù)時(shí),會(huì)看到同樣的數(shù)據(jù)行。不過(guò)理論上會(huì)出現(xiàn)幻讀,簡(jiǎn)單的說(shuō)幻讀指的的當(dāng)用戶讀取某一范圍的數(shù)據(jù)行時(shí),另一個(gè)事務(wù)又在該范圍插入了新行,當(dāng)用戶在讀取該范圍的數(shù)據(jù)時(shí)會(huì)發(fā)現(xiàn)有新的幻影行。

  • 可串行化

Serializable 串行化:所有的增刪改查串行執(zhí)行。它通過(guò)強(qiáng)制事務(wù)排序,解決相互沖突,從而解決幻度的問(wèn)題。這個(gè)級(jí)別可能導(dǎo)致大量的超時(shí)現(xiàn)象的和鎖競(jìng)爭(zhēng),效率低下

事務(wù)隔離級(jí)別和鎖的關(guān)系

  • 事務(wù)隔離級(jí)別是SQL92定制的標(biāo)準(zhǔn),相當(dāng)于事務(wù)并發(fā)控制的整體解決方案,本質(zhì)上是對(duì)鎖和MVCC使用的封裝,隱藏了底層細(xì)節(jié)。

  • 鎖是數(shù)據(jù)庫(kù)實(shí)現(xiàn)并發(fā)控制的基礎(chǔ),事務(wù)隔離性是采用鎖來(lái)實(shí)現(xiàn),對(duì)相應(yīng)操作加不同的鎖,就可以防止其他事務(wù)同時(shí)對(duì)數(shù)據(jù)進(jìn)行讀寫(xiě)操作。

  • 對(duì)用戶來(lái)講,首先選擇使用隔離級(jí)別,當(dāng)選用的隔離級(jí)別不能解決并發(fā)問(wèn)題或需求時(shí),才有必要在開(kāi)發(fā)中手動(dòng)的設(shè)置鎖。

MySQL默認(rèn)隔離級(jí)別:可重復(fù)讀

Oracle、SQLServer默認(rèn)隔離級(jí)別:讀已提交

一般使用時(shí),建議采用默認(rèn)隔離級(jí)別,然后存在的一些并發(fā)問(wèn)題,可以通過(guò)悲觀鎖、樂(lè)觀鎖等實(shí)現(xiàn)處理

MySQL隔離級(jí)別控制

查看MySQL當(dāng)前數(shù)據(jù)庫(kù)的事務(wù)隔離級(jí)別命令

show variables like 'tx_isolation'; select @@tx_isolation;

設(shè)置隔離級(jí)別

set tx_isolation='READ-UNCOMMITTED'; set tx_isolation='READ-COMMITTED'; set tx_isolation='REPEATABLE-READ'; set tx_isolation='SERIALIZABLE';

鎖機(jī)制和實(shí)戰(zhàn)

鎖分類

  • 操作的粒度可分為表級(jí)鎖、行級(jí)鎖和頁(yè)級(jí)鎖。

    • 表級(jí)鎖:每次操作鎖住整張表。鎖定粒度大,發(fā)生鎖沖突的概率最高,并發(fā)度最低。應(yīng)用在MyISAM、InnoDB、BDB 等存儲(chǔ)引擎中。
    • 行級(jí)鎖:每次操作鎖住一行數(shù)據(jù)。鎖定粒度最小,發(fā)生鎖沖突的概率最低,并發(fā)度最高。應(yīng)用在InnoDB 存儲(chǔ)引擎中。
    • 頁(yè)級(jí)鎖:每次鎖定相鄰的一組記錄,鎖定粒度界于表鎖和行鎖之間,開(kāi)銷和加鎖時(shí)間界于表鎖和行鎖之間,并發(fā)度一般。應(yīng)用在BDB 存儲(chǔ)引擎中。
  • 操作的類型可分為讀鎖和寫(xiě)鎖。

    • 讀鎖(S鎖):共享鎖,針對(duì)同一份數(shù)據(jù),多個(gè)讀操作可以同時(shí)進(jìn)行而不會(huì)互相影響。

    • 寫(xiě)鎖(X鎖):排他鎖,當(dāng)前寫(xiě)操作沒(méi)有完成前,它會(huì)阻斷其他寫(xiě)鎖和讀鎖。

    IS鎖、IX鎖:意向讀鎖、意向?qū)戞i,屬于表級(jí)鎖,S和X主要針對(duì)行級(jí)鎖。在對(duì)表記錄添加S或X鎖之前,會(huì)先對(duì)表添加IS或IX鎖。

    S鎖:事務(wù)A對(duì)記錄添加了S鎖,可以對(duì)記錄進(jìn)行讀操作,不能做修改,其他事務(wù)可以對(duì)該記錄追加。

    S鎖,但是不能追加X(jué)鎖,需要追加X(jué)鎖,需要等記錄的S鎖全部釋放。

    X鎖:事務(wù)A對(duì)記錄添加了X鎖,可以對(duì)記錄進(jìn)行讀和修改操作,其他事務(wù)不能對(duì)記錄做讀和修改操作

  • 操作的性能可分為樂(lè)觀鎖和悲觀鎖。

    • 樂(lè)觀鎖:一般的實(shí)現(xiàn)方式是對(duì)記錄數(shù)據(jù)版本進(jìn)行比對(duì),在數(shù)據(jù)更新提交的時(shí)候才會(huì)進(jìn)行沖突檢測(cè),如果發(fā)現(xiàn)沖突了,則提示錯(cuò)誤信息。
    • 悲觀鎖:在對(duì)一條數(shù)據(jù)修改的時(shí)候,為了避免同時(shí)被其他人修改,在修改數(shù)據(jù)之前先鎖定,再修改的控制方式。共享鎖和排他鎖是悲觀鎖的不同實(shí)現(xiàn),但都屬于悲觀鎖范疇。

行鎖原理

在InnoDB引擎中,我們可以使用行鎖和表鎖,其中行鎖又分為共享鎖和排他鎖InnoDB行鎖是通過(guò)對(duì)索引數(shù)據(jù)頁(yè)上的記錄加鎖實(shí)現(xiàn)的

主要實(shí)現(xiàn)算法有 3 種:Record Lock、Gap Lock 和 Next-key Lock。

  • RecordLock鎖:鎖定單個(gè)行記錄的鎖。(記錄鎖,RC、RR隔離級(jí)別都支持)
  • GapLock鎖:間隙鎖,鎖定索引記錄間隙,確保索引記錄的間隙不變。(范圍鎖,RR隔離級(jí)別支持)
  • Next-key Lock 鎖:記錄鎖和間隙鎖組合,同時(shí)鎖住數(shù)據(jù),并且鎖住數(shù)據(jù)前后范圍。(記錄鎖+范圍鎖,RR隔離級(jí)別支持)

在RR隔離級(jí)別,InnoDB對(duì)于記錄加鎖行為都是先采用Next-Key Lock,但是當(dāng)SQL操作含有唯一索引時(shí),Innodb會(huì)對(duì)Next-Key Lock進(jìn)行優(yōu)化,降級(jí)為RecordLock,僅鎖住索引本身而非范圍。

  • select … from 語(yǔ)句:InnoDB引擎采用MVCC機(jī)制實(shí)現(xiàn)非阻塞讀,所以對(duì)于普通的select語(yǔ)句,InnoDB不加鎖

  • select … from lock in share mode語(yǔ)句:追加了共享鎖,InnoDB會(huì)使用Next-Key Lock鎖進(jìn)行處理,如果掃描發(fā)現(xiàn)唯一索引,可以降級(jí)為RecordLock鎖。

  • select … from for update語(yǔ)句:追加了排他鎖,InnoDB會(huì)使用Next-Key Lock鎖進(jìn)行處理,如果掃描發(fā)現(xiàn)唯一索引,可以降級(jí)為RecordLock鎖。

  • update … where 語(yǔ)句:InnoDB會(huì)使用Next-Key Lock鎖進(jìn)行處理,如果掃描發(fā)現(xiàn)唯一索引,可以降級(jí)為RecordLock鎖。

  • delete … where 語(yǔ)句:InnoDB會(huì)使用Next-Key Lock鎖進(jìn)行處理,如果掃描發(fā)現(xiàn)唯一索引,可以降級(jí)為RecordLock鎖。

  • insert語(yǔ)句:InnoDB會(huì)在將要插入的那一行設(shè)置一個(gè)排他的RecordLock鎖

悲觀鎖

悲觀鎖(Pessimistic Locking),是指在數(shù)據(jù)處理過(guò)程,將數(shù)據(jù)處于鎖定狀態(tài),一般使用數(shù)據(jù)庫(kù)的鎖機(jī)制實(shí)現(xiàn)。從廣義上來(lái)講,前面提到的行鎖、表鎖、讀鎖、寫(xiě)鎖、共享鎖、排他鎖等,這些都屬于悲觀鎖范疇。

  • 表級(jí)鎖

表級(jí)鎖每次操作都鎖住整張表,并發(fā)度最低。

常用命令如下:手動(dòng)增加表鎖

lock table 表名稱 read|write,表名稱2 read|write;

查看表上加過(guò)的鎖

show open tables;

刪除表鎖

unlock tables;

表級(jí)讀鎖會(huì)阻塞寫(xiě)操作,但是不會(huì)阻塞讀操作。而寫(xiě)鎖則會(huì)把讀和寫(xiě)操作都阻塞。

  • 共享鎖

共享鎖又稱為讀鎖,簡(jiǎn)稱S鎖。共享鎖就是多個(gè)事務(wù)對(duì)于同一數(shù)據(jù)可以共享一把鎖,都能訪問(wèn)到數(shù)據(jù),但是只能讀不能修改。使用共享鎖的方法是在select … lock in share mode,只適用查詢語(yǔ)句

總結(jié):事務(wù)使用了共享鎖(讀鎖),只能讀取,不能修改,修改操作被阻塞。

  • 排他鎖(行級(jí)鎖-寫(xiě)鎖)

排他鎖又稱為寫(xiě)鎖,簡(jiǎn)稱X鎖。排他鎖就是不能與其他鎖并存,如一個(gè)事務(wù)獲取了一個(gè)數(shù)據(jù)行的排他鎖,其他事務(wù)就不能對(duì)該行記錄做其他操作,也不能獲取該行的鎖。

使用排他鎖的方法是在SQL末尾加上for updateinnodb引擎默認(rèn)會(huì)在update,delete語(yǔ)句加上for update。行級(jí)鎖的實(shí)現(xiàn)其實(shí)是依靠其對(duì)應(yīng)的索引,所以如果操作沒(méi)用到索引的查詢,那么會(huì)鎖住全表記錄。

總結(jié):事務(wù)使用了排他鎖(寫(xiě)鎖),當(dāng)前事務(wù)可以讀取和修改,其他事務(wù)不能修改,也不能獲取記錄鎖(select… for update)。如果查詢沒(méi)有使用到索引,將會(huì)鎖住整個(gè)表記錄

樂(lè)觀鎖

在數(shù)據(jù)庫(kù)操作時(shí),想法很樂(lè)觀,認(rèn)為這次的操作不會(huì)導(dǎo)致沖突,因此在數(shù)據(jù)庫(kù)操作時(shí)并不做任何的特殊處理,即不加鎖,而是在進(jìn)行事務(wù)提交時(shí)再去判斷是否有沖突了。

悲觀鎖和樂(lè)觀鎖都可以解決事務(wù)寫(xiě)寫(xiě)并發(fā),在應(yīng)用中可以根據(jù)并發(fā)處理能力選擇區(qū)分,比如對(duì)并發(fā)率要求高的選擇樂(lè)觀鎖;對(duì)于并發(fā)率要求低的可以選擇悲觀鎖。

樂(lè)觀鎖實(shí)現(xiàn)原理

  • 使用版本字段(version)

先給數(shù)據(jù)表增加一個(gè)版本(version) 字段,每操作一次,將那條記錄的版本號(hào)加 1。version是用來(lái)查看被讀的記錄有無(wú)變化,作用是防止記錄在業(yè)務(wù)處理期間被其他事務(wù)修改。

  • 使用時(shí)間戳(Timestamp)

與使用version版本字段相似,同樣需要給在數(shù)據(jù)表增加一個(gè)字段,字段類型使用timestamp時(shí)間戳。也是在更新提交的時(shí)候檢查當(dāng)前數(shù)據(jù)庫(kù)中數(shù)據(jù)的時(shí)間戳和自己更新前取到的時(shí)間戳進(jìn)行對(duì)比,如果一致則提交更新,否則就是版本沖突,取消操作

樂(lè)觀鎖案例

第一步:查詢商品信息

select (quantity,version) from products where id=1;

第二部:根據(jù)商品信息生成訂單

insert into orders ... insert into items ...

第三部:修改商品庫(kù)存

update products set quantity=quantity-1,version=version+1 where id=1 and version=#{version};

死鎖與解決方案

  • 表鎖死鎖

用戶A訪問(wèn)表A(鎖住了表A),然后又訪問(wèn)表B;另一個(gè)用戶B訪問(wèn)表B(鎖住了表B),然后企圖訪問(wèn)表A.

解決方案:

這種死鎖比較常見(jiàn),是由于程序的BUG產(chǎn)生的,除了調(diào)整的程序的邏輯沒(méi)有其它的辦法。仔細(xì)分析程序的邏輯,對(duì)于數(shù)據(jù)庫(kù)的多表操作時(shí),盡量按照相同的順序進(jìn)行處理,盡量避免同時(shí)鎖定兩個(gè)資源,如操作A和B兩張表時(shí),總是按先A后B的順序處理, 必須同時(shí)鎖定兩個(gè)資源時(shí),要保證在任何時(shí)刻都應(yīng)該按照相同的順序來(lái)鎖定資源。

  • 行級(jí)鎖死鎖

如果在事務(wù)中執(zhí)行了一條沒(méi)有索引條件的查詢,引發(fā)全表掃描,把行級(jí)鎖上升為全表記錄鎖定(等價(jià)于表級(jí)鎖),多個(gè)這樣的事務(wù)執(zhí)行后,就很容易產(chǎn)生死鎖和阻塞,最終應(yīng)用系統(tǒng)會(huì)越來(lái)越慢,發(fā)生阻塞或死鎖。

解決方案:

解決一:

SQL語(yǔ)句中不要使用太復(fù)雜的關(guān)聯(lián)多表的查詢;使用explain“執(zhí)行計(jì)劃"對(duì)SQL語(yǔ)句進(jìn)行分析,對(duì)于有全表掃描和全表鎖定的SQL語(yǔ)句,建立相應(yīng)的索引進(jìn)行優(yōu)化

解決二:

  • 在同一個(gè)事務(wù)中,盡可能做到一次鎖定所需要的所有資源

  • 按照id對(duì)資源排序,然后按順序進(jìn)行處理

==================================

  • 共享鎖轉(zhuǎn)換為排他鎖

事務(wù)A 查詢一條紀(jì)錄,然后更新該條紀(jì)錄;此時(shí)事務(wù)B 也更新該條紀(jì)錄,這時(shí)事務(wù)B 的排他鎖由于事務(wù)A 有共享鎖,必須等A 釋放共享鎖后才可以獲取,只能排隊(duì)等待。事務(wù)A 再執(zhí)行更新操作時(shí),此處發(fā)生死鎖,因?yàn)槭聞?wù)A 需要排他鎖來(lái)做更新操作。但是,無(wú)法授予該鎖請(qǐng)求,因?yàn)槭聞?wù)B 已經(jīng)有一個(gè)排他鎖請(qǐng)求,并且正在等待事務(wù)A 釋放其共享鎖。

事務(wù)A: select * from dept where deptno=1 lock in share mode; //共享鎖,1 update dept set dname='java' where deptno=1;//排他鎖,3 事務(wù)B: update dept set dname='Java' where deptno=1;//由于1有共享鎖,沒(méi)法獲取排他鎖,需等待,2

解決方案:

  • 對(duì)于按鈕等控件,點(diǎn)擊立刻失效,不讓用戶重復(fù)點(diǎn)擊,避免引發(fā)同時(shí)對(duì)同一條記錄多次操作;

  • 使用樂(lè)觀鎖進(jìn)行控制。樂(lè)觀鎖機(jī)制避免了長(zhǎng)事務(wù)中的數(shù)據(jù)庫(kù)加鎖開(kāi)銷,大大提升了大并發(fā)量下的系統(tǒng)性能。需要注意的是,由于樂(lè)觀鎖機(jī)制是在我們的系統(tǒng)中實(shí)現(xiàn),來(lái)自外部系統(tǒng)的用戶更新操作不受我們系統(tǒng)的控制,因此可能會(huì)造成臟數(shù)據(jù)被更新到數(shù)據(jù)庫(kù)中;

死鎖排查:

  • 查看死鎖日志

通過(guò)show engine innodb status\G命令查看近期死鎖日志信息。

使用方法:1、查看近期死鎖日志信息;2、使用explain查看下SQL執(zhí)行計(jì)劃

  • 查看鎖狀態(tài)變量

通過(guò)**show status like’innodb_row_lock%‘**命令檢查狀態(tài)變量,分析系統(tǒng)中的行鎖的爭(zhēng)奪情況

Innodb_row_lock_current_waits:當(dāng)前正在等待鎖的數(shù)量

Innodb_row_lock_time:從系統(tǒng)啟動(dòng)到現(xiàn)在鎖定總時(shí)間長(zhǎng)度

Innodb_row_lock_time_avg: 每次等待鎖的平均時(shí)間

Innodb_row_lock_time_max:從系統(tǒng)啟動(dòng)到現(xiàn)在等待最長(zhǎng)的一次鎖的時(shí)間

Innodb_row_lock_waits:系統(tǒng)啟動(dòng)后到現(xiàn)在總共等待的次數(shù)

如果等待次數(shù)高,而且每次等待時(shí)間長(zhǎng),需要分析系統(tǒng)中為什么會(huì)有如此多的等待,然后著手定制優(yōu)化。

mysql集群架構(gòu)

概念

實(shí)現(xiàn)高可用的方案有以下幾種架構(gòu)模式:

  • 主從模式

簡(jiǎn)單靈活,能滿足多種需求。比較主流的用法,但是寫(xiě)操作高可用需要自行處理。

  • 雙主模式

互為主從,有雙主雙寫(xiě)、雙主單寫(xiě)兩種方式,建議使用雙主單寫(xiě)

centos虛擬機(jī)安裝mysql

cd /usr/local/src tar -xvf mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar## centos自帶 mariadb,查詢并刪除 rpm -qa|grep mariadb rpm -e mariadb-libs-5.5.41-2.el7_0.x86_64 --nodeps## i表示安裝,v表示顯示安裝過(guò)程,h表示顯示進(jìn)度 ## 安裝common包 rpm -ivh mysql-community-common-5.7.28-1.el7.x86_64.rpm ## 安裝lib包 rpm -ivh mysql-community-libs-5.7.28-1.el7.x86_64.rpm ## 安裝libs-compat包 rpm -ivh mysql-community-libs-compat-5.7.28-1.el7.x86_64.rpm ## 安裝client包 rpm -ivh mysql-community-client-5.7.28-1.el7.x86_64.rpm ## 安裝server包 rpm -ivh mysql-community-server-5.7.28-1.el7.x86_64.rpm ## 安裝devel包 rpm -ivh mysql-community-devel-5.7.28-1.el7.x86_64.rpm ## 初始化mysql mysqld --initialize --user=mysql ## 查詢密碼 cat /var/log/mysqld.log ## 獲取臨時(shí)密碼 ZTl%tXzk#57 ## 開(kāi)機(jī)自啟 systemctl start mysqld.service ## 查詢狀態(tài)是否啟動(dòng) systemctl status mysqld.service ##登錄mysql mysql -uroot -p## 進(jìn)入mysql 設(shè)置 密碼 set password=password('root'); ## mysql授權(quán)外部鏈接 GRANT REPLICATION SLAVE ON *.* TO 'root'@'%' identified by 'root'; GRANT all privileges ON *.* TO 'root'@'%' identified by 'root'; ##刷新 flush privileges; ## 退出 關(guān)閉防火墻 exit#mysql內(nèi)執(zhí)行 systemctl stop iptables; systemctl stop firewalld; ## 禁用防火墻 systemctl disable firewalld.service

mysql主從復(fù)制

MySQL主從模式是指數(shù)據(jù)可以從一個(gè)MySQL數(shù)據(jù)庫(kù)服務(wù)器主節(jié)點(diǎn)復(fù)制到一個(gè)或多個(gè)從節(jié)點(diǎn)。MySQL 默認(rèn)采用異步復(fù)制方式,這樣從節(jié)點(diǎn)不用一直訪問(wèn)主服務(wù)器來(lái)更新自己的數(shù)據(jù),從節(jié)點(diǎn)可以復(fù)制主數(shù)據(jù)庫(kù)中的所有數(shù)據(jù)庫(kù),或者特定的數(shù)據(jù)庫(kù),或者特定的表。

mysql主從復(fù)制用途:

  • 實(shí)時(shí)災(zāi)備,用于故障切換(高可用)

  • 讀寫(xiě)分離,提供查詢服務(wù)(讀擴(kuò)展)

  • 數(shù)據(jù)備份,避免影響業(yè)務(wù)(高可用)

主從復(fù)制整體分為以下三個(gè)步驟

  • 主庫(kù)將數(shù)據(jù)庫(kù)的變更操作記錄到Binlog日志文件中

  • 從庫(kù)讀取主庫(kù)中的Binlog日志文件信息寫(xiě)入到從庫(kù)的Relay Log中繼日志中

  • 從庫(kù)讀取中繼日志信息在從庫(kù)中進(jìn)行Replay,更新從庫(kù)數(shù)據(jù)信息

搭建流程

主服務(wù)器master

從服務(wù)器 slave

主服務(wù)器

  • 從庫(kù)服務(wù)器能連通主庫(kù)

  • 主庫(kù)開(kāi)啟binlog日志(設(shè)置log-bin參數(shù))

  • 主從server-id不同

  • 配置etc下的my.cnf(my.ini)文件
  • #開(kāi)啟binlog日期 log_bin=mysql-bin server-id=1 ## 同步日志 sync-binlog=1 ## 忽略一些庫(kù) binlog-ignore-db=performance_schema binlog-ignore-db=informance_schema binlog-ignore-db=sys ## 同步一些表 binlog-do-db=xxx(表名)
  • 修改后重啟mysql
  • systemctl restart mysqld
  • 授權(quán)
  • 進(jìn)入mysql的命令行

    GRANT REPLICATION SLAVE ON *.* TO 'root'@'%' identified by 'root'; GRANT all privileges ON *.* TO 'root'@'%' identified by 'root'; //刷新 flush privileges;
  • 查詢主庫(kù)狀態(tài)
  • show master status

    從服務(wù)器

  • 配置etc下的my.cnf(my.ini)文件
  • ## 同步日志 sync-binlog=1 ## 中繼日志 relay_log=mysql-relay-bin ##只讀屬性 read_only=1
  • 修改后重啟mysql
  • systemctl restart mysqld
  • 清楚庫(kù)狀態(tài)
  • show master status ## 從庫(kù)中如果有值,說(shuō)明之前做過(guò) stop slave; ##先停步slave服務(wù)線程,這個(gè)是很重要的,
  • 同步復(fù)制進(jìn)入mysql的命令行
  • change master to master_host='192.168.182.128',master_port=3306,master_user='root',master_password='root',master_log_file='nysql_bin.000002',master_log_pos=154;
  • 查詢從庫(kù)狀態(tài)
  • show master status \G; ## 從庫(kù)中如果有值,說(shuō)明之前做過(guò) start slave;

    問(wèn)題

    mysql主從復(fù)制存在的問(wèn)題:

    • 主庫(kù)宕機(jī)后,數(shù)據(jù)可能丟失

    • 從庫(kù)只有一個(gè)SQL Thread,主庫(kù)寫(xiě)壓力大,復(fù)制很可能延時(shí)

    解決方法:

    • 半同步復(fù)制—解決數(shù)據(jù)丟失的問(wèn)題

    • 并行復(fù)制----解決從庫(kù)復(fù)制延遲的問(wèn)題

    半同步復(fù)制

    semi-sync意思是MASTER只需要接收到其中一臺(tái)SLAVE的返回信息,就會(huì)commit;否則需等待直至切換成異步再提交

    主庫(kù)安裝semi

    進(jìn)入mysql 安裝配置semi

    ##是否支持動(dòng)態(tài)加載 select @@have_dynamic_loading; ##開(kāi)啟插件 show plugins; ##安裝semi install plugin rpl_semi_sync_master soname 'semisync_master.so'; ##查看 show variables like '%semi%'; //============下面部分無(wú)視 ##開(kāi)啟semi set global rpl_semi_sync_master_enabled=1; ##1000毫秒 set global rpl_semi_sync_master_timeout=1000;

    從庫(kù)安裝semi

    進(jìn)入mysql 安裝配置semi

    ##安裝semi install plugin rpl_semi_sync_slave soname 'semisync_slave.so'; ##查看 show variables like '%semi%'; ##開(kāi)啟semi set global rpl_semi_sync_master_enabled=1; ## 重啟 stop slave; start slave;

    全同步復(fù)制

    為了兼容MySQL 5.6基于庫(kù)的并行復(fù)制,5.7引入了新的變量slave-parallel-type,其可以配置的值有:

    DATABASE(默認(rèn)值,基于庫(kù)的并行復(fù)制方式)、LOGICAL_CLOCK(基于組提交的并行復(fù)制方式)。

    show variables like '%binlog_group%'; ## 先關(guān)閉 stop slave; ## 提交的時(shí)間 set global binlog_group_commit_sync_delay=1000; ## 提交的組數(shù)量 set global binlog_group_commit_sync_no_delay_count=100;show variables like '%slave%'; ## 并行組提交方式 set global slave_parallel_type=LOGICAL_CLOCK; ## 線程數(shù) set global slave_parallel_workers=8;show variables like '%relay_log%'; ## 轉(zhuǎn)發(fā)的日志回復(fù) set global relay_log_recovery=1; ## 存儲(chǔ)方式 set relay_log_info_repository='table';

    直接寫(xiě)配置文件與set global的區(qū)別

    set global后重啟服務(wù),配置屬性消失

    寫(xiě)到my.ini文件中,不會(huì)消失

    配置etc下的my.ini文件

    relay_log_recovery=1 slave_parallel_type=LOGICAL_CLOCK slave_parallel_workers=8 relay_log_info_repository=table; master_info_repository=table;#重啟 systemctl restart mysqld # 查詢 show variables like '%relay_log%';

    并行復(fù)制配置與調(diào)優(yōu)

    • binlog_transaction_dependency_history_size 用于控制集合變量的大小
    • binlog_transaction_depandency_tracking 控制binlog文件中事務(wù)之間的依賴關(guān)系
    • transaction_write_set_extraction 用于控制事務(wù)的檢測(cè)算法
    • master_info_repository 性能提升
    • slave_parallel_workers SQL線程
    • slave_preserve_commit_order 實(shí)現(xiàn)更小粒度的并行復(fù)制
    slave-parallel-type=LOGICAL_CLOCK slave-parallel-workers=16 slave_pending_jobs_size_max = 2147483648 slave_preserve_commit_order=1 master_info_repository=TABLE relay_log_info_repository=TABLE relay_log_recovery=ON

    讀寫(xiě)分離

    mysql-proxy

    解壓 mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz文件

    創(chuàng)建配置文件

    vim /etc/mysql-proxy.cnf user=rootadmin-username=rootadmin-password=root#代理的主機(jī)IP名 proxy-address=192.168.95.134:4040 #指定主庫(kù)的ip proxy-backend-address=192.168.95.130:3306 #指定讀庫(kù)(從庫(kù))的ip proxy-read-only-backend-addresses=192.168.95.132:3306,192.168.95.133:3306 #采用lua腳本管理 proxy-lua-script=/share/doc/mysql-proxy/rw-spiltting.lua #log路徑 log-file=/var/log/mysql-proxy.log log-level=debug #進(jìn)程的運(yùn)行模式 daemon=true #是否重啟 keepalive=true

    修改權(quán)限

    chmod 660 /etc/mysql-proxy.cnf

    修改rw-spilttind.lua腳本

    #連接池 #最小鏈接 4改成1 min_idle_connections = 1 min_idle_connections = 8

    啟動(dòng)mysql-proxy

    ./mysql-proxy --defaults-file=/etc/mysql-proxy.cnf

    雙主復(fù)制

    配置master1

    進(jìn)入master1的etc/my.cnf

    #開(kāi)啟binlog日期 log_bin=mysql-bin server-id=1 ## 同步日志 sync-binlog=1 ## 忽略一些庫(kù) binlog-ignore-db=performance_schema binlog-ignore-db=informance_schema binlog-ignore-db=sys ## 同步一些表 binlog-do-db=xxx(表名) ## relay_log功能 relay_log=mysql-relay-bin ##從服務(wù)日志更新 log_slave_updates=1 ##1.3.5.7.9 ##指定自動(dòng)遞增 auto_increment_offset=1 ##增量 auto_increment_increment=2

    重啟mysql

    systemctl restart mysqld

    進(jìn)入mysql,查詢,指定授權(quán)(授權(quán)過(guò),直接取消)

    show master status ## 授權(quán) GRANT REPLICATION SLAVE ON *.* TO 'root'@'%' identified by 'root'; GRANT all privileges ON *.* TO 'root'@'%' identified by 'root'; ##刷新 flush privileges;

    配置master2

    進(jìn)入master2的etc/my.cnf

    #開(kāi)啟binlog日期 log_bin=mysql-bin server-id=3 ## 同步日志 sync-binlog=1 ## 忽略一些庫(kù) binlog-ignore-db=performance_schema binlog-ignore-db=informance_schema binlog-ignore-db=sys## relay_log功能 relay_log=mysql-relay-bin ##從服務(wù)日志更新 log_slave_updates=1 ##2,4,6,8,10 ##指定自動(dòng)遞增 auto_increment_offset=2 ##增量 auto_increment_increment=2

    重啟mysql

    systemctl restart mysqld

    授權(quán)

    ## 授權(quán) GRANT REPLICATION SLAVE ON *.* TO 'root'@'%' identified by 'root'; GRANT all privileges ON *.* TO 'root'@'%' identified by 'root'; ## 刷新 flush privileges;

    查詢狀態(tài)

    show master status

    指定復(fù)制操作

    master1指定master2(fileID,Position)

    change master to master_host='59.151.15.36',master_port='3306',master_user='root',master_password='root',master_log_file=' mysql-bin.000016 ',master_log_pos=107;## 啟動(dòng)slave start slave; ## 查詢狀態(tài) show slave status\G

    master2指定master1(fileID,Position)

    change master to master_host='59.151.15.36',master_port='3306',master_user='root',master_password='root',master_log_file=' mysql-bin.000016 ',master_log_pos=107;## 啟動(dòng)slave start slave; ## 查詢狀態(tài) show slave status\G

    MMM架構(gòu)

    MMM(Master-Master Replication Manager for MySQL)是一套用來(lái)管理和監(jiān)控雙主復(fù)制,支持雙主故障切換 的第三方軟件。

    MMM 包含writer和reader兩類角色,分別對(duì)應(yīng)寫(xiě)節(jié)點(diǎn)和讀節(jié)點(diǎn)。

    • 當(dāng) writer節(jié)點(diǎn)出現(xiàn)故障,程序會(huì)自動(dòng)移除該節(jié)點(diǎn)上的VIP

    • 寫(xiě)操作切換到 Master2,并將Master2設(shè)置為writer將所有Slave節(jié)點(diǎn)會(huì)指向Master2

    MHA架構(gòu)

    MHA(Master High Availability)是一套比較成熟的 MySQL 高可用方案,也是一款優(yōu)秀的故障切換和主從提升的高可用軟件。

    MHA由兩部分組成:MHA Manager(管理節(jié)點(diǎn))和MHA Node(數(shù)據(jù)節(jié)點(diǎn))

    • MHA Manager可以單獨(dú)部署在一臺(tái)獨(dú)立的機(jī)器上管理多個(gè)master-slave集群,也可以部署在一臺(tái)slave節(jié)點(diǎn)上。負(fù)責(zé)檢測(cè)master是否宕機(jī)、控制故障轉(zhuǎn)移、檢查MySQL復(fù)制狀況等。

    • MHA Node運(yùn)行在每臺(tái)MySQL服務(wù)器上,不管是Master角色,還是Slave角色,都稱為Node,是被監(jiān)控管理的對(duì)象節(jié)點(diǎn)負(fù)責(zé)保存和復(fù)制master的二進(jìn)制日志、識(shí)別差異的中繼日志事件并將其差異的事件應(yīng)用于其他的slave、清除中繼日志

    MHA故障處理機(jī)制:

    • 把宕機(jī)master的binlog保存下來(lái)

    • 根據(jù)binlog位置點(diǎn)找到最新的slave

    • 用最新slave的relay log修復(fù)其它slave

    • 將保存下來(lái)的binlog在最新的slave上恢復(fù)

    • 將最新的slave提升為master

    • 將其它slave重新指向新提升的master,并開(kāi)啟主從復(fù)制

    MHA優(yōu)點(diǎn):

    • 自動(dòng)故障轉(zhuǎn)移快

    • 主庫(kù)崩潰不存在數(shù)據(jù)一致性問(wèn)題

    • 性能優(yōu)秀,支持半同步復(fù)制和異步復(fù)制

    • 一個(gè)Manager監(jiān)控節(jié)點(diǎn)可以監(jiān)控多個(gè)集群

    主備切換策略

    主備切換是指將備庫(kù)變?yōu)橹鲙?kù),主庫(kù)變?yōu)閭鋷?kù),有可靠性優(yōu)先可用性優(yōu)先兩種策略。

    主備延遲問(wèn)題

    主備延遲是由主從數(shù)據(jù)同步延遲導(dǎo)致的,與數(shù)據(jù)同步有關(guān)的時(shí)間點(diǎn)主要包括以下三個(gè):

    • 主庫(kù) A 執(zhí)行完成一個(gè)事務(wù),寫(xiě)入 binlog,我們把這個(gè)時(shí)刻記為 T1;

    • 之后將binlog傳給備庫(kù) B,我們把備庫(kù) B 接收完 binlog 的時(shí)刻記為 T2;

    • 備庫(kù) B 執(zhí)行完成這個(gè)binlog復(fù)制,我們把這個(gè)時(shí)刻記為 T3。

    分庫(kù)分表

    使用分庫(kù)分表時(shí),主要有垂直拆分和水平拆分兩種拆分模式,都屬于物理空間的拆分。

    垂直拆分:由于表數(shù)量多導(dǎo)致的單個(gè)庫(kù)大。將表拆分到多個(gè)庫(kù)中。

    水平拆分:由于表記錄多導(dǎo)致的單個(gè)庫(kù)大。將表記錄拆分到多個(gè)表中。

    垂直拆分

    垂直拆分是將表按庫(kù)進(jìn)行分離,或者修改表結(jié)構(gòu)按照訪問(wèn)的差異將某些列拆分出去。

    • 垂直分庫(kù)

    • 垂直分表

    一個(gè)表中字段過(guò)多,還有有些字段經(jīng)常使用,有些字段不經(jīng)常使用,或者還有text等字段信息。

    垂直拆分優(yōu)點(diǎn)

    • 拆分后業(yè)務(wù)清晰,拆分規(guī)則明確;

    • 易于數(shù)據(jù)的維護(hù)和擴(kuò)展;

    • 可以使得行數(shù)據(jù)變小,一個(gè)數(shù)據(jù)塊 (Block) 就能存放更多的數(shù)據(jù),在查詢時(shí)就會(huì)減少 I/O 次數(shù);

    • 可以達(dá)到最大化利用 Cache 的目的,具體在垂直拆分的時(shí)候可以將不常變的字段放一起,將經(jīng)常改變的放一起;

    • 便于實(shí)現(xiàn)冷熱分離的數(shù)據(jù)表設(shè)計(jì)模式。

    垂直拆分缺點(diǎn)

    • 主鍵出現(xiàn)冗余,需要管理冗余列;

    • 會(huì)引起表連接 JOIN 操作,可以通過(guò)在業(yè)務(wù)服務(wù)器上進(jìn)行 join 來(lái)減少數(shù)據(jù)庫(kù)壓力,提高了系統(tǒng)的復(fù)雜度;

    • 依然存在單表數(shù)據(jù)量過(guò)大的問(wèn)題;

    • 事務(wù)處理復(fù)雜。

    水平拆分

    水平拆分又稱為橫向拆分。 相對(duì)于垂直拆分,它不再將數(shù)據(jù)根據(jù)業(yè)務(wù)邏輯分類,而是通過(guò)某個(gè)字段(或某幾個(gè)字段),根據(jù)某種規(guī)則將數(shù)據(jù)分散至多個(gè)庫(kù)或表中,每個(gè)表僅包含數(shù)據(jù)的一部分。

    下圖所示

    區(qū)分

    水平拆分:解決表中記錄過(guò)多問(wèn)題。

    垂直拆分:解決表過(guò)多或者是表字段過(guò)多問(wèn)題

    水平拆分重點(diǎn)考慮拆分規(guī)則:例如范圍、時(shí)間或Hash算法等。

    水平拆分優(yōu)點(diǎn)

    • 拆分規(guī)則設(shè)計(jì)好,join 操作基本可以數(shù)據(jù)庫(kù)做;

    • 不存在單庫(kù)大數(shù)據(jù),高并發(fā)的性能瓶頸;

    • 切分的表的結(jié)構(gòu)相同,應(yīng)用層改造較少,只需要增加路由規(guī)則即可;

    • 提高了系統(tǒng)的穩(wěn)定性和負(fù)載能力。

    水平拆分缺點(diǎn)

    • 拆分規(guī)則難以抽象;

    • 跨庫(kù)Join性能較差;

    • 分片事務(wù)的一致性難以解決;

    • 數(shù)據(jù)擴(kuò)容的難度和維護(hù)量極大。

    • 日常工作中,我們通常會(huì)同時(shí)使用兩種拆分方式,垂直拆分更偏向于產(chǎn)品/業(yè)務(wù)/功能拆分的過(guò)程,在技術(shù)上我們更關(guān)注水平拆分的方案。

    主鍵策略

    • UUID

    UUID是通用唯一識(shí)別碼(Universally Unique Identififier)的縮寫(xiě)。

    UUID在生成時(shí)使用到了以太網(wǎng)卡地址、納秒級(jí)時(shí)間、芯片ID碼和隨機(jī)數(shù)等信息,目的是讓分布式系統(tǒng)中的所有元素都能有唯一的識(shí)別信息

    使用UUID做主鍵,可以在本地生成,沒(méi)有網(wǎng)絡(luò)消耗,所以生成性能高。但是UUID比較長(zhǎng),沒(méi)有規(guī)律性,耗費(fèi)存儲(chǔ)空間

    • SNOWFLAKE(雪花ID)

    SnowFlake是Twitter開(kāi)源的分布式ID生成算法,結(jié)果是一個(gè)long型的ID,long型是8個(gè)字節(jié),64-bit。其核心思想是:使用41bit作為毫秒數(shù),10bit作為機(jī)器的ID(5個(gè)bit是數(shù)據(jù)中心,5個(gè)bit的機(jī)器ID),12bit作為毫秒內(nèi)的流水號(hào),最后還有一個(gè)符號(hào)位,永遠(yuǎn)是0

    分片策略

    將一個(gè)數(shù)據(jù)庫(kù)打碎成多個(gè)的過(guò)程就叫做分片,分片是屬于橫向擴(kuò)展方案。

    數(shù)據(jù)庫(kù)擴(kuò)展方案:

    • 橫向擴(kuò)展:一個(gè)庫(kù)變多個(gè)庫(kù),加機(jī)器數(shù)量

    • 縱向擴(kuò)展:一個(gè)庫(kù)還是一個(gè)庫(kù),優(yōu)化機(jī)器性能,加高配CPU或內(nèi)存

    • 基于范圍分片

    根據(jù)特定字段的范圍進(jìn)行拆分,比如用戶ID、訂單時(shí)間、產(chǎn)品價(jià)格等。例如:

    {[1 - 100] => Cluster A, [101 - 199] => Cluster B}

    優(yōu)點(diǎn):新的數(shù)據(jù)可以落在新的存儲(chǔ)節(jié)點(diǎn)上,如果集群擴(kuò)容,數(shù)據(jù)無(wú)需遷移。

    缺點(diǎn):數(shù)據(jù)熱點(diǎn)分布不均,數(shù)據(jù)冷熱不均勻,導(dǎo)致節(jié)點(diǎn)負(fù)荷不均。

    • 哈希取模分片

    假設(shè)有n臺(tái)設(shè)備,編號(hào)為0 ~ n-1,通過(guò)Hash(Key) % n就可以確定數(shù)據(jù)所在的設(shè)備編號(hào)。該模式也稱為離散分片

    • 一致性哈希分片

    一致性Hash是將數(shù)據(jù)按照特征值映射到一個(gè)首尾相接的Hash環(huán)上,同時(shí)也將節(jié)點(diǎn)(按照IP地址或者機(jī)器名Hash)映射到這個(gè)環(huán)上。對(duì)于數(shù)據(jù),從數(shù)據(jù)在環(huán)上的位置開(kāi)始,順時(shí)針找到的第一個(gè)節(jié)點(diǎn)即為數(shù)據(jù)的存儲(chǔ)節(jié)點(diǎn)。

    擴(kuò)容方案

    當(dāng)系統(tǒng)用戶進(jìn)入了高速增長(zhǎng)期時(shí),即便是對(duì)數(shù)據(jù)進(jìn)行分庫(kù)分表,但數(shù)據(jù)庫(kù)的容量,還有表的數(shù)據(jù)量也總會(huì)達(dá)到天花板。當(dāng)現(xiàn)有數(shù)據(jù)庫(kù)達(dá)到承受極限時(shí),就需要增加新服務(wù)器節(jié)點(diǎn)數(shù)量進(jìn)行橫向擴(kuò)容。

    • 停機(jī)擴(kuò)容

    優(yōu)點(diǎn):簡(jiǎn)單

    缺點(diǎn):

    ? 停止服務(wù),缺乏高可用

    ? 程序員壓力山大,需要在指定時(shí)間完成

    ? 如果有問(wèn)題沒(méi)有及時(shí)測(cè)試出來(lái)啟動(dòng)了服務(wù),運(yùn)行后發(fā)現(xiàn)問(wèn)題,數(shù)據(jù)會(huì)丟失一部分,難以回滾。

    適用場(chǎng)景:

    ? 小型網(wǎng)站

    ? 大部分游戲

    ? 對(duì)高可用要求不高的服務(wù)

    • 平滑擴(kuò)容

    平滑擴(kuò)容就是將數(shù)據(jù)庫(kù)數(shù)量擴(kuò)容成原來(lái)的2倍,比如:由2個(gè)數(shù)據(jù)庫(kù)擴(kuò)容到4個(gè)數(shù)據(jù)庫(kù)

    平滑擴(kuò)容方案能夠?qū)崿F(xiàn)n庫(kù)擴(kuò)2n庫(kù)的平滑擴(kuò)容,增加數(shù)據(jù)庫(kù)服務(wù)能力,降低單庫(kù)一半的數(shù)據(jù)量。其核心

    原理是:成倍擴(kuò)容,避免數(shù)據(jù)遷移。

    優(yōu)點(diǎn):

    ? 擴(kuò)容期間,服務(wù)正常進(jìn)行,保證高可用

    ? 相對(duì)停機(jī)擴(kuò)容,時(shí)間長(zhǎng),項(xiàng)目組壓力沒(méi)那么大,出錯(cuò)率低

    ? 擴(kuò)容期間遇到問(wèn)題,隨時(shí)解決,不怕影響線上服務(wù)

    ? 可以將每個(gè)數(shù)據(jù)庫(kù)數(shù)據(jù)量減少一半

    缺點(diǎn):

    ? 程序復(fù)雜、配置雙主同步、雙主雙寫(xiě)、檢測(cè)數(shù)據(jù)同步等

    ? 后期數(shù)據(jù)庫(kù)擴(kuò)容,比如成千上萬(wàn),代價(jià)比較高

    適用場(chǎng)景:

    ? 大型網(wǎng)站

    ? 對(duì)高可用要求高的服務(wù)

    問(wèn)題

    1.虛擬機(jī)centos7執(zhí)行ip addr命令看不到ip地址?

    方案一:

    #切換到root用戶 su root #編輯修改文件 vi /etc/sysconfig/network-scripts/ifcfg-eno16777736 ONBOOT=no #修改成ONBOOT=yes #強(qiáng)制保存 :wq! #重啟網(wǎng)絡(luò)服務(wù) service netword restart

    方案二:

    https://blog.csdn.net/weixin_43343006/article/details/100094624?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

    https://blog.csdn.net/liunian0714/article/details/78560473

    2.上傳文件:permission is not allowed?

    #切換到root用戶 su root #給目錄賦權(quán)限 chmod 777 src

    3.克隆虛擬機(jī)黑屏無(wú)法啟動(dòng)

  • 在克隆完虛擬機(jī)以后,啟動(dòng)之前,再虛擬機(jī)屬性->適配器-.從新生成maca地址

  • 在首選項(xiàng)中,把虛擬機(jī)打印 打開(kāi)

  • (主要解決方式)https://blog.csdn.net/wpw2000/article/details/108121096

    https://blog.csdn.net/Jarbein/article/details/91851350

    https://blog.csdn.net/fengy_jav/article/details/104458930

    4.虛擬機(jī)克隆修改網(wǎng)關(guān)IP

    cd /etc/sysconfig/network-scripts/ ##生成UUid uuidgen

    單詞

    Parser 解析

    Optimizer 查詢優(yōu)化器

    Engines 引擎

    Pluggable Storage Engines 存儲(chǔ)引擎層

    partition 分割,隔斷

    dependent 依賴

    identical 相同的

    Pessimistic 悲觀的

    relay 轉(zhuǎn)發(fā)

    dynamic 動(dòng)態(tài)的

    parallel 并行,平行

    recovery 恢復(fù),回復(fù)

    trace 追蹤,發(fā)現(xiàn)

    問(wèn)題:虛擬機(jī)centos7執(zhí)行ip addr命令看不到ip地址

    fg-eno16777736
    ONBOOT=no #修改成ONBOOT=yes
    #強(qiáng)制保存
    :wq!
    #重啟網(wǎng)絡(luò)服務(wù)
    service netword restart

    方案二:[外鏈圖片轉(zhuǎn)存中...(img-PCZ0U7Wa-1599925202804)]\pic\虛擬機(jī).png)> https://blog.csdn.net/weixin_43343006/article/details/100094624?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param> https://blog.csdn.net/liunian0714/article/details/78560473## 2.上傳文件:permission is not allowed?```shell #切換到root用戶 su root #給目錄賦權(quán)限 chmod 777 src

    3.克隆虛擬機(jī)黑屏無(wú)法啟動(dòng)

  • 在克隆完虛擬機(jī)以后,啟動(dòng)之前,再虛擬機(jī)屬性->適配器-.從新生成maca地址

  • 在首選項(xiàng)中,把虛擬機(jī)打印 打開(kāi)

  • (主要解決方式)https://blog.csdn.net/wpw2000/article/details/108121096

    https://blog.csdn.net/Jarbein/article/details/91851350

    https://blog.csdn.net/fengy_jav/article/details/104458930

    4.虛擬機(jī)克隆修改網(wǎng)關(guān)IP

    cd /etc/sysconfig/network-scripts/ ##生成UUid uuidgen

    https://blog.csdn.net/qq_35461394/article/details/92788603?utm_medium=distribute.pc_relevant.none-task-blog-title-6&spm=1001.2101.3001.4242

    https://blog.csdn.net/weixin_30426065/article/details/102344340?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param

    https://blog.csdn.net/qq_39192827/article/details/85952823

    待測(cè)試

    https://blog.csdn.net/woSHIxiaobai2/article/details/104222073?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

    https://www.cnblogs.com/Guugle/p/12982803.html

    單詞

    Parser 解析

    Optimizer 查詢優(yōu)化器

    Engines 引擎

    Pluggable Storage Engines 存儲(chǔ)引擎層

    partition 分割,隔斷

    dependent 依賴

    identical 相同的

    Pessimistic 悲觀的

    relay 轉(zhuǎn)發(fā)

    dynamic 動(dòng)態(tài)的

    parallel 并行,平行

    recovery 恢復(fù),回復(fù)

    trace 追蹤,發(fā)現(xiàn)

    問(wèn)題:虛擬機(jī)centos7執(zhí)行ip addr命令看不到ip地址

    總結(jié)

    以上是生活随笔為你收集整理的Mysql笔记总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。