本文轉(zhuǎn)自互聯(lián)網(wǎng)
在濟源等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供做網(wǎng)站、網(wǎng)站設(shè)計 網(wǎng)站設(shè)計制作按需開發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站設(shè)計,成都全網(wǎng)營銷推廣,成都外貿(mào)網(wǎng)站建設(shè)公司,濟源網(wǎng)站建設(shè)費用合理。
本系列文章將整理到我在GitHub上的《Java面試指南》倉庫,更多精彩內(nèi)容請到我的倉庫里查看
https://github.com/h3pl/Java-Tutorial
喜歡的話麻煩點下Star哈
文章首發(fā)于我的個人博客:
www.how2playlife.com
本文是微信公眾號【Java技術(shù)江湖】的《重新學(xué)習(xí)MySQL數(shù)據(jù)庫》其中一篇,本文部分內(nèi)容來源于網(wǎng)絡(luò),為了把本文主題講得清晰透徹,也整合了很多我認為不錯的技術(shù)博客內(nèi)容,引用其中了一些比較好的博客文章,如有侵權(quán),請聯(lián)系作者。
該系列博文會告訴你如何從入門到進階,從sql基本的使用方法,從MySQL執(zhí)行引擎再到索引、事務(wù)等知識,一步步地學(xué)習(xí)MySQL相關(guān)技術(shù)的實現(xiàn)原理,更好地了解如何基于這些知識來優(yōu)化sql,減少SQL執(zhí)行時間,通過執(zhí)行計劃對SQL性能進行分析,再到MySQL的主從復(fù)制、主備部署等內(nèi)容,以便讓你更完整地了解整個MySQL方面的技術(shù)體系,形成自己的知識框架。
如果對本系列文章有什么建議,或者是有什么疑問的話,也可以關(guān)注公眾號【Java技術(shù)江湖】聯(lián)系作者,歡迎你參與本系列博文的創(chuàng)作和修訂。
同大多數(shù)關(guān)系型數(shù)據(jù)庫一樣,日志文件是MySQL數(shù)據(jù)庫的重要組成部分。MySQL有幾種不同的日志文件,通常包括錯誤日志文件,二進制日志,通用日志,慢查詢?nèi)罩?,等等。這些日志可以幫助我們定位mysqld內(nèi)部發(fā)生的事件,數(shù)據(jù)庫性能故障,記錄數(shù)據(jù)的變更歷史,用戶恢復(fù)數(shù)據(jù)庫等等。本文主要描述錯誤日志文件。
a、錯誤日志:記錄啟動、運行或停止mysqld時出現(xiàn)的問題。 b、通用日志:記錄建立的客戶端連接和執(zhí)行的語句。 c、更新日志:記錄更改數(shù)據(jù)的語句。該日志在MySQL 5.1中已不再使用。 d、二進制日志:記錄所有更改數(shù)據(jù)的語句。還用于復(fù)制。 e、慢查詢?nèi)罩荆河涗浰袌?zhí)行時間超過long_query_time秒的所有查詢或不使用索引的查詢。 f、Innodb日志:innodb redo log 和undo log
缺省情況下,所有日志創(chuàng)建于mysqld數(shù)據(jù)目錄中。 可以通過刷新日志,來強制mysqld來關(guān)閉和重新打開日志文件(或者在某些情況下切換到一個新的日志)。 當(dāng)你執(zhí)行一個FLUSH LOGS語句或執(zhí)行mysqladmin flush-logs或mysqladmin refresh時,則日志被老化。 對于存在MySQL復(fù)制的情形下,從復(fù)制服務(wù)器將維護更多日志文件,被稱為接替日志。
錯誤日志是一個文本文件。 錯誤日志記錄了MySQL Server每次啟動和關(guān)閉的詳細信息以及運行過程中所有較為嚴重的警告和錯誤信息。 可以用—log-error[=file_name]選項來開啟mysql錯誤日志,該選項指定mysqld保存錯誤日志文件的位置。 對于指定—log-error[=file_name]選項而未給定file_name值,mysqld使用錯誤日志名host_name.err 并在數(shù)據(jù)目錄中寫入日志文件。 在mysqld正在寫入錯誤日志到文件時,執(zhí)行FLUSH LOGS 或者mysqladmin flush-logs時,服務(wù)器將關(guān)閉并重新打開日志文件。 建議在flush之前手動重命名錯誤日志文件,之后mysql服務(wù)將使用原始文件名打開一個新文件。 以下為錯誤日志備份方法: shell> mv host_name.err host_name.err-old shell> mysqladmin flush-logs shell> mv host_name.err-old backup-directory
MySQL數(shù)據(jù)庫InnoDB存儲引擎Log漫游
1 – Undo Log
Undo Log 是為了實現(xiàn)事務(wù)的原子性,在MySQL數(shù)據(jù)庫InnoDB存儲引擎中,還用Undo Log來實現(xiàn)多版本并發(fā)控制(簡稱:MVCC)。
事務(wù)的原子性(Atomicity) 事務(wù)中的所有操作,要么全部完成,要么不做任何操作,不能只做部分操作。如果在執(zhí)行的過程中發(fā)生 了錯誤,要回滾(Rollback)到事務(wù)開始前的狀態(tài),就像這個事務(wù)從來沒有執(zhí)行過。
原理 Undo Log的原理很簡單,為了滿足事務(wù)的原子性,在操作任何數(shù)據(jù)之前,首先將數(shù)據(jù)備份到一個地方 (這個存儲數(shù)據(jù)備份的地方稱為Undo Log)。然后進行數(shù)據(jù)的修改。如果出現(xiàn)了錯誤或者用戶執(zhí)行了 ROLLBACK語句,系統(tǒng)可以利用Undo Log中的備份將數(shù)據(jù)恢復(fù)到事務(wù)開始之前的狀態(tài)。
除了可以保證事務(wù)的原子性, Undo Log也可以用來輔助完成事務(wù)的持久化。
事務(wù)的持久性(Durability) 事務(wù)一旦完成,該事務(wù)對數(shù)據(jù)庫所做的所有修改都會持久的保存到數(shù)據(jù)庫中。為了保證持久性,數(shù)據(jù)庫 系統(tǒng)會將修改后的數(shù)據(jù)完全的記錄到持久的存儲上。
用Undo Log實現(xiàn)原子性和持久化的事務(wù)的簡化過程 假設(shè)有A、B兩個數(shù)據(jù),值分別為1,2。 A.事務(wù)開始. B.記錄A=1到undo log. C.修改A=3. D.記錄B=2到undo log. E.修改B=4. F.將undo log寫到磁盤。 G.將數(shù)據(jù)寫到磁盤。 H.事務(wù)提交 這里有一個隱含的前提條件:‘?dāng)?shù)據(jù)都是先讀到內(nèi)存中,然后修改內(nèi)存中的數(shù)據(jù),最后將數(shù)據(jù)寫回磁盤’。
之所以能同時保證原子性和持久化,是因為以下特點: A. 更新數(shù)據(jù)前記錄Undo log。 B. 為了保證持久性,必須將數(shù)據(jù)在事務(wù)提交前寫到磁盤。只要事務(wù)成功提交,數(shù)據(jù)必然已經(jīng)持久化。 C. Undo log必須先于數(shù)據(jù)持久化到磁盤。如果在G,H之間系統(tǒng)崩潰,undo log是完整的, 可以用來回滾事務(wù)。 D. 如果在A-F之間系統(tǒng)崩潰,因為數(shù)據(jù)沒有持久化到磁盤。所以磁盤上的數(shù)據(jù)還是保持在事務(wù)開始前的狀態(tài)。
缺陷:每個事務(wù)提交前將數(shù)據(jù)和Undo Log寫入磁盤,這樣會導(dǎo)致大量的磁盤IO,因此性能很低。
如果能夠?qū)?shù)據(jù)緩存一段時間,就能減少IO提高性能。但是這樣就會喪失事務(wù)的持久性。因此引入了另外一 種機制來實現(xiàn)持久化,即Redo Log.
2 – Redo Log
原理 和Undo Log相反, Redo Log記錄的是新數(shù)據(jù)的備份。在事務(wù)提交前,只要將Redo Log持久化即可, 不需要將數(shù)據(jù)持久化。當(dāng)系統(tǒng)崩潰時,雖然數(shù)據(jù)沒有持久化,但是Redo Log已經(jīng)持久化。系統(tǒng)可以根據(jù) Redo Log的內(nèi)容,將所有數(shù)據(jù)恢復(fù)到最新的狀態(tài)。
Undo + Redo事務(wù)的簡化過程 假設(shè)有A、B兩個數(shù)據(jù),值分別為1,2. A.事務(wù)開始. B.記錄A=1到undo log. C.修改A=3. D.記錄A=3到redo log. E.記錄B=2到undo log. F.修改B=4. G.記錄B=4到redo log. H.將redo log寫入磁盤。 I.事務(wù)提交
undo log 保存的是修改前的數(shù)據(jù),并且保存到內(nèi)存中,回滾的時候在讀取里面的內(nèi)容(從而實現(xiàn)了原子性),redolog保存的是修改后的數(shù)據(jù)(對新數(shù)據(jù)的備份,同時也會將redo log備份),在事務(wù)提交寫入到磁盤,從而保證了持久性
概述 數(shù)據(jù)庫查詢快慢是影響項目性能的一大因素,對于數(shù)據(jù)庫,我們除了要優(yōu)化 SQL,更重要的是得先找到需要優(yōu)化的 SQL。如何找到低效的 SQL 是寫這篇文章的主要目的。
MySQL 數(shù)據(jù)庫有一個“慢查詢?nèi)罩尽惫δ埽脕碛涗洸樵儠r間超過某個設(shè)定值的SQL,這將極大程度幫助我們快速定位到問題所在,以便對癥下藥。至于查詢時間的多少才算慢,每個項目、業(yè)務(wù)都有不同的要求,傳統(tǒng)企業(yè)的軟件允許查詢時間高于某個值,但是把這個標(biāo)準放在互聯(lián)網(wǎng)項目或者訪問量大的網(wǎng)站上,估計就是一個bug,甚至可能升級為一個功能性缺陷。
為避免誤導(dǎo)讀者,特申明本文的討論限制在 Win 64位 + MySQL 5.6 范圍內(nèi)。其他平臺或數(shù)據(jù)庫種類及版本,我沒有嘗試過,不做贅述。
設(shè)置日志功能 關(guān)于慢查詢?nèi)罩?,主要涉及到下面幾個參數(shù):
slow_query_log :是否開啟慢查詢?nèi)罩竟δ埽ū靥睿?long_query_time :超過設(shè)定值,將被視作慢查詢,并記錄至慢查詢?nèi)罩疚募校ū靥睿?log-slow-queries :慢查詢?nèi)罩疚募ú豢商睿詣釉?\data\ 創(chuàng)建一個 [hostname]-slow.log 文件 也就是說,只有滿足以上三個條件,“慢查詢功能”才可能正確開啟或關(guān)閉。
什么是MySQL主從復(fù)制 簡單來說就是保證主SQL(Master)和從SQL(Slave)的數(shù)據(jù)是一致性的,向Master插入數(shù)據(jù)后,Slave會自動從Master把修改的數(shù)據(jù)同步過來(有一定的延遲),通過這種方式來保證數(shù)據(jù)的一致性,就是主從復(fù)制
復(fù)制方式 MySQL5.6開始主從復(fù)制有兩種方式:基于日志(binlog)、基于GTID(全局事務(wù)標(biāo)示符)。 本文只涉及基于日志binlog的主從配置
復(fù)制原理 1、Master將數(shù)據(jù)改變記錄到二進制日志(binary log)中,也就是配置文件log-bin指定的文件,這些記錄叫做二進制日志事件(binary log events) 2、Slave通過I/O線程讀取Master中的binary log events并寫入到它的中繼日志(relay log) 3、Slave重做中繼日志中的事件,把中繼日志中的事件信息一條一條的在本地執(zhí)行一次,完成數(shù)據(jù)在本地的存儲,從而實現(xiàn)將改變反映到它自己的數(shù)據(jù)(數(shù)據(jù)重放)
1、什么是binlog binlog是一個二進制格式的文件,用于記錄用戶對數(shù)據(jù)庫更新的SQL語句信息,例如更改數(shù)據(jù)庫表和更改內(nèi)容的SQL語句都會記錄到binlog里,但是對庫表等內(nèi)容的查詢不會記錄。
默認情況下,binlog日志是二進制格式的,不能使用查看文本工具的命令(比如,cat,vi等)查看,而使用mysqlbinlog解析查看。
2.binlog的作用 當(dāng)有數(shù)據(jù)寫入到數(shù)據(jù)庫時,還會同時把更新的SQL語句寫入到對應(yīng)的binlog文件里,這個文件就是上文說的binlog文件。使用mysqldump備份時,只是對一段時間的數(shù)據(jù)進行全備,但是如果備份后突然發(fā)現(xiàn)數(shù)據(jù)庫服務(wù)器故障,這個時候就要用到binlog的日志了。
主要作用是用于數(shù)據(jù)庫的主從復(fù)制及數(shù)據(jù)的增量恢復(fù)。
1.啥是binlog? 記錄數(shù)據(jù)庫增刪改,不記錄查詢的二進制日志. 2.作用:用于數(shù)據(jù)同步. 3、如何開啟binlog日志功能 在mysql的配置文件my.cnf中,增加log_bin參數(shù)即可開啟binlog日志,也可以通過賦值來指定binlog日志的文件名,實例如下:
[root @DB02 ~]# grep log_bin /etc/my.cnf log_bin = /application/mysql/logs/dadong-bin
log_bin
[root @DB02 ~]# 提示:也可以按“l(fā)og_bin = /application/mysql/logs/dadong-bin”命名,目錄要存在 為什么要刷新binlog?找到全備數(shù)據(jù)和binlog文件的恢復(fù)臨界點.
mysql數(shù)據(jù)庫的binlog和relay log日志有著舉足輕重的作用,并且relay log僅僅存在于mysql 的slave庫,它的作用就是記錄slave庫中的io進程接收的從主庫傳過來的binlog,然后等待slave庫的sql進程去讀取和應(yīng)用,保證主從同步,但是binlog主庫和從庫(slave)都可以存在,記錄對數(shù)據(jù)發(fā)生或潛在發(fā)生更改的SQL語句,并以二進制的形式保存在磁盤,所以可以通過binlog來實時備份和恢復(fù)數(shù)據(jù)庫。
1、什么是binlog binlog是一個二進制格式的文件,用于記錄用戶對數(shù)據(jù)庫更新的SQL語句信息,例如更改數(shù)據(jù)庫表和更改內(nèi)容的SQL語句都會記錄到binlog里,但是對庫表等內(nèi)容的查詢不會記錄。
默認情況下,binlog日志是二進制格式的,不能使用查看文本工具的命令(比如,cat,vi等)查看,而使用mysqlbinlog解析查看。
2.binlog的作用 當(dāng)有數(shù)據(jù)寫入到數(shù)據(jù)庫時,還會同時把更新的SQL語句寫入到對應(yīng)的binlog文件里,這個文件就是上文說的binlog文件。使用mysqldump備份時,只是對一段時間的數(shù)據(jù)進行全備,但是如果備份后突然發(fā)現(xiàn)數(shù)據(jù)庫服務(wù)器故障,這個時候就要用到binlog的日志了。
主要作用是用于數(shù)據(jù)庫的主從復(fù)制及數(shù)據(jù)的增量恢復(fù)。