显示标签为“mysql_config_editor”的博文。显示所有博文
显示标签为“mysql_config_editor”的博文。显示所有博文

2014年10月12日星期日

旋轉的MySQL慢日誌

Original post: http://anothermysqldba.blogspot.com/2014/10/rotating-mysql-slow-logs.html

同時與不同的客戶工作,我碰巧會遇到的非常大的慢日誌文件時有發生。 雖然他們如何應該旋轉的若干意見存在。 許多這些意見使用日誌旋轉和刷新日誌的命令,我不喜歡,雖然我刷新二進制日誌。 這就是為什麼我同意羅納德·布拉德福德的博客文章 ,從幾年前就如何做到這一點。 
我已經採取了它遠一點和腳本的步驟。 在bash腳本是建立在MySQL 5.6和記mysql_config_editor它可以在舊版本的MySQL中被使用。

該腳本將執行下列操作: 
  • 收集當前的日誌文件名
  • 收集當前的長查詢時間值
  • 復位長的查詢時間為更高的值
  • 不同的副本截斷它,以及日誌(參見羅納德的帖子)
  • 復位長查詢時間回到原來的時間
  • 執行,如果你想一個簡單的慢查詢,以便您可以檢查新的記錄速度慢
  • 刪除舊的日誌慢,所以你可以得到的空間回來。
    • 如果你希望查看的日誌,而不是你可以發表評論,此命令的。
因此,所有這一切工作的? 
好吧,讓我們用這個例子。 

我目前使用的mysql_config_editor超過.my.cnf文件,所以我相應地更新腳本。 
# mysql_config_editor print --all 
[local] 
user = root 
password = ***** 
host = localhost 

我可以看到,這個慢查詢日誌現在是1G。 
# ls -alh mysql-slow.log 
-rw-rw---- 1 mysql mysql 1.1G Oct 11 16:08 mysql-slow.log 

所以,我執行腳本 
# /root/rotate_slow_logs.sh 
# ls -alh mysql-slow.log 
-rw-rw---- 1 mysql mysql 5.8K Oct 11 16:11 mysql-slow.log 

好啊好啊,它的工作,我現在有一個更小的日誌文件,而無需刷新我的垃圾桶日誌或重新啟動MySQL的。 

該腳本可以被添加到一個crontab所以你可以經常你想旋轉。 

下面是該腳本。 
#!/bin/bash 

# THIS IS BUILT WITH MYSQL 5.6 SECURITY IN MIND. 
# SET THE LOGINPATHVALUE if you are using the mysql_config_editor 
# IF YOU ARE NOT USING THE mysql_config_editor THEN IT IS ASSUMED YOU HAVE 
# SET A .my.cnf FILE IN THE USER HOME DIR OR THIS USER HAS NO PASSWORD SET 


# PLEASE SET THIS ACCORDINGLY TO YOUR SYSTEM. 
LOGINPATHVALUE="local"; 

if [ -z "${LOGINPATHVALUE}" ]; then 
LOGINPATH=""; 
fi 

if [ -n "${LOGINPATHVALUE-unset}" ]; then 
LOGINPATH="--login-path=$LOGINPATHVALUE " 

fi 

# GATHERS THE LOG FILE NAME 
SLOWLOG=$(mysqladmin $LOGINPATH variables | grep slow | grep file | awk '/[a-zA-Z]/ {print $4}' ) 

# GATHER CURRENT VALUE 
LQT=$( mysqladmin $LOGINPATH variables | grep long_query_time | awk '/[0-9]./ {print $4}' ) 
LQTB=$(mysql $LOGINPATH -e " SELECT @@global.long_query_time *200 AS LQTB;" | awk '/[0-9]./ {print $1}' ) 
LQTC=$(mysql $LOGINPATH -e " SELECT @@global.long_query_time *2 AS LQTC;" | awk '/[0-9]./ {print $1}' ) 

# GATHER MARKER 
DATE=`date +"%m%d%Y"` 

# RESET SLOW QUERY TIME 
# SET GLOBAL long_query_time=10; 
mysql $LOGINPATH -e "SET GLOBAL long_query_time= $LQTB" 

LQTD=$( mysqladmin $LOGINPATH variables | grep long_query_time | awk '/[0-9]./ {print $4}' ) 

#MOVE THE LOG OUT 
cp $SLOWLOG $SLOWLOG.$DATE; > $SLOWLOG 

#SET THE TIMEBACK 
mysql $LOGINPATH -e "SET GLOBAL long_query_time= $LQT" 

LQTD=$( mysqladmin $LOGINPATH variables | grep long_query_time | awk '/[0-9]./ {print $4}' ) 

#PLACE A Slow query for log 
SLOWQUERY=$(mysql $LOGINPATH -e "SELECT sleep($LQTC) " ) 

# REMOVE OLD LOG 
/bin/rm -f $SLOWLOG.$DATE;


2013年6月6日星期四

MySQL的檢查表



MySQL的檢查表的命令是非常有用的,誰想要做到以下幾點:
  • 檢查版本兼容性
  • 檢查數據一致性
  • 升級
  • 一般表錯誤
這個過程是很簡單的:

> show tables;
+-----------------+
| Tables_in_world |
+-----------------+
| City |
| Country |
| CountryLanguage |
+-----------------+

> check table City\G
*************************** 1. row ***************************
Table: world.City
Op: check
Msg_type: status
Msg_text: OK


這是一個很好的任務保持更新,所以大家都知道可能出現的錯誤。 一個可能的問題是,這個工具真的專注於MyISAM和InnoDB的。 如果你使用它,“檢查表”命令對於InnoDB真的只適用於當您添加QUICK選項(或任何購股權)。 對於InnoDB速度快,更改中和擴展選項都被忽略。 現在,如果你問自己,什麼InnoDB的? 為什麼MySQL的InnoDB引擎忽略了數據的一致性? 做一個深呼吸,放鬆,InnoDB是投訴的酸 ,酸“ 的首字母縮寫站在原子 , 一致性 ,隔離性和耐久性。 “ 所以,不要忽視檢查InnoDB表,因為它仍然可以為您提供一些見解或確認表。 請記住,如果一個InnoDB表被損壞服務器將關閉,以保護數據。 您只需為您的降壓MyISAM表,這個工具就會得到更多。

希望你得到的回應“OK”或“表已經更新了,”否則,你需要運行修復表修復表。

那麼,什麼是提供給我們的選項,這樣你就可以做到這一點往往容易。
下面的文檔鏈接還將為您提供與幾個社區驅動的自動選擇。 您可以編寫腳本的過程和方便地顯示表,然後申請檢查表的所有結果。 它只是似乎更容易給我,雖然使用的工具為您提供。


$ mysqlcheck -u root -p --databases world --fast
Enter password:
world.City OK
world.Country OK
world.CountryLanguage OK

$mysqlcheck -u root -p --databases world --fast --check-only-changed
Enter password:
world.City OK
world.Country OK
world.CountryLanguage OK

現在,這是簡單而直接的,但它也適合於另一個問題,怎麼樣的密碼?

你應該創建一個用戶沒有密碼,允許檢查表,只是讓你不必把一個密碼到您的腳本或cron作業? 你要防止密碼圍坐。mysql_history文件,以及。 所以再次利用的工具,為您提供。MySQL 5.6的介紹了MySQL的配置實用程序 。 我有一個例子,如何設置它在以前的博客文章:

mysqlcheck --login-path=local --databases world --fast --check-only-changed
world.City OK
world.Country OK
world.CountryLanguage OK

mysqlcheck的 - 幫助將提供給你可供選擇的完整列表。
現在,你可以檢查所有表,使你的密碼crontab文件和/或腳本。

文檔:

2013年5月19日星期日

MySQL的用戶::資助:: mysql_config_editor ::保安

Original post: http://anothermysqldba.blogspot.com/2013/05/mysql-users-grants-mysqlconfigeditor.html

安全對數據庫的訪問是任何數據庫管理員可能優先頭號。 如果不是,那麼你需要認真研究一下為什麼它是不是。 

