Category Archives: database

Innotopを入れてみる

Innotop って何ぬねの LinuxにTopというコマンドがある。Windowsでいうところのタスクマネージャのように、リアルタイムで状況確認するための基本コマンドだ。そしてMytopというMySQL版Topコマンドのようなものがあり、そんなMytopをインスパイアしてできたと作者が仰っている。 それがInnotopなのな。 とりあえずMytopを どんなんかな~?実行してみよう。 MySQL on localhost (5.1.73-log)                                            up 4+19:39:33 [05:07:50]  Queries: 2.4M   qps:    6 Slow:   30.2k         Se/In/Up/De(%):    44/07/27/01              qps now:   16 Slow qps: 2.0  Threads:   17 (   1/   0) 69/00/06/00  Key Efficiency: 99.8%  Bps in/out: 902.1/ 3.3k   Now in/out:  1.6k/25.0k       Id      User         Host/IP         DB      Time    Cmd Query or State        —      —-         ——-         —      —-    — ———-    120839    wp       localhost     wp         0  Query show full processlist    120872    wp       localhost     wp         0  Sleep サンプルがちょっと悲しいかな、全く何も溜まってないので全く参考にならなくてすまない。 以下は忘備録的なMyTopのインストールメモです、MyTOPはもともと使っていたので今回改めてローカルに入れてみたのね。 $ cd /tmp $ wget http://jeremy.zawodny.com/mysql/mytop/mytop-1.6.tar.gz $ tar zxvf mytop-1.6.tar.gz $ cd mytop-1.6 $ perl Makefile.PL Can’t locate ExtUtils/MakeMaker.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 […]

SQL文をもうちょっとやるぜよ

せっかくなので、前回の次回予告通りSQL文をもうちょっとやるぜよ。 自分の予想通りでほんとは違う事をしようと思ってたのだけれど、気まぐれというやつだにゃ。 大文字小文字 MySQLのマニュアルなどを見ているとだいたいというか、だいたいが大文字なのだが、SQLコマンドは大文字と小文字の区別はしないらしいにゃ。じゃあなんで分けてるんだろうか。 グーグル師匠に尋ねても特によさげな答えも見つからなかったので、テーブル名とかデータベース名とSQLコマンドとの区別がしやすいからだと勝手に予想してみる。 ユーザの作成 何故ユーザを作るのか、万が一ハッキングされた時に備えてというセオリーだが、そもそもアップデートや最低限のセキュリティをきっちりしているサーバーなら、当たらなければどうということはない。・・と思っちまうんだが、ウェブサービスと関連が深いところだけにサーバーのセキュリティをどんなに上手に固めてもPHPとか、PHPとか、PHPとかがセキュリティホールになったりするし、やっぱりユーザー権限で動かすのがよろしかろう。 テーブルについて +———+————-+——+—–+———+——-+ | Field   | Type        | Null | Key | Default | Extra | +———+————-+——+—–+———+——-+ | id      | int(11)     | NO   | PRI | NULL    |       | | year    | char(4)     | YES  |     | NULL    |       | | General | varchar(30) | YES  |     | NULL    |       | +———+————-+——+—–+———+——-+ 前回作ったテーブルを使ってちょっと補足(自分のために) Field:テーブル内のフィールドあるいは列の名前だ。 Type:フィールドに保持するデータ型だ。 Null:フィールドにNULL値を含めることができるか否かだ。 Key:キーやインデックスをサポートでき、適用されるキーのタイプを表示するだ。 Default:新しい行の作成時に値が指定されていない時、この値が入るだ。 Extra:追加情報を示すだ。 ところでキーやインデックスというのは、データを早く探すようにするもので、すなわちデータベースを軽くするためのものだと思うのだが、データベース構造とどっちが重要なのかとか、まだ全く分からないと言うか知らない。 ちなみにインデックスでググるとインデックスの方が検索上位に表示されるので、世の中でインデックスというとどうやらインデックスの事らしい。 ちなみに最近は録画してるものが溜まりに溜まってしまっていて、DVDレコーダーのHDD残容量がやばきち。 そうそう、録画してるやつも見ないといけないのだった。   日記には書いていないが、MySQLはちゃんとオライリーの本で勉強しているのだ。 あ、タイトルにしていたSQL文が一回も出ていない気が・・・。 更新頻度が下がるとアクセス数が減るようだから無理やり更新した感じだな。 それでは今日はこの辺で。  

SQL文をちょこっとやるぜよ

PHPでSQLを飛ばすにしても基本をやらんといかんぜよ。という事で、おそらく今までやってなかったSQLをちょこっとやるぜよ。 データベースを作る。 mysql> create database hogehoge; Query OK, 1 row affected (0.01 sec) 選択する。 mysql> use hogehoge; Database changed テーブルを作る。 mysql> create table history (     -> id INT NOT NULL PRIMARY KEY, -> year char(4),     -> General varchar(30)     -> ); Query OK, 0 rows affected (0.01 sec) mysql> desc history; +———+————-+——+—–+———+——-+ | Field   | Type        | Null | Key | Default | Extra | +———+————-+——+—–+———+——-+ | id      | int(11)     | NO   | PRI | NULL    |       | | year    | char(4)     | YES  |     | NULL    |       | | General | varchar(30) | YES  |     | NULL    |       | +———+————-+——+—–+———+——-+ 3 rows in set (0.00 sec) データ型はこっちを見るぜよ。 […]

いつもそこにDBがいた

日記を初めてから今までずーっと使っていながらも、あまり焦点を合わせていなかったなぁということで、今回はそんなデータベースに触れてみたいと思います。 自分で調べながら、他人に教える感じで進めていきまする。 データベースってなぬ? 一般的にデータベース(DB)って言われてるのは、だいたいRDBMSだと思います。 とは言うものの、たけけんもMySQLを使っていながらも、データベースってなに?ってことは説明が難しく感じます。 RDBMSはリレーショナルデータベースの管理システムってやつですが、DBって何?って聞いてきた人にDBはRDMBSだよって言っても は?ってなるので、簡単な説明をすると、たとえばエクセルは有名だと思うので、エクセルでこんな表(テーブル)を作ったとします。 よく作りますよね、こういうの。 ID クラス 名前 専攻科目 001 A-1 松田耕作 マスメディア 002 C-2 猪熊柔 柔道 たけけんも何年か前は仕事のデータの管理をエクセルのみ(実績データみたいなもんです)でやってましたが、データ量がその程度なら問題ないのですが、例にあげたような生徒の管理として、他に住所や電話番号とか色々な情報があったとして、それが例えば100万人くらいのデータだったとすると、膨大すぎてエクセルだと大変っすね。 エクセルというか、人間には大変です。 なので、上の表みたいにコンパクトにまとめて、ほかに住所や電話番号のテーブル、生年月日や所属のテーブルなどに分けます。 ※データベース構造の話はちょっと難しいので、サンプルとして説明しています。 そしてリレーショナルデータベースなら、クラスだったり、所属といったものをキーとして、その主キーを元にデータを抽出したり、テーブルの結合やらなんやらかんやらと、膨大なデータを管理ができて、一般的にはUI(管理画面)と連携したりして色々できるのがデータベースです。 すげーエクセルだって説明しているサイトをどこかで見ましたが、マイクロソフトだとAccessが該当し、エクセルでもVBを使えば近いことができるそうです。 他にもOracle Database、MySQL、PostgreSQL、MongoDBとかあります。 例では、顧客管理のようなテーブルになってますが、今使っているWordpressとかZabbixもデータベースを利用したプログラムです。 基本の基本 じゃあWordpressを題材にして、中身を覗いてみますん。 データベースの初期教育ってだいたい顧客管理だと思うんで、ブログのテーブルってちょっとピンと来ないかもしれないので、どんなのか見てみよう。 例はMySQLです。まずはログインしてテーブルを見てみます。 [root@vincentina]# mysql -u wordpress -p wordpress Enter password: Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A mysql> show tables; +————————–+ | Tables_in_wpdata         | +————————–+ | wp_Counterize            | | wp_Counterize_Keywords   | | wp_Counterize_Pages      | | wp_Counterize_Referers   | | wp_Counterize_UserAgents | | wp_commentmeta           | | wp_comments              | | wp_links                 | | wp_options               | | wp_postmeta              | | wp_posts                 | | wp_term_relationships    | | wp_term_taxonomy         | […]

