2009年2月23日 (月)

mysqlデータベース

現在のmysqlデータベースのテーブル一覧

■time_zone
time_zone
time_zone_leap_second
time_zone_name
time_zone_transition
time_zone_transition_type

■権限
columns_priv
db
tables_priv
user
procs_priv
host

■ストアドルーチン、イベント、
proc
func
event

■ログ
slow_log
general_log

■ヘルプ
help_category
help_keyword
help_relation
help_topic

■プラグイン
plugin

| | コメント (0) | トラックバック (0)

2009年1月27日 (火)

ARCHIVE ストレージエンジン

ストレージエンジンの中でもどちらかというとマイナーな部類に入ると
思われ、文字通りデータの保存用目的で使用することが多いだろう
ストレージエンジンです。

ARCHIVEストレージエンジンの特徴は、とにかくサイズが小さいこと!
挿入されたデータは、圧縮された保存されるためにサイズが小さくなります。
簡単に作成してみたところ、MyISAMと比較すると20,000行くらいのデータでは、
軽く100倍位サイズが小さいのです。

ただし、UPDATEやDELETE出来なかったり、BLOB型のデータ型が
使用できなかったりと、色々と制限があります。

そんなわけで、ちょっとマイナーなARCHIVEストレージエンジンについて
まとめてみました。

■特徴
・とにかくサイズが小さい。
・行レベルロック

■制限 

 制限が沢山あるので注意しよう。

・INSERT,UPDATEはできるが、DELETE,REPLACE,UPDATEが出来ない。
 保存目的でどんどんデータを溜め込むタイプであることがこれで分かるでしょう。
 DELETE出来ないってことは、不必要になったらDROP TABLEするしかないって事かぁ。
 もし、古いデータを一部消したい場合には、PARTITIONを組んでPARTITIONごと
 削除する等の方向に持っていかないとなのかなぁ。

・BLOB型、及び空間データ型(Spatil Data)は使用できない。

・AUTO_INCREMENTは使用できる。
 AUOT_INCREMENTカラムに対するインデックスの有無は選択可能。
 だけど、AUTO_INCREMENTカラム以外にインデックスは付けられない。
 つまり、インデックス作成したいならAUTO_INCREMENTカラムにしてねって事。

・ORDER BYが使用できない。
 上記のインデックスの話を踏まえると納得。

・OPTIMIZE TABLEでさらに圧縮率が上がる。

■内部的な動き
 本当は、ソースを読むのが確実だけど、リファレンスマニュアルをみて
 まとめてみました。

 INSERT:
 挿入されるごとに1行ごと圧縮され、基本的に圧縮されたデータは毎回 
 バッファからディスクにフラッシュされるよう。一度に大量の挿入があった場合
 (Bulk INSERT)には、全て挿入が終わった後に、データも反映されるようになる。

 SELECT:
 取り出しの際に、対象行を都度解凍する。

こんなところでしょうか。

個人的には、UPDATEやDELETEが出来ないのでよほどディスク量に制限がなければ他のストレージエンジンでもいいんじゃないかなぁと思います。INDEXも、AUTO_INCREMENTカラムでしか使用できないので、ある程度量が増えるとSELECTに時間がかかるのでは・・・と思います。(データの解凍+全テーブルスキャンが発生するので。)

| | コメント (0) | トラックバック (0)

2009年1月26日 (月)

MySQL Clsuter Geograghical Replicationでauto_increment

1_3

上図のように、MySQL ClusterでGeographical Replication (マスタ・マスタ)のときに、
auto_incrementを使用したいときはどうしたらよいか??

Clusterごとにauto_increment を設定する。

左のMySQL Clsuter
auto_increment_increment=2
auto_increment_offset=1

右側のMySQL Clsuter
auto_increment_increment=2
auto_increment_offset=2

と設定するとうまくいく。

| | コメント (0) | トラックバック (0)

2009年1月 7日 (水)

テーブル名やカラム名のリネーム

あけましておめでとうございます。
気ままに更新しているこのサイトですが、今年もどうぞ宜しくお願いいたします。

タイトルのSQL文、本当はすらすらと出てこないといけないのかなぁ。
めったに使用しないので忘れてしまいます(@Д@;
ということでメモ

■カラム名とデータ型の変更
 カラム名とデータ型を変更したい場合はCHANGEを使用
 mysql> ALTER TABLE CHANGE <古いカラム名> <新しいカラム名> <新しいデータ型>;

■テーブル名の変更
 RENAME ASを使用
 mysql> ALTER TABLE <古いテーブル名> RENAME AS <新しいテーブル名>;
 

| | コメント (0) | トラックバック (0)

2008年12月24日 (水)

mysqldにバグを仕込んでみた。

そんなたいそうなものではないのですが、gdbを使用してcoreファイルの解析っぽいものがしてみたかったのです。

mysqldにバグを仕込んで停止させてみる。その際にcoreファイルを出力させて
バグの場所を特定してみよう。

1.バグを仕込む
 今回はmi_write関数の中に、以下のコードを追加。

 char *ptr, str;
  ptr=str;

  strは初期化も値の代入もされていないので
 sagmentation falutで落ちるはず。

2.Coreファイルが出力されるように設定されているか確認。
 [root@localhost ~]# ulimit -a
 core file size          (blocks, -c) unlimited
 data seg size           (kbytes, -d) unlimited
 file size               (blocks, -f) unlimited
 pending signals                 (-i) 1024
 max locked memory       (kbytes, -l) 32
 max memory size         (kbytes, -m) unlimited
 open files                      (-n) 1024
 pipe size            (512 bytes, -p) 8
 POSIX message queues     (bytes, -q) 819200
 stack size              (kbytes, -s) 10240
 cpu time               (seconds, -t) unlimited
 max user processes              (-u) 16384
 virtual memory          (kbytes, -v) unlimited
 file locks                      (-x) unlimited

core file sizeがunlimitedになっているのでOK.

3.mysqldを起動
 coreが出力されるように、オプションをつける。
 #mysqld --core-file

4.バグを踏むようにデータを挿入
 #mysql -uroot
  mysql> use test
  mysql> create table t(a int)engine=myisam;
  mysql> insert into t values(100);
  ここでエラー。mysqldが落ちた。

5.coreファイルを確認
 [root@localhost data]# ls
 core.4239    ib_logfile1  localhost.err              localhost.localdomain.err -old  mysql
 ib_logfile0  ibdata1      localhost.localdomain.err  localhost.pid                  test

6.コアファイルを使用して解析~。
 #gdb --tui mysqld -c core.4239

7.gdbを使用して解析~。
(gdb) info threads
  10 process 4239  0x0067a7a2 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2
  9 process 4241  0x0067a7a2 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2
  8 process 4242  0x0067a7a2 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2
  7 process 4243  0x0067a7a2 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2
  6 process 4244  0x0067a7a2 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2
  5 process 4246  0x0067a7a2 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2
  4 process 4247  0x0067a7a2 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2
  3 process 4248  0x0067a7a2 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2
  2 process 4249  0x0067a7a2 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2
* 1 process 4251  0x0067a7a2 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2
(gdb)

ふむふむ。スレッドは11個 今はthread1に接続しているので、
詳しく中身を見てみる。

(gdb) bt
#0  0x0067a7a2 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2
#1  0x008fb95b in pthread_kill () from /lib/tls/libpthread.so.0
#2  0x084c8e52 in my_write_core (sig=11) at stacktrace.c:310
#3  0x0821e057 in handle_segfault (sig=11) at mysqld.cc:2508
#4  <signal handler called>
#5  0x08482252 in mi_write (info=0xa0a97d0, record=0xa0abe88 "x") at mi_write.c:54
#6  0x084675c3 in ha_myisam::write_row (this=0xa0abd70, buf=0xa0abe88 "x") at ha_myisam.cc:741
#7  0x0830de34 in handler::ha_write_row (this=0xa0abd70, buf=0xa0abe88 "x") at handler.cc:4562
#8  0x082a3580 in write_record (thd=0xa08d430, table=0xa0ab2d0, info=0xb17cc600) at sql_insert.cc:1568
#9  0x082a2042 in mysql_insert (thd=0xa08d430, table_list=0xa0d8e68, fields=@0xa08ea2c, values_list=@0xa08ea50, update_fields=@0xa08ea44, update_values=@0xa08ea38, duplic=DUP_ERROR, ignore=false)
    at sql_insert.cc:812
#10 0x0822c6bd in mysql_execute_command (thd=0xa08d430) at sql_parse.cc:3016
#11 0x082323be in mysql_parse (thd=0xa08d430, inBuf=0xa0d8dc0 "insert into t values(120)", length=25, found_semicolon=0xb17cd268) at sql_parse.cc:5727
#12 0x0822931d in dispatch_command (command=COM_QUERY, thd=0xa08d430, packet=0xa0d0d91 "insert into t values(120)", packet_length=25) at sql_parse.cc:1152
#13 0x082289ce in do_command (thd=0xa08d430) at sql_parse.cc:809
#14 0x08227698 in handle_one_connection (arg=0xa08d430) at sql_connect.cc:1115
#15 0x008f8371 in start_thread () from /lib/tls/libpthread.so.0
#16 0x0075fffe in clone () from /lib/tls/libc.so.6

ここでまず、#4に注目!!
シグナルハンドラが呼ばれています。

ということは、#1~#3はシグナルハンドラによって呼ばれた関数って事。
つまり、#4の前である#5の関数にバグがあることが分かる!
(お、確かにmi_write関数で止まっているぞ。)

ということで#5のスタックを詳しく見てみるために、#5のスタックに移動・・・。

(gdb) frame 5
#5  0x08482252 in mi_write (info=0xa0a97d0, record=0xa0abe88 "x") at mi_write.c:54

すると、該当行で停止しているのを確認。
>x54        *ptr=str;

おお!確かにバグを仕込んだ場所です。

ということで特定終了。

今回は自分で仕込んだバグ&関数の先頭にバグを仕込んじゃったので、
簡単に見つけることが出来たけど、本物のバグを見つけるのはもっと困難なんだろうなぁ。

| | コメント (1) | トラックバック (0)

2008年10月28日 (火)

sshを使用してrootでリモートログインしたい時(Solaris)

1./etc/ssh/sshd_config
permit root loginの項目をyesに変更

2.sshの再起動
svcadm refresh ssh

| | コメント (0) | トラックバック (0)

Solaris IPアドレス 変更

・ネットワークアドレスの変更(コマンドで変更)

# ifconfig e1000g0 down  ← 停止
# ifconfig e1000g0 192.168.0.1 netmask 255.255.255.0
# ifconfig e1000g0 up  ← 起動

・ネットワークアドレスの変更(ファイル編集)

/etc/hostname.e1000g0のファイル編集により、IPアドレスを変更する。

# vi /etc/hostname.e1000g0

192.168.0.1

設定を反映させるため、ホストを再起動。

| | コメント (0) | トラックバック (0)

2008年10月27日 (月)

zoneの色々

zoneの起動
#zoneadm -z my-zone boot
zoneの停止
#zoneadm -z my-zone halt

zoneの設定ファイルの所在
/etc/zones/の中にある。
それぞれのzoneの設定はmy-zone.xmlの中に記述
おそらくzonecfgで設定する内容はここに書かれる。
中にはindexに書かれるもののあるのだけれれど・・・。

・ZoneのIPアドレスの変更
サブネットマスクまで変える方法が分からなくて四苦八苦(汗;
でも、何てことなかった・・・。

面倒なのでコマンドだけ記述。
zonecfg -z my-zone add net set physical=***.***.***.***/** end commit
/**でよかったんだ~
わざわざzonecfgで設定しなくても、my-zone.xmlを変更してしまったほうが早いかも~。

もう一つ。

・zoneの名前の変更
zonecfg -z my-zone
set zonename=new-zone-name
commit exit
名前変更しても、zoneのファイルパスの名前は変更されない。 もしファイルパスを変えたかったらmy-zone.xml及びindexのパスを変更する必要がある。 これって邪道!?

| | コメント (0) | トラックバック (0)

2008年10月20日 (月)

ユーザ変数の使い方

もともとあるテーブルにカラムを追加し、そこに一意の値を入力したい場合。

mysql> select * from t;
+------+------+
| a    | b    |
+------+------+
| NULL |    1 |
| NULL |    1 |
| NULL |    1 |
| NULL |    1 |
| NULL |    1 |
| NULL |    1 |
+------+------+
6 rows in set (0.00 sec)

mysql> set @a=0;

mysql> update t set a=(@a:=@a+1);
Query OK, 6 rows affected (0.03 sec)
Rows matched: 6  Changed: 6  Warnings: 0

mysql> select * from t;
+------+------+
| a    | b    |
+------+------+
|    1 |    1 |
|    2 |    1 |
|    3 |    1 |
|    4 |    1 |
|    5 |    1 |
|    6 |    1 |
+------+------+
6 rows in set (0.00 sec)

update文は1文で書いてあるけれど、1行1行ごと数値計算が実行されていくので
上記みたいに1づつ増えていくみたい。便利便利。

| | コメント (0) | トラックバック (0)

2008年10月 6日 (月)

Solaris 10にZoneを構築してみた!

Zoneは1台の物理サーバ上に、仮想的に独立したSolaris環境を複数実現する技術のこと。
仮想的なSolaris環境は分離,独立していて、お互いに影響を与える事なく動作する。

zone には、"global zone" と "non-global zone" の2種類がある。
まずはじめにSolars 10 をインストールした環境が global zone 。これは1つしか存在しない。このglobal zone の上に構築される仮想サーバが non-global zone なのだ。
global zone は全ての non-global zone に干渉する事ができるが、non-global zone は他のzone(global zone 含む)にはいっさい干渉できない隔離された環境なのである。

non-global zoneの作成方法はちょっと面倒だった。
分からない項目は飛ばして、とりあえず最低限のセットアップだけで作成してみた。

ここからは面倒なので、non-global zoneをzoneと呼びます。

流れは大きく分けて3つ
1.Zoneの設定
2.Zoneのインストール
3.Zone上のOSの設定

1.Zoneの設定
■まず今のマシンにZoneがあるかどうかを確認。
# zoneadm list -vc
  ID NAME             STATUS     PATH                           BRAND    IP   
   0 global           running    /                              native   shared

うん、global zoneだけがある(単にOSをインストールしただけの)状態だって事が分かる。

■では新しくゾーンを作ってみよう。
# zonecfg -z zone01
zone0: そのような構成済みゾーンはありません
'create' を使用して、新しいゾーンの構成を開始してください。

■createで作成されます。
zonecfg:zone03> create

■ここから細かい設定をしていきます。

・ファイルパスの設定。
 zoneの情報をどこに保存するか決めます。
 dfなのでサイズを確認してから決めます。
 zone path には、各 non-gloal zone の root となる path なので、
 global zone に実存する path を割り当てます。

zonecfg:zone03> set zonepath=/export/home/zone03

・共有ファイルシステムの設定(inherit-pkg-dir)
 "inherit-pkg-dir" とは、packaged software を含むディレクトリを non-global
  zone でも使用できるよう、共有するためにmountする共有ファイルシステムです。 
 ユーザが任意のディレクトリを設定できるようになっているほか、default inher
 it-pkg-dir resources として、次の4つが、あらかじめシステムにより設定され
 ています。
 /lib
 /platform
 /sbin
 /usr

 他のディレクトリを指定したいときは、set dir= で設定します。
 終わったらendで抜けます。

zonecfg:zone03> add inherit-pkg-dir
zonecfg:zone03:inherit-pkg-dir> set dir=/opt
zonecfg:zone03:inherit-pkg-dir> end

・autoboot valueの設定
global zone がブートしたら non-global zone も自動的にブートするか否かを設定することができます。 デフォルト値は false ですが、自動的にブートするよう、true に設定します。
zonecfg:zone03> set autoboot=true

・ネットワークの設定
zonecfg:zone03> add net
zonecfg:zone03:net> set address=172.20.100.90
zonecfg:zone03:net> set physical=e1000g0
zonecfg:zone03:net> end

・リソースプールとの関連づけ
正直よく分からないので、マニュアルどおりに設定
zonecfg:zone03> set pool=pool_default

・その他、以下のの設定は無視しなかったです。
 ファイルシステムの登録
 Zone環境でのFSSの設定
 コメントの登録

■設定内容の確認
zonecfg:zone03> export
create -b
set zonepath=/export/home/zone03
set autoboot=true
set pool=pool_default
set ip-type=shared
add inherit-pkg-dir
set dir=/lib
end
add inherit-pkg-dir
set dir=/platform
end
add inherit-pkg-dir
set dir=/sbin
end
add inherit-pkg-dir
set dir=/usr
end
add inherit-pkg-dir
set dir=/opt
end
add net
set address=123.456.789.012
set physical=e1000g0
end

■整合性の検証
ここまで登録した設定の整合性をシステムが検証してくれます。
何か間違っていると、ここでエラーを出してくれます。
zonecfg:zone03> verify

■Stable Storageへの書き込み
これまでの設定をメモリから Stable Storageへ書き込みます。
zonecfg:zone03> commit

■設定の終了
zonecfg:zone03> exit

■設定の確認
# zoneadm list -vc
  ID NAME             STATUS     PATH                           BRAND    IP   
   0 global           running    /                              native   shared
   - zone03           configured /export/home/zone03            native   shared

2.Zoneのインストール
■以下のコマンドでインストールします。
# zoneadm -z zone03 install

zoneadm: zone 'zone03': 警告: プール機能がアクティブではありません; ゾーンはプール 'pool_default' に結合されません。
Preparing to install zone <zone03>.
Creating list of files to copy from the global zone.
Copying <2408> files to the zone.
Initializing zone product registry.
Determining zone package initialization order.

警告は出るけど、大丈夫です。
確認すると、STATUSがinstalledになります。
# zoneadm list -vc
  ID NAME             STATUS     PATH                           BRAND    IP   
   0 global           running    /                              native   shared
   - zone03           installed  /export/home/zone03            native   shared

■zone のブート
bootすることにより、zoneをrunningの状態にします。

# zoneadm -z zone03 boot
zoneadm: zone 'zone03': 警告: プール機能がアクティブではありません; ゾーンはプール 'pool_default' に結合されません。
zoneadm: zone 'zone03': 警告: Pools facility not active; zone will not be bound to pool

こちらも警告は出るけどOKです。
確認すると、STATUSがrunningになります。
# zoneadm list -vc
  ID NAME             STATUS     PATH                           BRAND    IP   
   0 global           running    /                              native   shared
   - zone03           running  /export/home/zone03            native   shared

3.Zone上のOSの設定
仮想上のOSの設定をすして、仮想OSのインストール完了です。
# zlogin -C MyZone
ここでネットワーク、言語や時間の設定をします。

これで終了!!!仮想OSが作成できました。

| | コメント (0) | トラックバック (0)

«MySQL HA用語集