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