b.l0g.jp

MySQLでテーブルの行数を数える

without comments

このエントリーをはてなブックマークに追加
はてなブックマーク - MySQLでテーブルの行数を数える
Share on Facebook

テーブル内の行数を数えるのに一番簡単なのは、

select count(*) from 'テーブル名';

と実行することだが、これだと最悪そのテーブルを総なめすることになる。
こういう時はinformation schemaから情報を引く。information_schema.tablesテーブルのtable_rowsカラムが行数。

mysql> select table_schema, table_name, table_rows from information_schema.tables
    -> where table_schema = 'hoge';
+--------------------+---------------------------------------+------------+
| table_schema       | table_name                            | table_rows |
+--------------------+---------------------------------------+------------+
| hoge               | wp_FollowMe_Links                     |          2 |
| hoge               | wp_commentmeta                        |        180 |
| hoge               | wp_comments                           |         60 |
| hoge               | wp_ktaisession                        |          0 |
| hoge               | wp_links                              |          7 |
| hoge               | wp_options                            |        236 |
| hoge               | wp_postmeta                           |        509 |
| hoge               | wp_posts                              |        323 |
| hoge               | wp_term_relationships                 |         39 |
| hoge               | wp_term_taxonomy                      |          9 |
| hoge               | wp_terms                              |          9 |
| hoge               | wp_usermeta                           |         31 |
| hoge               | wp_users                              |          2 |
+--------------------+---------------------------------------+------------+

showを使っても行数を引くことができるが、showの性質上表示させるカラムなどを細かく指定できず使いづらいこともあるので、information_schemaを引く方が好き。

show table status;

なおこれらのコマンドで引ける行数は、MyISAMなどのストレージエンジンでは正確な値だが、InnoDBの場合は概算値となる。なので、InnoDBの場合はselect count(*)するしかない。

Written by admin

12月 6th, 2011 at 3:24 pm

Posted in MySQL

Ubuntu Server 11.04マシンでUSB無線LANアダプタを使う

with one comment

このエントリーをはてなブックマークに追加
はてなブックマーク - Ubuntu Server 11.04マシンでUSB無線LANアダプタを使う
Share on Facebook

少し前に自宅で色々と検証したりするために、HP ML110 G6を買い、Ubuntu Server 11.04をインストールした。自宅は通信費節約のため、固定回線を引かず、外出時もそのまま使えるようにUQ WiMAXの回線を契約し、Aterm WM3500Rという無線LANルータを使っている。このため、ML110を無線LAN接続する必要がある。

近くのビックカメラで、安くて小さいUSB無線LANアダプタとしてプラネックスのGW-USNano2-Mを買ってきて、無線LANルータ経由でインターネットに接続するまでのメモ。

Ubuntu DesktopならGUIツールであれこれできるが、Serverなので全部CLIで。

ドライバパッケージをダウンロード

GW-USNano2-?(MやG)は、RealtekのRTL8192CUという無線LANチップを使っているようなので、これに対応したドライバをダウンロード。Realtekのダウンロードページを開き、以下のようにリンクをたどる

  1. Communications Network ICs
  2. Wireless LAN ICs
  3. WLAN NIC
  4. IEEE 802.11b/g/n Single-Chip
  5. Software
  6. RTL8192CUにチェックし、goボタン
  7. 「Linux driver for Kernel 2.6.38(and earlier)」から、RTL8192CU_linux_v3.1.2590.20110922.zipをダウンロード

ドライバのインストール

パッケージを展開し、コンパイル、インストール

$ unzip RTL8192CU_linux_v3.1.2590.20110922.zip
$ cd RTL8192CU_8188CUS_8188CE-VAU_linux_v3.1.2590.20110922/
$ sudo sh install.sh

※ Ubuntu Serverをインストールした直後は、makeやgccがインストールされないので、事前にsudo apt-get install make gccしておく。

インストールされたら、ドライバモジュールがロードされていることを確認

$ lsmod
Module Size Used by
nls_utf8 12557 0
isofs 40283 0
vesafb 13761 1
8192cu 508081 0 ← ロードされている
lp 17789 0
parport 46458 1 lp
usbhid 46956 0
hid 91020 1 usbhid
tg3 141750 0

無線LAN設定

WPA認証情報をファイルに書き込む。SSIDとキーは使用している無線LANアクセスポイントのものに置き換える。

$ wpa_passphrase [SSID] [キー] > wpa_supplicant.conf
$ sudo mv wpa_supplicant.conf /etc/wpa_supplicant/
$ sudo chown root:root /etc/wpa_supplicant/wpa_supplicant.conf

認証の設定を/etc/network/interfaceに設定を書き込む。DHCPを使用する場合の例。3行目のSSIDは上と同じく置き換えること。

auto wlan0
iface wlan0 inet dhcp
wpa-essid [SSID]
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

マシンを再起動

$ sudo reboot

再起動後、wlan0というインタフェースができており、ネットワークに接続できればOK。iwconfigコマンドで無線インタフェースの状態を確認できる。

lo        no wireless extensions.

eth0      no wireless extensions.

wlan0     IEEE 802.11bgn  ESSID:"aterm-xxxxxx-g"  Nickname:"<WIFI@REALTEK>"
          Mode:Managed  Frequency:2.412 GHz  Access Point: xx:xx:xx:xx:xx:xx
          Bit Rate:150 Mb/s   Sensitivity:0/0
          Retry:off   RTS thr:off   Fragment thr:off
          Power Management:off
          Link Quality=47/100  Signal level=47/100  Noise level=0/100
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

Written by admin

11月 28th, 2011 at 4:17 pm

Posted in Linux

historyに時刻を記録する

without comments

このエントリーをはてなブックマークに追加
はてなブックマーク - historyに時刻を記録する
Share on Facebook

bash 3.0以上(最近のLinuxは大抵3.0以上)を使用している場合は、「HISTTIMEFORMAT」というシェル変数に時刻のフォーマットを入れることで、historyコマンドの実行結果(ファイル)にコマンドだけではなく時刻も記録できる。以下はhistoryコマンドの実行結果の例。

100  2011-11-22 10:16:59 ls
101  2011-11-22 10:17:03 cd /var/log/
102  2011-11-22 10:17:04 ls

ホームディレクトリ以下の.bashrcや/etc/profile(全ユーザに適用したい場合)に

HISTTIMEFORMAT='%Y-%m-%d %T '

と書いておけばよい。時刻のフォーマットはdateコマンドと同じものが使えるようだ(man dateを参照)。

なお、historyコマンドでは上記のようなフォーマットが有効だが、.bash_historyファイルには、

#1321924619
ls
#1321924623
cd /var/log/
#1321924624
ls

のように、UNIX時刻が付加される形で記録される。

Written by admin

11月 25th, 2011 at 12:05 am

Posted in シェル

携帯キャリアの使用するIPアドレス帯一覧

without comments

このエントリーをはてなブックマークに追加
はてなブックマーク - 携帯キャリアの使用するIPアドレス帯一覧
Share on Facebook

携帯キャリアのIPアドレス帯を調べる機会があったので、メモとして載せておく。ソフトバンクは2011年9月30日からサイトのアドレスが変わっているので注意。

Written by admin

9月 30th, 2011 at 10:30 pm

Posted in 未分類

CentOSで各種ビープ音を鳴らさないようにする

without comments

このエントリーをはてなブックマークに追加
はてなブックマーク - CentOSで各種ビープ音を鳴らさないようにする
Share on Facebook

<ログイン時>

Xを起動するようにしていると(ランレベル5)、ログイン画面表示時にビープ音が鳴る。

「システム(System)」→「管理(Administration)」→「ログイン画面(Login Screen)」から「アクセシビリティ(Accessibility)」タブを開き、「ログイン画面を表示した時」のチェックを外す。

ログアウトし、次にログイン画面が表示されるときには、ビープ音は鳴らないようになっているはず。

<ターミナル使用時>

ターミナルを使用している時にタブを使ったりすると、ビープ音が鳴ることがある。

/etc/inputrc に以下の行を追加する(コメントアウトされた状態で既に記述があるはず)


set bell-style none

ログインしなおすと、設定が有効になりビープ音は鳴らなくなる。

<vi>

vi(vim)を使用していると、コマンドを間違えた時などにビープ音が鳴る。

viの設定ファイル(ホームディレクトリの.vimrcや/etc/skel/.vimrcなど)に以下の行を追加する。


set visualbell

記述してからviを起動すると、ビープ音は鳴らなくなる。

<全部のビープ音を鳴らないようにする>

ビープ音は、pcspkrというモジュールを経由して、マザーボード上のスピーカを動かして鳴らしている。このモジュール自体をロードしないようにしてしまえば、ビープ音は鳴らない。

/etc/modprobe.d/blacklist ファイルに以下の行を追加する。


blacklist pcspkr

<VMware Playerを使用している場合>

VMware Playerを使用している時には、ゲストOSでビープ音が鳴るタイミングで、VMware Playerを通じて、ホストマシンのビープ音が鳴ってしまう。これを鳴らさないようにするには、VMware側の設定でビープを無効にしてしまう。

C:\Users\(ユーザ名)\AppData\Roaming\VMware\preferences.ini ファイルと、対象になる仮想マシンの設定ファイル(.vmx)に以下の行を追加する。


mks.noBeep = "TRUE"

出典 : VMwareのKnowledge base

<Windowsでビープ音を鳴らさないようにする>

ついでにWindowsの場合も。ビープ音を鳴らすドライバを無効にしてしまう。以下、Windows 7での例。

  1. コントロールパネルなどから「デバイスマネージャ」を起動
  2.  「表示」→「非表示のデバイスの表示」
  3. ツリーから「プラグアンドプレイではないドライバ」→「Beep」を右クリックし、プロパティ
  4.  「ドライバー」タブで「停止」を選択

以上

Written by admin

8月 18th, 2011 at 11:59 pm

Posted in Linux

bshでのクォーテーションの入れ子

without comments

このエントリーをはてなブックマークに追加
はてなブックマーク - bshでのクォーテーションの入れ子
Share on Facebook

特殊文字(?など)をそのまま文字として扱いたい場合などに、シングルクォーテーション(‘)やダブルクォーテーション(“)で文字をくくる。

  • 「”」でくくった文字列は、その中に特殊文字が含まれているならそれを展開する。
  • 「’」でくくった文字列は、その中に特殊文字が含まれていてもそれを展開せず、そのまま表示する。
[hoge@symf test]$ abc=3
  ↑ abcという変数に3を代入
[hoge@symf test]$ echo $abc
3
  ↑ abcという変数の中身を表示
[hoge@symf test]$ echo "$abc"
3
  ↑ 「"」は特殊文字を展開するので変数として扱われるので、上に同じ
[hoge@symf test]$ echo '$abc'
$abc
  ↑ 「'」は特殊文字をそのまま表示する

クォーテーションを入れ子にする際には、シングルとダブルで少しやり方が違う。「man bash」の「クォート」の項には以下のように書かれている。

シングルクォートで文字を囲むと、クォート内部のそれぞれの文字は文字としての値を 保持 します。シングルクォートの間にシングルクォートを置くことはできません。これはバックスラッシュを前に付けても同じです。

ダブルクォートで文字を囲むとクォート内部の全ての文字は文字としての値を保持しま すが、 $, ‘, \ は例外となります。 $ と ‘ はダブルクォートの内部でも特殊な意味を失いません。バックスラッシュの場合は、次の文字が $, ‘, “, \,のいずれかである 場合に限り特殊な意味を失いません。前にバックスラッシュを付ければ、ダブルクォート文字をダブルクォートによるクォートの内部でクォートできます。

つまりこういうこと。

[hoge@symf test]$ ssh server "psql -c \"create database test with ENCODING = 'UTF8' ;\" "
  ↑ 「"」の中に「\"」があるので、これは成功

[hoge@symf test]$ ssh server 'psql -c \"create database test with ENCODING = 'UTF8' ;\" '
  ↑ 「'」の中では「\」をつけてもダメなので、これは失敗

create databaseじゃなくてcreatedbを使えば、クォートを入れ子にしなくてもいいって?あくまで例ですから (`・ω・´)キリッ

Written by admin

8月 3rd, 2011 at 9:30 pm

Posted in シェル

shのwhileループでファイルを読み、中でsshを実行すると1回しかループしない

without comments

このエントリーをはてなブックマークに追加
はてなブックマーク - shのwhileループでファイルを読み、中でsshを実行すると1回しかループしない
Share on Facebook

シェル(sh)スクリプトネタ。

while 文で以下のように指定すると、行ごとにファイルを読み込むことができる。

#!/bin/sh

# ファイルを1行ずつ読み込んで表示

TESTFILE=./hoge.txt

while read line
do
echo $line
done &lt; $TESTFILE

しかし、 while ループの中で ssh や rsh を実行すると、読み込むファイルが複数行あっても、1行目しか処理されない。

#!/bin/sh

# TESTFILEが複数行あっても1行目のみ処理されてループ終了

while read line
do
ssh 192.168.0.1 touch $line
done &lt; $TESTFILE

SSH を実行すると、標準入力がそちらに振り向けられるため、read で読んだ1行のみならず、ファイル全体が SSH に渡されてしまう。従って、SSH を実行した後はもう読める行がないので while ループは1回で終了してしまう。

これを防ぐには、ssh に -n オプションを付け、/dev/null をリダイレクトし、標準入力をリダイレクトしないようにする。

#!/bin/sh

# TESTFILEが複数行あればその行数分処理が実行される

while read line
do
ssh -n 192.168.0.1 touch $line
done &lt; $TESTFILE

なおこれは rsh コマンドでも同じ仕様になっているようだ。

なぜ1行目だけで終わってしまうのか分からずうんうんうなってたら、この本に書いてあった。

Written by admin

3月 18th, 2011 at 2:39 pm

Posted in 開発

ディレクトリをディレクトリにマウント

without comments

このエントリーをはてなブックマークに追加
はてなブックマーク - ディレクトリをディレクトリにマウント
Share on Facebook

Linuxで、ディスクデバイスではなく、ディレクトリをディレクトリにマウントしたい時は

mount --bind マウントしたいディレクトリ マウントポイント

fstabに書いてしまうときは以下のように書く。

マウントしたいディレクトリ マウントポイント none bind 0 0

例えば /home を /hoge/home としてマウントしたい時は

/home /hoge/home none bind 0 0

なお、マウントしたいディレクトリ(上の例では/hoge)よりも後にこの行を書かないと、マウントできないので注意。

Written by admin

2月 23rd, 2011 at 11:42 pm

Posted in 開発

sarコマンドでシステムのボトルネックを探る(2)

without comments

このエントリーをはてなブックマークに追加
はてなブックマーク - sarコマンドでシステムのボトルネックを探る(2)
Share on Facebook

CPUの処理の状況を調べるためには、sar (sar -u)が有効であることを前のエントリで書いた。次はメモリの使用状況を調べてみる。まず見てみるのは、メモリとスワップの使用状況を示す sar -r の結果である。

[doublemarket@hoge ~]$ sar -r
Linux 2.6.18-194.8.1.el5 (hoge)       2011年02月15日

00時00分01秒 kbmemfree kbmemused  %memused kbbuffers  kbcached kbswpfree kbswpused  %swpused  kbswpcad
00時10分01秒     12964    497568     97.46     30880    107440   1984336     63940      3.12     16392
00時20分01秒     13064    497468     97.44     30972    107376   1984336     63940      3.12     16392
00時30分01秒     12692    497840     97.51     31092    107236   1984336     63940      3.12     16392
:
:
20時20分01秒     43756    466776     91.43     45624    139552   1984336     63940      3.12     16288
20時30分01秒     27008    483524     94.71     46420    147608   1984336     63940      3.12     16288
20時40分01秒     22664    487868     95.56     46840    148920   1984336     63940      3.12     16288
20時50分01秒     22300    488232     95.63     47192    148968   1984336     63940      3.12     16288
平均値:      84267    426265     83.49     32592    129944   1984336     63940      3.12     16300

それぞれの列の意味は以下の通り。

kbmemfree
物理メモリの未使用KB。
kbmemused
物理メモリの使用済みKB。
%memused
物理メモリの使用率。Linuxでは、使用されていないメモリ領域をファイルシステムキャッシュ領域として使用するので、通常はほとんどfree部分はないものと考えてよい。従って、常に90数%といった高い使用率になる。実際にアプリケーションの動作に使われているメモリの量は、下の指標を確認する必要がある。
kbbuffers
カーネルがバッファ領域として使用しているメモリ量のKB。
kbcached
カーネルがキャッシュとして使用しているメモリ量のKB。kbmemusedからkbbufferesとkbcachedを引いた値が、実際にアプリケーションに割り当てられているメモリ量ということになる。逆に言えば、kbbufferesとkbcachedの容量が、kbmemusedの大部分を占めているようなら、アプリケーションにとってメモリ不足とは言えないということになる。
kbswpfree
スワップ領域の未使用量KB。
kbswpused
スワップ領域の使用済みKB。
%swpused
スワップ領域の使用量。通常ほとんど0だが、物理メモリが不足してくると使用率が上がってくる。数%であれば実質的にシステムの動作には影響がない場合が多いが、あまり多いようだと、スワップ領域へのアクセスが頻発している可能性もあり、システム全体のスループットを落とすことがある。%swpusedが大きく、かつsar -uのiowaitの値も大きい場合、ほぼ間違いなくスワップ領域へのアクセスでスローダウンしているので、物理メモリの増設などのメモリ不足解消策を取る必要がある。
kbswpcad
何の指標かよく分からなかったが、manページによると、一旦スワップ領域へ飛ばされたものの(スワップアウト)、スワップ領域からメモリに戻され(スワップイン)、かつまだスワップ領域にデータが残っている、というデータの量とのこと。

各列の値の傾向を見ると、上記のようにメモリ不足なのかどうかの手がかりが得られる。その他に詳しい情報を見たいときは、以下のオプションも用意されている。

sar -R
メモリ上のページの使用状況。
sar -W
スワップの発生状況。ページイン(スワップ領域から物理メモリへのページの移動)とページアウト(物理メモリからスワップ領域へのページの移動)がどの程度発生したのかを確認できる。
sar -B
ページングの状況。ページイン・ページアウトされたデータ容量、ページフォルトの回数、メジャーなページフォルトの回数をそれぞれ確認できる。

Written by admin

2月 21st, 2011 at 10:07 pm

Posted in 開発

sarコマンドでシステムのボトルネックを探る(1)

with one comment

このエントリーをはてなブックマークに追加
はてなブックマーク - sarコマンドでシステムのボトルネックを探る(1)
Share on Facebook

前回のエントリでは、システムのレスポンスが悪化している場合、まずとっかかりとしてtopコマンドを実行し、ロードアベレージを確認する方法を書いた。さらに踏み込んで、何が負荷の原因なのかを探るために、sarコマンドを使う方法について書く。

sarコマンドをオプションをつけずに実行すると、以下のような出力が得られる。ファイルを指定しないと、コマンドを実行した当日の0:00から直前までの10分おきの情報が表示される。過去の情報は/var/log/saディレクトリ以下に保存されており、「sar -f sa07」などと指定すると、そのファイルに保存された情報が閲覧できる。saの後の数字は日付を表している。

sarを実行してもコマンドが見つからない場合、sysstatパッケージがインストールされていないので、インストールすべし。

[doublemarket@hoge ~]$ sar
Linux 2.6.18-194.8.1.el5 (hoge)       2011年02月15日

00時00分01秒     CPU    %user    %nice  %system  %iowait   %steal    %idle
00時10分01秒     all     0.05     0.00     0.08     0.02     0.00    99.85
00時20分01秒     all     0.03     0.00     0.08     0.02     0.00    99.88
00時30分01秒     all     0.07     0.00     0.11     0.02     0.00    99.79
:
:
20時00分01秒     all     0.03     0.00     0.06     0.00     0.00    99.90
20時10分01秒     all     0.06     0.00     0.11     0.03     0.00    99.80
20時20分01秒     all     0.16     0.00     0.14     0.03     0.00    99.67
20時30分01秒     all     1.11     0.00     0.27     0.12     0.00    98.50
20時40分01秒     all     0.08     0.00     0.12     0.05     0.00    99.76
平均値:        all      0.08     0.00     0.10     0.09     0.00    99.73

ここで得られる結果は、sar -uと同じものである。それぞれの列の意味は以下の通り。

user
ユーザプログラムの実行に使用されたCPUリソースの割合
nice
niceによる優先度を処理するために使用されたCPUリソースの割合
system
カーネルが使用したCPUリソースの割合
iowait
I/O待ちの割合
idle
I/O待ち以外でCPUが待ち状態だった割合(何もしていない時間)

なお、マルチCPUの環境の場合ここに表示されているのは、全CPUの合算使用率になっている。それぞれのCPUの使用率を確認したい場合、「sar -P ALL」を実行する。意外と処理が特定のCPUに偏っていたりするので、こちらも確認してみた方がよい。

→ sarコマンドの実行結果からシステムの負荷状況に関して、以下の傾向がつかめる。

userの値だけが高い(他の値は低いまま)
CPUリソースを必要とするアプリケーションが動作している。
topやps auwxなどのコマンドでプロセスごとのCPU使用率を調べ、無限ループなどの不具合によるCPU使用率の上昇でないかなど、異常を確認。単に処理が重くなっているだけなら、スケールアップ(CPUを高速化)、スケールアウト(マシンを増設)を検討する。
iowaitの値が高い
そのマシンに求められる処理に対して、ハードディスクの速度が追いついていない。アプリケーションやミドルウェア(特にデータベースなど)のキャッシュの仕組みを見直したり、読み書きに使う物理的なディスクを分散させるなどして、なるべくディスクの読み書きが発生しない方法を考える。それでも高いままなら、より高速なディスクを使うしかない。なおたいていの場合は
・アプリケーション自体がディスクにアクセスする速度が遅い
・メモリが不足していてスワップ領域(つまりディスク)へのアクセスが頻発していて遅い
の2つに問題を分けることができる。このうちのどちらかという判断は、sar -rの結果などを見る必要がある。
systemの値が高い
仕組み的にいえば、コンテキストスイッチがたくさん発生していると値が上がるはずなので、必要以上にたくさんのプログラムを並列に処理しすぎていると、この値が異常に上がるということになるが、よく分からない。

sarコマンドには、メモリやディスク、ネットワークなどに関する情報が得られるよう、他にも色々なオプションがある。

Written by admin

2月 17th, 2011 at 9:59 pm

Posted in 開発