當前位置:首頁 » 操作系統 » 資料庫鎖定

資料庫鎖定

發布時間: 2023-05-30 05:06:16

㈠ orcal資料庫表被鎖了怎麼解鎖

1、在做Oracle監聽程序測試時,發現帳戶已經被鎖定。

㈡ Mysql資料庫表被鎖、解鎖,刪除事務

在程序員的職業生涯中,總會遇到資料庫表被鎖的情況,前些天就又撞見一次。由於業務突發需求,各個部門都在批量操作、導出數據,而資料庫又未做讀寫分離,結果就是:資料庫的某張表被鎖了!

用戶反饋系統部分功能無法使用,緊急排查,定位是資料庫表被鎖,然後進行緊急處理。這篇文章給大家講講遇到類似緊急狀況的排查及解決過程,建議點贊收藏,以備不時之需。

用戶反饋某功能頁面報502錯誤,於是第一時間看服務是否正常,資料庫是否正常。在控制台看到資料庫CPU飆升,堆積大量未提交事務,部分事務已經阻塞了很長時間,基本定位是資料庫層出現問題了。

查看阻塞事務列表,發現其中有鎖表現象,本想利用控制台直接結束掉阻塞的事務,但控制台賬號許可權有限,於是通過客戶端登錄對應賬號將鎖表事務kill掉,才避免了情況惡化。

下面就聊聊,如果當突然面對類似的情況,我們該如何緊急響應?

想像一個場景,當然也是軟體工程師職業生涯中會遇到的一種場景:原本運行正常的程序,某一天突然資料庫的表被鎖了,業務無法正常運轉,那麼我們該如何快速定位是哪個事務鎖了表,如何結束對應的事物?

首先最簡單粗暴的方式就是:重啟MySQL。對的,網管解決問題的神器——「重啟」。至於後果如何,你能不能跑了,要你自己三思而後行了!

重啟是可以解決表被鎖的問題的,但針對線上業務很顯然不太具有可行性。

下面來看看不用跑路的解決方案:

遇到資料庫阻塞問題,首先要查詢一下表是否在使用。

如果查詢結果為空,那麼說明表沒在使用,說明不是鎖表的問題。

如果查詢結果不為空,比如出現如下結果:

則說明表(test)正在被使用,此時需要進一步排查。

查看資料庫當前的進程,看看是否有慢SQL或被阻塞的線程。

執行命令:

該命令只顯示當前用戶正在運行的線程,當然,如果是root用戶是能看到所有的。

在上述實踐中,阿里雲控制台之所以能夠查看到所有的線程,猜測應該使用的就是root用戶,而筆者去kill的時候,無法kill掉,是因為登錄的用戶非root的資料庫賬號,無法操作另外一個用戶的線程。

如果情況緊急,此步驟可以跳過,主要用來查看核對:

如果情況緊急,此步驟可以跳過,主要用來查看核對:

看事務表INNODB_TRX中是否有正在鎖定的事務線程,看看ID是否在show processlist的sleep線程中。如果在,說明這個sleep的線程事務一直沒有commit或者rollback,而是卡住了,需要手動kill掉。

搜索的結果中,如果在事務表發現了很多任務,最好都kill掉。

執行kill命令:

對應的線程都執行完kill命令之後,後續事務便可正常處理。

針對緊急情況,通常也會直接操作第一、第二、第六步。

這里再補充一些MySQL鎖相關的知識點:資料庫鎖設計的初衷是處理並發問題,作為多用戶共享的資源,當出現並發訪問的時候,資料庫需要合理地控制資源的訪問規則,而鎖就是用來實現這些訪問規則的重要數據結構。

根據加鎖的范圍,MySQL裡面的鎖大致可以分成全局鎖、表級鎖和行鎖三類。MySQL中表級別的鎖有兩種:一種是表鎖,一種是元數據鎖(metadata lock,MDL)。

表鎖是在Server層實現的,ALTER TABLE之類的語句會使用表鎖,忽略存儲引擎的鎖機制。表鎖通過lock tables… read/write來實現,而對於InnoDB來說,一般會採用行級鎖。畢竟鎖住整張表影響范圍太大了。

另外一個表級鎖是MDL(metadata lock),用於並發情況下維護數據的一致性,保證讀寫的正確性,不需要顯式的使用,在訪問一張表時會被自動加上。

常見的一種鎖表場景就是有事務操作處於:Waiting for table metadata lock狀態。

MySQL在進行alter table等DDL操作時,有時會出現Waiting for table metadata lock的等待場景。

一旦alter table TableA的操作停滯在Waiting for table metadata lock狀態,後續對該表的任何操作(包括讀)都無法進行,因為它們也會在Opening tables的階段進入到Waiting for table metadata lock的鎖等待隊列。如果核心表出現了鎖等待隊列,就會造成災難性的後果。

通過show processlist可以看到表上有正在進行的操作(包括讀),此時alter table語句無法獲取到metadata 獨占鎖,會進行等待。

通過show processlist看不到表上有任何操作,但實際上存在有未提交的事務,可以在information_schema.innodb_trx中查看到。在事務沒有完成之前,表上的鎖不會釋放,alter table同樣獲取不到metadata的獨占鎖。

處理方法:通過 select * from information_schema.innodb_trxG, 找到未提交事物的sid,然後kill掉,讓其回滾。

通過show processlist看不到表上有任何操作,在information_schema.innodb_trx中也沒有任何進行中的事務。很可能是因為在一個顯式的事務中,對表進行了一個失敗的操作(比如查詢了一個不存在的欄位),這時事務沒有開始,但是失敗語句獲取到的鎖依然有效,沒有釋放。從performance_schema.events_statements_current表中可以查到失敗的語句。

處理方法:通過performance_schema.events_statements_current找到其sid,kill 掉該session,也可以kill掉DDL所在的session。

總之,alter table的語句是很危險的(核心是未提交事務或者長事務導致的),在操作之前要確認對要操作的表沒有任何進行中的操作、沒有未提交事務、也沒有顯式事務中的報錯語句。

如果有alter table的維護任務,在無人監管的時候運行,最好通過lock_wait_timeout設置好超時時間,避免長時間的metedata鎖等待。

關於MySQL的鎖表其實還有很多其他場景,我們在實踐的過程中盡量避免鎖表情況的發生,當然這需要一定經驗的支撐。但更重要的是,如果發現鎖表我們要能夠快速的響應,快速的解決問題,避免影響正常業務,避免情況進一步惡化。所以,本文中的解決思路大家一定要收藏或記憶一下,做到有備無患,避免突然狀況下抓瞎。

㈢ MySQL資料庫如何鎖定和解鎖資料庫表

第一步,創建資料庫表writer和查看錶結構,利用SQL語句:
create table writer(
wid int(10),
wno int(10),
wname varchar(20),
wsex varchar(2),
wage int(2)
第二步,向資料庫表writer插入五條數據,插入後查看錶里數據
第三步,利用鎖定語句鎖定資料庫表writer,利用SQL語句:
lock table writer read;
讓資料庫表只讀不能進行寫
第四步,為了驗證鎖定效果,可以查看資料庫表數據,利用SQL語句:
select * from writer;
第五步,利用update語句對id=5進行更新,SQL語句為:
update writer set wname = '胡思思' where id = 5;
第六步,利用unlock進行解鎖,SQL語句為:
unlock tables;

㈣ 資料庫鎖表是什麼意思

1、資料庫鎖表的意思:因為在資料庫里,同一個數據可能有多搭枝個人來讀取或更改,為了知者敏防止我更改的時候別人也同時更改,這是一般要鎖住表不讓別人改。

2、舉個簡單例子:在更新資料庫記錄的過程中,我是不希望別人也來更新我的這些記錄的,像庫存,做出庫的時候,原數量100,我出了20,我就需要把數量更新到80;

在更新的過程中,別人又做了30的出庫,如果在我更新的時候,別人先把庫存更新到70,然後我又更新80,那數量就錯誤了。所以我更新的時候,我就需要鎖定這條記錄。這是數據行鎖,排他鎖。

(4)資料庫鎖定擴展閱讀:

資料庫鎖表的必要條件:

1)互斥條件:指進程對所分配到的資源進行排它性使用,即在一段時間內某資源只由一個進程佔用。如果此時還有其它進程請求資源,則請求者只能等待,直至佔有資源的進程用畢釋放。

2)請求和保持條件:指進程已經保持至少一個資源,但又提出了新的資源請求,而該資源已被其它進程佔有,此時請求進程阻塞,但又對自己已獲得的其它資源保持不放。

3)不剝奪條件:指進程已獲得的資源,在未使用完之前,不能被剝奪,只能在使用完時由自己釋放。

