程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> mysql的啟動過程詳解,mysql啟動過程詳解

mysql的啟動過程詳解,mysql啟動過程詳解

編輯:MySQL綜合教程

mysql的啟動過程詳解,mysql啟動過程詳解


有一天,兩個不懂mysql內核的人想去了解mysql內核代碼,兩個人不是去調試代碼、查找資料,而是在那邊思考。因為不了解內核,所以邊思考邊去驗證。
 
使用的mysql代碼是5.1.7,調試環境是windows平台下的vs2003。
 
Bingxi:“alex,你覺得mysql的啟動過程會是什麼樣的呢?我們以銀行為例吧。”
Alex:“嗯,bingxi。早上銀行開門了,會先准備好環境,然後開門迎客,mysql也是這樣。Mysql裡面會有一個handle_connections_sockets函數,這個函數就好比是個叫號機,每個用戶來了都會取個號,然後就會進行業務處理。”
復制代碼 代碼如下:pthread_handler_t handle_connections_sockets(void *arg __attribute__((unused)))
{
  ……
  while (!abort_loop)
  {
    select((int) max_used_connection,&readFDs,0,0,0) < 0) //有連接了則往下來執行,否則一直等待
    ……
    accept(sock, my_reinterpret_cast(struct sockaddr *) (&cAddr),&length)  //接受請求
    ……
    create_new_thread(thd);
  }
  //abort_loop=1,則執行到這裡進行推出。今天業務不處理了
}

Bingxi:“啊,這裡面存在兩種可能的,1)用戶來一個就分配一個工作人員處理,2)將排號的人丟進工作隊列,根據叫號機到指定窗口獲取服務。前者的場景適合於請求量大,並且需要響應速度特別快的情況,但是分配也會有個限制,所謂的最大連接數,這樣的情況常見於互聯網行業,相應地我們可以看到機器的負載變化范圍特別大。同樣的,這也是它的一個弊端,假設每個業務都復雜(消耗資源型sql語句),同時處理的話,機器會支撐不住,這時候第二種方法就比較好,這種情況屬於事務性場景。”

Alex:“嗯,是的。Mysql選擇的是前者,oracle提供兩種方法供選擇。我們繼續往下面的代碼看,如果我們配置了線程緩存,且有可用的緩存,則喚醒該線程,否則創建新的線程。”
復制代碼 代碼如下:
static void create_new_thread(THD *thd)
{
 
    if (cached_thread_count > wake_thread)
    {
      start_cached_thread(thd);
    }
    else
    {
      if ((error=pthread_create(&thd->real_id,&connection_attrib,
                            handle_one_connection,
                            (void*) thd)))
  }
}

Bingxi:“嗯,老楊。是不是理解銀行為客戶分配了一個服務人員,在這段期間一直為該客戶服務。裡面有個代碼段,是一直在等用戶下命令。但是有可能網絡,或者被kill掉了,就像一個人存了100,不斷取1塊錢一樣,被保安帶走了。”
復制代碼 代碼如下:
pthread_handler_t handle_one_connection(void *arg)
{
    while (!net->error && net->vio != 0 &&
           !(thd->killed == THD::KILL_CONNECTION))
    {
      net->no_send_error= 0;
      if (do_command(thd))
       break;
    }
}

Alex:“嗯,獲取命令,然後執行命令。在dispatch_command函數中,根據不同的客戶請求進行響應的處理,比如開賬戶、存錢等”
復制代碼 代碼如下:
bool do_command(THD *thd)
{
 
  if ((packet_length=my_net_read(net)) == packet_error) //獲取命令
 
  DBUG_RETURN(dispatch_command(command,thd, packet+1, (uint) packet_length));
}


MYSQL啟動

你沒進入MySQL的命令行模式呀,其實不用在DOS下敲命令的,安裝好MYSQL後會有個MySQL Command Line Client,開始-》所有程序-》MYSQL-》MYSQL5.1->MySQL Command Line Client,進入MYSQL的命令行模式才可以執行MYSQL的指令的。
 

MYSQL使用方法

我把這個軟件已經放我空間了!你去下載!解壓以後我在裡面給你放了個txt幫助文檔,覺得好使在給分把!下載地址:sq.966sd.cn/SQL/wj/SQL.rar
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved