ラベル mysql_config_editor の投稿を表示しています。 すべての投稿を表示
ラベル mysql_config_editor の投稿を表示しています。 すべての投稿を表示

2014年10月12日日曜日

MySQLのスローログのローテーション

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

異なるクライアントでの作業中に、私は時々非常に大規模なスローログファイルを渡って実行するために起こる。 が、それらを回転させるべきかについて、いくつかの意見が存在する。 これらの意見の多くは、私も自分のバイナリログをフラッシュすることを好まない、ログローテートとフラッシュlogsコマンドを使用します。 私はロナルドブラッドフォードに同意するのはこのためですブログ投稿これを行う方法上の年前から。 
私は少しさらにそれを撮影し手順をスクリプト化している。 bashスクリプトは、MySQL 5.6で構築されており、心の中mysql_config_editorはそれは同様にMySQLの古いバージョンで使用することができます。 

このスクリプトは、次の操作を行います。 
  • 現在のログファイル名を収集します
  • 現在の長いクエリ時間値を収集
  • 高い値に長いクエリ時間をリセットします
  • ログは同様にそれを切り捨て中にコピー(ロナルドさんの投稿を参照してください)
  • 元の時間に戻って長いクエリ時間をリセットします
  • ご希望の場合は、新しいスローログを確認することができますので、簡単なスロークエリを実行します
  • あなたが戻ってスペースを得ることができますので、古い低速のログを削除します。
    • あなたが代わりにログを確認したい場合は、このコマンドをコメントアウトすることができます。
だから、すべての動作しますか? 
さて私たちは、この例を使用してみましょう。 

私は現在、私はそれに応じて、スクリプトを更新した形で書きファイルに上書きmysql_config_editorを使用しています。 
# 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 

良い[OK]を、それが働いたと私は私のビンのログをフラッシュするか、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のチェック表

Original post: http://anothermysqldba.blogspot.com/2013/06/mysql-check-table.html

MySQLのチェックtablesコマンドは、次の操作を実行したい人のために非常に有用である: 

  • バージョンの互換性の確認
  • データの整合性をチェックする
  • アップグレード
  • 一般的なテーブルエラー
プロセスは十分に簡単です: 

> 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オプション(またはオプションなし)を追加したときに、 "チェック表"コマンドは実際にのみ適用されます。 、CHANGED、FAST MEDIUMとEXTENDEDオプションはすべてのInnoDBは無視されます。 今、あなたが自分を求めている場合、どのようなInnoDBのはどうでしょうか? なぜMySQLはInnoDBエンジンでデータの整合性を無視するでしょうか? 深呼吸をしてリラックスし、InnoDBがあるACIDの苦情 、ACIDは" 頭字語の原子性のために立って、 一貫性 、独立性 、および耐久性。 " だから、それはまだあなたのテーブルにいくつかの洞察力か、確認情報を提供できるため、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の設定ユーティリティを 。 私は以前のブログ記事でそれを設定する方法の例があります: 
http://anothermysqldba.blogspot.com/2013/05/mysql-users-grants-mysqlconfigeditor.html 

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におけるセキュリティと主要な問題の一つは、もちろん、ユーザーを与えるパーミッションです。 
これらは、いくつかの単純なガイドラインです。 

まず最低限に "スーパーユーザ"または "ルート"アカウントを保つ。 フルアクセスまたはあなたの最大接続数に達したときにまだアクセスできるようになります "ALLはGRANT"を持つユーザー。 だからあなたが望む最後の事は、完全なアクセス権を持つユーザーでコマンドを実行するためのプログラムです。 

あなたが作成しているのかアカウントの種類を覚えておいてください。 次のようなユーザーを制限することができますMAXクエリ、MAXを更新し、最大接続数と時間あたりMAXユーザー接続 。 

ユーザーから接続しているネットワーク環境に留意してください。 ユーザーが同じサブネット内の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.%' |
+----------------------------------------------------------------------------------------------------------------------+

これができるようになりますだけ'192 .168.0からexampleuserために選択されます。% '。 また、心に留めておく必要がありexampleuserシステムはおそらくユーザが接続するサブネットアドレスのホストを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'のためにアクセスが拒否されました(パスワードを使用して:NO)

#のmysql - ログインパス=ローカル
MySQLのモニタへようこそ。

#のmysql - ログインパス=ローカル-e 'を今すぐSELECT()';

あなたにも、ローカルまたはリモートおよび等のような別のパスに名前を付けるためのオプションを持っている。 だからあなたが、setコマンドを使用した後に作成されている/。mylogin.cnfファイルを〜に複数のアクセスユーザアカウントを暗号化することができます。 

あなたはおそらくmysqlクライアントを使用するシェルスクリプトを持っている場合は、使用するように更新するスクリプトでパスワードを持っている" -ログインパスは="移動するため、より安全な方法です。 


もちろん、あなたは、もはやユーザーを必要としないときに... ユーザを削除します。 


> DROP USER 'exampleuser'@'localhost';