4)環路等待條件:指在發生死鎖時,必然存在一個進程——資源的環形鏈,即進程集合{P0,P1,P2,···,Pn}中的P0正在等待一個P1佔用的資源;P1正在等待P2佔用的資源,,Pn正在等待嫌穗已被P0佔用的資源。

㈤ 怎麼理解資料庫的鎖 一般鎖分別哪幾種

資料庫是一個多用戶使用的共享資源。當多個用戶並發地存取數據時,在資料庫中就會產生多個事務同時存取同一數據的情況。若對並發操作不加控制就可能會讀取和存儲不正確的數據,破壞資料庫的一致性。

加鎖是實現資料庫並發控制的一個非常重要的技術。當事務在對某個數據對象進行操作前,先向系統發出請求,對其加鎖。加鎖後事務就對該數據對象有了一定的控制,在該事務釋放鎖之前,其他的事務不能對此數據對象進行更新操作。

在資料庫中有兩種基本的鎖類型:排它鎖(Exclusive Locks,即X鎖)和共享鎖(Share Locks,即S鎖)。當數據對象被加上排它鎖時,其他的事務不能對它讀取和修改。加了共享鎖的數據對象可以被其他事務讀取,但不能修改。資料庫利用這兩種基本的鎖類型來對資料庫的事務進行並發控制。

(5)資料庫鎖定擴展閱讀:

排它鎖和共享鎖的不同之處:

1、共享鎖(S鎖):如果事務T對數據A加上共享鎖後,則其他事務只能對A再加共享鎖,不能加排他鎖。獲准共享鎖的事務只能讀數據,不能修改數據。

排他鎖(X鎖):如果事務T對數據A加上排他鎖後,則其他事務不能再對A加任任何類型的封鎖。獲准排他鎖的事務既能讀數據,又能修改數據。

2、共享鎖下其它用戶可以並發讀取,查詢數據。但不能修改,增加,刪除數據,資源共享。

3、共享鎖又稱為讀鎖(Share lock,簡記為S鎖),若事務T對數據對象A加上S鎖,則其它事務只能再對A加S鎖,而不能加X鎖,直到T釋放A上的S鎖。

㈥ 如何對MySQL資料庫表進行鎖定

伺服器由兩種表的鎖定方法:

1.內部鎖定

內部鎖定可以避免客戶機的請求相互干擾——例如,避免客戶機的SELECT查詢被另一個客戶機的UPDATE查詢所干擾。也可以利用內部鎖定機制防止伺服器在利用myisamchk或isamchk檢查或修復表時對表的訪問。

語法:

鎖定表:LOCK TABLES tbl_name {READ | WRITE},[ tbl_name {READ | WRITE},…]

解鎖表:UNLOCK TABLES

LOCK TABLES為當前線程鎖定表。UNLOCK TABLES釋放被當前線程持有的任何鎖。當線程發出另外一個LOCK TABLES時,或當伺服器的連接被關閉時,當前線程鎖定的所有表自動被解鎖。

如果一個線程獲得在一個表上的一個READ鎖,該線程(和所有其他線程)只能從表中讀。如果一個線程獲得一個表上的一個WRITE鎖,那麼只有持鎖的線程READ或WRITE表,其他線程被阻止。

每個線程等待(沒有超時)直到它獲得它請求的所有鎖。

WRITE鎖通常比READ鎖有更高的優先順序,以確保更改盡快被處理。這意味著,如果一個線程獲得READ鎖,並且然後另外一個線程請求一個WRITE鎖, 隨後的READ鎖請求將等待直到WRITE線程得到了鎖並且釋放了它。

顯然對於檢查,你只需要獲得讀鎖。再者鍾情跨下,只能讀取表,但不能修改它,因此他也允許其它客戶機讀取表。對於修復,你必須獲得些所以防止任何客戶機在你對表進行操作時修改它。

2.外部鎖定

伺服器還可以使用外部鎖定(文件級鎖)來防止其它程序在伺服器使用表時修改文件。通常,在表的檢查操作中伺服器將外部鎖定與myisamchk或isamchk作合使用。但是,外部鎖定在某些系統中是禁用的,因為他不能可靠的進行工作。對運行myisamchk或isamchk所選擇的過程取決於伺服器是否能使用外部鎖定。如果不使用,則必修使用內部鎖定協議。
如果伺服器用--skip-locking選項運行,則外部鎖定禁用。該選項在某些系統中是預設的,如Linux。可以通過運行mysqladmin variables命令確定伺服器是否能夠使用外部鎖定。檢查skip_locking變數的值並按以下方法進行:


如果skip_locking為off,則外部鎖定有效您可以繼續並運行人和一個實用程序來檢查表。伺服器和實用程序將合作對表進行訪問。但是,運行任何一個實用程序之前,應該使用mysqladmin
flush-tables。為了修復表,應該使用表的修復鎖定協議。


如果skip_locaking為on,則禁用外部鎖定,所以在myisamchk或isamchk檢查修復表示伺服器並不知道,最好關閉伺服器。如果堅持是伺服器保持開啟狀態,月確保在您使用此表示沒有客戶機來訪問它。必須使用卡黨的鎖定協議告訴伺服器是該表不被其他客戶機訪問。

檢查表的鎖定協議

本節只介紹如果使用表的內部鎖定。對於檢查表的鎖定協議,此過程只針對表的檢查,不針對表的修復。

1.調用mysql發布下列語句:

$mysql –u root –p db_namemysql>LOCK TABLE tbl_name READ;mysql>FLUSH TABLES;

該鎖防止其它客戶機在檢查時寫入該表和修改該表。FLUSH語句導致伺服器關閉表的文件,它將刷新仍在告訴緩存中的任何為寫入的改變。

2.執行檢查過程

$myisamchk tbl_name$ isamchk tbl_name

3.釋放表鎖

mysql>UNLOCK TABLES;

如果myisamchk或isamchk指出發現該表的問題,將需要執行表的修復。

修復表的鎖定協議

這里只介紹如果使用表的內部鎖定。修復表的鎖定過程類似於檢查表的鎖定過程,但有兩個區別。第一,你必須得到寫鎖而非讀鎖。由於你需要修改表,因此根本不允許客戶機對其進行訪問。第二,必須在執行修復之後發布FLUSH

TABLE語句,因為myisamchk和isamchk建立的新的索引文件,除非再次刷新改表的高速緩存,否則伺服器不會注意到這個改變。本例同樣適合優化表的過程。

1.調用mysql發布下列語句:

$mysql –u root –p db_namemysql>LOCK TABLE tbl_name WRITE;mysql>FLUSH TABLES;

2.做數據表的拷貝,然後運行myisamchk和isamchk:

$cp tbl_name.* /some/other/dir$myisamchk --recover tbl_name$ isamchk --recover tbl_name

--recover選項只是針對安裝而設置的。這些特殊選項的選擇將取決與你執行修復的類型。

3.再次刷新高速緩存,並釋放表鎖:
mysql>FLUSH TABLES;mysql>UNLOCK TABLES;

㈦ 資料庫死鎖處理方法

mysql數據謹銀庫死鎖解決方法如下:

1、對於按鈕等控制項,點擊後使其立刻失效,不讓用戶重復點擊,避免對同時對同一條記錄操作。

2、使用樂觀鎖進行控制。樂觀鎖大多是基於數祥核宴據版本(Version)記錄機制實現。即為數據增加一個版本標識,在基於資料庫表的版本解決方案中,一般是 通過為資料庫表增加一個「version」欄位來實現。讀取出數據時,將此版本號一同讀出,之後更新時,對此版本號加一。此時,將提交數據的版本數據與數 據庫表對應記錄的當前版本信息進行比對,如果提交的數據版本號大於資料庫表當前版本號,則予以更新,否則認為是過期數據。樂觀鎖機制避免了長事務中的數據 庫加鎖開銷(用戶A和用戶B操作過程中,都沒有對資料庫數據加鎖),大大提升了大並發量下的系統整體性能表現。Hibernate 在其數據訪問引擎中內置了樂觀鎖氏帶實現。需要注意的是,由於樂觀鎖機制是在系統中實現,來自外部系統的用戶更新操作不受系統的控制,因此可能會造 成臟數據被更新到資料庫中。

㈧ 資料庫如何解除表的鎖定

(1) HOLDLOCK: 在該表上保持共享鎖,直到整個事務結束,而不是在語句執行完立即釋放所添加的鎖。

(2) NOLOCK:不添加共享鎖和排它鎖,當這個選項生效後,可能讀到未提交讀的數據或「臟數據」,這個選項僅僅應用於SELECT語句。

(3) PAGLOCK:指定添加頁鎖(否則通常可能添加表鎖)。

(4) 用與運行在提交讀隔離級別的事務相同的鎖語義執行掃描。默認情況下,SQL Server 2000 在此隔離級別上操作。

(5) READPAST: 跳過已經加鎖的數據行,這個選項將使事務讀取數據時跳過那些已經被其他事務鎖定的數據行,而不是阻塞直到其他事務釋放鎖,READPAST僅僅應用於READ COMMITTED隔離性級別下事務操作中的SELECT語句操作。

(6) :等同於NOLOCK。

(7) :設置事務為可神裂重復讀隔離性級別。

(8) ROWLOCK:使用行級鎖,而不使用粒度更粗的頁級鎖和表級鎖。

(9) :用與運行在可串列讀隔離級別的事務相同的鎖語義執行掃描。等同於 HOLDLOCK。

(10) TABLOCK:指定使用表級鎖,而不是使用行級或頁面級的鎖,SQL Server在該語句執行完後釋放這個鎖,而如果同時指定了HOLDLOCK,該鎖一直保持到這個事務結束。(11) TABLOCKX:指定在表耐瞎攔上使用排它鎖,這個鎖可以阻止其他事務讀或更新這個表的數據,直到這個語句或整個事務結束。

(12) UPDLOCK :指定昌胡在 讀表中數據時設置更新 鎖(update lock)而不是設置共享鎖,該鎖一直保持到這個語句或整個事務結束,使用UPDLOCK的作用是允許用戶先讀取數據(而且不阻塞其他用戶讀數據),並且保證在後來再更新數據時,這一段時間內這些數據沒有被其他用戶修改。

㈨ 本地資料庫被鎖定怎麼解決

解決方法:如果你根據系統的提示操作,試圖使用組件服務管理工具修改此安全許可權是無法奏效的。有效方法是在注冊表中修改相關鍵值,運行注冊後,定位於「HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{6FE54E0E-009F-4E3D-A830-EDFA71E1F306}」,再查看右側視圖,記住「AppID」對應數值數據「{27AF75ED-20D9-11D1-B1CE-00805FC1270E}」
此後,打開「組件服務」,依次選擇「組件服務」→「計算機」→「我的電腦」→「DCOM配置」,點擊菜單欄「查看」→「詳細信息」,再在右側視圖中找到ID為「{27AF75ED-20D9-11D1-B1CE-00805FC1270E}」的應用程序「netman」,用滑鼠右鍵單擊,選擇「屬性」,在彈出窗口中切換到「安全」標簽頁,在「啟動和激活許可權」項目中點擊「編輯」按鈕,然後在彈出的「啟動許可權」對話框中添加「NETWORK SERVICE」用戶,設置其許可權為允許本地啟動和激活。確認操作後,系統就不會再顯示DCOM出錯了。

㈩ 資料庫中某條數據被鎖了。如何解鎖

1、查看資料庫鎖,診斷鎖的來源枝棗及類型改搭宏:

select object_id,session_id,locked_mode from v$locked_object;

或者用以下命令:

select b.owner,b.object_name,l.session_id,l.locked_mode

from v$locked_object l, dba_objects b

where b.object_id=l.object_id 2、找核冊出資料庫的serial#,以備殺死:

select t2.username,t2.sid,t2.serial#,t2.logon_time

from v$locked_object t1,v$session t2

where t1.session_id=t2.sid order by t2.logon_time; 3、殺死該session

alter system kill session 'sid,serial#'

記得以上是用SYS或者SYSTEM賬戶進入,要不沒許可權。

熱點內容
我的世界伺服器如何放村民 發布:2024-04-20 17:05:35 瀏覽:358
手機反編譯dex 發布:2024-04-20 17:01:01 瀏覽:703
安卓怎麼設置微信拍一拍 發布:2024-04-20 16:44:48 瀏覽:568
三星3熱點密碼怎麼設置 發布:2024-04-20 16:30:52 瀏覽:578
用keil編譯顯示警告warn 發布:2024-04-20 16:27:09 瀏覽:893
訪問在哪兒 發布:2024-04-20 16:20:42 瀏覽:200
安卓手機有什麼可以把聲音改成電音的軟體 發布:2024-04-20 16:19:40 瀏覽:563
uc瀏覽器怎麼緩存視頻 發布:2024-04-20 16:10:44 瀏覽:80
邏輯錯誤預編譯可以檢查出來嗎 發布:2024-04-20 15:58:28 瀏覽:1000
mc中國版伺服器地址 發布:2024-04-20 15:33:13 瀏覽:411