MRG_MyISAMエンジンとしても知られているMERGE ストレージエンジンは、
一つの物として使用する事ができる同一のMyISAM テーブルの集まりです。
「同一の」というのは、全てのテーブルが同一のカラムとインデックス情報
を持つという意味です。カラムのリストされている順番が違っていたり、
カラムが完全に一致していなかったり、インデックスの順番が違っていたりすると
MyISAM テーブルをマージする事はできません。しかし、全てのMyISAM
テーブルはmyisampackで圧縮する事ができます。
AVG_ROW_LENGTH、 MAX_ROWS、または PACK_KEYS 等のようなテーブル
オプションの違いは問題ではありません。

MERGE テーブルを作成する時、MySQLはディスク上に二つファイルを作成します。
そのファイル名はテーブル名で始まり、ファイルタイプを指示する拡張子が付きます。
.frm ファイルはテーブルフォーマットを格納し、
.MRG ファイルは一つの物として使用されるべきテーブルの名前を含んでいます。

———————————————————————
-rw-rw—- 1 mysql mysql 8592 2009-02-24 10:06 Y2008.frm
-rw-rw—- 1 mysql mysql 60 2009-02-24 10:08 Y2008.MYD
-rw-rw—- 1 mysql mysql 3072 2009-02-24 10:08 Y2008.MYI
-rw-rw—- 1 mysql mysql 8592 2009-02-24 10:11 Y2008_Y2009.frm
-rw-rw—- 1 mysql mysql 32 2009-02-24 10:11 Y2008_Y2009.MRG
-rw-rw—- 1 mysql mysql 8592 2009-02-24 10:09 Y2009.frm
-rw-rw—- 1 mysql mysql 36 2009-02-24 10:22 Y2009.MYD
-rw-rw—- 1 mysql mysql 3072 2009-02-24 10:22 Y2009.MYI
———————————————————————


mysql> CREATE TABLE Y2008 (
-> `id` int(11) NOT NULL AUTO_INCREMENT,
-> `comment` varchar(50) DEFAULT NULL,
-> PRIMARY KEY (`id`)
-> ) ENGINE=MYISAM DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.06 sec)

mysql> CREATE UNIQUE INDEX uidx_y2008_comment ON Y2008 (comment);
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> INSERT INTO Y2008 (comment) VALUES('comment1');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO Y2008 (comment) VALUES('comment2');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO Y2008 (comment) VALUES('comment3');
Query OK, 1 row affected (0.00 sec)

mysql> CREATE TABLE Y2009 (
-> `id` int(11) NOT NULL AUTO_INCREMENT,
-> `comment` varchar(50) DEFAULT NULL,
-> PRIMARY KEY (`id`)
-> ) ENGINE=MYISAM DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE UNIQUE INDEX uidx_y2009_comment ON Y2009 (comment);
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> CREATE TABLE Y2008_Y2009 (
-> `id` int(11) NOT NULL AUTO_INCREMENT,
-> `comment` varchar(50) DEFAULT NULL,
-> PRIMARY KEY (`id`)
-> ) TYPE=MERGE UNION=(Y2008,Y2009) INSERT_METHOD=LAST;
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> CREATE UNIQUE INDEX uidx_Yyyyy_comment ON Y2008_Y2009(comment);
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql>

create_merge

create_merge_status

mysql> select * from Y2008_Y2009;
+—-+———-+
| id | comment |
+—-+———-+
| 1 | comment1 |
| 2 | comment2 |
| 3 | comment3 |
+—-+———-+
3 rows in set (0.00 sec)

mysql>

create_merge_each_table

mysql> insert into Y2008_Y2009(comment) values(‘INSERT INTO MYISAM MERGE’);

mysql> select * from Y2008_Y2009;
+—-+————————–+
| id | comment |
+—-+————————–+
| 1 | comment1 |
| 2 | comment2 |
| 3 | comment3 |
| 4 | INSERT INTO MYISAM MERGE |
+—-+————————–+
4 rows in set (0.00 sec)

mysql>

create_merge_insert

mysql> select * from Y2008;
+—-+———-+
| id | comment |
+—-+———-+
| 1 | comment1 |
| 2 | comment2 |
| 3 | comment3 |
+—-+———-+
3 rows in set (0.00 sec)

mysql> select * from Y2009;
+—-+————————–+
| id | comment |
+—-+————————–+
| 4 | INSERT INTO MYISAM MERGE |
+—-+————————–+
1 row in set (0.00 sec)

mysql>

mrg


