Contrib のバックアップ(No.70)



目次:


提供ツール

4.1以上(含む5) への移行支援

ALTER char() シェルスクリプト

  • 4.0, 3.X から 4.1以上(5含む) に upgrade したときに、char() を ALTER しないといけない。それを自動でやってくれる shell スクリプト
  • 4.1,5.x に上げたときに一度だけ実行できる。
  • 実行にはalter権限が必要。スクリプトにユーザー名、パスワードを引数で与えて実行
  • GNUツールで固めた環境下では問題なく動作。

体験Knoppix

  • NDBクラスター体験 Knoppix CD イメージ
    http://www.mysql.gr.jp/knoppix/ndb/
    • CD を入れてマシンをブートすれば、NDBクラスターのできあがり。
    • 1台の PC に 2 つの クラスターノード(ndbd)を起動しているので、仮想的に、クラスターの障害実験が簡単にできる。(稼働中に片方の ndbd 落とせば、障害発生と同等)
    • 細かいところは、README を読んでください。
  • 実メモリー512M以上必要。
  • 起動したら、NDBクラスター、mysqld が立ち上がる。
  • ndbd は 2つ起動する。mysqld は1つ。おかげで CPU パワーはじめとするリソースをけっこう食います。


  • cdimg_20050121_1.iso
    • 650MB。
    • MySQL version 4.1.9
    • developper summit 2005 でサンプル出していたイメージです。


  • cdimg_20050216_1.iso
    • 638M
    • MySQL version 4.1.10 with MyNA jp patch




mysqlbench

  • pgbench を MySQL 用に移植したものです。
  • mysqlbench はマルチスレッドで複数のクライアントを生成しています(pgbenchと違う点)。
  • 使い方はpgbenchとだいたい同じ。いくつかオプションが違うぐらい。README 読んでください。
  • ソースの検証のご協力をお願いします。


  • 現在のところ、全てのスレッドの状態確認と同期を取るために、回りくどいことをしています。(要検証)
  • そのため、接続を含むテスト結果(includeの表記がある結果)は大きなオーバーヘッドがかかっています。exclude の方で比較してください。
  • Linux の場合、/lib/tls/ の、新しいスレッドの方ではうまく動かないことがあります(要対応)。そのため、リンクは前の LinuxThread の方を使用してください。



Super-Smack

  • 現在のメンテナー: http://vegan.net/tony/
  • オリジナル: http://jeremy.zawodny.com/mysql/super-smack/ : MySQL Super Smack
  • 複数のクライアントをマルチスレッドで生成できる。
  • version 1.2 では、PostgreSQLサポート + gcc-3.x はコンパイルエラーになる。gcc-2.95 だと OK。(version 1.3 で修正済み)



MySQL の変数、オプションのバージョン間での違い

MySQL の変数、オプションの一覧を、MySQL テーブルにして、mysqldump したものです。
mysql コマンドに食わせてください。

テーブル名概要
param_variMySQL サーバー変数一覧
param_vari_showMySQL サーバー変数一覧その2。 SHOW VARIABLES でしか現れてこない変数
param_optオプション一覧
param_showstatusSHOW STATUS 一覧
param上記4つのテーブルの MERGE




パッチ

ver. 5.1 用パッチ




ver. 5.0 用パッチ

  • --with-client-charset
  • mysqldump 修正
  • 自動変換抑制オプション(--skip-conversion)
  • 全てのバイト列が char() に入るようにするパッチ

詳しくは、4.1 用のパッチの節を参照してください。同じです。
パッチを適用した後、ac が必要です

aclocal
autoheader
libtoolize --automake --force
automake
autoconf

cd innobase
aclocal
autoheader
libtoolize --automake --force
automake
autoconf

旧いパッチ

パッチをあてた MS-Windows 用バイナリ&ソース

#ref(): File not found: "mysql-5.0.27-jp-cp932-win32.zip" at page "Contrib"

#ref(): File not found: "mysql-5.0.27-jp-win-src.patch" at page "Contrib"

#ref(): File not found: "mysql-5.0.27-jp-win-src.zip" at page "Contrib"

旧いバージョン

  • cp932 を標準にしています




ver. 4.1 用パッチ

旧いパッチ

パッチをあてた MS-Windows 用バイナリ&ソース

  • libmysql.dll をこのバイナリのやつに入れ替えるだけでも、文字破壊対策として、効果あるアプリがあるでしょう。
  • c:\mysql をインストール先としてコンパイル。


  • 4.1.21

    #ref(): File not found: "mysql-4.1.21-jp-cp932-win32.zip" at page "Contrib"

    #ref(): File not found: "mysql-4.1.21-jp-win-src.patch" at page "Contrib"

    #ref(): File not found: "mysql-4.1.21-jp-win-src.zip" at page "Contrib"

旧いバージョン

  • sjis(cp932) をサーバーとクライアントの default-character-set に
  • mysqldump 修正
  • cp932, eucjpms 追加
  • --skip-conversion 追加



