當前位置:編程學習大全網 - 圖片素材 - 深入研究insert into select鎖表故障(上)

深入研究insert into select鎖表故障(上)

前幾天,壹個mysql數據庫運維同事,在生產上用insert into select * from語句,在生產上備份了壹張表,結果將備份表全表鎖住了,業務影響了大約10分鐘。

看到這個語句,我第壹反應就是select語句也能鎖表,可是生產上的故障,證明確實鎖表了。所以,需要將insert into select * from獲取鎖的情況徹底研究明白。

從innodb引擎獲取的lock信息,太少了,只能看到有3 lock struct(s),6 row lock(s),不清楚那表申請的鎖,申請什麽類型的鎖,不知道這些信息,就研究不明白故障到底怎麽發生的。

幸運的是,mysql數據庫提供壹個參數innodb_status_output_locks,可以打印更詳細的lock信息。

啟用innodb_status_output_locks參數,默認是不開啟,所以需要開啟。

下面是開啟innodb_status_output_locks參數之後,獲取的詳細lock信息

從上面的信息,可以很清晰看到,t_test_1獲取到IS鎖,並且有5個Record lock信息,即鎖了5條記錄,而此表只有5條記錄,所以鎖全表。

TABLE LOCK table testdb1.t_test_1 trx id 182551 lock mode IS

insert into t_test_2 select * from t_test_1 where name like 'trest';這個sql語句中,t_test_1表的name字段沒有索引,索引走了全表掃描,如果在name字段創建索引呢,會有什麽變化呢

創建索引

重新獲取innodb的lock詳細信息

看到沒有,在這裏,現在只有壹個Record lock,不再是鎖全表了。

  • 上一篇:機械戰警的影片評價
  • 下一篇:拼音huan的漢字有哪些字
  • copyright 2024編程學習大全網