システムのボトルネック発見の為に、参考になるサイトを確認していたらGDB,AWK,SORTなどの
普段の運用で利用するコマンドを利用してボトルネックを確認するシェルを作成している人がいたので
参考にさせていただきました。Profilerとして利用するのに良さそうです。

GDB
GDB, the GNU Project debugger, allows you to see what is going on `inside’ another
program while it executes — or what another program was doing at the moment it crashed.

#!/bin/bash
nsamples=1
sleeptime=0
pid=$(pidof mysqld)

for x in $(seq 1 $nsamples)
  do
    gdb -ex "set pagination 0" -ex "thread apply all bt" -batch -p $pid
    sleep $sleeptime
  done | \
awk '
  BEGIN { s = ""; } 
  /Thread/ { print s; s = ""; } 
  /^\#/ { if (s != "" ) { s = s "," $4} else { s = $4 } } 
  END { print s }' | \
sort | uniq -c | sort -r -n -k 1,1

GDBがインストールされて無かったのでインストール

[root@CentOS64VM tools]# yum install gdb
Loaded plugins: fastestmirror, presto
Loading mirror speeds from cached hostfile
* base: ftp.nara.wide.ad.jp
* extras: ftp.nara.wide.ad.jp
* updates: ftp.nara.wide.ad.jp
Setting up Install Process
Resolving Dependencies
–> Running transaction check
—> Package gdb.x86_64 0:7.2-56.el6 will be installed
–> Finished Dependency Resolution

Dependencies Resolved

=====================================================================================
Package Arch Version Repository  Size
=====================================================================================
Installing:
gdb    x86_64 7.2-56.el6   base   2.3 M

Transaction Summary
=====================================================================================
Install 1 Package(s)

Total download size: 2.3 M
Installed size: 5.2 M
Is this ok [y/N]: y
Downloading Packages:
Setting up and reading Presto delta metadata
Processing delta metadata
Package(s) data still to download: 2.3 M

[省略]

Trying other mirror.
gdb-7.2-56.el6.x86_64.rpm           | 2.3 MB 00:13
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
Warning: RPMDB altered outside of yum.
Installing : gdb-7.2-56.el6.x86_64       1/1
Verifying : gdb-7.2-56.el6.x86_64 1/1

Installed:
gdb.x86_64 0:7.2-56.el6

Complete!
[root@CentOS64VM tools]#

GDBとスクリプトの準備が出来たので実行
Profiler

TPCC-MYSQLを実行して負荷をかけた状態でシステム状態を確認してみる。

[root@CentOS64VM tools]# ./poor_mans_profiler.sh
20
2 pthread_cond_wait@@GLIBC_2.3.2,os_cond_wait,reset_sig_count=2912),log_write_up_to,trx_commit_complete_for_mysql,innobase_commit,ha_commit_one_phase,he_command,mysql_parse,dispatch_command,do_handle_one_connection,handle_one_connection,pfs_spawn_thread,start_thread,clone
1 sigwait,signal_hand,pfs_spawn_thread,start_thread,clone
1 select,os_thread_sleep,srv_master_thread,start_thread,clone
1 pthread_cond_timedwait@@GLIBC_2.3.2,os_cond_wait_timed,time_in_usec=

こちらも合わせて確認:gdb -p `pidof mysqld`
How to debug lock (hang)

参考サイト
poor man’s profiler
漢(オトコ)のコンピュータ道
poormans-profiler
GDB: The GNU Project Debugger
ファイヤープロジェクト


MySQL Administrator と MySQL Query Browserどちらのツールも
データベース(スキーマ)作成、テーブル作成などが出来ますが、
データの変更はMySQL Query Browserのみが出来ます。

① MySQLAdministratorでのデータベースの作成

mysqladmin_cratedb

② MySQLAdministratorでのテーブルの作成
mysqladmin_cratetable

Maintenanceは…

[Optimize Table] — テーブルの最適化
[Check Table] —– テーブルのチェック
[Repair Table] —- テーブルの修復


障害発生時に既存のデーブルが残っていても、DROPしてからCREATE
テーブルを行いデータをリストアするため。(リストア先のDBはOver Writeされる)

[root@colinux ~]# mysqldump –add-drop-table –databases test > /tmp/backup_test.sql -u root -p
Enter password:
[root@colinux ~]# ls -l /tmp/backup_test.sql
-rw-r–r– 1 root root 3360 2009-02-06 11:19 /tmp/backup_test.sql
[root@colinux ~]#

db_restore

※ default設定なので、特にオプションは付けなくて良い。
   –skip-optしない限り、-optはdefaultで有効(add-drop-tableも有効)

※ 全てのDBをmysqldumpする場合は、
   「mysqldump –all-databases > ファイル.sql 」

※–single-transaction

[root@colinux tmp]# mysqldump –databases –single-transaction TEST > /tmp/backu
p_single_tran_test.sql -u root -p
Enter password:
[root@colinux tmp]# ls -l /tmp/backup_single_tran_test.sql
-rw-r–r– 1 root root 2891 2009-02-06 12:38 /tmp/backup_single_tran_test.sql
[root@colinux tmp]#

このオプションはサーバからデータをダンプする前にBEGIN SQLステートメント
を発行します。InnoDBといったトランザクションテーブルに対してのみ便利です。
なぜなら、アプリケーションをブロックせずに、BEGINが発行された当時の
データベースの状態をダンプするからです。

このオプションを使用しているときは、一定の状態でダンプされるのは
InnoDBテーブルのみだということを留意してください。
例えば、このオプションを使用中にダンプされたMyISAMやMEMORYテーブル
は状態が変化する可能性があります。


存在しているユーザーの確認

[root@colinux tmp]# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 26
Server version: 5.1.30 MySQL Community Server (GPL)

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the buffer.

mysql> use mysql
Database changed
mysql> select user,host,password from mysql.user;
+———-+———–+——————————————-+
| user     | host      | password                                  |
+———-+———–+——————————————-+
| root     | localhost | *N41EFFFE1191DDDD7D3F2B6F5A9CDDD0DDDDDC3D |
| root     | colinux   | *N41EFFFE1191DDDD7D3F2B6F5A9CDDD0DDDDDC3D |
| root     | 127.0.0.1 | *N41EFFFE1191DDDD7D3F2B6F5A9CDDD0DDDDDC3D |
| variable | %         | *N41EFFFE1191DDDD7D3F2B6F5A9CDDD0DDDDDC3D |
+———-+———–+——————————————-+
4 rows in set (0.00 sec)

mysql>

ユーザー権限の確認

mysql> SELECT Host, User, Select_priv, Insert_priv,Update_priv, Delete_priv FROM user;
+———–+———-+————-+————-+————-+————-+
| Host      | User     | Select_priv | Insert_priv | Update_priv | Delete_priv |
+———–+———-+————-+————-+————-+————-+
| localhost | root     | Y           | Y           | Y           | Y           |
| colinux   | root     | Y           | Y           | Y           | Y           |
| 127.0.0.1 | root     | Y           | Y           | Y           | Y           |
| %         | variable | Y           | Y           | Y           | Y           |
+———–+———-+————-+————-+————-+————-+
4 rows in set (0.01 sec)

mysql>

ユーザーとDB毎の権限確認

mysql> select Db,User,Host,Select_priv from db;
+———+——-+———–+————-+
| Db      | User  | Host      | Select_priv |
+———+——-+———–+————-+
| test    |       | %         | Y           |
| test\_% |       | %         | Y           |
| DB02    | admin | localhost | Y           |
+———+——-+———–+————-+
3 rows in set (0.00 sec)

mysql> select Db,User,Host,Select_priv,Insert_priv,Update_priv from db;
+———+——-+———–+————-+————-+————-+
| Db      | User  | Host      | Select_priv | Insert_priv | Update_priv |
+———+——-+———–+————-+————-+————-+
| test    |       | %         | Y           | Y           | Y           |
| test\_% |       | %         | Y           | Y           | Y           |
| DB02    | admin | localhost | Y           | Y           | Y           |
+———+——-+———–+————-+————-+————-+

3 rows in set (0.49 sec)

mysql>

mysql_priv

mysql_priv