serverとclientを違う標準キャラクターセットに

  • コンパイル時に、server と client を違うキャラクターセットにコンパイルできるようにする
  • configure --with-client-charset= と指定
    • ./configure --with-client-charset=binary --with-charset=ujis の指定が可能
    • ./configure --with-charset=ujis の場合は、クライアントの標準もujisになる。
  • mysqldump がconfigure時のキャラクターセットを無視してutf8固定になるのを止めさせるようにもなる。(utf8固定ではなく、configureで指定したキャラクターセットを標準とするようになる)

パッチ当てた後、aclocal ; autoconf を実行のこと。(configure.in を変更するから)



mysqldump 時に、BLOB の内容を HEX で出力するパッチ

このパッチは、4.1.8 に取り込まれました。4.1.8 以上ではパッチ当ては不要です。

  • BLOB の内容が、0xABCDEF のように出力される。
  • mysqldump --hex-blob --skip-opt でダンプ


上の hex-blob が MySQL のソースに取り込まれたとき、char() binary も hex 出力するように変わっていました。(MySQL-5.0.15では直っています)
また、0バイトの BLOB を出力すると、「0x」 だけになり、SQLの構文エラーになるバグも含まれてしまいました。(MySQL-5.0.15では直っています)
このパッチは、

  • --hex-blob を指定すると BLOB のみを HEX で出力するように修正
  • --hex-char とすると CHAR() BINARY を HEX 出力するように修正
  • 0バイト時の構文エラーも修正
  • --csv (same as --fields-terminated-by=',' --fields-optionally-enclosed-by='"' --lines-terminated-by='\r\n') 追加



余計なお世話な文字チェック機能をはずす(すべてのバイト列を CHAR() が受け付ける)パッチ

4.1 は文字コードの範囲外のバイト列をchar()にINSERTできない仕様ですが、 このパッチをあてると、全てのバイト列が char() に入るようになります。

(4.0までは全てのバイト列がINSERTできる仕様です)



cp932, eucjpms パッチ

これは上の -with-client-charset.patch、-ctype.patch を含みます。

cp932, eucjpms キャラクターセットの追加パッチ。5.0からのバックポート。
aclocal、 autoconf の作業が必要。



余計なお世話の自動変換を停止するオプションのパッチ

  • 脱文字破壊!
  • mysqld --skip-conversion とすることで、自動変換機能を停止させます。
  • まるで 4.0 までのような動きになります。
  • メリットは、クライアントのキャラクターセットが何であれ(たとえlatin1であっても)、 クライアントから送られてきたバイト列は変換を通らず、そのままinsertします。
  • デメリットは、今のぱっちだと SQL関数の、CONVERT() 関数が使えません。
    • どなたか対応お願いします



sjis<->cp932, ujis<->eucjpms 変換をしないパッチ

  • cp932 と sjis の組み合わせの時、自動変換機能を止める
  • eucjpms と ujis の組み合わせの時、自動変換機能を止める



SET NAMES 文を実行したらescape処理時のキャラクターセットも変更するパッチ

  • SET NAMES 文を実行したら、内部(mysql.charset : escapeするために使用される)キャラクターセットも指定したものに変更。




ver. 4.0 用パッチ

SJIS + BLOB

  • 4.0 の BLOB 型が、sjis バイト列を余計にエスケープしないようにする
  • バイナリファイルをただしく BLOB に入れれるはず。

mysqldump 時に、BLOB の内容を HEX で出力するパッチ

4.0.23 でパッチが取り込まれました。4.0.23以上ではパッチは不要です

  • BLOB の内容が、0xABCDEF のように出力される。
  • mysqldump --hex-blob でダンプ



上の hex-blob が MySQL のソースに取り込まれたとき、char() binary も hex 出力するように変わっていました。
また、0バイトの BLOB を出力すると、「0x」 だけになり、SQLの構文エラーになるバグも含まれてしまいました。
このパッチは、

  • --hex-blob を指定すると BLOB のみを HEX で出力するように修正
  • --hex-char とすると CHAR() BINARY を HEX 出力するように修正
  • 0バイト時の構文エラーも修正
  • --csv (same as --fields-terminated-by=',' --fields-optionally-enclosed-by='"' --lines-terminated-by='\r\n') 追加




PHP4 用 パッチ

MySQL 4.1(5.0) への対応、その他。

このパッチを当てると、PHP4 の mysql.so は以下の機能を持ちます。

  • php.ini ファイルに以下のキーワードが指定できます。
  • mysql.set_names = キャラクターセット名
  • mysql.load_group = my.cnfグループ名
  • mysql.compress = 0か1
       mysql.set_names = binary
               サーバーに接続したら、すぐに、「SET NAMES binary」 を実行する。
               なにも指定していないときは、SET 文は実行しない。
               指定できるキャラクターセット名は、MySQL の指定に従う。(ujis, sjis, binary, utf8, ...)
       mysql.load_group = php
               my.cnf ファイルの中の [php] グループを読み込む。
               なにも指定していないときは、なにも読み込まない。
       mysql.compress = 1
               通信を gzip 圧縮する。0 のときは圧縮しない。
  • new function:
    • string mysql_hex_string(string);
             与えられた文字列を 16進数表示します。
             ex.
             echo mysql_hex_string("あいうえお");

この関数は、MySQL 4.0.22 以上の 4.0 および、4.1.7 以上で使用できます。


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS