第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ソケットで行われる。 |