mysql> select TABLE_SCHEMA,TABLE_NAME,TABLE_TYPE,ENGINE from information_schema.tables where table_schema = 'TEST';
+--------------+-------------+------------+------------+
| TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | ENGINE |
+--------------+-------------+------------+------------+
| TEST | MEM | BASE TABLE | MEMORY |
| TEST | MEM2 | BASE TABLE | MEMORY |
| TEST | MEM3 | BASE TABLE | MEMORY |
| TEST | MYSQLIMP | BASE TABLE | MyISAM |
| TEST | T1 | BASE TABLE | InnoDB |
| TEST | T2 | BASE TABLE | InnoDB |
| TEST | Y2008 | BASE TABLE | MyISAM |
| TEST | Y2008_Y2009 | BASE TABLE | MRG_MYISAM |
| TEST | Y2009 | BASE TABLE | MyISAM |
+--------------+-------------+------------+------------+
9 rows in set (0.00 sec)

mrg_myisam

MERGEテーブル上では、SELECT、 DELETE、 UPDATE、そして INSERTを
利用する事ができます。MERGE テーブルにマップするMyISAM テーブル上に、
SELECT、 UPDATE、そして DELETE 権限を持たなければいけません。

MERGE テーブルをDROPする時、 MERGE 仕様だけが削除されます。
基礎となるテーブルは影響を受けません。

MERGE テーブルを作成するには、どの MyISAM テーブルを一つの物として利用
したいかを示すUNION=(list-of-tables) 条項を指定しなければいけません。
MERGE テーブルに、 UNION リストの最初か最後のテーブルに位置する
為の挿入が必要であれば、自由に INSERT_METHOD オプションを指定する事が
できます。テーブルの最初か最後に挿入されるように、FIRST か LAST値を
それぞれ使用してください。INSERT_METHOD オプションを指定しない場合や、
NOの値で指定した場合は、MERGEテーブルに行を挿入しようとしてもエラーが発生します。

※オプションとして、MERGE テーブルへの挿入が UNION リスト内の最初のテーブルと最後のテーブル
のどちらで行われるかを、INSERT_METHOD で指定できます。INSERT_METHOD を指定しなかった
場合、または NO を指定した場合は、MERGE テーブルに対するすべての INSERT コマンドでエラーが
返されます。

※MERGE テーブルの中で、いくつものMyISAMフィーチャーを利用する事はできません。
例えば、MERGE テーブル上でFULLTEXT インデックスを作成する事はできません。
(もちろん、基礎となるMyISAM テーブル上に FULLTEXT インデックスを作成する事はできますが、
全文検索で MERGE テーブルを検索する事はできません。


mysql> show table status like ‘TABLE007’\G
*************************** 1. row ***************************
Name: TABLE007
Engine: InnoDB
Version: 10
Row_format: Compact
Rows: 9
Avg_row_length: 1820
Data_length: 16384
Max_data_length: 0
Index_length: 0
Data_free: 4194304
Auto_increment: 10
Create_time: 2009-02-17 11:30:45
Update_time: NULL
Check_time: NULL
Collation: utf8_general_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.00 sec)

mysql>

mysql> show create table TABLE007\G
*************************** 1. row ***************************
Table: TABLE007
Create Table: CREATE TABLE `TABLE007` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`comment` varchar(45) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql>

mysql> select table_name, Engine from information_schema.tables where
-> table_schema = ‘DB01’ and table_name = ‘TABLE007’;
+————+——–+
| table_name | Engine |
+————+——–+
| TABLE007 | InnoDB |
+————+——–+
1 row in set (0.00 sec)

mysql>

show_table_status

mysql> show engines;
\+————+———+—————————————————————-+————–+—–+————+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+————+———+—————————————————————-+————–+—–+————+
| MyISAM | DEFAULT | Default engine as of MySQL 3.23 with great performance | NO | NO | NO |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| InnoDB | YES | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
+————+———+—————————————————————-+————–+—–+————+
7 rows in set (0.00 sec)
mysql>

DEFAULT & YES = Storage Engine is compiled and enabled.
DISABLED = Compiled in but disabled.
NO = Not Compiled in when server was build.

engine

※ MYISAM, MERGE,MEMORYは常に利用可能なストレージエンジン
サポートされたストレージエンジン

『テーブルに利用されているストレージエンジンを把握する為の3つの方法。』

━━━━━━ SHOW TABLE STATUS ━━━━━━

