mysql源碼調試(mysql 源代碼)

本文目錄一覽:

Linux下如何使用源碼安裝mysql且開啟分區 mysql:mysql-5.1.61.tar.gz 求詳細步驟~

1.實現linux下純手動MySQL源碼安裝,首先要下載MySQL的源碼,我下載的是MySQL-5.0.87.tar.gz 2.解壓tar –xvf MySQL-5.0.87.tar.gz 3.進入MySQL-5.0.87 4.檢測環境並指定安裝目錄:./configure –prefix=/usr/local/MySQL 檢測出來缺什麼就安裝什麼。我裝的時候居然連gcc和g++都沒有,沒有編譯器的話就要直接下載rpm包(已編譯好的二進位文件)再安裝到系統。 如下是安裝gcc的命令(要先去下載這個包,這個地址有比較多的rpm包下載): sudo rpm -ivh gcc-4.1.2_20070115-0.11.i586.rpm 安裝這些rpm包的過程中有些是已安裝的,或者是自己依賴自己導致安裝不了,反正安裝不了就用強制安裝並忽略依賴的命令 sudo rpm -ivh gcc-4.1.2_20070115-0.11.i586.rpm –-force –nodeps 可能進過安裝一系列的rmp包後,終於完成了環境檢測。我大概裝了10+個的rmp包才完成。。杯具啊 5.編譯:make 6.安裝:sudo make install 7.實現linux下純手動MySQL源碼安裝中要進行配置。首先可以看到安裝完的目錄如下 在share/MySQL下打命令:ls –l | grep my- 出來的都是MySQL的配置文件,按照需要選擇其中一個拷到/etc下命名為my.cnf /etc/my.cnf是MySQL默認讀的配置文件的路徑 8.修改var的可寫許可權。這是MySQL的資料庫數據文件存放的位置,因為用當前用戶來運行MySQL的後台程序可能沒有這個目錄的可寫許可權。 chmod 777 ./var –r 9.配置系統環境變數,使得可以直接執行MySQL的程序 系統的環境變數是放在/etc/profile下的,而用戶的環境變數是放在用戶的根目錄下的.bashrc下 (1) /etc/profile的配置: PATH=/usr/local/MySQL/bin:$PATH PATH=/usr/local/MySQL/libexec:$PATH export PATH其中/usr/local/mydql/bin是MySQL主要的可執行程序的目錄,而libexec是放MySQL的後台主程序MySQLd的 (2).bashrc的配置: set PATH=/usr/local/MySQL/bin:$PATH set PATH=/usr/local/MySQL/libexec:$PATH export PATH這裡注意.bashrc裡面是要加個set的。配置完後重登錄就可以生效了 10.在啟動MySQLd之前要先初始化它,執行MySQL_install_db 11.啟動MySQLd,直接打MySQLd就可以了,因為之前配置過系統環境變數了 12.直接MySQL進入MySQL的命令行控制。默認是以當前用戶名登錄的,默認root是沒有密碼的 13.設置root的密碼:MySQLadmin –u root password 『123456』 14.以root身份登錄:MySQL –uroot –p 15.設置遠程登錄資料庫。用戶創建後默認是只能在本地登錄的。 update user set Host=’%』 where user=『kuncai’; 這句是將kuncai這個用戶的允許登錄的地址改成任意,但不包括本地。也就是說這樣kuncai這個用戶就無法在本地登錄了,只能遠程登錄。 只有root用戶才能執行這句,所以要先以root用戶登錄到本地資料庫才行。 flush privileges; 要再執行這句刷新緩存才能生效。以上的相關內容就是對linux下純手動MySQL源碼安裝的介紹,望你能有所收穫。 感謝你們能看到這些,如果大家有興趣開個自己的-淘-寶-網-店,小成本的進行-創-業-嘗試,可以加我Q1300-855-633,進行諮詢聯繫

mysql連接超時怎麼處理

MYSQL_OPT_READ_TIMEOUT 是 MySQL c api 客戶端中用來設置讀取超時時間的參數。在 MySQL 的官方文檔中,該參數的描述是這樣的:

MYSQL_OPT_READ_TIMEOUT (argument type: unsigned int *)The timeout in seconds for each attempt to read from the server. There are retries if necessary, so the total effective timeout value is three times the option value. You can set the value so that a lost connection can be detected earlier than the TCP/IPClose_Wait_Timeout value of 10 minutes.

也就是說在需要的時候,實際的超時時間會是設定值的 3 倍。但是實際測試後發現實際的超時時間和設置的超時時間一致。

而具體什麼時候發生三倍超時,在文檔中沒有找到。所以對 MySQL 5.7.20 的源碼進行了一些分析。

使用 GDB 調試代碼找了實際與 mysql server 通信的代碼,如下:

請點擊輸入圖片描述

其中 vio_read() 函數中,使用 recv 和 poll 來讀取報文和做讀取超時。net_should_retry() 函數只有在發生 EINTR 時才會返回 true。從這段代碼來看是符合測試結果的,並沒有對讀取進行三次重試。只有在讀取操作被系統中斷打斷時才會重試,但是這個重試並沒有次數限制。

從上面代碼的分析可以看出,代碼的邏輯和文檔的描述不符。於是在一頓搜索後,找到了一個 MySQL 的 BUG(Bug #31163)。該 BUG 報告了在 MySQL 5.0 中,MySQL c api 讀取的實際超時時間是設置的三倍,與現有文檔描述相符。於是對 MySQL 5.0.96 的代碼又進行分析。

同樣使用 GDB 找到了通信部分的代碼。這次找到了重試三次的代碼,如下:

請點擊輸入圖片描述

這個版本的 MySQL api 的讀寫超時是直接使用的 setsockopt 設置的。第一次循環,在 A 點發生了第一次超時(雖然注釋寫的非阻塞,但是客戶端的連接始終是阻塞模式的)。然後在 B 點將該 socket 設置為阻塞模式,C 點這裡重置 retry 次數。由於設置了 alarm 第二次以後的循環會直接進入 D 點的這個分支,並且判斷循環次數。作為客戶端時net-retry_count 始終是 1,所以重試了兩次,共計進行了 3 次 vioread 後從 E 點退出函數。

由上面的分析可知,MySQL 文檔對於該參數的描述已經過時,現在的 MYSQL_OPT_READ_TIMEOUT 並不會出現三倍超時的問題。而 Bug #31163 中的處理結果也是將文檔中該參數的描述更新為實際讀取超時時間是設定時間的三倍。也許是 MySQL 的維護者們在後續版本更新時忘記更新文檔吧。

ubuntu 怎麼源碼安裝mysql

1.下載源碼包

2.解壓包

tar -zxvf mysql-5.6.33.tar.gz

3.安裝必要依賴

sudo apt-get install make bison g++ build-essential libncurses5-dev cmake

4.進入安裝包目錄,配置MySQL安裝參數 //源碼安裝最大的好處就是可以自定義參數,制定安裝目錄,方便管理

cmake -DCMAKE_INSTALL_PREFIX=[指定MySQL安裝的目錄]/usr/local/mysql -DSYSCONFDIR=/etc -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DEXTRA_CHARSETS=all -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DENABLED_LOCAL_INFILE=1 -DMYSQL_DATADIR=[指定MySQL的數據存放目錄如:]/usr/local/mysql/data -DMYSQL_USER=mysql -DWITH_DEBUG=0

make -j4 #-j數字 表示以多核心運行編譯

make install #安裝

5. 常用命令軟連接,設置環境變數

sudo ln -s /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib/libmysqlclient.so.18

sudo ln -s /usr/local/mysql/bin/mysql /usr/bin

sudo ln -s /usr/local/mysql/bin/mysqladmin /usr/bin

6.初始化資料庫

sudo /usr/local/mysql/scripts/mysql_install_db –basedir=/usr/local/mysql –datadir=/usr/local/mysql/data –user=mysql

7.啟動MySQL伺服器

sudo /usr/local/mysql/bin/mysqld start

#如果啟動不了,考慮編譯安裝時自定義數據存放目錄,所以導致mysqld找不到對應的目錄

解決: vi /usr/local/mysql/bin/mysqld

修改datadir = [指定MySQL的數據存放目錄如:] /usr/local/mysql/data

保存退出,再次啟動 sudo /usr/local/mysql/bin/mysqld start #OK 搞定

8. 啟動成功後創建root用戶的密碼

/usr/local/mysql/bin/mysqladmin -u root password ‘新密碼’

9.啟動MySQL端

/usr/local/mysql/bin/mysql -u root -p

輸入密碼

10.設置環境變數

vi /home/個人目錄/.bashrc 或者 vi /root/.bashrc

#在後面添加這段代碼

export PATH=”$PATH:/home/sy/lnmp/mysql/bin”

#重啟電腦ok

#若不想重啟電腦,僅限當次有效(重啟失效)

#執行命令

export PATH=$PATH:/usr/local/mysql/bin

mysql –version //測試

面試官:MySQL許可權表損壞導致無法啟動怎麼辦?

一、背景

近期,公司RDS雲產品的MySQL Server版本進行升級,由目前使用的5.7.26版本升級到最新版本5.7.31;升級後測試同學發現:在MySQL創建用戶後,5.7.31版本重新啟動集群會出現啟動失敗的現象;而5.7.26版本在相同測試場景下是正常啟動的。這到底是為什麼呢?

二、問題復現

2.1 實驗環境

2.2 操作步驟

按照測試同學的測試步驟,首先創建一個用戶:

然後關閉mysqld;這裡需要介紹一下,我們集群的關閉方式是如下方式:

這種方式的內部實現類似於kill -9模式。所以我在線下環境使用kill -9的方式來複現,操作如下:

然後重啟mysqld,操作如下:

此時問題復現了,mysqld啟動失敗,我們查看了下error日誌,信息如下:

根據報錯信息可以看出:MySQL的許可權系統表發生了損壞,導致了mysqld啟動失敗;由於在MySQL 5.7及其之前版本該表是MyISAM引擎,且該引擎不支持事務,所以在mysqld異常崩潰會導致該類型引擎表的損壞;但在mysqld啟動時是有參數控制MyISAM引擎的恢復模式,且該參數在我們產品中也配置到了my.cnf中,如下所示:

2.3 參數解析

對於該參數的官方文檔的解釋如下:

設置MyISAM存儲引擎恢復模式。選項值是OFF、DEFAULT、BACKUP、FORCE或QUICK的值的任意組合。如果指定多個值,請用逗號分隔。指定不帶參數的選項與指定DEFAULT相同,指定顯式值” “將禁用恢復(與OFF值相同)。如果啟用了恢復,則mysqld每次打開MyISAM表時,都會檢查該表是否標記為已崩潰或未正確關閉。(只有在禁用外部鎖定的情況下運行,最後一個選項才起作用。)在這種情況下,mysqld在表上運行檢查。如果表已損壞,mysqld將嘗試對其進行修復。

伺服器自動修復表之前,它將有關修復的注釋寫到錯誤日誌中。如果您希望能夠在無需用戶干預的情況下從大多數問題中恢復,則應使用選項BACKUP,FORCE。即使某些行將被刪除,這也會強制修復表,但是它將舊的數據文件保留為備份,以便您以後可以檢查發生了什麼。

全局變數,只讀變數,默認為OFF。

三、問題修復

這類MySQL用戶表損耗的問題解決方式也是有多種,我這裡列舉其中一種:

(1)my.cnf中的[mysqld]標籤下添加skip_grant_tables,啟動時跳過載入系統字典。

(2)重啟mysqld,然後修復mysql schema下的所有表。

(3)在[mysqld]標籤下注釋或刪除掉skip_grant_tables,然後重啟mysqld。

此時mysqld是可以正常啟動的,無異常。

四、深入排查

在產品化中,以上修復方式很不優雅,只是作為臨時的解決方案;並且也存在一些令人疑惑的點:

帶著這些疑問,我們繼續排查出現該現象的原因;此時Google也沒有找到一些有效的信息,那麼只能通過MySQL源代碼來尋找一些答案。

首先需要下載mysql 5.7.31版本的源代碼,並搭建mysql debug環境;具體步驟可以自動Google搜索一下,本文就不再贅述了。

在源代碼中搜索一下關鍵詞,用於打斷點的位置,然後進行調試:

定位到相關代碼,大概是sql/mysqld.cc的4958行,且存在if條件判斷,此時我們開始調試:

通過以上調試信息,可以判斷出acl_init函數返回的值為真;此時我們查看該函數的代碼 (sql/auth/sql_auth_cache.cc:1365):

根據該函數的注釋發現:該函數是初始化負責用戶/資料庫級特權檢查的結構,並從mysql schema中的表中為其載入特權信息;且return值為1代表的是初始化許可權失敗。

此後開始逐步調試,觀察return相關信息,當調試到lock_table_names函數時,我們發現在Phase 3時return值為true,且根據代碼注釋發現true代表是Failure;具體代碼如下(sql/sql_base.cc:5549):

調試信息如下:

可以看到flags的值為0,而MYSQL_OPEN_SKIP_SCOPED_MDL_LOCK為宏定義值0x1000,與flags的值 做按位與操作,結果自然也是0,當然MYSQL_LOCK_IGNORE_GLOBAL_READ_ONLY也是如此;need_global_read_lock_protection是bool類型值,代表是否需要全局讀鎖的保護,這個值是在table- mdl_request.type不為MDL_SHARED_READ_ONLY發生改變;check_readonly函數相關信息 下面概述。

此時也查看了下MySQL 5.7.26版本代碼作為對比,發現lock_table_names函數下的Phase 3後的部分代 碼是在5.7.29版本後新增的。如果是git clone的MySQL代碼可以用git blame命令查詢文件變化的信息:

上述展示的信息中,最左側的列值為commit id為05824063和0405ebee,有興趣的同學可以詳細看下。

此功能解決的問題是 BUG#28438114: SET READ_ONLY=1 SOMETIMES DOESN’T BLOCK CONCURRENT DDL.;當然這個代碼的變更功能也在5.7 Release Notes中有所體現,如下所示( m/doc/relnotes/mysql/5.7/en/news-5-7-29.html ):

最後我們再查看下check_readonly函數,該函數是基於read_only和super_read_only狀態執行標準化檢查,是禁止(TRUE)還是允許(FALSE)操作。代碼如下(sql/auth/sql_authorization.cc:489):

此時第一反應就是去檢查my.cnf中是否包含read_only相關參數,檢查之後發現確實是使用了該參數, 如下:

此時注釋掉該參數,然後再次啟動mysqld,發現MyISAM表可以自動修復,且正常啟動;error log信息如下:

由於docker一些限制,我們在mysqld啟動會涉及兩次;所以解決該問題的方式為:第一次mysqld的啟動時先關閉read_only參數,第二次啟動時開啟read_only參數。之所以選擇默認開啟read_only參數, 是為了避免在mysqld啟動後,選主邏輯未完成時的保護措施;當然選主完成後,會自動對master執行 set global read_only=0 操作。

五、總結

六、附錄

調試的棧幀信息如下,有興趣的小夥伴可以研究下:

熟悉MySQL體系結構和innodb存儲引擎工作原理;以及MySQL備份恢復、複製、數據遷移等技術;專註於MySQL、MariaDB開源資料庫,喜好開源技術。

原文鏈接:

如何在Windows下編譯或調試MySQL

用vs code 就可以了。

Visual Studio Code

Visual Studio Code(簡稱VS Code)是由微軟開發的,同時支持Windows、Linux和macOS操作系統的開源文本編輯器。它支持調試,內置了Git 版本控制功能,同時也具有開發環境功能,例如代碼補全(類似於IntelliSense)、代碼片段、代碼重構等。該編輯器支持用戶自定義配置,例如改變主題顏色、鍵盤快捷方式、編輯器屬性和其他參數,還支持擴展程序並在編輯器中內置了擴展程序管理的功能。

安裝LLDB

LLDB是LLVM編譯器的一部分,推薦使用Homebrew安裝LLVM工具集,不建議使用系統自帶的LLDB,安裝前必須先創建證書否則無法安裝,步驟如下:

創建完成後,開始安裝LLVM

brew install llvm –with-python@2 –with-lldb

安裝插件

VS Code自帶有debug功能,這裡我推薦使用LLDB Debugger插件。

接下來,為項目配置調試參數。

配置調試參數

使用VS Code打開MySQL源碼目錄,在側邊欄選擇debug欄目,添加配置,program輸入需要調試的程序路徑,這裡選擇你編譯好的mysqld路徑,args輸入程序啟動所需的參數,通常會指定mysqld的配置文件。這樣就配置好了,是不是很簡單。

啟動調試

點擊啟動按鈕,啟動後如果沒有設置斷點會mysqld會正常啟動,如果觸發了斷點會如下圖顯示。

整個調試窗口基本分為六部分,所有的調試操作都在這裡完成:

1: 顯示變數信息

2: 設置重點關注的變數

3: 顯示調用棧信息

4: 設置斷點信息,在代碼行號前也可以設置斷點

5: 代碼顯示區域,上方是調試按鈕,包括 continue/stepover/step in/step out/restart/stop

6: 調試終端輸入輸出區

斷點設置

在代碼行號前點擊即可在該行為設置斷點,也可以根據條件設置斷點。以設置ConditionalBreakpoint為例,當程序啟動後會按照你設置的條件表達式判斷是否觸發斷點。

Conditional Breakpoint這種方式用在目標變數達到某條件時觸發斷點,其餘則跳過繼續執行。比如:設置變數等於目標表名時觸發斷點,其餘表則跳過,相對函數名斷點省去很多手工跳過操作。

遠程調試

假如你想調試遠程Linux伺服器上的MySQL上面的方法就不合適了,這時需要遠程調試。lldb和gdb都支持遠程調試,這裡以lldb為例。

需要先在遠程主機上安裝lldb,使用yum安裝,源地址在這裡

remote$ yum install -y llvm-toolset-7

安裝完成後,啟動lldb-server

remote$ /opt/rh/llvm-toolset-7/root/usr/bin/lldb-serverplatform –listen “*:9191” –server

接下來,在VS Code調試界面中新增配置項。

{

“type”: “lldb”,

“request”: “attach”,

“name”: “Remote attach”,

“program”: “~/mysql5626/usr/local/mysql/bin/mysqld”,

“pid”:”target_pid”,

“initCommands”: [

“platform select remote-linux”,

“platform connect connect://remote_host:9191”

],

“sourceMap”: {

“/export/home/pb2/build/sb_0-15908961-1436910670.17/mysql-5.6.26”: “/Users/hongbin/workbench/mysql-server”

}

},

program: 本機也要拷貝一份目標程序,載入

pid: 填寫遠程主機的mysqld進程id

sourceMap: 填寫mysqld編譯的代碼路徑與本機代碼庫路徑的映射,這樣調試時代碼才可以和程序關聯在一起看

注意:記得調試前將代碼切換到與目標程序版本一致的branch

如何查看mySQL的源代碼

給你個過來人的建議。兩個方式入手。

1、利用他。儘可能從大模塊開始,用你的代碼,去調用他。這是從功能特性角度,去理解各個模塊的作用。這非常容易加深你對應用它的理解。

2、在代碼中插入LOG,檢測代碼運行流程。

如果你只是靜態的看代碼,這個不現實的。

如果你想看一部分代碼。首先你要想辦法讓這套代碼RUN起來,如果你使用任何方式都無法讓這段代碼運行,我只能說,這段代碼沒有存在價值。為什麼在裡面,當然更大的可能是,你沒找到開啟它的方法。

動態分析法,是門學問。包括對運行態才出現BUG的系統進行DEBUG,當然不是GDB或者VC的F5模式。不過貌似學校沒有這類教學。很工程的東西。我也只是經驗所得。沒有系統的理論化。

例如一套系統,你在不改代碼的情況下,要能找到問題。甚至不能加LOG代碼,只能通過反饋判斷。不是不可能的。甚至有時必須這麼做。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/272444.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-17 13:56
下一篇 2024-12-17 13:56

相關推薦

  • 如何修改mysql的埠號

    本文將介紹如何修改mysql的埠號,方便開發者根據實際需求配置對應埠號。 一、為什麼需要修改mysql埠號 默認情況下,mysql使用的埠號是3306。在某些情況下,我們需…

    編程 2025-04-29
  • g3log源代碼學習

    g3log是一個高性能C++日誌庫,其代碼十分精簡和可讀性強,本文將從3個方面詳細介紹g3log源代碼學習。 一、g3log源代碼整體架構 g3log的整體架構十分清晰,其中有3個…

    編程 2025-04-29
  • 雲智直聘 源碼分析

    本文將會對雲智直聘的源碼進行分析,包括前端頁面和後端代碼,幫助讀者了解其架構、技術實現以及對一些常見的問題進行解決。通過本文的閱讀,讀者將會了解到雲智直聘的特點、優勢以及不足之處,…

    編程 2025-04-29
  • Python操作MySQL

    本文將從以下幾個方面對Python操作MySQL進行詳細闡述: 一、連接MySQL資料庫 在使用Python操作MySQL之前,我們需要先連接MySQL資料庫。在Python中,我…

    編程 2025-04-29
  • MySQL遞歸函數的用法

    本文將從多個方面對MySQL遞歸函數的用法做詳細的闡述,包括函數的定義、使用方法、示例及注意事項。 一、遞歸函數的定義 遞歸函數是指在函數內部調用自身的函數。MySQL提供了CRE…

    編程 2025-04-29
  • MySQL bigint與long的區別

    本文將從數據類型定義、存儲空間、數據範圍、計算效率、應用場景五個方面詳細闡述MySQL bigint與long的區別。 一、數據類型定義 bigint在MySQL中是一種有符號的整…

    編程 2025-04-28
  • Python網站源碼解析

    本文將從多個方面對Python網站源碼進行詳細解析,包括搭建網站、數據處理、安全性等內容。 一、搭建網站 Python是一種高級編程語言,適用於多種領域。它也可以用於搭建網站。最常…

    編程 2025-04-28
  • 數字孿生源代碼的介紹

    數字孿生源代碼是一種用於模擬現實世界的技術。它將現實世界的實體或場景進行數字化,使得我們可以通過計算機程序對其進行模擬,以便進行分析和預測。數字孿生源代碼包含了許多組件和演算法,下面…

    編程 2025-04-28
  • MySQL左連接索引不生效問題解決

    在MySQL資料庫中,經常會使用左連接查詢操作,但是左連接查詢中索引不生效的情況也比較常見。本文將從多個方面探討MySQL左連接索引不生效問題,並給出相應的解決方法。 一、索引的作…

    編程 2025-04-28
  • 源碼是什麼

    源碼是一段計算機程序的原始代碼,它是程序員所編寫的可讀性高、理解性強的文本。在計算機中,源碼是指編寫的程序代碼,這些代碼按照一定規則排列,被計算機識別並執行。 一、源碼的組成 源碼…

    編程 2025-04-27

發表回復

登錄後才能評論