2013年7月3日星期三

了解你的MySQL服務器

Original post: http://anothermysqldba.blogspot.com/2013/07/understand-your-mysql-server.html

我想通它寫出來的一些指引,以幫助大家了解自己的MySQL服務器的不同方面,可能會有所幫助。

這個數據已經收集到隨著時間的推移,我會盡我所能,參考文章。 總體考​​慮在這裡列出你最好的信息來源:
所以,為了這個例子,讓我們假設你剛剛接手負責一個MySQL服務器。 什麼是最好的方式來收集有效的信息需要知道...

你知不知道到數據庫的密碼? 如果它不使用mysql_config_editor(前5.6)你可以做一個小挖找出來。 否則,你必須重新啟動它,並迫使自己的方式。我們假設你不想重新啟動它。 如果你必須弄清楚如何使用-跳過發放表檢討以前的一些博客文章的例子: http://anothermysqldba.blogspot.com/search/label/--skip-grant-tables

因此,首先一些放在尋找密碼。 這也意味著,如果你做這些人以後可以找到密碼。
  • 找出是否有人在命令行上使用的密碼。
    • 歷史| grep的mysql的
  • 的的crontab-l
    • 如果你看到備份腳本或等這些腳本輸入密碼
  • my.cnf中定位。
  • bash_history的貓| grep的mysql的
  • 嘗試的mysql沒有密碼的,但當然希望是你的盒子是安全的。
  • 隨著MySQL 5.6的檢查,如果你已經有一個配置的帳戶
    • mysql_config_editor打印 - 所有
OK,所以你的帳戶信息,你是在包裝盒上。
跳轉到MySQL服務器之前先知道一點關於你的服務器。
這些信息有些你可能只知道,但為了安全起見。
例如在Linux系統上運行以下操作系統,發行版,內存,磁盤信息。
  • 貓的/ etc / *釋放
  • uname-a的
  • DF-啊
  • 安裝
  • 自由米
  • 頂部
  • 超過這個職位的Swappiness資訊http://www.mysqlplus.net/tag/swappiness/
  • 你有一個特定的cnf的文件正在使用?
    • 用ps-ef | grep的MYSQL | grep的CNF
    • DATADIR:
      • 用ps-ef | grep的MYSQL | grep的DATADIR

所以,現在跳轉到MySQL服務器,並開始收集一些數據。 my.cnf文件審查雖然可以給你的大部分信息,你還可以收集從服務器。

show variables like '%log%';


看在你的錯誤(ERR)文件審查任何問題。 這應該是一個地方,你看一個錯誤後啟動等

因此,如何在服務器上運行? 為了迅速收集以下運行狀態的命令。
  • 版本
  • 主題
  • 問題
  • 慢速查詢
  • 打開
  • FLUSH TABLES
  • 打開表
  • 平均每秒查詢

mysql> status


“mysqladmin的擴展狀態”命令,也可以給你的信息,但在服務器內使用grep也是有效的。

密切留意以下信息。
這也被張貼在這裡http://www.techrepublic.com/blog/opensource/10-mysql-variables-that-you-should-monitor/56

您可以查看帖子中提到,看到一個漂亮的表,解釋了一些這些值。 這些都是我想你應該留意雖然。

> show status like 'Handler_read_first';
> show status like 'Key_reads';
> show status like 'Select_full_join';


找出您的查詢運行速度慢的百分比整體。 希望這是一個小數目。
使用狀態信息來填充這些變量進行快速檢查。

set @slow_queries=<value in the status output>;
set @questions=<value in the status output>;
SELECT ROUND(100* (@slow_queries / @questions),2) "Slow Query percentage" \G


學習了解的輸出:SHOW ENGINE INNODB STATUS \ G
盯緊死鎖信息,這樣你就可以開始調試那些。

您的系統是否有觸發器,事件的存儲過程?

mysql> SELECT db, name FROM mysql.proc;
mysql> SELECT TRIGGER_SCHEMA , TRIGGER_NAME FROM information_schema.TRIGGERS ;
mysql> SELECT EVENT_NAME FROM information_schema.EVENTS ;


知道你的服務器變量

show variables like '%innodb%';
show variables like '%thread%';
show variables like '%table%';
show variables like '%buffer%';
show variables like '%cache%';


檢查您的用戶帳戶。
它們都具有有效的密碼。

SELECT Host, User ,
CASE
WHEN CHARACTER_LENGTH(Password) = 16 THEN 'Pre-4.1 I should update this'
WHEN CHARACTER_LENGTH(Password) > 16 THEN 'Valid password'
WHEN CHARACTER_LENGTH(Password) =0 THEN ' BLANK PASSWORD so I just do not care if people steal my stuff'
END as Password
FROM mysql.user;


了解你的InnoDB日誌文件,並想出一個良好的緩衝池大小。
男爵張貼在這裡: http://www.mysqlperformanceblog.com/2008/11/21/how-to-calculate-a-good-innodb-log-file-size/
閱讀他的文章,以了解更多有關。 下面是一個例子,如何使用此信息。 我用他的號碼的例子幫助。 像男爵說,運行在交通繁忙時得到有效的信息。

mysql>pager grep sequence; show engine innodb status\G select sleep(60); show engine innodb status\G pager;
mysql>SET @sequence1= 3836410803;
mysql>SET @sequence2= 3838334638;
mysql>select ( ( (@sequence2 - @sequence1) / 1024 / 1024 )* 60 ) /2 as innodb_log_file_size_used ;
mysql>select (@@innodb_log_file_size / 1024) / 1024 as current_log_file_MB_size;


緩衝池大小。
雖然下面的查詢周圍網發布,並給出一個有效的緩衝池起點,我也看到了一些無效的或不切實際的數字,根據它的服務器上。 就個人而言,檢討的結果,下面的查詢。 高峰流量和金額數據發送到每男爵後的日誌審查結果。 然後考慮你有多少內存在服務器上。 你的數據庫在內存中運行的速度就越快,得到的結果,但你必須考慮到,什麼是數據庫做。 所以,你必須使用自己的緩衝池的大小,以獲得良好的價值判斷和研究。 另一個選項可以使用tools.percona.com,回答問題,並看看它會告訴你什麼。


mysql>select ( ( (@sequence2 - @sequence1) / 1024 / 1024 )* 60 ) *2 as innodb_buffer_pool_GB_test ;

mysql>SELECT CONCAT(ROUND(KBS/POWER(1024,
IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.49999),
SUBSTR(' KMG',IF(PowerOf1024<0,0,
IF(PowerOf1024>3,0,PowerOf1024))+1,1)) recommended_innodb_buffer_pool_size
FROM (SELECT SUM(data_length+index_length) KBS FROM information_schema.tables
WHERE engine='InnoDB') A,
(SELECT 3 PowerOf1024) B \G



接下來,你應該檢討這個開放方舟博客文章挖成索引等。 該帖子和網站整體的大的信息。
http://code.openark.org/blog/mysql/useful-database-analysis-queries-with-information_schema


挖掘到更多有關服務器的數據....


什麼是最古老的表,也許需要存檔這些嗎?

SELECT CONCAT(`TABLE_SCHEMA`, "." , `TABLE_NAME`) as name , `UPDATE_TIME`
FROM information_schema.TABLES
WHERE TABLE_SCHEMA NOT IN ('information_schema','mysql','test','performance_schema') AND `UPDATE_TIME` IS NOT NULL ORDER BY `UPDATE_TIME` LIMIT 25;



什麼是空間?

SELECT concat(table_schema,'.',table_name) table_name,
concat(round(data_length/(1024*1024),2),'M') data_length
FROM information_schema.TABLES
ORDER BY data_length DESC LIMIT 5;


這僅僅是一個起點,讓你了解正在發生的事情與您的服務器。 使用本網站列出的網站了解更多信息。