導航:首頁 > 程序命令 > mysql資料庫解鎖命令

mysql資料庫解鎖命令

發布時間:2022-09-24 10:04:53

⑴ 死鎖後關閉TOMCAT,資料庫能否自動解鎖

如果沒有其他資源佔用表資源的話,資料庫會自動釋放鎖,
MySQL解鎖命令是:
show processlist;
找到鎖進程,kill id ;
Oracle 解鎖命令是:
SELECT s.sid, s.serial#, s.username, s.schemaname, s.osuser, s.process, s.machine,
s.terminal, s.logon_time, l.type
FROM v$session s, v$lock l
WHERE s.sid = l.sid
AND s.username IS NOT NULL
ORDER BY sid;
--殺掉進程 sid,serial#
alter system kill session sid,serial#;

⑵ mysql資料庫鎖表如何解鎖

當前運行的所有事務
select * from information_schema.innodb_trx
當前出現的鎖
select * from information_schema.innodb_locks
鎖等待的對應關系
select * from information_schema.innodb_lock_waits
通過找到線程id號,進行kill

通過 select * from information_schema.innodb_trx 查詢 trx_mysql_thread_id然後執行 kill 線程ID

⑶ mysql 表鎖住了,怎麼解鎖

對於寫鎖定如下:
1)、如果表沒有加鎖,那麼對其加寫鎖定。
2)、否則,那麼把請求放入寫鎖隊列中。
對於讀鎖定如下:
1)、如果表沒有加寫鎖,那麼加一個讀鎖。
2)、否則,那麼把請求放到讀鎖隊列中。
當然我們可以分別用low_priority 以及high_priority在寫和讀操作上來改變這些行為。

⑷ 用sql語句,怎麼解決mysql資料庫死鎖