已經可以通過手動的一般準則: 


MySQL中的主要安全問題之一當然是給你的用戶的權限。 
這些都是一些簡單的指引。 

首先“超級用戶”或“根”賬戶保持到最低限度。 用戶完全訪問“GRANT ALL”將仍然可以訪問,當你已經達到你的最大連接。 所以你想的最後一件事是一個程序,一個具有完全訪問權限的用戶執行命令。 

請記住,您正在創建什麼類型的帳戶。 您可以限制用戶最大查詢,最大的更新,最大連接數和每小時的最大用戶連接 。 

請記住您的用戶連接的網絡環境。 如果用戶將要使用DHCP的網絡地址在同一子網內,你只是為自己創造更多的工作,如果你限制到一個單一的IP。 您仍然可以限制他們的子網雖然帶有通配符。 例如'192 .168.0.2'與'192 .168.0% 

遠離整個通配符的主機和用戶的訪問。 



> CREATE USER ''@'192.168.0.56' ;
Query OK, 0 rows affected (0.02 sec)

> show grants for ''@'192.168.0.56';
+-----------------------------------------+
| Grants for @192.168.0.56 |
+-----------------------------------------+
| GRANT USAGE ON *.* TO ''@'192.168.0.56' |
+-----------------------------------------+


這將使你敞開,任何人從192.168.0.56是不是一個聰明的安全的事情。 
它也違反其他帳戶,因為MySQL從192.168.0.56首先檢查主機的用戶名和第二。 


> GRANT SELECT ON test.* TO 'exampleuser'@'192.168.0.%' IDENTIFIED BY 'somepassword';

> show grants for 'exampleuser'@'192.168.0.%';
+----------------------------------------------------------------------------------------------------------------------+
| Grants for exampleuser@192.168.0.% |
+----------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'exampleuser'@'192.168.0.%' IDENTIFIED BY PASSWORD '*DAABDB4081CCE333168409A6DB119E18D8EAA073' |
| GRANT SELECT ON `test`.* TO 'exampleuser'@'192.168.0.%' |
+----------------------------------------------------------------------------------------------------------------------+

這將允許只選擇為exampleuser從'192 .168.0%。 您還必須牢記,如果exam​​pleuser的是從本地主機連接,該系統將可能用戶本地主機之前,先192.168.0。%的子網地址,除非用戶使用的子網地址主機連接。 

這意味著,你可以創建一個每個主機的不同權限的用戶名和密碼。 


> SHOW GRANTS FOR 'exampleuser'@'localhost';
+--------------------------------------------------------------------------------------------------------------------+
| Grants for exampleuser@localhost |
+--------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'exampleuser'@'localhost' IDENTIFIED BY PASSWORD '*DAABDB4081CCE333168409A6DB119E18D8EAA073' |
| GRANT SELECT, UPDATE, DELETE ON `test`.* TO 'exampleuser'@'localhost' |
+--------------------------------------------------------------------------------------------------------------------+

你最好不要通過mysql客戶端使用中 - password = <密碼>選項。 您可以使用-p來提示輸入密碼。 

您也可以選擇與MySQL 5.6中使用MySQL的配置實用程序 。 


# mysql_config_editor set --login-path=local --host=localhost --user=root --password
Enter password: 




# mysql_config_editor print --all
[local]
user = root
password = *****
host = localhost 


#mysql的
ERROR 1045(28000):拒絕訪問用戶'根'@'localhost'的(使用密碼:否)

#mysql的 - 登錄路徑=當地
歡迎到MySQL監視器。

#mysql的 - 登錄路徑=本地-E“SELECT NOW()';

你有不同的路徑,例如本地或遠程等選項來命名。 所以,你可以在你的〜加密多個接入用戶帳戶,一旦您使用set命令創建/ mylogin.cnf文件。 

如果你有使用mysql客戶端的shell腳本,並有可能再有密碼的腳本更新他們使用“ -登錄路徑=”是一種更安全的路要走。 


當然,當你不再需要的用戶... 刪除用戶。 


> DROP USER 'exampleuser'@'localhost';