十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
PHP MySQL Linux現(xiàn)在已逐漸成為小型web服務(wù)器的一種經(jīng)典組合。在Windows環(huán)境下構(gòu)筑和調(diào)試MySQL數(shù)據(jù)庫(kù)是許多網(wǎng)站研發(fā)者的一種最好選擇。本人在Windows98環(huán)境下初學(xué)MySQL,現(xiàn)將學(xué)習(xí)過程和經(jīng)驗(yàn)總結(jié)出來供大家參考。
成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),陽泉企業(yè)網(wǎng)站建設(shè),陽泉品牌網(wǎng)站建設(shè),網(wǎng)站定制,陽泉網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,陽泉網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
1、下載mysql-3.23.35-win.zip并解壓;
2、運(yùn)行setup.exe;選擇d:mysql,"tyical install"
3、啟動(dòng)mysql,有如下方法:方法一:使用winmysqladmin
1)、進(jìn)入d::mysqlbin目錄,運(yùn)行winmysqladmin.exe,在屏幕右下角的任務(wù)欄內(nèi)會(huì)有一個(gè)帶紅色的圖符
2)、鼠標(biāo)左鍵點(diǎn)擊該圖符,選擇“show me”,出現(xiàn)“WinMySQLAdmin”操作界面;首次運(yùn)行時(shí)會(huì)中間會(huì)出現(xiàn)一個(gè)對(duì)話框需要輸入并配置您的用戶名和口令
3)、選擇“My.INI setup”
4)、在“mysqld file”中選擇“mysqld-opt”(win9x)或“mysqld-nt”(winNT)
5)、選擇“Pick-up or Edit my.ini values”能夠在右邊窗口內(nèi)對(duì)您的my.ini文檔進(jìn)行編輯
6)、選擇“Save Modification”保存您的my.ini文檔
7)、假如您想快速使用winmysqladmin(開機(jī)時(shí)自動(dòng)運(yùn)行),選擇“Create ShortCut on Start Menu”
8)、測(cè)試:
進(jìn)入DOS界面;
在d:mysqlbin目錄下運(yùn)行mysql,進(jìn)入mysql交互操作界面
輸入show databases并回車,屏幕顯示出當(dāng)前已有的兩個(gè)數(shù)據(jù)庫(kù)mysql和test方法二:不使用winmysqladmin
1)、在DOS窗口下,進(jìn)入d:/mysql/bin目錄
2)、win9X下)運(yùn)行:mysqld在NT下運(yùn)行:
mysqld-nt --standalone
3)、此后,mysql在后臺(tái)運(yùn)行
4)、測(cè)試mysql:(在d:/mysql/bin目錄下)
a)、mysqlshow 正常時(shí)顯示已有的兩個(gè)數(shù)據(jù)庫(kù)mysql和test
b)、mysqlshow -u root mysql 正常時(shí)顯示數(shù)據(jù)庫(kù)mysql里的五個(gè)表:columns_priv,db,host,tables_priv,user
c)、mysqladmin version status proc 顯示版本號(hào)、狀態(tài)、進(jìn)程信息等
d)、mysql test 進(jìn)入mysql操作界面,當(dāng)前數(shù)據(jù)庫(kù)為test
4、至此,MySQL已成功安裝,接著能夠熟悉MySQL的常用命令并創(chuàng)建自己的數(shù)據(jù)庫(kù)了。
簡(jiǎn)介:
大家好,我是xp,我又詐尸了
mvcc ,想必大家都不陌生,每個(gè)Java程序員都或多或少的了解過,不過不知道大家都是怎么學(xué)習(xí)的,是不是簡(jiǎn)單的百度一下呢?下面,我來帶大家裝個(gè)13,調(diào)試 mvcc 。咳,不是源碼哈,但有那味了。
開卷開卷。
首先介紹一下 mvcc 的字面意思,全稱: Multiversion Concurrency Control,翻譯下來就是多版本并發(fā)控制技術(shù)。
臟讀、 不可重復(fù)讀 、幻讀的概念就不多啰嗦了,mvcc具體的含義也不多啰嗦了,可以自行百度。 mvcc 解決了臟讀、 不可重復(fù)讀、部分幻讀 ,包含了3個(gè)重要成分:
undo log作用:
在數(shù)據(jù)修改的時(shí)候,不僅記錄了 redo log ,還記錄了 undo log 。但是 不同于 redo log , undo log 是邏輯日志。簡(jiǎn)單理解成, delete的時(shí)候,undo log會(huì)出現(xiàn)一條insert,update的時(shí)候,undo log會(huì)出現(xiàn)一條舊數(shù)據(jù), 用來事務(wù)失敗之后的回滾。
3個(gè)隱式字段:
Read View:
好了,理論講完了,讓我們嗨起來。
嗨之前,有一個(gè)情況單獨(dú)說一下:
可以看到,此時(shí)的trx_id非常大,這是因?yàn)榇藭r(shí)是只讀事務(wù)。對(duì)于只讀事務(wù), InnoDB 并不會(huì)分配 trx_id,只有發(fā)生dml才會(huì)分配。這樣有2個(gè)好處:
當(dāng)commit了之后,我們使用SHOW ENGINE INNODB STATUS查看:
可以看到,顯示該事務(wù)并沒有開始。
好,回到正軌,相信大家都知道, 視圖可見性判斷(不知道的先百度 mvcc ):
整體是這樣的:
第一步我們以 38488 為開始值,把 name 更新成 111 ,并且 commit
第二步以 38490 把 name 更新成 222,333 ,但是不 commit
當(dāng) 38490 第一次修改為 222 的時(shí)候,數(shù)據(jù)結(jié)構(gòu)大致是這樣的:
使用 SHOW ENGINE INNODB STATUS 側(cè)面驗(yàn)證:
當(dāng) 38490 第二次修改為 333 的時(shí)候,數(shù)據(jù)結(jié)構(gòu)大致是這樣的:
使用 SHOW ENGINE INNODB STATUS 側(cè)面驗(yàn)證:
第三步以 38491 去查詢,此時(shí)生成的 m_ids 應(yīng)該是 [348490,38491]
使用 SHOW ENGINE INNODB STATUS 側(cè)面驗(yàn)證:
此時(shí) ReadView 的幾個(gè)屬性值為:
接下來我們來驗(yàn)證結(jié)論:
1:不用驗(yàn)證,當(dāng)前事務(wù)修改的肯定自己可見
2: 38491查詢id=1的記錄,name為111
38488 348490,所以111可見
3:不用驗(yàn)證,38492是下個(gè)事務(wù)的id,還沒生成呢,當(dāng)前事務(wù),肯定看不見下個(gè)事務(wù)修改的值
4:我們先把38491commit,把id為20的name更新成111
然后再開一個(gè)事務(wù)38496:
此時(shí)查id為20,是可見的
m_ids:[348490,38496],因?yàn)?8491已經(jīng)commit了,所以m_ids沒有。此時(shí)的38491在m_ids之間,但是在m_ids里面找不到,所以可見。
好了,愉快的裝13結(jié)束了,兄弟們,下次見。
navicat 怎樣調(diào)試mysql存儲(chǔ)過程
使用Navicat for MySQL工具創(chuàng)建存儲(chǔ)過程步驟:
1. 新建函數(shù)(選擇函數(shù)標(biāo)簽 - 點(diǎn)擊新建函數(shù)):
2、輸入函數(shù)的參數(shù)個(gè)數(shù)、參數(shù)名、參數(shù)類型等:
3、編寫存儲(chǔ)過程:
4、保存(請(qǐng)輸入合法名稱):
5、運(yùn)行存儲(chǔ)過程(在結(jié)果1,2,3...中可以查詢輸出信息):
=====================================
/*腳本2開始*/
DECLARE RANDSTR varchar(2) DEFAULT CAST(round(rand()*53) AS char(2));
DECLARE LocationId INT DEFAULT (SELECT `ID` FROM `shuo_Citys` WHERE `PID`0 ORDER BY rand() Limit 1);
DECLARE Location VARCHAR(50) DEFAULT (SELECT `Name` FROM `shuo_Citys` WHERE `ID`=LocationId);
/*腳本2結(jié)束*/
=====================================
這段移到
declare Uid int;
的下一行
原因:declare 必須都在最前面
前幾天看到姜老師的舊文 用 VSCode 編譯和調(diào)試 MySQL,每個(gè) DBA 都應(yīng) get 的小技能[1] , 文末留了一個(gè)思考題,如何修改源碼,自定義版本,使得 select version() 輸出自定義內(nèi)容
調(diào)試過程參考 macOS VSCode 編譯調(diào)試 MySQL 5.7[2]
內(nèi)部 Item 對(duì)象參考 從SQL語句到MySQL內(nèi)部對(duì)象[3]
源碼面前沒有秘密,建義對(duì) DB 感興趣的嘗試 debug 調(diào)試。本文環(huán)境為 mac + vscode + lldb
vscode 插件:
mysql 源碼:
補(bǔ)?。? MySQL = 8.0.21 需要對(duì) cmake/mysql_version.cmake 文件打補(bǔ)丁 (沒有嚴(yán)格測(cè)試所有版本)
創(chuàng)建 cmake-build-debug 目錄,后續(xù) mysql 編譯結(jié)果,以及啟動(dòng)后生成的文件都在這里
在 mysql 工程目錄下面創(chuàng)建 .vscode/settings.json 文件
內(nèi)容沒啥好說的,都是指定目錄及 boost 配置,其中 WITH_DEBUG 打開 debug 模式,會(huì)在 /tmp/debug.trace 生成 debug 信息
View - Command Palette - CMake: Configure 執(zhí)行后生成 cmake 配置
View - Command Palette - CMake: Build 編譯生成最終 mysql 相關(guān)命令
發(fā)現(xiàn)老版本編譯很麻煩,各種報(bào)錯(cuò),mysql 5.7 代碼量遠(yuǎn)超過 5.5, 只能硬著頭皮看 5.7
首先初始化 my.cnf 配置,簡(jiǎn)單的就可以,共它均默認(rèn)
初始化數(shù)據(jù)文件,非安全模式,調(diào)試用
由于用 vscode 接管 mysql, 所以需要配置 .vscode/launch.json
然后點(diǎn)擊 run and debug mysqld
mysql 啟動(dòng),看到輸出日志無異常,此時(shí)可以用 mysql-client 連接
首先在 sql_parser.cc:5435 處打斷點(diǎn)
mysql_parse 是 sql 處理的入口,至于 tcp connection 連接先可以忽略
執(zhí)行上述 sql 自動(dòng)跳轉(zhuǎn)到斷點(diǎn)處, Step Into , Step Over , Step Out 這些調(diào)試熟悉下即可
接下來分別調(diào)用主要函數(shù): mysql_execute_command , execute_sqlcom_select , handle_query , select-join-exec() , Query_result_send::send_data , Item::send , Item_string:val_str , Protocol_text::store , net_send_ok
啟動(dòng) mysql 時(shí) init_common_variables 會(huì)初始化一堆變量,其中會(huì)調(diào)用 set_server_version 生成版本信息,修改這個(gè)就可以
看好條件編譯的是哪塊,修改即可, 重新 CMake: Build 編譯再運(yùn)行
這里不做過深分析,簡(jiǎn)單講
sql_yacc.cc 函數(shù) PTI_function_call_generic_ident_sys 解析 sql, 識(shí)別出 version() 是一個(gè)函數(shù)調(diào)用
find_native_function_builder 查找 hash 表,找到對(duì)應(yīng) version 函數(shù)注冊(cè)的單例工廠函數(shù)
mysql 啟動(dòng)時(shí)調(diào)用 item_create_init 將這些函數(shù) builder 注冊(cè)到 hash 表 native_functions_hash
MySQL 代碼太龐大,5.1 大約 100w 行,5.5 130w 行,5.7 以后 330w 行,只能挑重點(diǎn)讀源碼。最近很多群里的人在背八股,沒必要,有那時(shí)間學(xué)著調(diào)試下源碼,讀讀多好
原文出處: