目錄
一、理論
1.Navicat
2.MVCC
二、實(shí)驗(yàn)
1.Navicat連接MySQL
?2.navicat的基礎(chǔ)操作
?3.測(cè)試提交事務(wù)
三、問題
1.解決1130
2.解決2003
3.解決1045
4.密碼安全級(jí)別不滿足
四、總結(jié)
一、理論
1.Navicat
(1)簡(jiǎn)介
Navicat Premium 是一套數(shù)據(jù)庫開發(fā)工具,實(shí)現(xiàn)從單一應(yīng)用程序中同時(shí)連接 MySQL、MariaDB、MongoDB、SQL Server、Oracle、PostgreSQL 和 SQLite 數(shù)據(jù)庫。它與 Amazon RDS、Amazon Aurora、Amazon Redshift、Microsoft Azure、Oracle Cloud、MongoDB Atlas、阿里云、騰訊云和華為云等云數(shù)據(jù)庫兼容。你可以快速輕松地創(chuàng)建、管理和維護(hù)數(shù)據(jù)庫。
Navicat 是一套快速、可靠并價(jià)格相宜的數(shù)據(jù)庫管理工具, 專為簡(jiǎn)化數(shù)據(jù)庫的管理及降低系統(tǒng)管理成本而設(shè)。它的設(shè)計(jì)符合數(shù)據(jù)庫管理員、開發(fā)人員及中小企業(yè)的需要。Navicat 是以直覺化的圖形用戶界面而建的,讓你可以以安全并且簡(jiǎn)單的方式創(chuàng)建、組織、訪問并共用信息。
(2)版本
Navicat提供了多個(gè)版本以滿足不同用戶的需求,以下是其中幾個(gè)版本的簡(jiǎn)要介紹:
①?Navicat Premium:這是Navicat最全面的版本,它提供了對(duì)多種數(shù)據(jù)庫類型(MySQL、MariaDB、建模、數(shù)據(jù)同步、備份和還原等。建模、數(shù)據(jù)同步、備份和還原等。
②?Navicat for MySQL/MariaDB/PostgreSQL/Oracle/SQL Server:這些版本專門為單個(gè)數(shù)據(jù)庫類型而開發(fā),因此它們具有更專業(yè)的特性和工具來優(yōu)化您的MySQL、MariaDB、 PostgreSQL、 Oracle或SQLServer數(shù)據(jù)庫管理。
③?Navicat Essentials: 這是- - 個(gè)輕量級(jí)的版本,適用于只需要基本數(shù)據(jù)庫管理功能的用戶。它支持MySQL、MariaDB、 PostgreSQL和SQLite數(shù)據(jù)庫, 但缺少一些高級(jí)功能。
④?Navicat for MongoDB:專門J針對(duì)MongoDB進(jìn)行了優(yōu)化,支持MongoDB的所有常見功能,包括數(shù)據(jù)導(dǎo)入/導(dǎo)出、查詢構(gòu)建、數(shù)據(jù)編輯、索|管理等。
2.MVCC
(1)概念
MVCC(Multi-Version Concurrency Control)即多版本并發(fā)控制。是一種并發(fā)控制的方法,一般在數(shù)據(jù)庫管理系統(tǒng)中,實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的并發(fā)訪問,在編程語言中實(shí)現(xiàn)事務(wù)內(nèi)存。文章來源地址http://www.zghlxwxcb.cn/news/detail-564979.html
在 MySQL InnoDB 中主要是為了提高數(shù)據(jù)庫并發(fā)性能,用更好的方式去處理讀-寫沖突,做到即使有讀寫沖突時(shí),也能做到不加鎖,非阻塞并發(fā)讀
(2)當(dāng)前讀和快照讀
? ①?當(dāng)前讀(悲觀鎖的具體實(shí)現(xiàn))
(select。。。lock in mode)共享鎖和(select。。。for update/insert/delete)排他鎖這些操作都屬于當(dāng)前讀,他們讀取的都是記錄的最新版本,并且讀取時(shí)還需要保證其他事務(wù)不能修改其正在讀取的當(dāng)前記錄。
?②?快照讀(MVCC非阻塞的具體實(shí)現(xiàn))
像不加鎖的 select 操作就是快照讀,即不加鎖的非阻塞讀;快照讀的前提是隔離級(jí)別不是串行級(jí)別,串行級(jí)別下的快照讀會(huì)退化成當(dāng)前讀;之所以出現(xiàn)快照讀的情況,是基于提高并發(fā)性能的考慮,快照讀的實(shí)現(xiàn)是基于MVCC ,可以認(rèn)為 MVCC 是行鎖的一個(gè)變種,但它在很多情況下,避免了加鎖操作,降低了開銷;既然是基于多版本,即快照讀可能讀到的并不一定是數(shù)據(jù)的最新版本,而有可能是之前的歷史版本
(3)原理
從navicat事務(wù)的隔離級(jí)別可以發(fā)現(xiàn),數(shù)據(jù)庫有三種并發(fā)的場(chǎng)景:(讀while讀)(讀while寫)(寫while寫),當(dāng)然,(讀while讀)沒有什么問題,但后兩者存在著沖突。
①隱式字段
每行記錄除了我們自定義的字段外,還有數(shù)據(jù)庫隱式定義的 DB_TRX_ID;DB_ROLL_PTR等字段。
DB_TRX_ID
6 byte,最近修改事務(wù) ID:記錄最后一次修改該記錄的事務(wù) ID
DB_ROLL_PTR
7 byte,回滾指針,指向這條記錄的上一個(gè)版本的位置(存儲(chǔ)于 rollback segment 里)
DB_ROW_ID
6 byte,隱含的自增 ID(隱藏主鍵),如果數(shù)據(jù)表沒有主鍵,InnoDB 會(huì)自動(dòng)以DB_ROW_ID產(chǎn)生一個(gè)聚簇索引
還有一個(gè)刪除 flag 隱藏字段, 既記錄被更新或刪除并不代表真的刪除,而是刪除 flag 變了
②?undo日志
insert undo log(事務(wù)在 insert 新記錄時(shí)產(chǎn)生)只在rollback時(shí)需要,在事務(wù)提交后可以被立即丟棄
update undo log(事務(wù)在進(jìn)行 update 或 delete 時(shí)產(chǎn)生)提交后直到?jīng)]有事務(wù)涉及后,由purge線程統(tǒng)一清除
*purge:更新或者刪除操作都只是設(shè)置一下老記錄的 deleted_bit ,并不真正將過時(shí)的記錄刪除。為了節(jié)省磁盤空間,InnoDB 有專門的 purge 線程來清理 deleted_bit 為 true 的記錄。為了不影響 MVCC 的正常工作,purge 線程自己也維護(hù)了一個(gè)read view(這個(gè) read view 相當(dāng)于系統(tǒng)中最老活躍事務(wù)的 read view );如果某個(gè)記錄的 deleted_bit 為 true ,并且 DB_TRX_ID 相對(duì)于 purge 線程的 read view 可見,那么這條記錄是可以被安全清除的。
不同事務(wù)或者相同事務(wù)的對(duì)同一記錄的修改,會(huì)導(dǎo)致該記錄的undo log成為一條記錄版本線性表,既鏈表,undo log 的鏈?zhǔn)拙褪亲钚碌呐f記錄,鏈尾就是最早的舊記錄
兩者中,insert undo log 實(shí)際上就是rollback segment中的舊紀(jì)錄鏈,上文中navicat上我們進(jìn)行的read uncommitted級(jí)別的事務(wù)在對(duì)數(shù)據(jù)進(jìn)行修改時(shí),數(shù)據(jù)庫先為該行加鎖(排它鎖),把修改之前的該行數(shù)據(jù)拷貝到undo log中作為舊紀(jì)錄,此時(shí)被修改的記錄的DB_TRX_ID就會(huì)變?yōu)樽龃诵薷牡氖聞?wù)的ID,我們默認(rèn)從1開始,之后遞增,而DB_ROLL_PTR則指向undo log中的副本數(shù)據(jù)(SQL語句:delete。。。),事務(wù)提交后,釋放鎖。
而update undo log的實(shí)現(xiàn)原理是,當(dāng)進(jìn)行數(shù)據(jù)修改的操作時(shí),會(huì)有一個(gè)叫做COW(copy on write)的機(jī)制,/*吐槽:奶牛機(jī)制。。。*/還是字面意思,復(fù)制寫,它的存在是為了解決一個(gè)讀寫并發(fā)的問題,為了讓讀寫可以互不干擾,例如在進(jìn)行update操作時(shí),會(huì)先把要操作的行復(fù)制出一份,在復(fù)制出的行上進(jìn)行數(shù)據(jù)修改,復(fù)制出的這行數(shù)據(jù)的事務(wù)id會(huì)發(fā)生更改,而回滾指針則指向了update undo log(被復(fù)制的數(shù)據(jù)),也就是進(jìn)行update操作的原數(shù)據(jù),解決了讀寫并發(fā)的問題同時(shí)帶來了數(shù)據(jù)讀取的延后性問題
③Read View
三個(gè)主要屬性:
表1?Read View屬性
屬性 | 功能 |
trx_list ? ? ? ? ? ? | (隨便取的名字) ?開啟read view時(shí)當(dāng)前活躍的(未提交)事務(wù)id集合 |
up_limit_id ? ? ? ? | 開啟read view時(shí)最小的事務(wù)id |
low_limit_id ? ? ? | 開啟read view后,應(yīng)該分配給下一個(gè)事務(wù)的id值,也即當(dāng)前最大事務(wù)id+1 |
事務(wù)執(zhí)行的快照讀的那一刻,會(huì)生成數(shù)據(jù)庫系統(tǒng)當(dāng)前的一個(gè)快照,記錄并維護(hù)系統(tǒng)當(dāng)前活躍事務(wù)的 ID (當(dāng)每個(gè)事務(wù)開啟時(shí),都會(huì)被分配一個(gè) ID , 這個(gè) ID 是遞增的,所以最新的事務(wù),ID 值越大,反之越小);主要是用來做可見性判斷的, 即當(dāng)我們某個(gè)事務(wù)執(zhí)行快照讀的時(shí)候,對(duì)該記錄創(chuàng)建一個(gè) Read View 讀視圖,通過一定條件判斷當(dāng)前事務(wù)能夠看到哪個(gè)版本的數(shù)據(jù),既可能是當(dāng)前最新的數(shù)據(jù),也有可能是該行記錄的undo log里面的某個(gè)版本的數(shù)據(jù)
read view遵循一個(gè)可見性算法來進(jìn)行判斷,將要被修改的數(shù)據(jù)的最新記錄中的 DB_TRX_ID(當(dāng)前事務(wù) ID )取出來,與系統(tǒng)當(dāng)前其他活躍事務(wù)的 ID 去對(duì)比(由 Read View 維護(hù)),如果事務(wù)id 跟 Read View 的屬性做了某些比較,不符合可見性,那就通過 DB_ROLL_PTR 回滾指針去取出 Undo Log 中的 DB_TRX_ID 再比較,即遍歷鏈表的 DB_TRX_ID(從鏈?zhǔn)椎芥溛玻磸淖罱囊淮涡薷牟槠穑?,直到找到滿足特定條件的 DB_TRX_ID , 那么這個(gè) DB_TRX_ID 所在的舊記錄就是當(dāng)前事務(wù)可見的最新老版本。
DB_TRX_ID < up_limit_id , 當(dāng)前行事務(wù)id比活躍的最小事務(wù)id還小時(shí),當(dāng)前事務(wù)對(duì)該記錄的修改已經(jīng)提交,因?yàn)楫?dāng)前事務(wù)id比活躍的最小事務(wù)id還小,不在活躍的事務(wù)之中,也就意味著該事務(wù)已經(jīng)提交或回滾。也就是在生成Read View之前,事務(wù)已經(jīng)提交,則這個(gè)數(shù)據(jù)是可讀的;
DB_TRX_ID > low_limit_id , 修改該行的事務(wù)id大于了Read View里系統(tǒng)待分配的下一個(gè)事務(wù)id,說明修改該行的事務(wù)是生成該Read View之后出現(xiàn)的事務(wù),這時(shí),應(yīng)該是不可見的,一個(gè)事務(wù)不可以看到未提交事務(wù)所作的數(shù)據(jù)修改(臟讀)。
DB_TRX_ID 在 up_limit_id 和 low_limit_id 的范圍內(nèi),分為兩種情況:
(1)包含在 trx_list 中表示在開啟這個(gè)read view時(shí),該事務(wù)還是活躍的(未提交),應(yīng)該不可見,否則就是臟讀
(2)不包含在 trx_list 中表示在開啟這個(gè)read view時(shí),該事務(wù)已經(jīng)提交了,所以可見
基于RC隔離級(jí)別:與RR相比,RC的特點(diǎn)是不可重復(fù)讀,也就是每一次讀取的都是當(dāng)前最新的數(shù)據(jù),那么RC每一次進(jìn)行讀取的時(shí)候會(huì)開啟一個(gè)新的RW,這樣就可以保證,在每次讀取數(shù)據(jù)的時(shí)候,TRX_list里都是當(dāng)前最新的活躍事務(wù)。
二、實(shí)驗(yàn)
1.Navicat連接MySQL
(1)新建連接
?(2)配置連接
(3)連接數(shù)據(jù)庫
這里可能會(huì)出現(xiàn)登錄失敗的情況,開的虛擬機(jī)和navicat跑在一臺(tái)機(jī)器上,排除數(shù)據(jù)庫沒有開啟成功、主機(jī)防火墻未設(shè)置策略或未關(guān)閉(錯(cuò)誤碼1130)等問題,可能存在的問題是windows主機(jī)沒有開啟telnet功能,需要做如下設(shè)置:
?(4)登錄數(shù)據(jù)庫需要授權(quán)
對(duì)用戶進(jìn)行一個(gè)網(wǎng)段進(jìn)行授權(quán)
grant all privileges on *.* to 'root'@'localhost' identified by '123456';
#將所有數(shù)據(jù)庫的所有表(*.*)的所有權(quán)限(all privileges),授予通過 一個(gè)網(wǎng)段 ip(%)訪問的用戶,密碼為123456,如果要限制所有機(jī)器可以訪問,將網(wǎng)段換成相應(yīng)的%即可
這樣就可以成功登錄
flush privileges; 刷新權(quán)限
#當(dāng)然,給root用戶設(shè)置任何host都可以登錄明顯是不安全的
?(5) 連接成功
?2.navicat的基礎(chǔ)操作
(1)數(shù)據(jù)庫的基本操作
通過右鍵點(diǎn)擊,我們可以創(chuàng)建、編輯、刪除......數(shù)據(jù)庫更改數(shù)據(jù)庫和表的屬性。
?雙擊表查看表內(nèi)容
右擊
?和數(shù)據(jù)庫表內(nèi)容信息一樣 :
?(2)對(duì)表進(jìn)行操作
右鍵test庫下的“表”,選擇新建數(shù)據(jù)表,或右擊一個(gè)已存在的表點(diǎn)擊“設(shè)計(jì)表”,進(jìn)入一個(gè)編輯表的窗口。在這里對(duì)表進(jìn)行表結(jié)構(gòu)的展示和編輯,可以插入字段并定義字段類型和長度,設(shè)置主鍵、設(shè)置默認(rèn)值,是否為“null”等,相當(dāng)于describe和alter操作。
?
?在這個(gè)界面創(chuàng)建外鍵,我們先清空表內(nèi)容(最好創(chuàng)建表的時(shí)候設(shè)置,否則會(huì)報(bào)錯(cuò)),所關(guān)聯(lián)的主表的主鍵和foreign key需要在類型、長度上保持一致,同時(shí)外鍵不可以設(shè)置自增、無符號(hào)、填充零
?(3)sql 語句管理數(shù)據(jù)庫
在navicat中,也可以點(diǎn)擊新建查詢,在命令行中輸入SQL語句的方式管理數(shù)據(jù)庫中的數(shù)據(jù),并可以使用Tab鍵對(duì)命令進(jìn)行補(bǔ)全。
?(4)用戶管理
點(diǎn)擊用戶進(jìn)入用戶的管理界面,在這里可以直觀的看到當(dāng)前數(shù)據(jù)庫(非單個(gè)庫)的所有用戶,也可以對(duì)他們進(jìn)行更改密碼,新建、刪除?,權(quán)限設(shè)置,以及可登錄的主機(jī)設(shè)置(文章開頭的設(shè)置)。
?(5)視圖的創(chuàng)建
新建攝圖
?
(6)表的導(dǎo)入與導(dǎo)出
?導(dǎo)出全部記錄
選擇格式
選擇導(dǎo)出文件
?選擇字段
?開始導(dǎo)出-點(diǎn)擊開始
完成
?
?在保存的excel表打開查看
新建備份
?(7)數(shù)據(jù)庫的備份?
選擇備份
?新建備份
?備份完成
(8)還原備份?
?
?3.測(cè)試提交事務(wù)
InnoDB四種隔離級(jí)別:read uncommit(有臟讀問題)、read commit(有不可重復(fù)讀問題)、repeatable read(有幻讀問題)、serializable(解決前三種問題,但效率過低)丟失更新。
(1)read uncommit(有臟讀問題)
兩個(gè)事務(wù)同時(shí)對(duì)同一個(gè)數(shù)據(jù)進(jìn)行只讀不提交操作,一個(gè)進(jìn)行修改,一個(gè)來進(jìn)行讀取數(shù)據(jù)。
(2)read committed(oracle默認(rèn)隔離級(jí)別)
(3)測(cè)試回滾事務(wù)
?回滾操作
(4)多個(gè)回滾點(diǎn)測(cè)試?
三、問題
1.解決1130
? ? (1)解決方法
? ? 在安裝mysql的虛擬機(jī)中登錄mysql賬號(hào),更改“mysql”數(shù)據(jù)庫里的“user”表里的“host”項(xiàng),把原來的“l(fā)ocalhost”改成“%”;
? ?
? ? mysql -uroot -p password
? ? mysql>use mysql;
? ? mysql>update user set host = '%' where user = 'root';
? ? mysql>select host, user from user;
? ? mysql>flush privileges或mysql>service mysqld restart生效以上設(shè)置
2.解決2003
? ? 防火墻問題,需要開放對(duì)應(yīng)端口(3306)或者關(guān)閉防火墻;
? (1)開放3306端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent ? ?然后重啟防火墻
? ? ? ? ? ? ? ?命令含義:
?
? ? ? ? ? ? --zone #作用域
?
? ? ? ? ? ? --add-port=3306/tcp ?#添加端口,格式為:端口/通訊協(xié)議
?
? ? ? ? ? ? --permanent ? #永久生效,沒有此參數(shù)重啟后失效
?
? ? ? ?
? ? (2)關(guān)閉防火墻:關(guān)閉防火墻:systemctl stop firewalld.service(臨時(shí)關(guān)閉)
? ? ? ? ? ? ? ? ? ? ? ? ? 禁止開機(jī)啟動(dòng)啟動(dòng)防火墻:systemctl disable firewalld.service
?
防火墻簡(jiǎn)單命令:
? ? ? ? ? ? ? ? 重啟防火墻:firewall-cmd --reload
? ? ? ? ? ? ? ? 查看防火墻狀態(tài):firewall-cmd --state
? ? ? ? ? ? ? ? 關(guān)閉防火墻:systemctl stop firewalld.service
? ? ? ? ? ? ? ? 開啟防火墻:systemctl start firewalld.service
? ? ? ? ? ? ? ? 禁止開機(jī)啟動(dòng)啟動(dòng)防火墻:systemctl disable firewalld.service
3.解決1045
root用戶下host為‘%‘和‘localhost’的密碼竟然不一樣:
?
(1)原因分析
當(dāng)不給localhost主機(jī)添加密碼時(shí),無論是在非本機(jī)ip還是localhost都能依靠主機(jī)為%的密碼通過mysql驗(yàn)證,完成連接:
當(dāng)單獨(dú)給localhost添加跟%不一樣的密碼時(shí),如果你在本地登錄,mysql數(shù)據(jù)庫只認(rèn)localhost主機(jī)的密碼,不認(rèn)%主機(jī)的密碼,并且通過navicate登錄的時(shí)候雖然你的主機(jī)名或者ip填的localhost,mysql也不會(huì)讓你通過主機(jī)為localhost那個(gè)密碼登錄的,只能使用%的那個(gè)密碼登錄。
?
?(2)解決方法
給%添加跟localhost一樣的密碼
grant all on *.* to root@'%' identified by '123456' with grant option;
select host, user,authentication_string from user;
(3)連接成功
4.密碼安全級(jí)別不滿足
?(1)原因分析
MySQL的?validate_password插件默認(rèn)安裝。這將要求密碼包含至少一個(gè)大寫字母,一個(gè)小寫字母,一個(gè)數(shù)字和一個(gè)特殊字符,并且密碼總長度至少為8個(gè)字符。
(2)解決方法
需要修改簡(jiǎn)單密碼,可以依次執(zhí)行以下操作步驟:
set global validate_password_policy=0;
set global validate_password_length=1;
set global validate_password_mixed_case_count=2;
-- 然后進(jìn)行密碼更改
grant all on *.* to root@'%' identified by '123456' with grant option;
或者
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
?
四、總結(jié)
Navicat Premium 是一套數(shù)據(jù)庫開發(fā)工具,實(shí)現(xiàn)從單一應(yīng)用程序中同時(shí)連接 MySQL、MariaDB、MongoDB、SQL Server、Oracle、PostgreSQL 和 SQLite 數(shù)據(jù)庫。文章來源:http://www.zghlxwxcb.cn/news/detail-564979.html
MVCC(Multi-Version Concurrency Control)即多版本并發(fā)控制。是一種并發(fā)控制的方法,一般在數(shù)據(jù)庫管理系統(tǒng)中,實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的并發(fā)訪問,在編程語言中實(shí)現(xiàn)事務(wù)內(nèi)存。
到了這里,關(guān)于數(shù)據(jù)庫應(yīng)用:Navicat連接MySQL的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!