Slowquerylogの結果からインデックスを張ってみた結果

MySQLの話なのだが、こないだインデックスを作ってまだ1日しか立ってないけど、ログを見たら驚きの白さだった。 あらすじも書いておくと、というか言葉でなくて過去ログを載せる。 22日 Count: 884  Time=0.02s (20s)  Lock=0.00s (0s)  Rows=277.2 (245047), wpdata[wpdata]@localhost   SELECT option_name, option_value FROM wp_options WHERE autoload = ‘S’ 23日 Count: 1165  Time=0.02s (26s)  Lock=0.00s (0s)  Rows=277.6 (323453), wpdata[wpdata]@localhost   SELECT option_name, option_value FROM wp_options WHERE autoload = ‘S’ 24日 Count: 5  Time=0.03s (0s)  Lock=0.00s (0s)  Rows=277.0 (1385), wpdata[wpdata]@localhost   SELECT option_name, option_value FROM wp_options WHERE autoload = ‘S’ なー? だがしかし、ここからが俺たちの戦いはこれからだ!なのだ。 たけけんはrrdtoolのグラフのツールでCactiというツールを使っているのだけど(日本語がw)、SlowQueryログを見ていると、こいつがかなりダメダメなのだ。 でも今回は前回のWordpressのwp_optionsテーブルみたいに簡単には行かないみたいでさ。 Cactiの方は、これは既にインデックスが貼られているし、前回と同じやりかただとEXPLAINもできやしない。 できやしない。 自宅サーバーを買う前にちょっとここら辺をクリアーにしてから進みたいと思うた。 ってことで次はMySQLの巻に進むことにしよう。 これもずーーーーーっと前からやりたかったところなんだがね。 MyISAMとInnoDBでどう違うんやってことも、なんせCactiとWordpressで違うから、そのあたりもちゃんと分かってないからまだまだ覚える事は多い。 ある程度いろいろやってくると覚えることがぶわーって見えてきて、その多さにちょっと面喰ったりするけど、今回はそんなこともないようなので良かったよかいち。 でもCacitなんかはそろそろやめにしようと思っていて、最近は負荷グラフはまったく使ってないっても大きいけど、Nagiosグラフというのを使ってみたいのと、Zabbixを使ってみるかどうしようか悩んでいるところなのだ。 サーバーダウンとか全くないから、本当にただの環境構築のテストになるのは分かってるんだが、やってみるのもいい事だしなあ。 テストでどっちもやってみる!良かったのを使うっていうのが一番いいだろう。 なぜならもうだいぶ長いことこういったツール類のテスト構築とか、そんな感じの作業をしてないしね。 と言いながらプログラムが書けないと多分この先ちょっと大変だろうなぁって思う事が日に日に多くなってきてたので、またプログラムをちょこっとずつやってみたりなんかしている。 そう言ったこともあって、やりたいなあと思ってる事も忘れたりしてww なかなか作業ができないような気もせすん。 あとはもうそろそろ初めてから3年目に入るので、人気のコンテンツの紹介とかもやりたいと思ってたり、11月は見たい映画もいろいろあるし、見たいスポーツの試合も多いし、最近のマイブームの紹介もしたいし、年末まであっという間なんだろうなあと思うた。   こうやって書いてみると、やることが多いなあ  

Slowquerylogの結果からインデックスを張ってみた

もう2か月近く前の事になるけど、SlowqueryLogを取るように設定した。 Slowquerylogを取ってみることにしてみた 毎朝ログを見ているものの、見てるだけ~(懐かしいなあ)でとくに何もしていなかったのだが、これでは宝の持ち腐れ~っだったわけだけど、ここ2カ月くらいずっと仮想環境にはまってたのでまあいいかなと。 今はDebianのPreceed作成が順調に進んでいるとこだけど、気まぐれで別の事をちょこっと調べたら、ちょっとはまってしまってしばらく弄ってたので、日記にアップしようと思った。 ログを調べてみよう メールも来ているけど、せっかくログインしたしコマンドで見てみよう。 # mysqldumpslow -s t /var/lib/mysql/slow.log 上のコマンドで順番に並べてくれるらしい。ここ数日のものを調べてみたら1個だけ数字がでかいのがあった。 Reading mysql slow query log from /var/lib/mysql/slow.log.20131022 Count: 884  Time=0.02s (20s)  Lock=0.00s (0s)  Rows=277.2 (245047), wpdata[wpdata]@localhost   SELECT option_name, option_value FROM wp_options WHERE autoload = ‘S’ Reading mysql slow query log from /var/lib/mysql/slow.log.20131023 Count: 1165  Time=0.02s (26s)  Lock=0.00s (0s)  Rows=277.6 (323453), wpdata[wpdata]@localhost   SELECT option_name, option_value FROM wp_options WHERE autoload = ‘S’ Reading mysql slow query log from /var/lib/mysql/slow.log.20131021 Count: 1354  Time=0.02s (31s)  Lock=0.00s (0s)  Rows=277.8 (376113), wpdata[wpdata]@localhost   SELECT option_name, option_value FROM wp_options WHERE autoload = ‘S’ これは改善の余地がありそうだ(たぶん)。DBサーバーのチューンではExplainというのが定番なようで、そのExplainを使ってこのテーブルをちょっと調べてみる。 mysql> EXPLAIN SELECT option_name, option_value FROM wp_options WHERE autoload = ‘S’\G; *************************** 1. row ***************************            id: 1   […]

Slowquerylogを取ってみることにしてみた

Slowquerylogというのは long_query_time 秒より実行に時間がかかる SQL ステートメントすべてが入ります by mysql公式ページ というもので、ボトルネックを探したりするものだ、と思う。多分。 てことでデフォルトではOFFになってるみたいなので、設定からやってみよう。 まずはMysqlのバージョンから、ちぇけちぇけー。 $ mysql -V mysql  Ver 14.14 Distrib 5.1.69, for redhat-linux-gnu (x86_64) using readline 5.1 mysql> SELECT version(); +————+ | version()  | +————+ | 5.1.69-log | +————+ 1 row in set (0.00 sec) 5.1だったわ、5.5だと思ってたw 5.1系で利用する場合でググるのさ。 # vi /etc/my.cnf slow_query_log = 1 log_output = FILE slow_query_log_file=/var/lib/mysql/slow.log long_query_time = 1 log_queries_not_using_indexes = 1 上から箇条書きすると ログを取るよ 出力を対象はFILE ログファイルを置くところは/var/lib/mysql/slow.log この秒数以上かかったやつを記録する インデックスを使用しないやつを記録する てな感じ。 mysqldを再起動して設定完了。 なのだが。。。 ところがどっこい。 # mysqldumpslow -s t /var/lib/mysql/slow.log Reading mysql slow query log from /var/lib/mysql/slow.log mysql> SHOW VARIABLES LIKE ‘slow%’; +———————+———————————+ | Variable_name       | Value                           | +———————+———————————+ | slow_launch_time    | 2                               | | slow_query_log      | OFF                             | | slow_query_log_file | /var/run/mysqld/mysqld-slow.log | +———————+———————————+ 3 […]