|
MySQL 5.1.47 リリースノート (日本語翻訳)
InnoDBに関する注意事項:
・
InnoDBPlugin
はバージョン1.0.8にアップグレードされている。本バージョンは、GeneralAvailability(GA)の品質であるとみなされている。
InnoDBPluginChangeHistory
には、ここで報告した変更点に加えて情報が含まれている場合がある。
今回のリリースでは、
InnoDBPlugin
は、RHEL3、RHEL4、SuSE9(x86、x86_64、ia64)、およびLinuxRPM汎用パッケージを除き、ソースおよびバイナリディストリビューションに含まれている。また、FreeBSD6とHP-UX、およびia64全般のLinuxでは動作しない。
機能の追加と変更:
・
InnoDB
は、リカバリ中にREDOログ記録をハッシュテーブルに再保存する。64ビットシステムでは、このハッシュテーブルはバッファプールサイズの8分の1である。メモリ使用量を減らすために、ハッシュテーブルの大きさがバッファプールサイズの64分の1に縮小した(32ビットシステムでは128分の1)(
Bug#53122
)。
修正されたバグ:
・
セキュリティ修正
:サーバは、
COM_FIELD_LIST
コマンドパケットのテーブル名引数の正当性および
テーブル名の許容基準への準拠をチェックしていなかった。したがって、
特別に作成されたテーブル名引数を
COM_FIELD_LIST
に付与することで、
権限およびテーブルレベルの許可に対するほぼすべての形式のチェックを迂回することが可能であった。
つまりMySQL5.0以降では、1つのテーブルの
SELECT
権限を有する認証済みユーザが、その他のすべてのデータベースのすべてのテーブルのフィールド定義を取得でき、さらにはサーバのファイルシステムからアクセス可能なその他のMySQLインスタンスも取得できる可能性があった。
さらにMySQL5.1以降では、1つのテーブルの
DELETE
または
SELECT
権限を有する認証済みユーザが、このサーバ上にあるすべてのデータベースのすべてのテーブルのコンテンツだけでなく、サーバのファイルシステムからアクセス可能なその他のMySQLインスタンスの削除や読み取りを行うことが可能であった(
Bug#53371
、
CVE-2010-1848
)。
・
セキュリティ修正
:
COM_FIELD_LIST
コマンドパケットのテーブル名引数に対して境界チェックを行わないため、
サーバがバッファオーバーフロー攻撃を受ける可能性があった。テーブル名に長いデータを送信することでバッファのオーバーフローが引き起こされるため、認証済みユーザが悪意のあるコードを投入する可能性があった(
Bug#53237
、
CVE-2010-1850
)。
・ セキュリティ修正 :1つのパケットの最大サイズよりも大きなパケットを受信した場合、サーバが無制限にパケットの読み取りを続ける可能性があった( Bug#50974 、 CVE-2010-1849 )。
・
重要な変更
:
レプリケーション
:
CHANGEMASTERTO
および
SETGLOBALsql_slave_skip_counter
を実行すると、ステートメント実行以前のスレーブの状態に関する情報がエラーログに書き込まれるようになった。
CHANGEMASTERTO
の場合は、
MASTER_HOST
、
MASTER_PORT
、
MASTER_LOG_FILE
、
MASTER_LOG_POS
の以前の値などが書き込まれる。
SETGLOBALsql_slave_skip_counter
の場合は、
sql_slave_skip_counter
の以前の値、グループのリレーログ名、グループのリレーログ位置などが書き込まれる(
Bug#43406
、
Bug#43407
)。
・
レプリケーション
:
REVOKE
ステートメントの失敗が間違ったエラーコードで記録されていたため、マスター上での失敗が予測されていた場合でもレプリケーションスレーブが停止した(
Bug#51987
)。
・一部のパス名が
LOAD_FILE()
に渡された場合に、サーバクラッシュを引き起こす可能性があった(
Bug#53417
)。
・
INSERT
中の外部キー制約違反を報告する際に、
InnoDB
は
DB_TRX_ID
および
DB_ROLL_PTR
システムカラムに、初期化されていないデータを表示する可能性があった(
Bug#53202
)。
・圧縮テーブルを使用している場合、
InnoDB
ページ分割が無限ループに陥ることがあった
(
Bug#52964
)。
・カラム値のプレフィックスのインデックスを含む
DYNAMIC
または
COMPRESSED
フォーマットの
InnoDB
テーブルから削除マークの付いたレコードを消去している間に、厳密すぎる表明が失敗する可能性があった(
Bug#52746
)。
・
InnoDB
は、レコードヘッダに“オフページストレージ”フラグがあることを確認せずにオフページストレージの選択を試みていた。これを修正するために、
DYNAMIC
および
COMPRESSED
フォーマットにおいて、
InnoDB
は長さの上限が256バイトを超えない非
BLOB
カラムをローカルに保存するようになった。これは、長さの上限が255バイト以下の場合は、“外部ストレージ”フラグが入る余地がないからである。
REDUNDANT
および
COMPACT
フォーマットにおいては、
InnoDB
は
local_len
=788バイトまでの長さのカラムは常にローカルに保存するため、この制限は当然適用される(
Bug#52745
)。
・
Bug#3300
に対処するために、
InnoDB
に
半一貫的読み込みが実装された。半一貫的読み込みは、一致しないレコードが既に他のトランザクションによってロックされている場合は、そのトランザクションをブロックしない。レコードがロックされていない場合はロックを取得するが、そのレコードがWHERE条件に合致しない場合はロックをリリースする。しかし、
pk_col1=constant1,...,pk_colN=constantN
形式のWHERE条件を有する
UPDATE
ステートメントについても半一貫的読み込みを試みており、半一貫的読み込みはテーブルスキャンの際のみ試行される、という前提のもとに設計されたいくつかのコードの実行が失敗していた(
Bug#52663
)。
・空文字列に
@@GLOBAL.debug
を設定すると、現行のデバッグ設定をクリアできなかった(
Bug#52629
)。
・
コンパレータアレイ(
Arg_comparator
クラスのメンバ)の割り当ての解除をしなかったことにより
メモリリークが発生した(
Bug#52124
)。
・デバッグビルドにおいて、照合順序の調整が必要な可能性のあるサブクエリを含むビューを作成すると表明が発生した。例えば、照合順序の異なる複数のアイテムがあり、結果の照合順序をその内のどれか1つに調整できる場合に表明が発生する可能性があった( Bug#52120 )。
・
InnoDB
の行ロックを待機している接続は、行ロックの待機が終了するまで
KILL
を無視していた。ロック待機中に
KILL
が実行されると“lockwaittimeoutexceeded”ではなく“queryinterrupted”エラーになるようになった(
Bug#51920
)。
・
LOCK_plugin
、
LOCK_global_system_variables
、
LOCK_status
mutexなどでロックを実行した場合に、デッドロックが発生する可能性があった(
Bug#51591
)。
・
InnoDB
は、
高速インデックス作成の際に間違って
テーブルコピーを使用する
場合があった(
Bug#50946
)。
・トリガのリストを作成する際に、構文的に間違ったトリガにより、サーバがクラッシュする可能性があった( Bug#50755 )。
・
InnoDBPlugin
は、すべてのカラムが埋まっている場合、ある行が最大サイズをオーバーすることが可能かどうかチェックする。そのため、組み込み
InnoDB
で作成できるテーブルについて、
Rowsizetoolarge
エラーが生じる場合があった。
したがって、
innodb_strict_mode
がオンになっている場合、または動的テーブルもしくは圧縮テーブルの場合のみチェックが行われるようになった(
Bug#50495
)。
・MySQL5.1では、行ベースのバイナリログの制限により
READCOMMITTED
によるロックの使用を減らすように変更された(
Section12.3.6「SETTRANSACTIONSyntax」
の「
READCOMMITTED
」のNoteを参照)。しかし、
READUNCOMMITTED
はそのように変更されなかったため、より高く設定されたアイソレーションレベルを超えるロックを使用していた。これは予想していなかったことである。したがって、
READUNCOMMITTED
についてもロックの使用を減らし、
READCOMMITTED
と同様のバイナリログの制限を設けるように変更された(
Bug#48607
)。
・サブクエリを含むクエリで
EXPLAIN
を実行すると、サーバがクラッシュする可能性があった(
Bug#48419
)。
・Windowsでは、サーバがEventID100の記述を見つけることができなかった( Bug#48042 )。
・
InnoDB
テーブルの更新の際に、値の変更がない場合でも
TIMESTAMP
カラムが更新される可能性があった(
Bug#47453
)。
・
mysqld_safe
が
mysqld
に
--open-files-limit
を渡さない場合があった。また、
mysqld_safe
は、ダッシュやアンダースコアをオプション名と同等に扱わなかった(
Bug#47095
)。
・
--skip-grant-tables
でサーバを起動する場合、プラグインのロードおよびアンロードは許可されるべきではないが、サーバは
INSTALLPLUGIN
および
UNINSTALLPLUGIN
ステートメントを拒否しなかった(
Bug#46261
)。
・
InnoDB
は、NULLカラムにユニークインデックスを作成できない場合があった(
Bug#41094
)。
・
time_t
の定義が、サーバ側で想定したものと違った場合でも、Windows上のストレージエンジンプラグインをビルドすることができてしまった。その違いにより、影響を受けたプラグインがクラッシュする可能性があった。さらに、ストレージエンジンのAPI層において
time_t
型の使用が強制されていた(
Bug#39802
、
Bug#40092
)。
・
UNINSTALLPLUGIN
を使用してロードされたプラグインを削除する際に、オープンテーブルおよび接続が原因で、オープン接続が切断されるまで
mysqld
がハングしていた(
Bug#39053
)。
・1)
FLUSHPRIVILEGES
操作中にスレッドが中断された場合、不適切な診断エリアの設定により、後にデバッグ表明が発生することがまれにあった。2)
KILL
操作を行うと、診断エリアの状態に関するコンソールエラーメッセージが、そのような状態の存在を確認せずに発生する可能性があった(
Bug#33982
)。