Home > Archives > January 2008 Archive
January 2008 Archive
LOAD DATA INFILE時の文字コード
- January 31, 2008 10:16 AM
問題
latin1のデータをselect into outfileでエクスポート/ダンプして、load data infileでインポートすると、警告がでてうまくいかない。
mysql> use world; Database changed mysql> show tables; +-----------------+ | Tables_in_world | +-----------------+ | city | | country | | countrylanguage | +-----------------+ 3 rows in set (0.13 sec)mysql> select * into outfile 'c:\cl.txt' from countrylanguage;
Query OK, 984 rows affected (0.19 sec)mysql> create database world2;
Query OK, 1 row affected (0.09 sec)mysql> use world2;
Database changed
mysql> create table cl like world.countrylanguage;
Query OK, 0 rows affected (0.22 sec)mysql> load data infile 'c:\cl.txt' into table cl;
Query OK, 984 rows affected, 17 warnings (0.06 sec)
Records: 984 Deleted: 0 Skipped: 0 Warnings: 11Error (Code 1406): Data too long for column 'Language' at row 132
Error (Code 1366): Incorrect string value: '\x9Aua' for column 'Language' at row 257
Error (Code 1366): Incorrect string value: '\x9Aua' for column 'Language' at row 271
Error (Code 1406): Data too long for column 'Language' at row 289
Error (Code 1366): Incorrect string value: '\xE1huatl' for column 'Language' at row 357
Error (Code 1406): Data too long for column 'Language' at row 378
Error (Code 1366): Incorrect string value: '\x9Aua' for column 'Language' at row 379
Error (Code 1406): Data too long for column 'Language' at row 419
Error (Code 1406): Data too long for column 'Language' at row 462
Error (Code 1406): Data too long for column 'Language' at row 470
Error (Code 1366): Incorrect string value: '\x9Au' for column 'Language' at row 505
Error (Code 1406): Data too long for column 'Language' at row 544
Error (Code 1406): Data too long for column 'Language' at row 546
Error (Code 1406): Data too long for column 'Language' at row 606
Error (Code 1406): Data too long for column 'Language' at row 624
Error (Code 1366): Incorrect string value: '\x9Aam' for column 'Language' at row 637
Error (Code 1406): Data too long for column 'Language' at row 839
mysql> show warnings;
+-------+------+----------------------------------------------------------------------+
| Level | Code | Message |
+-------+------+----------------------------------------------------------------------+
| Error | 1406 | Data too long for column 'Language' at row 132 |
| Error | 1366 | Incorrect string value: '\x9Aua' for column 'Language' at row 257 |
| Error | 1366 | Incorrect string value: '\x9Aua' for column 'Language' at row 271 |
| Error | 1406 | Data too long for column 'Language' at row 289 |
| Error | 1366 | Incorrect string value: '\xE1huatl' for column 'Language' at row 357 |
| Error | 1406 | Data too long for column 'Language' at row 378 |
| Error | 1366 | Incorrect string value: '\x9Aua' for column 'Language' at row 379 |
| Error | 1406 | Data too long for column 'Language' at row 419 |
| Error | 1406 | Data too long for column 'Language' at row 462 |
| Error | 1406 | Data too long for column 'Language' at row 470 |
| Error | 1366 | Incorrect string value: '\x9Au' for column 'Language' at row 505 |
| Error | 1406 | Data too long for column 'Language' at row 544 |
| Error | 1406 | Data too long for column 'Language' at row 546 |
| Error | 1406 | Data too long for column 'Language' at row 606 |
| Error | 1406 | Data too long for column 'Language' at row 624 |
| Error | 1366 | Incorrect string value: '\x9Aam' for column 'Language' at row 637 |
| Error | 1406 | Data too long for column 'Language' at row 839 |
+-------+------+----------------------------------------------------------------------+
Windowsのプロンプト上からは正しくlatin1の文字を確認できない。
putty(latin1に設定)などを使ってLinuxなどを経由することで、正しくWorldデータベースのテーブルがlatin1で入っていることは確認できた。
またDOSプロンプトを使わないで、Query Browser経由でも、確認できそう。
またダンプしたファイルは、秀丸で文字コードを「欧文(L)」にすることで正しくlatin1の文字を確認できた。
また該当のテキスト全体を
とで囲んで、ブラウザで開いた後に
文字コードセットをISO-8859-1(Latin1)に指定することでも確認できるそうな。
ので、問題はload data infileする際のcharacter setと思われる。
回答
LOAD DATA INFILEはcharacter_set_database変数のcharacter setを使う
character_set_databaseは、そのデータベースのdefault character setから引っ張ってくる
latin1のデータを入れる場合に必要な方法は、以下のどれか
1.character_set_databaseを変更する
mysql> set character_set_database='latin1';
Query OK, 0 rows affected (0.00 sec)
2.LOAD DATA INFILEに明示的にcharacter setを指定する
mysql> load data infile 'c:\cl.txt' into table cl character set latin1; Query OK, 984 rows affected (0.02 sec) Records: 984 Deleted: 0 Skipped: 0 Warnings: 0
3.Database作成時にdefault character setを指定しておく
mysql> create database world3 default character set latin1; Query OK, 1 row affected (0.00 sec)mysql> create table world3.cl like cl;
Query OK, 0 rows affected (0.00 sec)mysql> use world3;
Database changed
mysql> load data infile 'c:\cl.txt' into table cl;
Query OK, 984 rows affected (0.02 sec)
Records: 984 Deleted: 0 Skipped: 0 Warnings: 0
- Comments (Close): 0
- TrackBack (Close): 0
MySQLのログのローテーション
- January 28, 2008 5:20 PM
2とおり
1。logrotateに任せている場合
logrotate
/support-files/mysql-log-rotateを参考にできる。
2。自分でスクリプトを書く
mvしてから、flush logs;を発行する。
- Comments (Close): 0
- TrackBack (Close): 0
master_pos_wait関数でレプリケーションの同期確認
- January 16, 2008 1:11 PM
MASTER_POS_WAIT(log_name,log_pos[,timeout])
この関数は、マスター / スレーブの同期化のコントロールに役立ちます。スレーブがマスター ログで指定された位置まで読み取り、すべてのアップデートを適用するまでブロックします。戻り値は、指定の位置まで進むまでスレーブが待たなければいけないログ イベントの数です。この関数は、スレーブ SQL スレッドが開始されていない、スレーブのマスター情報が初期化されていない、引数が正しくない、またはエラーが発生、という場合は NULL を戻します。タイムアウトの時間を越えると -1 が戻されます。MASTER_POS_WAIT() の待機中にスレーブ SQL スレッドが停止すると、関数は NULL を戻します。スレーブが指定の位置を過ぎたら、関数はただちに戻しを行います。timeout 値が指定された場合、timeout の秒数を経過したのち MASTER_POS_WAIT() は待機をやめます。timeout は 0 より大きい数字でなければなりません。0 または負数の timeout では待機時間なしになります。
http://dev.mysql.com/doc/refman/5.1/ja/miscellaneous-functions.html
引数には、マスターのshow master status;の結果を入れる。
マスターとスレーブが完全に同期されていることを確認する関数で、これを使えば、わざわざshow master statusとshow slave statusの結果を比べなくても済むので便利!!!!!
- Comments (Close): 0
- TrackBack (Close): 0
ndb_restore
- January 15, 2008 1:27 PM
ndb_restore -m -b 1 -n 2m: メタデータのリストア b: バックアップIDの指定 n: ノードIDの指定
ndb_restore -r -b 1 -n 2r: データのリストア
- Comments (Close): 0
- TrackBack (Close): 0
MySQL Cluster DBA Certificationに合格した
- January 15, 2008 10:50 AM
今回は特に準備しなかったのだけど、暗記系が少なかったので、何とか合格できた。
IPAプロジェクトで私が担当したMySQL Clusterのレポートを一通り読むだけでいけそう。
試験に合格するだけであれば、MySQL 5.1 Cluster Certification Study Guideは必要なさそう。
- Comments (Close): 0
- TrackBack (Close): 0
MySQL 5.1 Cluster DBA Certification Study Guideが発売された
- January 15, 2008 10:44 AM
http://www.lulu.com/content/1297960
レビュアーとして何章かレビューしたので、先週見本が届いた。
MySQL Clusteringよりも新しいので、MySQL Cluster Replicationなどの情報が新しく、オススメ。
試験の合格には、、、ここまでspecificな情報は必要ない。
- Comments (Close): 0
- TrackBack (Close): 0
MySQL Cluster Replicationの制限
- January 7, 2008 7:26 PM
MySQL AB :: MySQL 5.1 Reference Manual :: 15.10.3 Known Issues in MySQL Cluster Replication
・マルチバイト環境でいくつかの制限
・マスター/マスターレプリケーションは構成できる。。。のか?
- Comments (Close): 0
- TrackBack (Close): 0
MySQL Cluster 5.xとMySQL Cluster Carrier Grade Edition(CGE)の違い
- January 7, 2008 7:10 PM
Q. なぜソースが別管理されているか
A. NDBのソースコードに手を加える上で、MySQL Serverのソースコードがころころと
変更されるのは非常にやりづらいらかでしょう。
加えて、QAプロセスを簡略化するためでしょう。
http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-cge-releases.html
を見ると、MySQL Serverのバージョンを固定して、NDBのバージョンがざくざくと
上がっている様子が分かる。
Q. MySQL Cluster 5.xとCGEとの違い
A. CGEはMySQL Clusterよりもバグの修正が早いのに加えて、NDB向きの新機能が実装されている。
http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-cge-differences.html
を読むと、次のような新機能がCGEで実装されている。
- バックアップのステータスが細かくロギングされる
- Data Nodeのメモリ利用効率が良くなった
- DUMPコマンドの追加(トランザクションやロックの状態追跡)
- オンラインでカラムの追加、インデックスの追加、インデックスの削除
が可能になった(以前はシングルユーザーモードにする必要があった)
- 主キーアクセスのパフォーマンス向上
- Comments (Close): 0
- TrackBack (Close): 0