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: 11

Error (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

次期MyISAMのMariaがパブリックになった

  • January 29, 2008 8:24 AM
  • 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 2
m: メタデータのリストア b: バックアップIDの指定 n: ノードIDの指定
ndb_restore -r -b 1 -n 2
r: データのリストア
  • 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

Index of all entries

Home > Archives > January 2008 Archive

Search
Feeds

Return to page top