00メニュー > 01はじめてのMySQL > 02MySQLの基礎知識 > 03MySQLを使いこなす > 04MySQL+PHPの基礎 > 05MySQL+PHPの実践 > 06Appendix

14ファイルを使ったやり取り(備忘録)→ > 01p > 02p > 03p > 04p > 05p > END

14 ファイルを使ったやり取り

  単純にINSERT、SELECT、DELETEするだけでデータベースが運用できるわけではありません。実践では複雑に絡み合った複数のテーブルを使って大量のデータを扱い、処理の効率を考え、そして不慮のデータ消滅も許されません。MySQLの勉強も佳境を迎えています。条件を設定した抽出、編集から、リレーショナルの名にふさわしい複数のテーブルの利用。そして「ビュー」「ストアドプロシージャ」「トランザクション」「ファイル操作」という、より実践的で必要とされる内容を解説します。
☆CHAPTER08⇒いろんな条件で抽出する
☆CHAPTER09⇒テーブルを編集する
☆CHAPTER10⇒複数のテーブルを利用する
☆CHAPTER11⇒ビューを使いこなす
☆CHAPTER12⇒ストアドプロシージャを使いこなす
☆CHAPTER13⇒トランザクションを使いこなす
★CHAPTER14⇒ファイルを使ったやり取り

ファイルを使ったやり取り(p298)

  MySQLモニタのようなCUIベースの(文字だけの)環境で、複雑なSQL文を発行したり、全てのデータを挿入したり・・・という作業は限界があります。ここではファイルを使った操作方法をまとめてみます。

(1)《テキストファイルからデータをを読み込む(インポート) p000》

  MySQLモニタのようなCUIベースの(文字だけの)環境で、複雑なSQL文を発行したり、すべてのデータを挿入したり・・・という作業には限界があります。
ここでは、ファイルを使った操作方法を学びます。 大量のデータをテーブルに入力するとき、MySQLモニタを開いてそのすべてをコーボードから手で入力していたら大変です。
通常、何千件、何万件というデータを入力するときは、「CSV」(comma Separated Values)形式のようなテキストファイルを使います。

(1-1)<CSVファイル>

CSVは「カンマで区切られた値」と訳されるように、そのファイルの中身はデータがカンマ(,)で区切られた形式で、文字(テキスト)だけでできています。
図14-1 CSV形式のファイル 【図形】 ※1つの行ごとに改行されます。
図14-2 インポート

(1-2)<ファイルをインポートする>

ファイルからデータをインポートするときにはLOAD DATA INFILEというコマンドを使います。 次のような構文になります。

●書式⇒ファイルからデータを読み込む

LOAD DATA INFILE ファイル名 INTO TABLE テーブル名 オプションの記述;
※CSV形式以外の、カンマで区切られていないテキストファイルも読み込むことができます。「データ間の区切り文字」や「改行文字」、「何行目から読み込むか」など、読み込むデータの形式を指定します。
この場合、上の「オプションの記述」の部分に、次を記述します。

●書式⇒LOAD DATA INFILE コマンドでデータ形式を指定するオプション

FIELDS TERMINATED BY 改行文字(デフォルト'\t':タブ)
LINES TERMINATED BY 改行文字(デフォルト'\n':改行)
IGNORE 最初にスキップする行 LINES(デフォルトは0)
※前ページで紹介した次のファイルは、テーブル「tb1」と同じ形式になっています。
今回は、このファイルに「t.csv」という名前を付けたとして、これをテーブル「tb1N」に読み込んでみることにしましょう。

□List14_1 t.csv

N551,佐々木,37
N552,伊藤,41
N553,斉藤,31
N554,井上,43
N555,阿部,31
※ここで使っている区切り文字は「,」なので、「FIELDS TERMINATED BY ','」だけは指定します。
また、CSVファイルが保存されているフォルダを指定するときは、パスはWindowsであっても「\」を使わずに「/」を使って下さい(例:「c:\data\t.csv」→「c:/data/t.csv」)。
それでは、実際に操作してみましょう。上記のCSVファイル「t.CSV」が「c:\data」フォルダにあるとして、これをテーブル「tb1」と同じ内容のテーブル「tb1N」にインポートします。

●インポートの内容

○CSVファイル「t.CSV」
【画像】

●(実行前)インポートを行なうテーブル「tb1N」

mysql> SELECT * FROM tb1N;
+------+------+------+
| bang | nama | tosi |
+------+------+------+
| A105 | 西沢 | 35 |
| A104 | 渡辺 | 23 |
| A103 | 中川 | 20 |
| A102 | 高橋 | 28 |
| A101 | 佐藤 | 40 |
+------+------+------+
5 rows in set (0.04 sec)

mysql>

●(実行後)「t.CSV」がインポート

●操作手順

①次を実行する
LOAD DATA INFILE 'c:/data/t.csv' INTO TABLE tb1N FIELDS
TERMINATED BY ',';

●実行結果

mysql> LOAD DATA INFILE 'c:/data/t.csv' INTO TABLE tb1N FIELDS
-> TERMINATED BY ',';
Query OK, 5 rows affected (0.04 sec)
Records: 5 Deleted: 0 Skipped: 0 Warnings: 0

mysql>

「SELECT * FROM tb1N;」
でテーブル「tb1」の内容を確認してください。5レコードが新たに追加されているのがわかります。

●実行結果

mysql> SELECT * FROM tb1N;
+------+--------+------+
| bang | nama | tosi |
+------+--------+------+
| A105 | 西沢 | 35 |
| A104 | 渡辺 | 23 |
| A103 | 中川 | 20 |
| A102 | 高橋 | 28 |
| A101 | 佐藤 | 40 |
| N551 | 佐々木 | 37 |
| N552 | 伊藤 | 41 |
| N553 | 斉藤 | 31 |
| N554 | 井上 | 43 |
| N555 | 阿倍 | 31 |
+------+--------+------+
10 rows in set (0.00 sec)

mysql>
※たとえばデータベースの種類が異なっていても、CSVファイルのようなか形式であればインポートすることができます。データベースを運用する上では必須のテクニックと言えるでしょう。

(1-3)<データをテキストファイルに書き出す(エクスポート)>

インポートとは逆に、テーブルにあるデータを「CSV」ファイルなどのテキストファイルとして取り出すことができます。
このようにデータをファイルとして取り出すことを、エクスポート(export)といいます。
【図14-3 エクスポート 画像】
※エクスポートしたファイルは、別のデータベースやシステムで利用したり、万が一のときのバックアップしたりと活躍します。 エクスポートは、次のようにして行ないます。

書式⇒データをテキストファイルとして書き出す

SELECT * INTO OUTFILE ファイル名 オプションの記述 FROM テーブル名;
※引数の「オプションの記述」というのは、書き出すテキストファイルの形式を指定するものです。インポートで指定する記述方法と同じです。

(1-4)<ファイルをエクスポートする>

では、エクスポートを実行してみることにしょう。「c:\data」フォルダに、テーブル「tb1」のデータを書き出したCSV形式のテキストファイル「out.csv」を作成してみましょう。

●実行される結果

●「実行前」テーブル「tb1」

【画像】

●「実行後」CSVファイル「out.csv」

●操作手順

SELECT * INTO OUTFILE 'c:/data/out.csv' FIELDS TERMINATED BY ',' FROM tb1;

●実行結果

mysql> SELECT * INTO OUTFILE 'c:/data/out.csv' FIELDS TERMINATED BY ',' FROM tb1 ;
Query OK, 5 rows affected (0.08 sec)

mysql>

※これで、「out.csv」というCSVファイルが「c:\data」フォルダに作成されます。
エクスポートしたファイルの内容は、メモ帳などのテキストエディタで確認できます。
ここでは、コマンドプロント「TYPE」コマンドを使ってみましょう。一度MySQLモニタを終了し、コマンドプロントの状態で次にようにTYPEを使います。
TYPE C:\data\out.csv

●実行結果

C:\Documents and Settings\Owner>TYPE c:\data\out.csv
A105,西沢,35
A104,渡辺,23
A103,中川,20
A102,高橋,28
A101,佐藤,40

C:\Documents and Settings\Owner>
※このようにコマンドプロントで「TYPE」コマンドを使うと、テキストの内容が表示されます。
エクスポートした「out.csv」のデータは、「LOAD DATA INFILE」コマンドでインポートすることができます。

(2)《SQLのコマンドをファイルから読み込んで実行する p304》

(2-1)<ファイルに書き込まれたSQL文をMySQLモニタから実行する>

複雑でも長いSQL文を発行するとき、いちいちMySQLモニタで記述していては大変です。複雑なSQL文を実行する場合、一度テキストファイルとして作成し、保存したファイルを一度に実行しましょう。
こうすることで効率よく作業を進めることができます。また、作成したテキストのSQL文を表示し、これをSQLモニタでコピー・貼り付けして実行することもできます。
テキストファイルとしてSQL文を保存しておけば、いつでも操作が再現できますし、改良するのも楽になります。
【図14-4 SQLファイルを読み込む 画像】
※メモ帳などのテキストエディタであらかじめSQL文を作成しておき、これをMySQLモニタでSOURCEコマンドを使って実行します。

●書式⇒SQL文が保存されたテキストファイルを実行

SOURCE テキストファイル名;
※では、実際にやって見ましょう。「USE db1;」「SELECT * FROM tb;」および 「SELECT * FROM tb1;」の3行からなるテキストファイル「sql.txt」を「c:\data」フォルダに作成し、これを読み込んで実行してみましょう。

●実行される内容p305

●(実行前)テキストファイル「sql.txt」


データベース「db1」を指定

(実行後)

●操作手順

①List 14-2テキストファイル「sql.txt」を作成する
②次を実行する
SOURCE c:/data/sql.txt

■List14-2 sql.txt

SELECT * FROM tb;
SELECT * FROM tb1;

■実行結果

C:\Documents and Settings\Owner>mysql -u root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.0.45-community-nt MySQL Community Edition (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> SOURCE c:/data/sql.txt
Database changed
+--------+------+------+
| bang | uria | tuki |
+--------+------+------+
| A103 | 101 | 4 |
| A102 | 54 | 5 |
| A104 | 181 | 4 |
| A101 | 184 | 4 |
| A103 | 17 | 5 |
| A101 | 300 | 5 |
| A102 | 205 | 6 |
| A104 | 93 | 5 |
| A103 | 12 | 6 |
| A107 | 87 | 6 |
| 意地悪 | 50 | NULL |
+--------+------+------+
11 rows in set (0.48 sec)

+------+------+------+
| bang | nama | tosi |
+------+------+------+
| A105 | 西沢 | 35 |
| A104 | 渡辺 | 23 |
| A103 | 中川 | 20 |
| A102 | 高橋 | 28 |
| A101 | 佐藤 | 40 |
+------+------+------+
5 rows in set (0.13 sec)

mysql> ※「SOURCE」はSQLコマンドでないので、行の最後にデリミタ「;」は付けない点に注意してください。

(2-2)<ファイルに書かれたSQLコマンドプロントから実行する>

ここまで、SQLコマンドを実行する場合には、MySQLモニタを起動して「mysql>」というプロントの後にSQL文を入力して実行していました。
実は、わざわざMySQLモニタを起動しなくても、コマンドプロントから直接SQL文を実行することができます。
つまり、前項で行なったような「SQL文が書かれているテキストファイルの実行」も、MySQLモニタを起動しなくても出来るということになります。
ここでは、次のList4-2の「sql.txt」を「SOURCE」コマンドで実行してみます。
USE db1;
SELECT * FROM tb;
SELECT * FROM tb1;
※コマンドプロントからSQL文を実行する場合、次のようなコマンドになります。

書式⇒コマンドプロントからSQL文を実行する

mysql データベース名 -uユーザー名 -pパスワード -e "MySQLモニタのコマンド" 「e」のオプションを付けて、その後にコマンドを「""」で囲んで指定します。
コマンドは「''」(シングルクォテーション)ではなく、「""」ダブルクォテーション で囲ってください。
また、「-pパスワード」「-e」「"MySQLモニタのコマンド"」のそれぞれの間には、半角スペースを入れて下さい。
※データベースを指定する必要がなければ、「データベース名」を省略ができます。 今回は「sql.txt」の中に「USE db1;」の記述があるので、「デーだベース名」は省略することができます。
実際にやって見ましょう。「c:\data」フォルダにある、データベース「db1」に関するSQL文が記述されているテキストファイル「sql.txt」を、mysqlコマンドで実行してみます。

●操作手順

①次のコマンドプロントから実行する
mysql db1 -uroot -p1234 -e "SOURCE c:/data/sql.txt"

●実行結果

C:\Documents and Settings\Owner>mysql db1 -uroot -e "SOURCE c:/data/sql.txt"
+--------+------+------+
| bang | uria | tuki |
+--------+------+------+
| A103 | 101 | 4 |
| A102 | 54 | 5 |
| A104 | 181 | 4 |
| A101 | 184 | 4 |
| A103 | 17 | 5 |
| A101 | 300 | 5 |
| A102 | 205 | 6 |
| A104 | 93 | 5 |
| A103 | 12 | 6 |
| A107 | 87 | 6 |
| 意地悪 | 50 | NULL |
+--------+------+------+
+------+------+------+
| bang | nama | tosi |
+------+------+------+
| A105 | 西沢 | 35 |
| A104 | 渡辺 | 23 |
| A103 | 中川 | 20 |
| A102 | 高橋 | 28 |
| A101 | 佐藤 | 40 |
+------+------+------+

★ここではパスワードを省略しました。
C:\Documents and Settings\Owner>
※MySQLモニタを起動しなくても、テキストファイルに記述されたSQLコマンドを実行することができました。

(3)《SQLの実行結果をファイルに保存する p309》

MySQLモニタで入力したコマンドは画面に表示され、またその実行結果も画面に表示されます。
ユーザーは画面に表示された実行結果のデータを見て情報を得ますが、これらの結果をデータとして利用することも出来るのです。
ここでは、「MySQLモニタでteeコマンドを実行」「リダイレクトで、結果を標準出力に出力」という、2つの方法を紹介します。

(3-1)<リダイレクトでSQL文の実行結果をテキストファイルに出力する>

コンピュータは,何かのデータを入力し、それを処理した結果を出力させることができます。
このとき、通常はキーボードのように最初から用意されている出力装置を「標準出力」といいます。
この「標準入力」や「標準出力」の装置を変更することができます。 この変更作業を「リダイレクト」といいます。リダイレクトは、WindowsやLinuxなどのOSも持つ機能です。
リダイレクトを行なう、つまり入出力先を変更するには、「>」などの記号を使います。

●プロンプトでリダイレクトを行なう

たとえばWindowsのコマンドプロントで「dir」(Linuxのターミナルなら「ls」と入力するとファイルやフォルダの情報が表示されます。)

C:\Documents and Settings\Owner>dir
ドライブ C のボリューム ラベルがありません。
ボリューム シリアル番号は C824-AC35 です

C:\Documents and Settings\Owner のディレクトリ

2009/11/19 09:12  <DIR>     . //< >は小文字で・・
2009/11/19 09:12  <DIR>     ..
2009/11/18 08:58 <DIR> Favorites
2009/11/12 15:56 <DIR> My Documents
2002/04/01 11:52 <DIR> WINDOWS
2007/05/05 19:38 <DIR> スタート メニュー
2010/02/20 10:37 <DIR> デスクトップ
0 個のファイル 0 バイト
7 個のディレクトリ 14,736,515,072 バイトの空き領域

C:\Documents and Settings\Owner>

■実行結果(表示される内容は環境によって異なる)

【検証したもの】
※つまり、「dir」の結果は「ディスプレイ」という標準出力に出力されたことになります。
これを「リダイレクト」を使って、標準出力ではない「abc.txt」というファイルに保存します。 次にのように操作します(Linuxでは「ls>abc.txt」)。 dir>abc.txt

■実行結果

C:\Documents and Settings\Owner>TYPE abc.txt
ドライブ C のボリューム ラベルがありません。
ボリューム シリアル番号は C824-AC35 です

C:\Documents and Settings\Owner のディレクトリ

2010/04/02 21:02 <DIR> .//< >は小文字で・・
2010/04/02 21:02 <DIR> ..
2010/04/02 21:05    0 abc.txt
2009/11/18 08:58 <DIR> Favorites
2009/11/12 15:56 <DIR> My Documents
2002/04/01 11:52 <DIR> WINDOWS
2007/05/05 19:38 <DIR> スタート メニュー
2010/02/20 10:37 <DIR> デスクトップ
1 個のファイル 0 バイト
7 個のディレクトリ 14,736,908,288 バイトの空き領域

C:\Documents and Settings\Owner>

【検証したもの】 c:\Users\tateda>dir>abc.txt
※この結果、「dir」を実行した結果がテキストファイル「abc.txt」に書き込まれます。
これは「>abc.txt」を付けたことで、出力結果を「abc.txt」に送ったからです。
出力結果が保存された「abc.txt」のファイルは実行した場所に保存されています。
たとえば上の例なら、Cドライブの「\Users\tateda」フォルダ(ディレクトリ)になります。テキストエディタや、「TYPE abc.txt」として内容を確認して下さい。
「dir」を実行したときと、同じ内容が表示されます。

●MySQLモニタでリダイレクトを使う

さて、このリダイレクトの機能をMySQLでも使ってみることにしましょう。 MySQLモニタを起動するときには、たとえば次を実行しました。
mysql -u -p1234
これを、リダイレクトを使って抽出の結果をファイルに入力するように変更します。 ためしに、次のようにMySQLモニタを起動してください。
mysql -u root -p1234 > log.txt
このようにしてMySQLモニタを起動すると、SQL文を実行した結果が画面に表示されずに、リダイレクトで指定した「log.txt」にだけ出力されます。
では、まず使うデータベースを指定してから、テーブル「tb1」の内容を「SELECT」で表示させ、最後に「EXIT」でMySQLモニタを終了しましょう。
繰り返しますが、実行結果は何も表示されません。
USE db1;
SELECT * FROM tb1
EXIT

■実行結果

※元のコマンドプロントに戻りましたか?画面に何も表示されない、ということは不便ですね。
では、「log.txt」の中身を確認してみましょう。メモ帳などのテキストエディタで「log.txt」を開いてください。あるいはそのまま「TYPE log.txt」と入力して下さい。
いつものMySQLモニタでの表示がテキストファイルになっています。

●実行結果(log.txtの内容)

※このように、「SELECT * FROM tb1;」の結果が表示されるはずです。このファイルは単純なテキストファイルなので,他のシステムやアプリケーションでも自由に利用できます。
もし、結果が画面に表れないで使いづらいという場合は、コマンドプロントからSQL文のテキストファイル「sql.txt」を実行して、その結果をそのままリダイレクトでテキストファイル「log.txt」に書き出します。

mysql -u root -p1234 -e "SOURCE c:/data/sql.txt">c:/data/log.txt
※「sql.txt」は次のような内容です。
C:\Documents and Settings\Owner>mysql -u root -e "SOURCE c:/data/sql.txt">c:/dat a/log.txt

C:\Documents and Settings\Owner>

■実行結果(「sql.txt」の内容)

USE db1
SELECT * FROM tb;
SELECT * FROM tb1;

※データ内容は・・・「log.txt」
bang uria tuki
A103 101 4
A102 54 5
A104 181 4
A101 184 4
A103 17 5
A101 300 5
A102 205 6
A104 93 5
A103 12 6
A107 87 6
意地悪 50 NULL
bang nama tosi
A105 西沢 35
A104 渡辺 23
A103 中川 20
A102 高橋 28
A101 佐藤 40

(3-2)<teeコマンドを使ってSQLの結果をファイルに保存する>

MySQLモニタでteeコマンドを使うと、前項のリダイレクトと同様に、結果をファイルに書き出すことができます。
MySQLモニタで次のように「tee」を実行すると、その後の実行した結果は指定したファイルに保存されます。

●書式⇒実行した内容をファイルに保存する

tee 出力するファイル名;

●実行した結果をファイルに保存する

例えば、「log3.txt」のファイルに書き出すときは、MySQLモニタの状態で次のようにします。 tee log3.txt

■実行結果

mysql>tee log3.txt
Loggin to file "log3.txt"
※これで、空のテキストファイル「log3.txt」が作られます。以降に出力は、画面に表示されるだけでなく「log3.txt」にも書き込まれます。
なお、「log3.txt」が保存されるのは実行した場所です。前項の例ならCドライブの「\user\tateda」フォルダになります。
「tee」を実行した状態で、次のようにコマンドを実行してみます。
USE db1;
SELECT * FROM tb;
SELECT * FROM tb1;

mysql> tee c:/data/log3.txt
Logging to file 'c:/data/log3.txt'
mysql> USE db1;
Database changed
mysql> SELECT * FROM tb;
+--------+------+------+
| bang | uria | tuki |
+--------+------+------+
| A103 | 101 | 4 |
| A102 | 54 | 5 |
| A104 | 181 | 4 |
| A101 | 184 | 4 |
| A103 | 17 | 5 |
| A101 | 300 | 5 |
| A102 | 205 | 6 |
| A104 | 93 | 5 |
| A103 | 12 | 6 |
| A107 | 87 | 6 |
| 意地悪 | 50 | NULL |
+--------+------+------+
11 rows in set (0.81 sec)

mysql> SELECT * FROM tb1;
+------+------+------+
| bang | nama | tosi |
+------+------+------+
| A105 | 西沢 | 35 |
| A104 | 渡辺 | 23 |
| A103 | 中川 | 20 |
| A102 | 高橋 | 28 |
| A101 | 佐藤 | 40 |
+------+------+------+
5 rows in set (0.53 sec)

mysql>

※実行結果は通常通り表示されますが、内容は「log3.txt」に書き込まれます。
★「log3.txt」の内容です。
mysql> USE db1;
Database changed
mysql> SELECT * FROM tb;
+--------+------+------+
| bang | uria | tuki |
+--------+------+------+
| A103 | 101 | 4 |
| A102 | 54 | 5 |
| A104 | 181 | 4 |
| A101 | 184 | 4 |
| A103 | 17 | 5 |
| A101 | 300 | 5 |
| A102 | 205 | 6 |
| A104 | 93 | 5 |
| A103 | 12 | 6 |
| A107 | 87 | 6 |
| 意地悪 | 50 | NULL |
+--------+------+------+
11 rows in set (0.81 sec)

mysql> SELECT * FROM tb1;
+------+------+------+
| bang | nama | tosi |
+------+------+------+
| A105 | 西沢 | 35 |
| A104 | 渡辺 | 23 |
| A103 | 中川 | 20 |
| A102 | 高橋 | 28 |
| A101 | 佐藤 | 40 |
+------+------+------+
5 rows in set (0.53 sec)

●ファイルへの出力の中止

ファイルへの出力を中止するときは、noteeコマンドを使います。
mysql>notee
Outfile disabled.

mysql> notee
Outfile disabled.
mysql>

■実行結果

※「EXIT」等で、MySQLモニタを終了してください。「log3.txt」の内容をテキストエディタや「TYPE log3.txt」で確認します。
いつもMySQLに表示されている内容が、そのままテキストとなって「log3.txt」に書き込まれます。
※次のようにしてファイルを呼び出す。
C:\Documents and Settings\Owner>c:/data/log3.txt

(4)《データベース全体のバックアップとリストア p315》

(4-1)<バックアップとリストアの方法>

データベースの設定、テーブルとカラムの定義やデータなど、データベースのすべての情報を丸ごとファイルにして取り出すことが可能です。

●ダンプ

データベースのすべての内容を書き出すことを、ダンプ(dump)する。といいます。
ダンプしたファイルを使えば、別のサーバーに同じ内容のデータベースを構築したり、万が一の事態に対応するためのバックアップを取ることも可能です。
MySQLのデータベースをダンプするときは、コマンドプロントからmysqldumpコマンドを実行します。
【図14-5 ダンプ 画像】

※mysqldumpコマンドでは、データベースの構成とデータそのものをSQL文として書き出します。
つまり、「CREATE TABLE…」でテーブルを作成、さらに「INSERT INTO…」というような内容のSQL文を書き出します。
※ダンプにより書き出された情報は、単なるSQL文からできるテキストです。 そこから、データベースのすべての情報を読み取ることが可能であり、「ダンプ出力はデータベースそのものである」ともいえます。
その扱いには十分慎重に行なう必要があります。

●リストア

逆に、mysqldumpコマンドで書き出したデータをデータベースに戻すことを、リストア(restore)するといいます。
リストアすることは、データデースを1から作るということになります。もっともこれは単純で、SQL文の集まりであるテキストファイルを「mysql」コマンドでリダイレクトするだけです。

(4-2)<mysqldumpを使って書き出す>

ここまで構築してきたデータベース「db1」のすべての情報を、mysqldumpコマンドを使ってダンプしてみることにしましょう。mysqldumpコマンドを実行した結果をリダイレクトでファイルに書き込みます。

●書式⇒データベースをダンプする

mysqldump -u ユーザー名 -pパスワード データベース名 > 出力ファイル名;
※では、実際にやって見ましょう。データデース「db1」の情報を、「db1_out.txt」というファイル名でダンプする

●実行される内容

●操作手順

①コマンドプロントから次を実行する
mysqldump -u root -p1234 db1>db1_out.txt

●実行結果

※多少時間がかかって終了します。出力されたファイルは単純なテキストファイルなので、エディタで実際にその内容を確認してみるとよいでしょう。なんとも難しそうな内容です。
C:\Documents and Settings\Owner>mysqldump -u root db1>c:/data/db1_out.txt

C:\Documents and Settings\Owner>

■「db1_out.txt」の内容の一部

※行の先頭が「---」になっていたり、「/:」と「*/」で囲まれていたりする部分はコメントで、コマンドではなく単なる「説明書き」です。
コメントの上の方には「CREATE TABLE~」あります。テーブルを作成しているのです。

-- MySQL dump 10.11
--
-- Host: localhost Database: db1
-- ------------------------------------------------------
-- Server version 5.0.45-community-nt

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `hizu_ziko`
--

DROP TABLE IF EXISTS `hizu_ziko`;
CREATE TABLE `hizu_ziko` (
`hizu` datetime default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

- - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - -
-- Dumping data for table `hizu_ziko`
--
23),('A109','‘o?a',25),('A110','?g“c',27);
/*!40000 ALTER TABLE `tb2` ENABLE KEYS */;
UNLOCK TABLES;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2010-04-02 23:07:22

(4-3)<ダンプしたファイルをリストアする>

ダンプしたファイルをリストアします。コマンドラインから、リダイレクトでファイルをデータベースにリストアします。
データベースをダンプした場合、これをリストアするときは、流し込むデータベースが存在している必要があります。
このため、別の場所にデータベースを作るときなど、データベースが存在しない場合はあらかじめ作っておく必要があります。
では、リストアを行ってみましょう。データベース「tb2」を作成し、ここにダンプしたファイル「db1_out.txt」をリストアしてみましょう。

●実行される内容

●データベース「db2」を作成

●テキストファイル「db1_out.txt」

●(実行後)データベース「db2」を構築

●実行手順

①コマンドプロントから次を実行する。これでデータベース「db2」が作成される
mysqladmin -u root -p1234 CREATE db2
②コマンドプロントから次を実行
mysql -u -p1234 db2 <db1_out.txt
※この手順で、通常はデータベース「db2」が複製されます。もしエラーになった場合は、文字コードが原因である可能性があります。この場合は、次のようにダンプ、リストアとも文字コードを指定して実行してみてください。

(4-4)<文字コードの問題>

上記のような操作方法でおおむねうまくいくはずですが、MySQLの運用でしばしば悩まされるのが「文字コード」の問題です。
たとえば、リストアしている最中に、以下のようなエラーとなって止ってしまうことがあるかもしれません。
c:\users\tateda>mysql -u root -p1234 db2 <db1_out.txt
ERROR 1067 (42000) at Line 86: Invalid default value for 'nama'
単純に「ダンプ→リストア」すると、日本語2バイトが問題となってエラーになることがあります。これは、ダンプやリストアするときに文字コードも指定しないと、デフォルトの文字コードでファイルの入出力が行なわれるからです。
エラーが発生してうまく「ダンプ→リストア」ができないときは、文字コードを指定してダンプ、リストアを試してください。文字コードを指定するのは次のオプションです。
--default-character-set=文字コード
たとえば、シフトJISを表す「sjis」を指定する場合は、
「--default-character-set=sjis」を付けます。
次に、このオプションで文字コードを「sjis」に指定してダンプを実行する例です。 「db3_out.txt」にダンプで書き出して、新たに作成したデータベースdb3にリストアしています。
①mysqldump -u root -p1234 db1>db3_out.txt --default-character- set=sjis
②mysqladmin -u root -p1234 CREATE db3
③mysql -uroot -p1234 db3<db3_out.txt --default-character-set=sjis

<まとめ>

●テキストファイルを使った、データのインポートエクスポート
●SQLをまとめて記述してあるファイルを使った実行方法
●クエリの実行結果をファイルに保存する方法
●データベース全体のバックアップとリカバリ
※大量のデータを1つ1つINSERT命令で入力していくことは、実践ではほとんどありません。ここで、ファイルを使ったデータのやり取りの方法を確実に覚えておきましよう。

<チェック>

□「LOAD DATA INFILE…」でデータをインポートすることができる
□「SELECT * INTO OUTFILE…」でデータをエクスポートすることができる
□SOURCEコマンドを使って、SQL文を一括で実行することができる
□teeを使って、実行結果を書き出すことができる
□mysqldumpでデータベース全体をバックアップすることができる
□リダイレクトを使って、データベースをリストアップすることができる

<練習問題>

問題1
MyISAMテーブルでは、次の構文でテーブルのバックアップ、リストアできます。
(フォルダの指定には「\」を使わずに「/」を使い「c:/folder」のように記述)。
■テーブルのバックアップ
BACKUP TABLE テーブル名 TO "バックアップ先のフォルダ";
■テーブルのりストア
RESTORE TABLE テーブル名 FROM "バップアップ先のフォルダ";
※この方法を使って、テーブル「tb1」をCドライブの「data」フォルダにバックアップし、さらにテーブル「tb1」を削除後、リストアしてみましょう。

《解答1》

①次を実行し、テーブル「tb1」を、Cドライブの「data」フォルダにバックアップします。
BACKUP TABLE tb1 to 'c:/data';
■実行結果
mysql>
②次を実行し、テーブル「tb1」を削除します。
DROP TABLE tb1;
■実行結果
③次を実行し、テーブル「tb1」をリストアします。
RESTORETABLE tb1 FROM 'c:/data';
■実行結果
※テーブルの存在を確認しましょう。
SELECT * FROM tb1;

【実行結果】

未処理