搜尋
首頁資料庫mysql教程MySQL優化之-安全地關閉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 就夠了,如果發生阻塞,再參考上面的內容進行分析和解決吧。


#

以上是MySQL優化之-安全地關閉MySQL實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
解釋InnoDB緩衝池及其對性能的重要性。解釋InnoDB緩衝池及其對性能的重要性。Apr 19, 2025 am 12:24 AM

InnoDBBufferPool通過緩存數據和索引頁來減少磁盤I/O,提升數據庫性能。其工作原理包括:1.數據讀取:從BufferPool中讀取數據;2.數據寫入:修改數據後寫入BufferPool並定期刷新到磁盤;3.緩存管理:使用LRU算法管理緩存頁;4.預讀機制:提前加載相鄰數據頁。通過調整BufferPool大小和使用多個實例,可以優化數據庫性能。

MySQL與其他編程語言:一種比較MySQL與其他編程語言:一種比較Apr 19, 2025 am 12:22 AM

MySQL与其他编程语言相比,主要用于存储和管理数据,而其他语言如Python、Java、C 则用于逻辑处理和应用开发。MySQL以其高性能、可扩展性和跨平台支持著称,适合数据管理需求,而其他语言在各自领域如数据分析、企业应用和系统编程中各有优势。

學習MySQL:新用戶的分步指南學習MySQL:新用戶的分步指南Apr 19, 2025 am 12:19 AM

MySQL值得學習,因為它是強大的開源數據庫管理系統,適用於數據存儲、管理和分析。 1)MySQL是關係型數據庫,使用SQL操作數據,適合結構化數據管理。 2)SQL語言是與MySQL交互的關鍵,支持CRUD操作。 3)MySQL的工作原理包括客戶端/服務器架構、存儲引擎和查詢優化器。 4)基本用法包括創建數據庫和表,高級用法涉及使用JOIN連接表。 5)常見錯誤包括語法錯誤和權限問題,調試技巧包括檢查語法和使用EXPLAIN命令。 6)性能優化涉及使用索引、優化SQL語句和定期維護數據庫。

MySQL:初學者的基本技能MySQL:初學者的基本技能Apr 18, 2025 am 12:24 AM

MySQL適合初學者學習數據庫技能。 1.安裝MySQL服務器和客戶端工具。 2.理解基本SQL查詢,如SELECT。 3.掌握數據操作:創建表、插入、更新、刪除數據。 4.學習高級技巧:子查詢和窗口函數。 5.調試和優化:檢查語法、使用索引、避免SELECT*,並使用LIMIT。

MySQL:結構化數據和關係數據庫MySQL:結構化數據和關係數據庫Apr 18, 2025 am 12:22 AM

MySQL通過表結構和SQL查詢高效管理結構化數據,並通過外鍵實現表間關係。 1.創建表時定義數據格式和類型。 2.使用外鍵建立表間關係。 3.通過索引和查詢優化提高性能。 4.定期備份和監控數據庫確保數據安全和性能優化。

MySQL:解釋的關鍵功能和功能MySQL:解釋的關鍵功能和功能Apr 18, 2025 am 12:17 AM

MySQL是一個開源的關係型數據庫管理系統,廣泛應用於Web開發。它的關鍵特性包括:1.支持多種存儲引擎,如InnoDB和MyISAM,適用於不同場景;2.提供主從復制功能,利於負載均衡和數據備份;3.通過查詢優化和索引使用提高查詢效率。

SQL的目的:與MySQL數據庫進行交互SQL的目的:與MySQL數據庫進行交互Apr 18, 2025 am 12:12 AM

SQL用於與MySQL數據庫交互,實現數據的增、刪、改、查及數據庫設計。 1)SQL通過SELECT、INSERT、UPDATE、DELETE語句進行數據操作;2)使用CREATE、ALTER、DROP語句進行數據庫設計和管理;3)複雜查詢和數據分析通過SQL實現,提升業務決策效率。

初學者的MySQL:開始數據庫管理初學者的MySQL:開始數據庫管理Apr 18, 2025 am 12:10 AM

MySQL的基本操作包括創建數據庫、表格,及使用SQL進行數據的CRUD操作。 1.創建數據庫:CREATEDATABASEmy_first_db;2.創建表格:CREATETABLEbooks(idINTAUTO_INCREMENTPRIMARYKEY,titleVARCHAR(100)NOTNULL,authorVARCHAR(100)NOTNULL,published_yearINT);3.插入數據:INSERTINTObooks(title,author,published_year)VA

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境