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

MySQL封閉進程詳解和平安封閉MySQL的辦法

編輯:MySQL綜合教程

MySQL封閉進程詳解和平安封閉MySQL的辦法。本站提示廣大學習愛好者:(MySQL封閉進程詳解和平安封閉MySQL的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL封閉進程詳解和平安封閉MySQL的辦法正文


本文剖析了mysqld過程封閉的進程,和若何平安、緊張地封閉MySQL實例,對這個進程不甚清晰的同窗可以參考下。

封閉進程:

1、提議shutdown,收回SIGTERM旌旗燈號

2、有需要的話,新建一個封閉線程(shutdown thread)

   假如是客戶端提議的封閉,則會新建一個公用的封閉線程

   假如是直吸收到 SIGTERM 旌旗燈號停止封閉的話,專門擔任旌旗燈號處置的線程就會擔任封閉任務,或許新建一個自力的線程擔任這個事

   當沒法創立自力的封閉線程時(例如內存缺乏),MySQL Server會收回相似上面的告警信息:

   Error: Can't create thread to kill server

3、MySQL Server不再呼應新的銜接要求

   封閉TCP/IP收集監聽,封閉Unix Socket等渠道

4、逐步封閉以後的銜接、事務

   余暇銜接,將連忙被終止;

   以後還有事務、SQL運動的銜接,會將其標識為 killed,並按期檢討其狀況,以便下次檢討時將其封閉;(參考 KILL 語法)

   以後有活潑事務的,該事物會被回滾,假如該事務中還修正了非事務表,則曾經修正的數據沒法回滾,能夠只會完成部門變革;

   假如是Master/Slave復制場景裡的Master,則對復制線程的處置進程和通俗線程也是一樣的;

   假如是Master/Slave復制場景裡的Slave,則會順次封閉IO、SQL線程,假如這2個線程以後是活潑的,則也會加上 killed 標識,然後再封閉;

   Slave辦事器上,SQL線程是許可直接停滯以後的SQL操作的(為了不復制成績),然後再封閉該線程;

   在MySQl 5.0.80及之前的版本裡,假如SQL線程其時正好履行一個事務到中央,該事務會回滾;從5.0.81開端,則會期待一切的操作停止,除非用戶提議KILL操作。

   當Slave的SQL線程對非事務表履行操作時被強迫 KILL了,能夠會招致Master、Slave數據紛歧致;

5、MySQL Server過程封閉一切線程,封閉一切存儲引擎;

   刷新一切表cache,封閉一切翻開的表;

   每一個存儲引擎各自信責相干的封閉操作,例如MyISAM會刷新一切期待寫入的操作;InnoDB會將buffer pool刷新到磁盤中(從MySQL 5.0.5開端,假如innodb_fast_shutdown不設置為 2 的話),把以後的LSN記載到表空間中,然後封閉一切的外部線程。

6、MySQL Server過程加入

關於KILL指令

   從5.0開端,KILL 支撐指定  CONNECTION | QUERY兩種可選項:

@KILL CONNECTION和本來的一樣,停滯回滾事務,封閉該線程銜接,釋放相干資本;

@KILL QUERY則只停滯線程以後提交履行的操作,其他的堅持不變;

   提交KILL操作後,該線程上會設置一個特別的 kill標志位。平日須要一段時光後能力真正封閉線程,由於kill標志位只在特定的情形下才檢討:

1、履行SELECT查詢時,在ORDER BY或GROUP BY輪回中,每次讀完一些行記載塊後會檢討 kill標志位,假如發明存在,該語句會終止;

2、履行ALTER TABLE時,在從原始表中每讀取一些行記載塊後會檢討 kill 標志位,假如發明存在,該語句會終止,刪除暫時表;

3、履行UPDATE和DELETE時,每讀取一些行記載塊而且更新或刪除後會檢討 kill 標志位,假如發明存在,該語句會終止,回滾事務,若是在非事務表上的操作,則已產生變革的數據不會回滾;

4、GET_LOCK() 函數前往NULL;

5、INSERT DELAY線程會敏捷內存中的新增記載,然後終止;

6、假如以後線程持有表級鎖,則會釋放,並終止;

7、假如線程的寫操作挪用在期待釋放磁盤空間,則會直接拋出“磁盤空間滿”毛病,然後終止;

8、當MyISAM表在履行REPAIR TABLE 或 OPTIMIZE TABLE 時被 KILL的話,會招致該表破壞弗成用,指點再次修復完成。

平安封閉MySQL幾點建議

  想要平安封閉 mysqld 辦事過程,建議依照上面的步調來停止:

0、器具有SUPER、ALL等最高權限的賬號銜接MySQL,最好是用 unix socket 方法銜接;

1、在5.0及以上版本,設置innodb_fast_shutdown = 1,許可疾速封閉InnoDB(不停止full purge、insert buffer merge),假如是為了進級或許升級MySQL版本,則不要設置;

2、設置innodb_max_dirty_pages_pct = 0,讓InnoDB把一切髒頁都刷新到磁盤中去;

3、設置max_connections和max_user_connections為1,也就最初除本身以後的銜接外,不許可再有新的銜接創立;

4、封閉一切不活潑的線程,也就是狀況為Sleep  且 Time 年夜於 1 的線程ID;

5、履行 SHOW PROCESSLIST  確認能否還有活潑的線程,特別是會發生表鎖的線程,例若有年夜數據集的SELECT,或許年夜規模的UPDATE,或許履行DDL,都是要特殊謹嚴的;

6、履行 SHOW ENGINE INNODB STATUS 確認History list length的值較低(普通要低於500),也就是未PURGE的事務很少,而且確認Log sequence number、Log flushed up to、Last checkpoint at三個狀況的值一樣,也就是一切的LSN都曾經做過檢討點了;

7、然後履行FLUSH LOCKAL TABLES 操作,刷新一切 table cache,封閉已翻開的表(LOCAL的感化是該操作不記載BINLOG);

8、假如是SLAVE辦事器,最好是先封閉 IO_THREAD,期待一切RELAY LOG都運用完後,再封閉 SQL_THREAD,防止 SQL_THREAD 在履行年夜事務被終止,耐煩待其全體運用終了,假如非要強迫封閉的話,最好也期待年夜事務停止後再封閉SQL_THREAD;

9、最初再履行 mysqladmin shutdown。

10、緊迫情形下,可以設置innodb_fast_shutdown = 1,然後直接履行 mysqladmin shutdown 便可,乃至直接在操作體系層挪用 kill 或許 kill -9 殺失落 mysqld 過程(在innodb_flush_log_at_trx_commit = 0 的時刻能夠會喪失部門事務),不外mysqld過程再次啟動時,會停止CRASH RECOVERY任務,須要有所衡量。

煩瑣那末多,其實正常情形下履行 mysqladmin shutdown 就夠了,假如產生壅塞,再參考下面的內容停止剖析息爭決吧,哈哈:)

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