本文目錄一覽:
- 1、MySQL 內存佔用總是太高,你需要立即進行這些操作……
- 2、mysql 盤滿了怎麼辦
- 3、mysql數據庫太大了怎麼備份
- 4、Mysql數據庫CPU佔用過高原因排查 show processlist
MySQL 內存佔用總是太高,你需要立即進行這些操作……
生產環境中,MySQL 不經意間吃掉全部的內容,然後開始吃掉 SWAP,性能一降再降,怎麼辦?
可以從下面三點查看原因:
MySQL 使用內存,有兩個途徑。
永久佔用的內容
比如全局緩衝區(Global Buffer)類別,是在服務器啟動期間從操作系統獲得的,不會釋放到任何一個別的進程。
動態請求的內存
線程緩衝區由MySQL使用,它是在處理新查詢時從操作系統請求的內存。在執行查詢之後,該內存被釋放回操作系統。
這意味着 MySQL 的內存使用,是 全局緩衝區 加上 線程緩衝區 以及 允許的最大連接數 。
對於專用數據庫服務器,該值需要保持在服務器內存的90%以下。在共享服務器的情況下,它應該保持在服務器內存的50%以下。
檢查一下 MySQL 設置,有助於確定內存使用情況,從而為 MySQL 分配合適的值。
一個近似的公式:
當網站受到攻擊時,有可能在短時間內建立異常高的連接數量。MySQL 中的 PROCESSLIST 可用於檢測頂級用戶並阻止對濫用連接的訪問。
找出查詢需要很長時間才能執行的語句,因為這些查詢需要進一步優化服務器才能更好地執行,可以通過服務器查詢日誌進行識別。由於查詢速度慢,導致磁盤讀取較多,導致內存和CPU使用率較高,影響服務器性能。
最後,到了加內存條的時候了。雖然在優化數據庫設置之後,服務器會不斷地路由到使用交換內存,但也必須增加內存。俗話說:「巧婦難為無米之炊」,就是這個意思。
上面說的這些方向,大家可以在實際操作中驗證體會,希望大家在數據庫優化的路上,麻溜順暢,砥礪前行。
mysql 盤滿了怎麼辦
操作系統:CentOS 6.2
現象:MySQL無法啟動
查找問題發現:存放mysql數據分區100%
[root@jinniu-test3 mysql]# df -h
文件系統 容量 已用 可用 已用%% 掛載點
/dev/sda2 49G 49G 20K 100% /
tmpfs 933M 0 933M 0% /dev/shm
/dev/sda1 194M 31M 153M 17% /boot
/dev/sda5 219G 701M 207G 1% /opt
檢查/etc/my.cnf,數據文件默認存放於/var/lib/mysql下
確認此文件夾確實過大
解決方案:轉移存放目錄,修改my.cnf或者軟連接回來
[root@-_- ~]# cp -Rp /var/lib/mysql /opt/ –帶權限拷貝整個目錄
修改/etc/my.cnf配置datadir=/opt/mysql指向新位置
重啟mysql發現無法啟動
[root@-_- ~]# service mysqld start
MySQL Daemon failed to start.
正在啟動 mysqld: [失敗]
檢查/var/log/mysqld.log文件最後
[root@-_- ~]# tail -20 /var/log/mysqld.log
…
130301 11:52:05 [Warning] Can’t create test file /opt/mysql/-_-.lower-test
130301 11:52:05 [Warning] Can’t create test file /opt/mysql/-_-.lower-test
…
網絡搜索問題得知是這台機器啟用SElinux 安全策略引起的
使用命令可以解決
[root@-_- ~]# chcon -R -t mysqld_db_t /opt/mysql
實在不行,禁用SElinux
執行:setenforce 0
mysql數據庫太大了怎麼備份
命令:mysqlhotcopy
這個命令會在拷貝文件之前會把表鎖住,並把數據同步到數據文件中,以避免拷貝到不完整的數據文件,是最安全快捷的備份方法。
命令的使用方法是:
mysqlhotcopy -u root -prootpass db1 db2 … dbn output_dir
如果需要備份全部數據庫,可以加上–regexp=」.*」參數。
Mysqlhotcopy命令可自動完成數據鎖定工作,備份時不用關閉服務器。
它還可以刷新日誌,使備份文件和日誌文件的檢查點能保持同步。
Mysql數據庫CPU佔用過高原因排查 show processlist
mysql服務器最近偶爾出現cpu百分百居高不下的情況,所以需要進行分析
兄弟命令 show processlist;只列出前100條,如果想全列出請使用show full processlist;
先 簡單說一下各列的含義和用途:
正在將表中修改的數據刷新到磁盤中,同時正在關閉已經用完的表。這是一個很快的操作,如果不是這樣的話,就應該確認磁盤空間是否已經滿了或者磁盤是否正處於重負中。
Connect Out
複製從服務器正在連接主服務器。
Copying to tmp table on disk
由於臨時結果集大於 tmp_table_size,正在將臨時表從內存存儲轉為磁盤存儲以此節省內存。
Creating tmp table
正在創建臨時表以存放部分查詢結果。
deleting from main table
服務器正在執行多表刪除中的第一部分,剛刪除第一個表。
deleting from reference tables
服務器正在執行多表刪除中的第二部分,正在刪除其他表的記錄。
Flushing tables
正在執行 FLUSH TABLES,等待其他線程關閉數據表。
Killed
發送了一個kill請求給某線程,那麼這個線程將會檢查kill標誌位,同時會放棄下一個kill請求。MySQL會在每次的主循環中檢查kill標誌 位,不過有些情況下該線程可能會過一小段才能死掉。如果該線程程被其他線程鎖住了,那麼kill請求會在鎖釋放時馬上生效。
Locked
被其他查詢鎖住了。
Sending data
正在處理 SELECT 查詢的記錄,同時正在把結果發送給客戶端。
Sorting for group
正在為 GROUP BY 做排序。
Sorting for order
正在為 ORDER BY 做排序。
Opening tables
這個過程應該會很快,除非受到其他因素的干擾。例如,在執 ALTER TABLE 或 LOCK TABLE 語句行完以前,數據表無法被其他線程打開。 正嘗試打開一個表。
Removing duplicates
正在執行一個 SELECT DISTINCT 方式的查詢,但是MySQL無法在前一個階段優化掉那些重複的記錄。因此,MySQL需要再次去掉重複的記錄,然後再把結果發送給客戶端。
Reopen table
獲得了對一個表的鎖,但是必須在表結構修改之後才能獲得這個鎖。已經釋放鎖,關閉數據表,正嘗試重新打開數據表。
Repair by sorting
修復指令正在排序以創建索引。
Repair with keycache
修復指令正在利用索引緩存一個一個地創建新索引。它會比 Repair by sorting 慢些。
Searching rows for update
正在講符合條件的記錄找出來以備更新。它必須在 UPDATE 要修改相關的記錄之前就完成了。
Sleeping
正在等待客戶端發送新請求.
System lock
正在等待取得一個外部的系統鎖。如果當前沒有運行多個 mysqld 服務器同時請求同一個表,那麼可以通過增加 –skip-external-locking參數來禁止外部系統鎖。
U pgrading lock
INSERT DELAYED 正在嘗試取得一個鎖表以插入新記錄。
Updating
正在搜索匹配的記錄,並且修改它們。
User Lock
正在等待 GET_LOCK()。
Waiting for tables
該線程得到通知,數據表結構已經被修改了,需要重新打開數據表以取得新的結構。然後,為了能的重新打開數據表,必須等到所有其他線程關閉這個表。以下幾種 情況下會產生這個通知:FLUSH TABLES tbl_name, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE, 或 OPTIMIZE TABLE。
waiting for handler insert
INSERT DELAYED 已經處理完了所有待處理的插入操作,正在等待新的請求。
大部分狀態對應很快的操作,只要有一個線程保持同一個狀態好幾秒鐘,那麼可能是有問題發生了,需要檢查一下。
還有其他的狀態沒在上面中列出來,不過它們大部分只是在查看服務器是否有存在錯誤是才用得着。
文章轉自:
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/186949.html