mysql> show table status like ‘mt_author’\G
*************************** 1. row ***************************
Name: mt_author
Engine: MyISAM
Version: 10
Row_format: Dynamic
Rows: 1
Avg_row_length: 88
Data_length: 88
Max_data_length: 281474976710655
Index_length: 6144
Data_free: 0
Auto_increment: 2
Create_time: 2008-03-10 17:55:37
Update_time: 2008-03-10 17:55:37
Check_time: 2008-03-10 17:55:37
Collation: utf8_bin
Checksum: NULL
Create_options:
Comment:
1 row in set (0.00 sec)

━━━━━━ SHOW CREATE ━━━━━━

mysql> show create table mt_author\G
*************************** 1. row ***************************
Table: mt_author
Create Table: CREATE TABLE `mt_author` (
`author_id` int(11) NOT NULL auto_increment,
`author_api_password` varchar(60) collate utf8_bin default NULL,
`author_can_create_blog` tinyint(4) default NULL,
`author_can_view_log` tinyint(4) default NULL,
`author_email` varchar(75) collate utf8_bin default NULL,
`author_entry_prefs` varchar(255) collate utf8_bin default NULL,
`author_hint` varchar(75) collate utf8_bin default NULL,
`author_is_superuser` tinyint(4) default NULL,
`author_name` varchar(50) collate utf8_bin NOT NULL default ”,
`author_nickname` varchar(50) collate utf8_bin default NULL,
`author_password` varchar(60) collate utf8_bin NOT NULL default ”,
`author_preferred_language` varchar(50) collate utf8_bin default NULL,
`author_public_key` mediumtext collate utf8_bin,
`author_remote_auth_token` varchar(50) collate utf8_bin default NULL,
`author_remote_auth_username` varchar(50) collate utf8_bin default NULL,
`author_type` smallint(6) NOT NULL default ‘1’,
`author_url` varchar(255) collate utf8_bin default NULL,
`author_created_on` datetime default NULL,
`author_created_by` int(11) default NULL,
`author_modified_on` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
`author_modified_by` int(11) default NULL,
PRIMARY KEY (`author_id`),
KEY `mt_author_email` (`author_email`),
KEY `mt_author_created_on` (`author_created_on`),
KEY `mt_author_name` (`author_name`),
KEY `mt_author_type` (`author_type`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_bin
1 row in set (0.00 sec)

━━━━━━ INFORMATION SCHEMA ━━━━━━

mysql> select TABLE_NAME,TABLE_TYPE,ENGINE from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA =’MT’;
+—————–+————+——–+
| TABLE_NAME | TABLE_TYPE | ENGINE |
+—————–+————+——–+
| mt_author | BASE TABLE | MyISAM |
| mt_blog | BASE TABLE | MyISAM |
| mt_category | BASE TABLE | MyISAM |
| mt_comment | BASE TABLE | MyISAM |
| mt_config | BASE TABLE | MyISAM |
| mt_entry | BASE TABLE | MyISAM |
| mt_fileinfo | BASE TABLE | MyISAM |
| mt_ipbanlist | BASE TABLE | MyISAM |
| mt_log | BASE TABLE | MyISAM |
| mt_notification | BASE TABLE | MyISAM |
| mt_objecttag | BASE TABLE | MyISAM |
| mt_permission | BASE TABLE | MyISAM |
| mt_placement | BASE TABLE | MyISAM |
| mt_plugindata | BASE TABLE | MyISAM |
| mt_rfdata | BASE TABLE | MyISAM |
| mt_session | BASE TABLE | MyISAM |
| mt_tag | BASE TABLE | MyISAM |
| mt_tbping | BASE TABLE | MyISAM |
| mt_template | BASE TABLE | MyISAM |
| mt_templatemap | BASE TABLE | MyISAM |
| mt_trackback | BASE TABLE | MyISAM |
+—————–+————+——–+
21 rows in set (0.01 sec)

mysql>


自分でREADロックを明示的にかけたテーブルに対して、データ追加、更新処理を行うと
エラー(ERROR 1099)が返ってくる。他のユーザーがREADロック
かけているテーブルに対して、データ追加、更新処理を行うとロック待ちになって
タイムアウトまで待ち続けます。

mysql> desc TABLE007;
+———+——————+——+—–+———+—————-+
| Field   | Type             | Null | Key | Default | Extra          |
+———+——————+——+—–+———+—————-+
| id      | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| comment | varchar(45)      | NO   |     | NULL    |                |
+———+——————+——+—–+———+—————-+
2 rows in set (0.00 sec)

mysql>

mysql> LOCK TABLES TABLE007 READ;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO TABLE007(comment) VALUES(‘READ LOCK BY MYSELF’);
ERROR 1099 (HY000): Table ‘TABLE007’ was locked with a READ lock and can’t be up
dated
mysql> SELECT COUNT(*) FROM TABLE007;
+———-+
| COUNT(*) |
+———-+
|        4 |
+———-+
1 row in set (0.00 sec)

mysql> UNLOCK TABLES;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO TABLE007(comment) VALUES(‘READ LOCK BY MYSELF’);
Query OK, 1 row affected (0.02 sec)

mysql>

==============================検証その1=================================

【自分でロックしている場合】

lock_read_mysql
※ すぐにエラーコードが返ってくる。

【自分のロック解除した場合】

lock_read_mysql_unlock

==============================検証その2=================================

【他のユーザーがロックしている場合】

lock_read_mysql_others
※ ロックが解除されるまで待ち続ける

【他のユーザーがロックしていたテーブルのロックを解除した場合】

lock_read_mysql_others_answer1

【memo】
━ 1 ━
ロックをかけているユーザーが他のテーブルをロックかけた場合は、前にかけていた
ロックは解除される。同時に複数のテーブルを同時にロックするには以下のように
複数テーブルを同時にロックをかける。

LOCK TABLES TABLE007 READ,TABLE008 READ;

━ 2 ━
READロックは他のSELECTステートメントをブロックしない。


READ LOCAL と READ は、どのように違うのだろう?

———————————– 抜粋 ———————————–
READ LOCAL と READ の違いは、READ LOCAL は、ロックされている間に非対立 INSERT ステートメント(並列挿入)が実行される事を許容するという事です。しかし、もしロックを保持している間に MySQL の外部でデータベース ファイルを複製しようとすると、これを利用する事はできません。 InnoDB テーブルに対しては、READ LOCAL は READ と同じです。

オリジナル本文
——————————————————————————

    テーブル全体に対してロックを実行(LOCK TABLES )

READ:読み取りは許可、書き込みは不可
WRITE:読み取り、書き込み共に不可がある。

    LOCK TABLESでロックしたテーブルを全て解除(UNLOCK TABLES)

UNLOCK TABLES実行
LOCK TABLESを発行したMySQLセッションが終了

lock

【MYSQL LOCK LEVEL】
━ TABLE LEVEL LOCK(テーブルレベルロック) ENGINE: MYISAM、 MEMORY、 MERGE 
━ PAGE LEVEL LOCK(ページレベルロック) ENGINE:  BDB
━ ROW-LEVEL LOCK(行ロック) ENGINE:  INNODB


システム負荷によって起こるリソースの枯渇防止制限を mysqld にて設定。

■これまでサーバーで観察された最大接続数

mysql> SHOW STATUS LIKE ‘max_used_connections’;
+———————-+——-+
| Variable_name | Value |
+———————-+——-+
| Max_used_connections | 3 |
+———————-+——-+
1 row in set (0.00 sec)

【最大接続数が指定】
set-variable=max_connections=500
【10 秒以上アイドル状態であったすべての接続を終了】
set-variable=wait_timeout=10
【ホストとサーバー接続に問題があり、ホストがリクエストの処理をアボートする回数】
多すぎる場合には、FLUSH HOSTS が実行されるまでホストはロックされます
max_connect_errors = 100

mysqlconn


mysql> SHOW STATUS LIKE ‘qcache%’;
+————————-+——-+
| Variable_name | Value |
+————————-+——-+
| Qcache_free_blocks | 0 |
| Qcache_free_memory | 0 |
| Qcache_hits | 0 |
| Qcache_inserts | 0 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 0 |
| Qcache_queries_in_cache | 0 |
| Qcache_total_blocks | 0 |
+————————-+——-+
8 rows in set (0.18 sec)

mysql>

MySQL クエリーキャッシュ変数
変数名 説明
—————————————————————————————–
【Qcache_free_blocks】
キャッシュの中にある連続したメモリー・ブロックの数を表します。
この値が大きいと、キャッシュの断片化が起きていることを示します。
FLUSH QUERY CACHE はキャッシュのデフラグを行い 1 つのフリーブロックのみにします。
【Qcache_free_memory】
キャッシュ内の空きメモリー容量を表します。
【Qcache_hits】
キャッシュにあるクエリーが使われるたびにインクリメントされます。
【Qcache_inserts】
クエリーが挿入されるたびにインクリメントされます。挿入された回数を
ヒット数で割るとミス・レートが得られ、1 からミス・レートの値を引くと
ヒットレートが得られます。
【Qcache_lowmem_prunes】
キャッシュがメモリー不足になり、さらにクエリーをキャッシュするために
クリーンアップしなければならなかった回数を表します。この値は時間の経過に伴う
変化を調べるのが適切です。この値が増加している場合は、断片化が深刻であるか、
あるいはメモリーが不足している兆候です (上記の free_blocks と free_memory でその状況を知ることができます)。
【Qcache_not_cached】
キャッシュの候補にならなかったクエリーの数
通常はクエリーが SELECT 文ではなかったために候補にならなかったクエリーの数
【Qcache_queries_in_cache】
現在キャッシュされているクエリー (とレスポンス) の数を表します。
【Qcache_total_blocks】
キャッシュの中にあるブロックの数を表します。


MYSQLにはDB作成方法やテーブルを作成する方法が幾つかあるので見直しします。
DBは、mysqlコマンド、mysqladminコマンド,MYSQL Administrator, Query Browser
で作成する事が出来ます。テーブルもmysqlコマンド、MYSQL Administrator,
Query Browserを利用して作成する事が出来ます。
但しテーブルのデータ操作は、mysqlコマンドかMySQL Query Browserを利用する
必要があります。

————————————————————————————————–
mysqlやコマンドラインで以下のようにテーブルを作成する事が出来ます。
————————————————————————————————–
CREATE TABLE `TABLE008` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`comment` varchar(45) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

create_table

————————————————————————————————–
MYSQL Administratorでもテーブルを作成する事が出来ます
————————————————————————————————–
STEP1
create_table_ma

STEP2
create_table_ma2

STEP3
create_table_ma3

STEP4
create_table_ma_fin


mysqlimport — データインポートプログラム

mysqlimportクライアントはLOAD DATA INFILESQLステートメントに
コマンドラインインターフェースを提供します。 mysqlimportに対する殆どの
オプションはLOAD DATA INFILE構文の節に直接対応しています。

mysqlimportは以下のように起動


shell> mysqlimport [options] db_name textfile1 [textfile2 …]

コマンドラインで名づけられた各テキストファイルごとに、mysqlimportは
ファイルネームの拡張を取り除き、結果をファイルの内容をインポートする
テーブルの名前を決定します
。例えば、patient.txt、patient.text、そしてpatientと
名づけられたファイルは全てpatientと名づけられたテーブルにインポートされます。

[root@colinux ~]# mysql -e 'CREATE TABLE MYSQLIMP(id INT, n VARCHAR(30))' TEST -
u root -p

Enter password:
[root@colinux ~]# ed
a
100 MysqlImport Test
101 Good Luck
.
w MYSQLIMP.txt
35
q
[root@colinux ~]# od -c MYSQLIMP.txt
0000000 1 0 0 \t M y s q l I m p o r t
0000020 T e s t \n 1 0 1 \t G o o d L u
0000040 c k \n
0000043
[root@colinux ~]# mysqlimport --local TEST MYSQLIMP.txt -u root -p
Enter password:
TEST.MYSQLIMP: Records: 2 Deleted: 0 Skipped: 0 Warnings: 0
[root@colinux ~]#

[root@colinux ~]# mysql -e 'select * from MYSQLIMP' TEST -u root -p
Enter password:
+——+——————+
| id | n |
+——+——————+
| 100 | MysqlImport Test |
| 101 | Good Luck |
+——+——————+
[root@colinux ~]#

※テーブルとファイルを作成してインポート
mysqlimport

※SELECTしてインポートされた事を確認。
mysqlimport_result


MYSQLのオプションファイル(設定ファイル)は複数存在する場合があります。
複数の設定ファイルが存在した場合、後ろで定義したオプションの方が前で定義した
同一オプションより優先されます。

コマンドラインオプションは全ての設定ファイルよりも優先されます。

Windows
Windows上のMySQL Serverは、以下の表にリストされている設定ファイルを、リストの上から順に読み込みます。
同じ設定が複数の設定ファイルに記述されている場合は、最後に読み込まれた設定が有効になります。
=====================================================
ファイル名 目的
=====================================================
WINDIR\my.ini グローバルオプション
C:\my.cnf グローバルオプション
INSTALLDIR\my.ini グローバルオプション
defaults-extra-file --defaults-extra-file=pathで指定されたファイル(あれば)

WINDIR ユーザのWindowsディレクトリの場所を表しています。一般的に、C:\WINDOWS もしくは C:\WINNTになります。以下のコマンドを使用して WINDIR 環境変数の値から正確なロケーションを割り出すことができます。

Unix or Linux
Unix系のプラットフォーム上のMySQL Serverは、以下の設定ファイルを表の上にリストされている順に読み込みます。
同じ設定が複数の設定ファイルに記述されている場合は、最後に読み込まれた設定が有効になります。
=====================================================
ファイル名 目的
=====================================================
/etc/my.cnf グローバルオプション
$MYSQL_HOME/my.cnf サーバ固有のオプション
defaults-extra-file --defaults-extra-file=pathで指定されたファイル(あれば)
~/.my.cnf ユーザ固有のオプション

MYSQL_HOMEはサーバ固有のファイルmy.cnfを含むディレクトリへのパスを含む環境変数です。
MYSQL_HOME がセットされていない状態で mysqld_safe プログラムを使ってサーバをスタートさせると、
mysqld_safe は次のように MYSQL_HOME をセットしようとします。

BASEDIR と DATADIR をそれぞれ、MySQLベースディレクトリとデータディレクトリのパスネームの代理に立てます。
DATADIRにはmy.cnfファイルが存在し、BASEDIRには存在しない場合、mysqld_safeはMYSQL_HOMEをDATADIRにセットします。
または、もしMYSQL_HOMEがセットされておらず、my.cnfファイルがDATADIRに存在しない場合、mysqld_safeはBASEDIRにMYSQL_HOMEをセットします。
MySQL 5.1ではDATADIRのmy.cnfファイルのロケーションとしての使用は認証されていません。BASEDIR の方が良い場所です。
一般的にDATADIRは/usr/local/mysql/dataでバイナリインストールに、または/usr/local/varでソースインストールに使用されます。


myisamchk (MYISAM ONLY) テーブルにアクセスが無い事を確認
http://dev.mysql.com/doc/refman/5.1/ja/myisamchk.html
myisamchk ユーティリティはユーザのデータベース テーブルの情報を収集し、
チェック、修復、もしくは最適化します。myisamchk は MyISAM
テーブルとともに作動します(データやインデックスを記憶するための
.MYD や .MYI テーブル)。

━アクセスが無い状態である必要あり━
※サーバーを停止しておく
※テーブルをLockしておく

*で全てのMYIテーブルをチェックする事が出来ます。
[root@colinux mysql]# myisamchk *.MYI
———

Checking MyISAM file: user_info.MYI
Data records: 0 Deleted blocks: 0
– check file-size
– check record delete-chain
– check key delete-chain
– check index reference
– check data record references index: 1
– check data record references index: 2
– check record links

———

Checking MyISAM file: user.MYI
Data records: 5 Deleted blocks: 0
– check file-size
– check record delete-chain
– check key delete-chain
– check index reference
– check data record references index: 1
– check record links

全てのMyISAMテーブルをチェックするお勧めの方法は以下のとおりです。

[root@colinux mysql]# myisamchk --silent --fast /usr/local/mysql/data/mysql/*.MYI
[root@colinux mysql]#

全ての MyISAM テーブルをチェックし、破壊されているものを修復したい場合、以下のコマンドを使用してください。

shell> myisamchk --silent --force --fast --update-state \
--key_buffer_size=64M --sort_buffer_size=64M \
--read_buffer_size=1M --write_buffer_size=1M \
/path/to/datadir/*/*.MYI

(例)メモリー量は調整してください。

[root@colinux mysql]# myisamchk --silent --force --fast --update-state --key_buf
fer_size=16M --sort_buffer_size=16M --read_buffer_size=16M --write_buffer_size=16M *.MYI

[root@colinux mysql]#

myisamchk

[root@colinux TEST]# myisamchk --recover *.MYI
– recovering (with keycache) MyISAM-table ‘MYSQLIMP.MYI’
Data records: 5
———
– recovering (with sort) MyISAM-table ‘Y2008.MYI’
Data records: 3
– Fixing index 1
– Fixing index 2
———
– recovering (with sort) MyISAM-table ‘Y2009.MYI’
Data records: 1
– Fixing index 1
– Fixing index 2

[root@colinux TEST]# myisamchk --recover MYSQLIMP
- recovering (with keycache) MyISAM-table 'MYSQLIMP'
Data records: 5

[root@colinux TEST]#

※ 起動時にcheckする場合は、mysqld --myisam-recovert=QUICK

※ Optionファイルに、myisam-recoverオプションを設定しても可能