第2章MySQLの運営
index--TOP--prevpage
mysqladmin:MySQLデータベース管理コマンド

mysqladminはデータベース管理操作を行うユーティリティーだ。主な使い方は以下の通り。

>mysqladmin[OPTIONS]command[command-option]command...

mysqladmin--helpを実行すれば、mysqladminがサポートするオプション一覧が得られる。

mysqladminがサポートするコマンド
create[データベース名]データベース作成
drop[データベース名]データベース削除
extended-status サーバーから拡張ステータスメッセージを得る
flush-hosts 全てのキャッシュしているホストをフラッシュ
lush-logs 全てのログをフラッシュ
flush-tables全てのテーブルをフラッシュ
killid,id,...mysqlスレッドをキル
password[パスワード]パスワードを変更
pingmysqldが生きているかチェック
processlist実行中のスレッドを表示
reload設定情報の再読み込み
refresh全てのテーブルをフラッシュし、ログファイルを一度閉じて開く
shutdownmysqldの終了
statusサーバーからステータスメッセージを得る
variables可能な変数の表示
versionバージョン情報の表示

全てのコマンドはそのコマンド固有の接頭部分で省略できる。

>mysqladminprocstat

mysqladminstatusコマンドの返す項目

*Uptime
MySQLサーバーが起動してからの秒数
*Threads
実行中のスレッド(クライアント)数
*Questions
mysqld開始以降のクライアントからの問い合わせ数
*Slowqueries
long_query_time秒以上にかかったクエリの数
*Opens
mysqldが過去に開いたテーブルの数
*Flushtables
flush...,refresh,reloadコマンドの実行回数
*Opentables
現在開かれているテーブルの数
*Memoryinuse
mysqldによるメモリー割り当て(MySQLを--with-debugでコンパイルした場合だけに表示される)
*Maxmemoryused
mysqldが割り当てたメモリーの最大数(MySQLを--with-debugでコンパイルした場合だけに表示される)

------------------------------------------------------------------------

mysqldumpでデータベースやテーブルをまるごと出力!

通常、mysqldumpはデータベースのバックアップに使用されます。

mysqldumpを使った定期バックアップ

mysqldumpを使った簡単な定期バックアップ方法を紹介しましょう。まずシェルスクリプトを作成します。

自分のホームディレクトリに移動
cd
シェルスクリプト用のディレクトリを作成
mkdirsh
ダンプ用ディレクトリを作成
mkdirdump
mysqldump用のファイルをviで作成します。
vimysqldump.sh

mysqldump.shの内容は以下のとおりです。ユーザ名myuser、パスワードmypass、
バックアップディレクトリは/home/dump/db.txtとします。

mysqldump.shのソース

#!/bin/sh

mysqldump--all-databases>/home/dump/db.txt-umyuser--password=mypass--opt

最後にcronに登録。毎日1時に/home/shディレクトリにあるmysqldump.shを実行させます。

crontab-e
01****/home/sh/mysqldump.sh

mysqldumpの使い方

データベース、あるいは、バックアップ、他のSQLサーバーへのデータを移動を目的としたデータのまとまり、
これらをダンプするためのユーティリティ。ダンプは、テーブルの作成のためのSQL文を含みます。

サーバでバックアップを行なう場合、mysqlhotcopyを代わりに使用することを考慮すべきです。

>mysqldump[OPTIONS]database[tables]
もしくは
>mysqldump[OPTIONS]--databases[OPTIONS]DB1[DB2DB3...]
もしくは
>mysqldump[OPTIONS]--all-databases[OPTIONS]

もしテーブルを指定せず、--databasesや--all-databasesを使用しなかったなら、
データベースの全てのテーブルがダンプされます。

mysqldump--helpによって、オプションの一覧を手にいれることができます。

もしmysqldumpを--quickや--optなしで実行するならば、mysqldumpは結果を表示する前に、
結果をメモリに全てロードすることに注意してください。
これは大きなデータベースをダンプする際に問題になるでしょう。

mysqldumpのオプション
--add-locks
テーブルのダンプの前にLOCKTABLES文を追加し、
テーブルのダンプ後にUNLOCKTABLE文を追加(あとでMySQLに挿入するときに速くなる)。
--add-drop-table
テーブル作成の前にテーブルを削除する
-A,--all-databases
全てのデータベースをダンプします。
-a,--all
全てを含むオプションを作成します。.
--allow-keywords
予約語と同じ名前をもつフィールドの作成を許可します。これは、それぞれのフィールド名の前に、テーブル名を付け足します。
-c,--complete-insert
完全なINSERT文(フィールド名を書いた文)を使用します。
-C,--compress
サーバーとクライアントの両方が圧縮をサポートしている場合は、その間でやりとりされる通信を圧縮する。
-B,--databases
ダンプするデータベースを指定できます。
例:--databasesdb1db2...
--delayed
INSERTDELAYEDコマンドを使用してレコードを挿入します。
-e,--extended-insert
新しいマルチラインINSERT構文を使用します。(これはあとで挿入する際、よりコンパクトかつ速くなります。)
-#,--debug[=option_string]
Traceusageoftheprogram(fordebugging).
--help
Displayahelpmessageandexit.
--fields-terminated-by=...
--fields-enclosed-by=...
--fields-optionally-enclosed-by=...
--fields-escaped-by=...
--lines-terminated-by=...
これらのオプションは-Tとともに使用され、LOADDATAINFILEと同様の意味をなします。
「7.18LOADDATAINFILE構文」節参照
-F,--flush-logs
ダンプする前に、MySQLのログファイルをフラッシュします。
-f,--force,
ダンプの途中でSQLエラーが発生しても、ダンプを続けます。
-h,--host=..
指定されたホストのMySQLからダンプする。デフォルトのホストはlocalhost。
-l,--lock-tables.
ダンプを開始する前に全てのテーブルをロックする。
ThetablesarelockedwithREADLOCALtoallowconcurrentinsertsinthecaseofMyISAMtables.
-n,--no-create-db
'CREATEDATABASE/*!32312IFNOTEXISTS*/db_name;'willnotbeputintheoutput.
Theabovelinewillbeaddedotherwise,if--databasesor--all-databasesoptionwasgiven.
-t,--no-create-info
テーブルの作成情報(CREATETABLE文)を書き出さない。
-d,--no-data
テーブルの構造だけを書き出し、テーブル内のレコードを書き出さない。
--opt
--quick--add-drop-table--add-locks--extended-insert--lock-tablesと同じ。MySQLから読み出す時間を可能な限り速くします。
-pyour_pass,--password[=your_pass]
サーバーに接続する際のパスワードを指定。もし「=your_pass」部分を与えなかった場合は、mysqldumpはパスワードのプロンプトをだします。
-Pport_num,--port=port_num
サーバーに接続する際に使用するTCP/IPポート番号。(これはlocalhost以外のホストへの接続に使用されます。
localhostの場合は、Unixソケットが使用されます。)
-q,--quick
クエリをバッファにため込みません。stdoutに直接出します。mysql_use_result()をこれに使用しています。
-r,--result-file=...
Directoutputtoagivenfile.ThisoptionshouldbeusedinMSDOS,
becauseitpreventsnewline'\n'frombeingconvertedto'\n\r'(newline+carriagereturn).
-S/path/to/socket,--socket=/path/to/socket
localhostに接続する際のソケットファイルを指定。デフォルトは「/tmp/mysql.sock」。
--tables
Overridesoption--databases(-B).
-T,--tab=path-to-some-directory
Createsatable_name.sqlfile,thatcontainstheSQLCREATEcommands,
andatable_name.txtfile,thatcontainsthedata,
foreachgivetable.NOTE:Thisonlyworksifmysqldumpisrunonthesamemachineasthemysqlddaemon.
Theformatofthe.txtfileismadeaccordingtothe--fields-xxxand--lines--xxxoptions.
与えられたテーブル毎に、SQLCREATE文を含むtable_name.sqlファイル、データを含むtable_name.txtファイルを作成します。NOTE:これはmysqldデーモンが走っているマシン上でmysqldumpを実行する場合にだけ、動作します。.txtファイルのフォーマットは、--fields-xxxと--lines--xxxオプションに従います。
-uuser_name,--user=user_name
サーバーに接続する際のMySQLユーザー名を指定。デフォルトはUnixのログイン名。
-Ovar=option,--set-variablevar=option
変数の値をセット。可能な変数は後述。
-v,--verbose
冗長モード。プログラムが何を行っているかより表示します。
-V,--version
バージョン表示。
-w,--where='where-condition'
選択されたレコードのみをダンプ(クオートは必須)。
"--where=user='jimf'""-wuserid>1""-wuserid<1"
-Onet_buffer_length=#,where#<16M
Whencreatingmulti-row-insertstatements(aswithoption--extended-insertor--opt),
mysqldumpwillcreaterowsuptonet_buffer_lengthlength.
Ifyouincreasethisvariable,
youshouldalsoensurethatthemax_allowed_packetvariableinthe
MySQLserverisbiggerthanthenet_buffer_length.




mysqldumpの活用

データベースをファイルにバックアップする場合は以下のとおり。

mysqldump--optデータベース名>ファイル名

バックアップファイルをデータベースに戻す場合は次のとおり。

mysqlデータベース名<ファイル名

もしくは、下記の方法でもいい。

mysql-e"sourceファイル名"データベース名

他のMySQLにデータベースをコピーするのにも使えるんだ。

mysqldump--optデータベース名|mysql--host=リモートホスト名-Cデータベース名

複数のデータベースを指定してダンプします。

mysqldump--databasesdatabase1[database2database3...]>my_databases.sql

すべてのデータベースをダンプします。

mysqldump--all-databases>all_databases.sql
------------------------------------------------------------------------
mysqlimportテキストファイルからデータを読み込む

mysqlimportは、LOADDATAINFILESQL構文を、コマンドラインインターフェースで提供します。
mysqlimportのオプションのほとんどが、LOADDATAINFILEへの同じオプションに対応します。

mysqlimportの実行は以下のようにします:

shell>mysqlimport[options]databasetextfile1[textfile2....]

mysqlimportは、コマンドラインの引数に与えられたファイル名の拡張子を取り、拡張子を取った後の名前を、ファイルの内容を取り込むテーブルの名前とします。例えば、`patient.txt',`patient.text',`patient'というファイルは全て、patientとという名前のテーブルに取り込まれます。

mysqlimportは以下のオプションをサポートします

-c,--columns=...
Thisoptiontakesacomma-separatedlistoffieldnamesasanargument.
ThefieldlistisusedtocreateaproperLOADDATAINFILEcommand,whichisthenpassedtoMySQL.
「7.23LOADDATAINFILE構文」節参照.
-C,--compress
クライアントとサーバーの両方が圧縮をサポートしているなら、クライアント・サーバー間でやり取りされる全ての情報を圧縮します。
-#,--debug[=option_string]
プログラムのトレース(デバッグ)
-d,--delete
テキストファイルを取り込む前にテーブルを空にします。
--fields-terminated-by=...
--fields-enclosed-by=...
--fields-optionally-enclosed-by=...
--fields-escaped-by=...
--lines-terminated-by=...
これらのオプションは、LOADDATAINFILEの対応する文節と同じ意味になります。「7.23LOADDATAINFILE構文」節参照.
-f,--force
エラーを無視します。例えば、テキストファイルを取り込むテーブルがない場合、残りのファイルの処理に移ります。
--forceがなければ、テーブルがなければmysqlimportは終了します。
--help
ヘルプを表示して終了。
-hhost_name,--host=host_name
名前を指定されたMySQLサーバーにデータを取り入れます。デフォルトではlocalhost.
-i,--ignore
--replaceオプションの説明を見てください。
-l,--lock-tables
それぞれのテキストファイルを処理する前に、書き込まれる全てのテーブルをロックします。これは確実に、すべてのテーブルをサーバ上で同期させます。
-L,--local
クライアントからの入力ファイルを読みます。デフォルトでは、localhostに接続した場合、テキストファイルはサーバー上にあると仮定されます。(localhostはデフォルト値)
-pyour_pass,--password[=your_pass]
サーバーに接続するときに使用するパスワード。もし`=your_pass'のところにパスワードを書かなければ、mysqlimportはパスワードのためのプロンプトをだします。
-Pport_num,--port=port_num
ホストに接続するためのTCP/IPポート番号。(これはlocalhostを除くホストへの接続に使用します。localhostへは、UNIXソケットを使用します。)
-r,--replace
--replaceと--ignoreオプションは、入力されているレコードのユニークキーの値が、既に存在しているレコードのユニークキーの値と同じ場合、その入力されているデータの取り扱いを決定します。もし--replaceが指定されているなら、既にあるレコードは新しく読まれたレコードに置き換えられます。もし--ignoreが指定されているなら、入力された物は無視されます。どちらのオプションも指定していない場合、キーの値が重なっているとエラーを発し、テキストファイルの残りの部分は無視されます。
-s,--silent
静粛モード。エラーだけ出力します。
-S/path/to/socket,--socket=/path/to/socket
localhostへの接続時に使用するソケットファイルを指定します。
-uuser_name,--user=user_name
サーバーの接続に使用するMySQLユーザー名の指定。デフォルトは、Unixのログイン名。
-v,--verbose
冗長モード。プログラムがしている事について多く出力します。
-V,--version
バージョンを表示して終了。

------------------------------------------------------------------------
mysqlhotcopy,CopyingMySQLDatabasesandTables

mysqlhotcopyは、データベースのバックアップを迅速に作るためにLOCKTABLES、FLUSHTABLES、
および、cp、または、scpを使うperlスクリプトです。
1つのテーブルのデータベースのバックアップを作るのが最も速い方法です。
ただし、データベースディレクトリがある同じマシン上でしか実行できません。

mysqlhotcopydb_name[/path/to/new_directory]

mysqlhotcopydb_name_1...db_name_n/path/to/new_directory

mysqlhotcopydb_name./regex/

mysqlhotcopyのオプション
-?,--help
ヘルプを表示
-u,--user=#
ユーザ名を指定してデータベースにログインする
-p,--password=#
パスワードを指定してデータベースにログインする
-P,--port=#
ポートを指定してデータベースにログインする
-S,--socket=#
ソケットを指定してデータベースにログインする
--allowold
Don'tabortiftargetalreadyexists(renameit_old)
--keepold
Don'tdeleteprevious(nowrenamed)targetwhendone
--noindices
Don'tincludefullindexfilesincopytomakethebackupsmallerandfaster
Theindexescanlaterbereconstructedwithmyisamchk-rq..
--method=#
Methodforcopy(cporscp).
-q,--quiet
エラーメッセージを表示しない
--debug
デバックをオンにする
-n,--dryrun
Reportactionswithoutdoingthem
--regexp=#
Copyalldatabaseswithnamesmatchingregexp
--suffix=#
Suffixfornamesofcopieddatabases
--checkpoint=#
Insertcheckpointentryintospecifieddb.table
--flushlog
Flushlogsoncealltablesarelocked.
--tmpdir=#
Temporarydirectory(insteadof/tmp).


Youcanuseperldocmysqlhotcopytogetamorecompletedocumentationformysqlhotcopy.

mysqlhotcopyreadsthegroups[client]and[mysqlhotcopy]fromtheoptionfiles.

Tobeabletoexecutemysqlhotcopyyouneedwriteaccesstothebackupdirectory,
SELECTprivilegetothetablesyouareabouttocopyandtheMySQLReloadprivilege
(tobeabletoexecuteFLUSHTABLES).


MySQLのセキュリティ対策
MySQLのセキュリティ

MySQLサーバに接続するときは、パスワードを使用すべきだ。
パスワード以外の全ての情報はテキストで転送されるので、覗き見される恐れがある。
より安全にしたい場合、ssh(http://www.cs.hut.fi/ssh)をインストールする。
これを使用すれば、MySQLサーバーとMySQLクライアント間のTCP/IPコネクションは全て暗号化される。

MySQLシステムを安全にするための注意点

*全てのMySQLユーザにパスワードを使用する
*mysqldを実行しているUnixユーザだけが読み込み/書き込み可能
*process特権を全てのユーザに与えない
(この許可がある人は誰でもmysqladminprocesslistコマンドで実行されているクエリーの中身を見ることができる)。
*fileを全てのユーザに与えない(ユーザがこの特権を持つ場合、mysqldデーモンを実行しているUnixユーザーの権限で、
ファイルシステム内のどこにでもファイルを書き込むことができる)。
*DNSを信用しない場合、特権テーブル内にはホスト名の代わりにIPを使用すべきだ。
mysqldへの--secureオプションは原理上はホスト名を安全にする。どんな場合でも、
ホスト名へのワイルドカードの使用については、注意深くすべきだ。

------------------------------------------------------------------------
MySQLの安全な起動法

MySQLデーモンをUnixのrootユーザーで実行しないように。
mysqldは任意のユーザで実行できる。MySQLを動作させるユーザーは以下のようにするといい。

*loginを許可しない(shellやpasswdを与えない)
*wheelやrootgroupにしない
*全く新しく作成したgroupに属する


MySQLサーバの起動

#mysqld-umysqluser[オプション]&

※mysqldを他のUnixユーザーで起動したとしても、MySQLのuserテーブルのrootユーザーの名前を変更する必要はありません。

セキュリティに影響するmysqlオプション

--secure
gethostbyname()から返されるipがオリジナルのホスト名に戻せるかどうかをチェックする。
これは、外の誰かが他のホストを真似てアクセスを得ることを難しくなる。
--skip-grant-tables
特権システムを全く使用しない。これは全員に全てのデータベースへの完全なアクセスを与える。
--skip-name-resolve
ホスト名を解析しない。特権テーブル中の全てのHost項目はIP番号かlocalhostでなければならない。
--skip-networking
ネットワーク(TCP/IP)経由の接続を許可しない。mysqldへの全ての接続は、Unixソケットで行われる。