MySQL死鎖問題的相關知識是本文我們主要要介紹的內容,接下來我們就來一一介紹這部分內容,希望能夠對您有所幫助。
1、MySQL常用存儲引擎的鎖機制
MyISAM和MEMORY採用表級鎖(table-level locking)
BDB採用頁面鎖(page-level locking)或表級鎖,默認為頁面鎖
InnoDB支持行級鎖(row-level locking)和表級鎖,默認為行級鎖
2、各種鎖特點
表級鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖沖突的概率最高,並發度最低
行級鎖:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖沖突的概率最低,並發度也最高
頁面鎖:開銷和加鎖時間界於表鎖和行鎖之間;會出現死鎖;鎖定粒度界於表鎖和行鎖之間,並發度一般
3、各種鎖的適用場景
表級鎖更適合於以查詢為主,只有少量按索引條件更新數據的應用,如Web應用
行級鎖則更適合於有大量按索引條件並發更新數據,同時又有並發查詢的應用,如一些在線事務處理系統
4、死鎖
是指兩個或兩個以上的進程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。
表級鎖不會產生死鎖。所以解決死鎖主要還是針對於最常用的InnoDB。
5、死鎖舉例分析
在MySQL中,行級鎖並不是直接鎖記錄,而是鎖索引。索引分為主鍵索引和非主鍵索引兩種,如果一條sql語句操作了主鍵索引,MySQL就會鎖定這條主鍵索引;如果一條語句操作了非主鍵索引,MySQL會先鎖定該非主鍵索引,再鎖定相關的主鍵索引。
在UPDATE、DELETE操作時,MySQL不僅鎖定WHERE條件掃描過的所有索引記錄,而且會鎖定相鄰的鍵值,即所謂的next-key locking。
例如,一個表db。tab_test,結構如下:
id:主鍵;
state:狀態;
time:時間;
索引:idx_1(state,time)
出現死鎖日誌如下:
?***(1) TRANSACTION:
?TRANSACTION 0 677833455, ACTIVE 0 sec, process no 11393, OSthread id 278546 starting index read
?mysql tables in use 1, locked 1
?LOCK WAIT 3 lock struct(s), heap size 320
?MySQL thread id 83, query id 162348740 dcnet03 dcnet Searching rows for update
?update tab_test set state=1064,time=now() where state=1061 and time < date_sub(now(), INTERVAL 30 minute) (任務1的sql語句)
?***(1) WAITING FOR THIS LOCK TO BE GRANTED: (任務1等待的索引記錄)
?RECORD LOCKS space id 0 page no 849384 n bits 208 index `PRIMARY` of table `db/tab_test` trx id 0 677833455 _mode X locks rec but not gap waiting
?Record lock, heap no 92 PHYSICAL RECORD: n_fields 11; compact format; info bits 0
?0: len 8; hex 800000000097629c; asc b ;; 1: len 6; hex 00002866eaee; asc (f ;; 2: len 7; hex 00000d40040110; asc @ ;; 3: len 8; hex 80000000000050b2; asc P ;; 4: len 8; hex 800000000000502a; asc P*;; 5: len 8; hex 8000000000005426; asc T&;; 6: len 8; hex 800012412c66d29c; asc A,f ;; 7: len 23; hex 8616e642e706870; asc xxx.com/;; 8: len 8; hex 800000000000042b; asc +;; 9: len 4; hex 474bfa2b; asc GK +;; 10: len 8; hex 8000000000004e24; asc N$;;
?*** (2) TRANSACTION:
?TRANSACTION 0 677833454, ACTIVE 0 sec, process no 11397, OS thread id 344086 updating or deleting, thread declared inside InnoDB 499
?mysql tables in use 1, locked 1
?3 lock struct(s), heap size 320, undo log entries 1
?MySQL thread id 84, query id 162348739 dcnet03 dcnet Updating update tab_test set state=1067,time=now () where id in (9921180) (任務2的sql語句)
?*** (2) HOLDS THE LOCK(S): (任務2已獲得的鎖)
?RECORD LOCKS space id 0 page no 849384 n bits 208 index `PRIMARY` of table `db/tab_test` trx id 0 677833454 lock_mode X locks rec but not gap
?Record lock, heap no 92 PHYSICAL RECORD: n_fields 11; compact format; info bits 0
?0: len 8; hex 800000000097629c; asc b ;; 1: len 6; hex 00002866eaee; asc (f ;; 2: len 7; hex 00000d40040110; asc @ ;; 3: len 8; hex 80000000000050b2; asc P ;; 4: len 8; hex 800000000000502a; asc P*;; 5: len 8; hex 8000000000005426; asc T&;; 6: len 8; hex 800012412c66d29c; asc A,f ;; 7: len 23; hex 8616e642e706870; asc uploadfire.com/hand.php;; 8: len 8; hex 800000000000042b; asc +;; 9: len 4; hex 474bfa2b; asc GK +;; 10: len 8; hex 8000000000004e24; asc N$;;
?*** (2) WAITING FOR THIS LOCK TO BE GRANTED: (任務2等待的鎖)
?RECORD LOCKS space id 0 page no 843102 n bits 600 index `idx_1` of table `db/tab_test` trx id 0 677833454 lock_mode X locks rec but not gap waiting
?Record lock, heap no 395 PHYSICAL RECORD: n_fields 3; compact format; info bits 0
?0: len 8; hex 8000000000000425; asc %;; 1: len 8; hex 800012412c66d29c; asc A,f ;; 2: len 8; hex 800000000097629c; asc b ;;
?*** WE ROLL BACK TRANSACTION (1)
?(回滾了任務1,以解除死鎖)
原因分析:
當「update tab_test set state=1064,time=now() where state=1061 and time < date_sub(now(), INTERVAL 30 minute)」執行時,MySQL會使用idx_1索引,因此首先鎖定相關的索引記錄,因為idx_1是非主鍵索引,為執行該語句,MySQL還會鎖定主鍵索引。
假設「update tab_test set state=1067,time=now () where id in (9921180)」幾乎同時執行時,本語句首先鎖定主鍵索引,由於需要更新state的值,所以還需要鎖定idx_1的某些索引記錄。
這樣第一條語句鎖定了idx_1的記錄,等待主鍵索引,而第二條語句則鎖定了主鍵索引記錄,而等待idx_1的記錄,這樣死鎖就產生了。
6、解決辦法
拆分第一條sql,先查出符合條件的主鍵值,再按照主鍵更新記錄:
?select id from tab_test where state=1061 and time < date_sub(now(), INTERVAL 30 minute);
?update tab_test state=1064,time=now() where id in(......);

⑸ 如何利用MySQL資料庫鎖定和解鎖資料庫表

第一步,創建資料庫表writer和查看錶結構,利用SQL語句:
create table writer(
wid int(10),
wno int(10),
wname varchar(20),
wsex varchar(2),
wage int(2)
);
desc writer;
如下圖所示:

第二步,向資料庫表writer插入五條數據,插入後查看錶里數據,如下圖所示:

第三步,利用鎖定語句鎖定資料庫表writer,利用SQL語句:
lock table writer read;
讓資料庫表只讀不能進行寫
如下圖所示:

第四步,為了驗證鎖定效果,可以查看資料庫表數據,利用SQL語句:
select * from writer;
如下圖所示:

第五步,利用update語句對id=5進行更新,SQL語句為:
update writer set wname = '胡思思' where id = 5;
如下圖所示:

6
第六步,利用unlock進行解鎖,SQL語句為:
unlock tables;
如下圖所示:

⑹ 如何清理mysql資料庫緩存數據

1、打開mysql的客戶端 這里使用navicat,連接資料庫,等到navicat主頁面,雙擊需要操作的資料庫連接。

⑺ 如何對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;

java程序中如何實現對mysql資料庫中表的鎖定

方法1:用mysql命令鎖住表.

publicvoidtest(){

Stringsql="locktablesaa1write";
//或Stringsql="locktablesaa1read";
//如果想鎖多個表locktablesaa1read,aa2write,.....
Stringsql1="select*fromaa1";

Stringsql2="unlocktables";
try{
this.pstmt=conn.prepareStatement(sql);
this.pstmt1=conn.prepareStatement(sql1);
this.pstmt2=conn.prepareStatement(sql2);
pstmt.executeQuery();
pstmt1.executeQuery();
pstmt2.executeQuery();

}catch(Exceptione){
System.out.println("異常"+e.getMessage());
}

}

對於read lock 和 write lock官方說明:
1.如果一個線程獲得一個表的READ鎖定,該線程(和所有其它線程)只能從該表中讀取。
如果一個線程獲得一個表的WRITE鎖定,只有保持鎖定的線程可以對表進行寫入。
其它的線程被阻止,直到鎖定被釋放時為止。

2.當您使用LOCK TABLES時,您必須鎖定您打算在查詢中使用的所有的表。
雖然使用LOCKTABLES語句獲得的鎖定仍然有效,但是您不能訪問沒有被此語句鎖定的任何的表。
同時,您不能在一次查詢中多次使用一個已鎖定的表——使用別名代替,
在此情況下,您必須分別獲得對每個別名的鎖定。

對與read lock 和 write lock個人說明:
1.read lock 和 write lock 是線程級(表級別).
2.在同一個會話中加了read lock鎖. 只能對這個表進行讀操作.對這個表以外的任何錶都無法進行增、刪、改、查的操作.
但是在不同會話中,只能對加了read lock的表進行讀操作.但可以對read lock以外的表進行增、刪、改、查的操作.
3.在同一個會話中加了write lock鎖.只能對這個表進行讀、寫操作.對這個表以外的任何錶都無法進行增、刪、改、查的操作.
但是在不同會話中,無法對加了write lock的表進行讀、寫操作.但可以對write lock以外的表進行增、刪、改、查的操作.
4.如果表中使用了別名.(SELECT * FROM aa1 AS byname_table)
在對aa1加鎖時,必須把別名加上去(lock tables aa1 as byname_table read)
在同一個會話中.必須使用別名進行查詢.
在不同的會話中.可以不需要使用別名進行查詢.
5.在多個會話中可以對同一個表進行lock read操作.但不能在多個會話中對同一個表進行lock write操作(這些鎖將等待已鎖的表釋放自身的線程鎖)
如果多個會話對同一個表進行lock read操作.那麼在這些會話中,也只能對以鎖的表進行讀操作.
6.如果要你鎖住了一個表,需要嵌套查詢.你必須使用別名,並且,要鎖定別名.
例如.lock table aa1 read ,aa1 as byname_table read;
select * from aa1 where id in (select * from aa1 as xxwhere id=2);
7.解鎖必須用unlock tables;

另:
在JAVA程序中,要想解鎖,需要調用 unlock tables來解鎖.
如果沒有調用unlock tables.
關閉connection 、程序結束 、調用GC 都能解鎖.

方法2:用記錄鎖鎖表.

publicvoidtest(){

Stringsql="select*fromaa1forupdate";
//select*fromaa1lockinsharemode;

try{
conn.setAutoCommit(false);
this.pstmt=conn.prepareStatement(sql);
pstmt.executeQuery();

}catch(Exceptione){
System.out.println("異常"+e.getMessage());
}

}

1.for update 與 lock in share mode 屬於行級鎖和頁級鎖

2.for update 排它鎖,lock in share mode 共享鎖

3.對於記錄鎖.必須開啟事務.

4.行級鎖定事實上是索引記錄的鎖定.只要是用索引掃描的行(或沒索引全表掃描的行),都將被鎖住.

5.在不同的隔離級別下還會使用next-key locking演算法.即所掃描的行之間的「間隙」也會也鎖住(在Repeatable read和Serializable隔離級別下有間隙鎖).

6.在mysql中共享鎖的含義是:在被共享鎖鎖住的行,即使內容被修改且並沒有提交.在另一個會話中依然看到最新修改的信息.

在同一會話中加上了共享鎖.可以對這個表以及這個表以外的所有表進行增、刪、改、查的操作.

在不同的會話中.可以查到共享鎖鎖住行的最新消息.但是在Read Uncommitted隔離級別下不能對鎖住的表進行刪,

改操作.(需要等待鎖釋放才能操作...)
在Read Committed隔離級別下不能對鎖住的表進行刪,改操作.(需要等待鎖釋放才能操作...)
在Repeatable read隔離級別下不能對鎖住行進行增、刪、改操作.(需要等待鎖釋放才能操作...)
在Serializable隔離級別下不能對鎖住行進行增、刪、改操作.(需要等待鎖釋放才能操作...)

7.在mysql中排他鎖的含義是:在被排它鎖鎖住的行,內容修改並沒提交,在另一個會話中不會看到最新修改的信息。

在不同的會話中.可以查到共享鎖鎖住行的最新消息.但是Read Uncommitted隔離級別下不能對鎖住的表進行刪,

改操作.(需要等待鎖釋放才能操作...)
在Read Committed隔離級別下不能對鎖住的表進行刪,改操作.(需要等待鎖釋放才能操作...)
在Repeatable read隔離級別下不能對鎖住行進行增、刪、改操作.(需要等待鎖釋放才能操作...)
在Serializable隔離級別下不能對鎖住行進行增、刪、改操作. (需要等待鎖釋放才能操作...)

8.在同一個會話中的可以疊加多個共享鎖和排他鎖.在多個會話中,需要等待鎖的釋放.

9.SQL中的update 與 for update是一樣的原理.

10.等待超時的參數設置:innodb_lock_wait_timeout=50 (單位秒).

11.任何可以觸發事務提交的命令,都可以關閉共享鎖和排它鎖.

⑼ 如何修改 Mysql 表 的屬性(將只讀改為可讀寫),只改表不改庫

如果是sqlserver資料庫,其實對於某列上不存在不讓修改的說法,sqlserver資料庫數據控制原理是角色控制,也就是說我們對於某一個角色去下定義,讓隸屬於這個角色的用戶不能夠更新數據。或者在某個角色的基礎上不分配或是回收對某一列的許可權!如果是這種情況,用一個能修改的角度登陸才行。

還有另一種就是所謂的觸發器,一旦發現你修改,立即返回原數據,這樣你也是永遠修改不了的!這時你要找到那個觸發器,將觸發器刪除後再進行修改,然後加回觸發器即可!

但這兩種情況都是對某一列下的定義(我們稱為鎖定粒度為列)不可能是某一個單元格!

如果你是站在erp管理的基礎上不讓你修改那是十分正常的!

在企業管理器中使用圖形方式(如二樓給的圖)還是語句,則沒有任何的區別!

閱讀全文

與mysql資料庫解鎖命令相關的資料

熱點內容
android應用logo 瀏覽:898
光遇安卓服墓土商店什麼時候開 瀏覽:566
月收益翻倍的源碼 瀏覽:636
asop源碼放在哪裡 瀏覽:988
電腦伺服器密碼怎麼找 瀏覽:574
jdp轉換pdf 瀏覽:748
把pdf導入iphone 瀏覽:508
米哈游租賃的雲伺服器是哪個 瀏覽:524
android直接打電話 瀏覽:1016
ubuntu停止命令 瀏覽:283
cnc攻絲編程 瀏覽:869
換個手機號碼app怎麼注冊 瀏覽:320
怎麼下載小猴口算app 瀏覽:115
輕鏈app的貨怎麼樣 瀏覽:625
電腦里的u盤如何加密 瀏覽:370
我的世界全部版本伺服器下載地址 瀏覽:50
交換原理pdf 瀏覽:228
菜鳥驛站app怎麼邀請新人 瀏覽:448
電腦里總是有一些1k的文件夾 瀏覽:45
drm加密絕對安全 瀏覽:513