第16日目:教えて('A`) 〜MySQLって何?(その3)〜
|
どうも、('A`)です。
今日は朝からちょっと大きなネットワーク障害が発生して復旧対応に大わらわの
状態でした。現在は正常に稼働しています。ご安心下さい。
こちらのページで今回の障害についてご報告差し上げておりますが、どの様な
「不具合」が発生したのか気になる方もいらっしゃると思いますので、解説します。
今朝の7時頃にデータセンターに設置されているスイッチの1つで何故か負荷が
急に高くなり、正常な応答動作がしづらい状況に陥りました。
そしてこれに付随して各スイッチが迂回経路を求めようとした際に問題のスイッチに
起因する「通信のループ現象」が発生し、構内のネットワーク全体がひっ迫した状態と
なりました。
PIEのネットワーク技術者チームはスイッチが物理的に壊れていない事を確認し
スパニングツリープロトコル(STP)の設定を調整した結果、午前8時30分に
構内ネットワークが正常化(復旧)しました。もう大丈夫です!
お客様への復旧連絡等の対応がようやく終わりましたので、やっと日記に取り掛かれます。
(それにしても('A`) が夜間監視の当番の日とかその翌朝ってこういう事が起きる頻度が
高いんですよ。気のせいかなあ・・・ちなみに今朝はこの障害が発生した為アメリカからの
モーニングコールで叩き起こされました。ちょっと眠たいです。)
さて、今日は昨日に引き続きphpMyAdminを使ったデータベース構築&データ登録のお話を
進めます。
昨日エース( ,_ノ` )y━・~~~から突っ込まれた「文字化け」の問題、そしてデータベースの
データのバックアップ&復元について重点的に説明します。
【文字化けの原因‥‥文字コードlatin1の悪戯】
昨日('A`)がデータ追加した際に「文字化け」が発生しましたが、これはMySQLシステムの
デフォルト文字コードが「latin1」(大まかにいえば英語)になっている為です。
今回使用したMySQLはFreeBSDのPorts(バイナリ形式)をpkg_addコマンドでインストール
したもので、その場合デフォルト文字コードがlatin1になります。
(ちなみにMySQLのバージョンは5.0.27です。)
MySQLの5.0.x系ではutf8(unicode)も文字コードとしてインストールされているので、
テーブル作成時の設定でキャラクタセットとして指定すると日本語も扱えます。
では具体的に文字化けを回避する為にどの様にテーブルを作ればよいか説明します。
まず昨日作ったテーブル「server_list」の設定内容を見てみます。

(図1)
図1の内容でテーブルを作成すると、MySQLでは各項目の文字コード(キャラクタセット)に
latin1を自動的に適用します。そしてphpMyAdmin側ではこのlatin1の文字コードに基づき
表示用の文字コードを図2の様に「latin1_swedish_cl」として適用します。
(なぜスウェーデンなんだろう・・・)
phpMyAdmin上でのテーブル構成の表示画面中では「照合順序」という項目がこれに
該当します。

(図2)
この状態で日本語の文字コードを入力すると、一覧表示の際に対応するコードが
見つからない為に「文字化け」した形で表示されます。
図3の様に鯖子J(''ー`)しの顔が「J('?`)?」の様に崩れて表示されます。

(図3)
それでは、どうすればいいか・・・テーブルを作成する時にテーブル全体又は項目の
文字コードを「utf8_unicode_cl」として適用すればOKです。
今回はテーブル全体に utf8_unicode_cl を適用する為、図4の様にテーブル全体の
「照合順序」のスクロールバーで選択し、「保存する」ボタンを押します。

(図4)
すると図5の様にテーブルの各項目の照合順序が「utf8_unicode_cl」となります。
またテーブルの文字コード(キャラクターセット)が utf8 となります。

(図5)
そこでこのテーブルに日本語を含むデータを追加してみると、図6の様に表示されます。
鯖子J(''ー`)し も root弟(´・ω・`) も文字化けする事無く表示されます。

(図6)
【もう1つのデータ入力方法‥‥インポート】
昨日はphpMyAdminのデータ追加画面からの入力方法について説明しました。
確かに入力はできるのですが、データ量が多いと「1件ずつ入力するのはきつい」と
思われる人もいるでしょう。そこで、もう一つの入力方法(インポート)を今から説明します。
まず入力するデータをEXCELやテキストエディタなどを使ってcsv形式で作成します。
(自分が使っているPC上に作って下さい。)
('A`)の場合には以下の内容のデータ(slist.csv)を作成しました。
banana205";"FreeBSD 6.2R";"206.223.151.30";"('A`)"
"banana260";"FreeBSD 6.2R";"206.223.147.160";"J( 'ー`)し"
"banana261";"FreeBSD 6.2R";"206.223.147.165";"(´・ω・`)"
|
それぞれの行はテーブルの1レコードに対応します。また1レコード中の各項目は
;(ゼミコロン)で区切り、各項目の実データは"(ダブルクォーテーション)で囲っています。
(但し1レコード目の1番目の項目については最初の"を外します。そうしないと
phpMyAdminからのインポートで内部的に作られるSQL文が正しく生成されないからです。)
あと改行コードは「LF」を選択して下さい。
csvファイルを作ったら、インポートします。
phpMyAdminの画面上に「インポート」と書かれた次のボタンを押します。

すると図7の画面が表示されます。

(図7)
ここで、「テキストファイルの場所」と書かれた欄の横にある「参照」ボタンを押すと
エクスプローラーのダイアログが表示されるので、先ほど作成したcsvファイルを選択します
次に、以下の内容を設定します。
・インポート済ファイルの書式 → 「CSV」を選択
・CSVオプション → 下記の内容を入力
1) フィールド区切り記号 → ;
2) フィールド囲み記号 → "
3) フィールドのエスケープ記号 → \
4) 行の終端記号 → \n
そして画面右下にある「実行する」ボタンをマウスでクリックします。
画面で入力した各種設定とcsvファイルの内容が正しければ、図8の画面に切り替わり
データが追加されます。
(実際登録されたデータを見る場合にはphpMyAdmin画面上の「表示」ボタンをクリック
します。すると図6の画面が表示されます。)

(図8)
【データのバックアップ‥‥エクスポート】
MySQLのデータベースが壊れたりデータが無くなったりしたらとても困りますよね。
(件数が多いとデータ入力も大変ですから。)
ではバックアップはどうすれば作れるのか。
ここではphpMyAdminのエクスポート機能について説明します。
皆さんの中にはバックアップを取得するのは「データ本体」だけで良いと考えている
方もいるかもしれませんが、データベースの場合には「テーブル定義」等も対象に
する必要があります。
エクスポートではSQL形式でファイルに出力する事で、「データ本体」と「テーブル定義」を
まとめて1ファイルに出してくれます。
しかもこのファイルを使ったインポートの事も考えてSQL文も埋め込まれた内容で
生成されます。
まずphpMyAdminの画面上に「エクスポート」と書かれた次のボタンを押します。

すると図9の画面が表示されます。

(図9)
ここで「SQLオプション」内の「データ」と囲まれた項目群から「完全なINSERT文を作成する」に
チェックを付けます。
次に画面下段の「ファイルで保存する」にチェックを付け、右下の「実行する」ボタンを
クリックします。
すると図10の画面の様にエクスポートされ出力されたファイルのダウンロードが
実行されますので、ローカルに保存します。

(図10)
今回エクスポートを実施し、ダウンロードされたファイル(server_list.sql)の内容は
以下の様になっています。
-- phpMyAdmin SQL Dump
-- version 2.7.0-pl2
-- http://www.phpmyadmin.net
--
-- ホスト: localhost:3306
-- 作成の時間: 2008 年 3 月 26 日 22:32
-- サーバーのバージョン: 5.0.27
-- PHP バージョン: 4.4.2
--
-- データベース: `jbana205`
--
-- --------------------------------------------------------
--
-- テーブルの構造 `server_list`
--
CREATE TABLE `server_list` (
`name` char(10) collate utf8_unicode_ci NOT NULL,
`os` char(12) collate utf8_unicode_ci NOT NULL,
`ip` char(15) collate utf8_unicode_ci NOT NULL,
`owner` char(10) collate utf8_unicode_ci NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
--
-- テーブルのダンプデータ `server_list`
--
INSERT INTO `server_list` VALUES ('?banana205', FreeBSD 6.2R, 206.223.151.30, '(''A`)');
INSERT INTO `server_list` VALUES ('banana260', FreeBSD 6.2R, 206.223.147.160, 'J( ''ー`)し');
INSERT INTO `server_list` VALUES ('banana261', FreeBSD 6.2R, 206.223.147.165, '(´・ω・`)');
|
「テーブルの構造」の箇所がテーブルの定義部分を、「テーブルのダンプデータ」の箇所が
実データ部分を示しています。しかも昨日実行した様なSQL文の形式で作成されています。
・・・気づいたのですが、この内容でそのままインポートしようとしてもエラーになるなあ。
(ダンプデータのところの項目でフィールドが囲まれているものと囲まれていないものが
混在しています。)
なので、「テーブルのダンプデータ」を以下の内容にテキストエディタで修正します。
INSERT INTO `server_list` VALUES ('?banana205', 'FreeBSD 6.2R', '206.223.151.30', '(''A`)');
INSERT INTO `server_list` VALUES ('banana260', 'FreeBSD 6.2R', '206.223.147.160', 'J( ''ー`)し');
INSERT INTO `server_list` VALUES ('banana261', 'FreeBSD 6.2R', '206.223.147.165', '(´・ω・`)');
|
では実際にこのデータでテーブルが復元できるか試してみます。
まずは今データベースに存在しているテーブルを一旦削除します。
phpMyAdminの画面上に「削除」と書かれた次のボタンを押します。

すると図11の画面が表示され、削除の確認ダイアログが表示されます。

(図11)
ここで「OK」ボタンを押すとテーブルはサーバ上から削除され、無くなります。
では続けて先ほどダウンロードし修正した server_list.sql をインポートしてみます。
phpMyAdminの画面上の「インポート」ボタンを押します。
そして図12の画面が表示されたら「参照」ボタンで server_list.sql を指定して
「実行する」ボタンを押します。

(図12)
すると図13の画面に切り替わりました。これでテーブルの作成とデータの追加が
完了しました。

(図13)
( ,_ノ` )y━・~~~「どうですか?今日の日記は。。。」
('A`):「えーと、文字化け対応とバックアップの作り方&戻し方の基本説明は
できたかなあ、と」
( ,_ノ` )y━・~~~「いいですねぇ。。。」
('A`):「じゃあ、もういいかな、アップしても。」
( ,_ノ` )y━・~~~「いいですよ。第一弾としては上出来です。」
('A`):「え・・・第一弾って?」
( ,_ノ` )y━・~~~「実はですね・・・T-BanaanサーバではphpMyAdminの最新版を
インストールできるんですよ。今回説明で使ったバージョンは
ちょっと古いですしね。
今度は新バージョンを使っての説明があるといいですなあw」
('A`):「うわーん!!!」
|
何とかエース( ,_ノ` )y━・~~~にお願いしてMySQLの説明はこれで一旦終わりとなりました。
(ただ、もしかすると近日中に「第二弾」があるのかも・・・)
明日からは久しぶりにロードバランサーの方のお話に戻れるかと思います。
それでは、また
|
|
|
|