MySQL - 顯示程序列表



MySQL 資料庫提供多使用者環境,允許多個客戶端同時訪問資料庫。程序定義為使用者在 MySQL 伺服器上執行的操作。多個使用者可以在 MySQL 伺服器上同時執行多個程序。

什麼是 MySQL 程序列表?

MySQL 程序列表定義為當前正在由伺服器中執行的一組使用者執行緒執行的操作列表。

如果使用者具有 PROCESS 許可權,他們可以檢視伺服器中的所有執行緒,包括其他使用者的執行緒。但是,如果使用者沒有此許可權,非匿名使用者只能訪問其自身執行緒的資訊;而匿名使用者則無法訪問執行緒資訊。

要檢索有關在 MySQL 伺服器上執行的這些程序的資訊,我們可以使用 SHOW PROCESSLIST 命令。

MySQL SHOW PROCESSLIST 命令

MySQL SHOW PROCESSLIST 命令用於顯示有關當前在 MySQL 伺服器上執行的程序的資訊。

當處理“連線過多”錯誤時,此語句特別有用,因為它提供了有關這些連線及其操作的詳細資訊。此外,MySQL 為具有 CONNECTION_ADMIN 許可權(或舊版本中的 SUPER 許可權)的管理員保留一個額外的連線,以確保他們始終可以訪問系統。

語法

以下是 SHOW PROCESSLIST 命令的語法:

SHOW [FULL] PROCESSLIST

這裡,FULL 關鍵字是可選的。但是,如果您省略 FULL 關鍵字,SHOW PROCESSLIST 只顯示 Info 欄位中每個語句的前 100 個字元。

示例

讓我們來看一個示例,以顯示 SHOW PROCESSLIST 命令的用法。我們將使用 '\G' 分隔符來垂直列印資訊表:

SHOW PROCESSLIST\G

輸出

以下是獲得的輸出:

*************************** 1. row ***************************
     Id: 5
   User: event_scheduler
   Host: localhost
     db: NULL
Command: Daemon
   Time: 1065209
  State: Waiting on empty queue
   Info: NULL
*************************** 2. row ***************************
     Id: 56
   User: root
   Host: localhost:51995
     db: customers
Command: Query
   Time: 0
  State: init
   Info: SHOW PROCESSLIST
2 rows in set (0.00 sec)

示例

現在,讓我們也嘗試在 SHOW PROCESSLIST 命令中使用 FULL 關鍵字,如下例所示:

SHOW FULL PROCESSLIST\G

輸出

獲得的輸出如下所示:

*************************** 1. row ***************************
     Id: 5
   User: event_scheduler
   Host: localhost
     db: NULL
Command: Daemon
   Time: 1065138
  State: Waiting on empty queue
   Info: NULL
*************************** 2. row ***************************
     Id: 56
   User: root
   Host: localhost:51995
     db: customers
Command: Query
   Time: 0
  State: init
   Info: SHOW FULL PROCESSLIST
2 rows in set (0.00 sec)

輸出解釋

從 SHOW PROCESSLIST 命令獲得的輸出結果集包含以下列:

  • Id - 它是連線的標識。

  • User - 這包含發出語句的 MySQL 使用者的名稱。

  • Host - 發出語句的客戶端的主機名(系統使用者除外,因為它沒有主機)。TCP/IP 連線的主機名以“主機名:客戶端埠”格式表示,以便更容易確定客戶端的操作。

  • db - 這是執行緒的預設資料庫,如果沒有選擇任何資料庫,則為 NULL。

  • Command - 顯示相應執行緒代表客戶端執行的命令型別,如果會話處於空閒狀態,則顯示 Sleep。

  • Time - 執行緒處於當前狀態的秒數。

  • State - 一個動作、事件或狀態,指示執行緒正在執行的操作。大多數狀態對應於非常快速的操作。如果執行緒在給定狀態下停留許多秒,則可能存在需要調查的問題。

  • Info - 執行緒正在執行的語句。如果它沒有執行任何語句,則顯示 NULL。

使用客戶端程式顯示程序列表

我們還可以使用客戶端程式顯示程序列表。

語法

要透過PHP程式檢索MySQL伺服器上正在執行的程序資訊,我們需要使用mysqli函式query()執行“SHOW PROCESSLIST”命令,如下所示:

$sql = "SHOW PROCESSLIST";
$mysqli->query($sql);

要透過JavaScript程式檢索MySQL伺服器上正在執行的程序資訊,我們需要使用mysql2庫的query()函式執行“SHOW PROCESSLIST”命令,如下所示:

sql = "SHOW PROCESSLIST";
con.query(sql)

要透過Java程式檢索MySQL伺服器上正在執行的程序資訊,我們需要使用JDBC函式executeQuery()執行“SHOW PROCESSLIST”命令,如下所示:

String sql = "SHOW PROCESSLIST";
statement.executeQuery(sql);

要透過Python程式檢索MySQL伺服器上正在執行的程序資訊,我們需要使用MySQL Connector/Pythonexecute()函式執行“SHOW PROCESSLIST”命令,如下所示:

show_processlist_query = "SHOW PROCESSLIST"
cursorObj.execute(show_processlist_query)

示例

以下是程式示例:

$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = 'password';
$db = 'TUTORIALS';
$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $db);
if ($mysqli->connect_errno) {
    printf("Connect failed: %s
", $mysqli->connect_error); exit(); } //printf('Connected successfully.
'); $sql = "SHOW PROCESSLIST"; if($result = $mysqli->query($sql)){ printf("Show query executed successfully...!\n"); printf("Process list: \n"); while($row = mysqli_fetch_array($result)){ print_r($row); } } if($mysqli->error){ printf("Error message: ", $mysqli->error); } $mysqli->close();

輸出

獲得的輸出如下所示:

Show query executed successfully...!
Process list: 
Array
(
    [0] => 5
    [Id] => 5
    [1] => event_scheduler
    [User] => event_scheduler
    [2] => localhost
    [Host] => localhost
    [3] =>
    [db] =>
    [4] => Daemon
    [Command] => Daemon
    [5] => 886450
    [Time] => 886450
    [6] => Waiting on empty queue
    [State] => Waiting on empty queue
    [7] =>
    [Info] =>
)
Array
(
    [0] => 602
    [Id] => 602
    [1] => root
    [User] => root
    [2] => localhost:54978
    [Host] => localhost:54978
    [3] => tutorials
    [db] => tutorials
    [4] => Sleep
    [Command] => Sleep
    [5] => 2994
    [Time] => 2994
    [6] =>
    [State] =>
    [7] =>
    [Info] =>
)
Array
(
    [0] => 641
    [Id] => 641
    [1] => root
    [User] => root
    [2] => localhost:56444
    [Host] => localhost:56444
    [3] => tutorials
    [db] => tutorials
    [4] => Query
    [Command] => Query
    [5] => 0
    [Time] => 0
    [6] => init
    [State] => init
    [7] => SHOW PROCESSLIST
    [Info] => SHOW PROCESSLIST
)  

var mysql = require('mysql2');
var con = mysql.createConnection({
    host: "localhost",
    user: "root",
    password: "Nr5a0204@123"
});

// Connecting to MySQL
con.connect(function (err) {
    if (err) throw err;
    console.log("Connected!");
    console.log("--------------------------");

    // Create a new database
    sql = "Create Database TUTORIALS";
    con.query(sql);

    sql = "USE TUTORIALS";
    con.query(sql);

    sql = "SHOW PROCESSLIST"
    con.query(sql, function(err, result){
      if (err) throw err
      console.log("**usage of SHOW PROCESSLIST command**");
      console.log(result);
      console.log("--------------------------");
    });

    sql = "SHOW FULL PROCESSLIST"
    con.query(sql, function(err, result){
      if (err) throw err
      console.log("**usage of FULL keyword with the SHOW PROCESSLIST command:**");
      console.log(result);
    });
});  

輸出

獲得的輸出如下所示:

 
Connected!
--------------------------
**usage of SHOW PROCESSLIST command**
[
  {
    Id: 5,
    User: 'event_scheduler',
    Host: 'localhost',
    db: null,
    Command: 'Daemon',
    Time: 1279159,
    State: 'Waiting on empty queue',
    Info: null
  },
  {
    Id: 310,
    User: 'root',
    Host: 'localhost:64181',
    db: null,
    Command: 'Sleep',
    Time: 6,
    State: '',
    Info: null
  },
  {
    Id: 311,
    User: 'root',
    Host: 'localhost:64182',
    db: null,
    Command: 'Sleep',
    Time: 4,
    State: '',
    Info: null
  },
  {
    Id: 329,
    User: 'root',
    Host: 'localhost:64371',
    db: 'tutorials',
    Command: 'Query',
    Time: 0,
    State: 'init',
    Info: 'SHOW PROCESSLIST'
  }
]
--------------------------
**usage of FULL keyword with the SHOW PROCESSLIST command:**
[
  {
    Id: 5,
    User: 'event_scheduler',
    Host: 'localhost',
    db: null,
    Command: 'Daemon',
    Time: 1279159,
    State: 'Waiting on empty queue',
    Info: null
  },
  {
    Id: 310,
    User: 'root',
    Host: 'localhost:64181',
    db: null,
    Command: 'Sleep',
    Time: 6,
    State: '',
    Info: null
  },
  {
    Id: 311,
    User: 'root',
    Host: 'localhost:64182',
    db: null,
    Command: 'Sleep',
    Time: 4,
    State: '',
    Info: null
  },
  {
    Id: 329,
    User: 'root',
    Host: 'localhost:64371',
    db: 'tutorials',
    Command: 'Query',
    Time: 0,
    State: 'init',
    Info: 'SHOW FULL PROCESSLIST'
  }
]
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class ProcessList {
  public static void main(String[] args) {
    String url = "jdbc:mysql://:3306/TUTORIALS";
    String user = "root";
    String password = "password";
    ResultSet rs;
    try {
      Class.forName("com.mysql.cj.jdbc.Driver");
            Connection con = DriverManager.getConnection(url, user, password);
            Statement st = con.createStatement();
            //System.out.println("Database connected successfully...!");
            String sql = "SHOW PROCESSLIST";
            rs = st.executeQuery(sql);
            System.out.println("Show statement executed successfully...!");
            System.out.println("ProcessList: ");
            while(rs.next()) {
              String p_list = rs.getString(1);
              System.out.println(p_list);
            }
    }catch(Exception e) {
      e.printStackTrace();
    }
  }
}

輸出

獲得的輸出如下所示:

Show statement executed successfully...!
ProcessList: 
5
13
43  
import mysql.connector
# Establishing the connection
connection = mysql.connector.connect(
    host='localhost',
    user='root',
    password='password',
    database='tut'
)
# Creating a cursor object
cursorObj = connection.cursor()
# show trigger
show_processlist_query = "SHOW PROCESSLIST"
cursorObj.execute(show_processlist_query)
result = cursorObj.fetchall()
print("Processlist in the database:")
for row in result:
    print(row)
# close the cursor and connection
cursorObj.close()
connection.close()

輸出

獲得的輸出如下所示:

Processlist in the database:
(5, 'event_scheduler', 'localhost', None, 'Daemon', 1029217, 'Waiting on empty queue', None)
(322, 'root', 'localhost:56077', 'tut', 'Sleep', 309, '', None)
(384, 'root', 'localhost:58907', 'tut', 'Query', 0, 'init', 'SHOW PROCESSLIST')
廣告