關於MySQL使用者會話及連接線程

來源:互聯網
上載者:User

標籤:緩衝   slist   網頁   RoCE   block   max   variables   日誌   toolbar   

0、概念理解:使用者會話和連接線程是什麼關係?

使用者會話和使用者連接線程是一一對應的關係,一個會話就一個使用者連接線程。

問題描述:

  如果系統因為執行了一個非常大的dml或者ddl操作導致系統hang住,我們想斷掉這個操作,怎麼辦?

解決辦法:

1、kill thread:殺死使用者的會話

  但是時間長,效果不佳:前滾+復原,前提是已經進行了很長時間,復原就需要更多的時間

2、kill mysqld進程:推薦,用這種殺進程的方式,速度快

  kill -9 進程號(ps aux 查看進程號)

  資料庫先前滾,不主動復原,直接可以對外進行服務了,當讀到哪個未提交事務時再去慢慢復原。

 

一、kill使用者會話及使用者連接線程

1、如何查看使用者會話,如何殺掉使用者會話

[[email protected] ~]# netstat -anp |grep 3306tcp        0      0 :::3306                     :::*                        LISTEN      17324/mysqld        [[email protected] ~]# ps -ef |grep ‘mysql -px x‘root     20510 20483  0 15:59 pts/1    00:00:00 mysql -px xroot     20528 46646  0 15:59 pts/4    00:00:00 grep mysql -px xroot     45626 45565  0 05:44 pts/3    00:00:00 mysql -px x[[email protected] ~]# kill -9 20510 

  # kill -9 <mysql會話進程PID>  //快速釋放資源(推薦)

注意:千萬不要將mysqld給kill掉了,不要殺掉LISTEN進程

2、如何查看使用者連接線程,如何殺掉使用者連接線程

mysql> show processlist;+--------+| Id     |+--------+| 194850 || 194851 |+--------+mysql> kill 194850;mysql> show processlist;+--------+| Id     |+--------+| 194851 || 194852 |+--------+

注意:如果將使用者連接線程殺死斷掉,而會話沒有殺掉的話,該使用者會話又會重新開啟一個使用者連接線程。

3、殺掉使用者連接線程的工作過程、弊端風險

  1、過程:

    rollback--->釋放資源--->kill線程

  2、弊端與風險:

    1、可能出現系統更加繁忙的情況(因為大量的rollback)

    2、會話釋放需要很長的時間

Q:假設現在有1000個使用者串連,如何快速殺掉?

A:

  1、使用concat寫指令碼

    mysql> select concat(‘kill ‘,ID,‘;‘) into outpfile ‘/tmp/kill.txt‘ from information_schema.PROCESSLIST;

    shell> cat kill.txt

    kill 194850;

    kill 194851;

  然後,複製到mysql中進行執行,將使用者連接線程都kill掉。

  2、使用awk取出使用者會話進程ID都kill掉

  shell> netstat -anp|grep mysql|grep -v mysqld|awk ‘{print $8}‘|awk -F ‘/‘ ‘{print $1}‘|xargs kill -9

關於mysqld_safe的注意點:

  在os層面將使用者連接線程kill掉,通過pstree -p可以看到MySQL相關進程及線程ID,#kill -9 mysql任一線程,會導致該mysqld進程被kill;但是通過mysqld_safe的安全機制,又會重新啟一個mysqld進程;如此原來的使用者連接線程也就隨原來的進程一塊被幹掉了。

 

二、MySQL用戶端的串連

1、最大串連數

mysql> show variables like ‘max_connections‘;+-----------------+-------+| Variable_name   | Value |+-----------------+-------+| max_connections | 151   |+-----------------+-------+

由上可見,MySQL預設用戶端的最大串連數是151,但是,在大並發下一百多的串連數就會不夠用,需要調整最大串連數,修改並寫入設定檔中:

  max_connections = 1000

  wait_timeout = 1000000  #逾時時間

重啟MySQL服務

2、查看當前有多少串連

mysql> show status like ‘%Threads_connected%‘;+-------------------+-------+| Variable_name     | Value |+-------------------+-------+| Threads_connected | 1     |+-------------------+-------+1 row in set (0.01 sec)mysql> show processlist;+-------+------+-----------+------+---------+------+----------+------------------+| Id    | User | Host      | db   | Command | Time | State    | Info             |+-------+------+-----------+------+---------+------+----------+------------------+| 17219 | root | localhost | NULL | Query   |    0 | starting | show processlist |+-------+------+-----------+------+---------+------+----------+------------------+1 row in set (0.01 sec)

3、最大失敗串連數:max_connect_errors

mysql> show variables like ‘max%errors‘;+--------------------+-------+| Variable_name      | Value |+--------------------+-------+| max_connect_errors | 100   |+--------------------+-------+1 row in set (0.00 sec)

  是一個MySQL中與安全有關的計數器值,負責阻止過多嘗試失敗的用戶端以暴力破解密碼的情況,值的大小與效能無太大的關係。

  預設是100,也就是說如果某一用戶端嘗試串連此MySQL伺服器,但是失敗(如密碼錯誤等等)10次,則MySQL會無條件強制阻止此用戶端串連。如果想重設計數器對某一用戶端的值,則必須重啟mysqld或者mysql> flush hosts;,當該用戶端成功串連一次mysqld後,針對此用戶端的max_connect_errors會清零。

  如果max_connect_errors的設定過小,則網頁可能提示無法串連資料庫伺服器。

  一般來說建議資料庫伺服器不監聽來自網路的串連,僅僅通過sock串連,這樣可以防止絕大多數針對mysql的攻擊;如果必須要開啟mysql的網路連接,則最好設定此值,以防止窮舉密碼的攻擊手段。

 

三、關於使用者工作空間

Q:如何判斷使用者會話線程空間(使用者工作空間)是否分配過小?

A:

  1、sort_buffer_size:需要排序會話的緩衝大小(預設256K),是針對每一個connection的;過大的配置+高並發可能會耗盡系統記憶體資源。

  2、binlog_cache_size:二進位日誌緩衝區(預設32K),基於會話;

  一個事務做出的修改,

    當小於binlog_cache_size時,所有修改內容存入binary log cache;

    當大於binlog_cache_size時,內容存入磁碟暫存資料表。

  3、join_buffer_size:多表串連結果集緩衝區,基於會話;

  (每次join操作都會調用my_malloc、my_free函數申請/釋放join_buffer_size大小的記憶體)

也就是說,sort_buffer、binlog_cache、join_buffer的組成,形成使用者會話線程空間。一般的,當Sort_merge_passes(磁碟排序)每秒值很大時,就說明使用者工作空間分配過小,就應該考慮增加sort_buffer_size值。

關於MySQL使用者會話及連接線程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.