page_adsence

ラベル MySQL の投稿を表示しています。 すべての投稿を表示
ラベル MySQL の投稿を表示しています。 すべての投稿を表示

2015年10月13日火曜日

ConfluenceをローカルのVMに入れてみた

会社で利用しているConfluenceなのですが、これが結構便利で他の事にも使えないかということで、調査目的でローカルのVMにインストールしてみた。

インストール方法は下記のサイトを参考にインストールしました。 Atlassian Confluence インストール ガイド (Linux OS)
インストール完了後にConfluenceのセットアップウィザードみたいなのがあるのですが、
その辺はこちらでも書いておこうと思います。

インストールしたConfluenceのバージョンは若干古めのやつ(5.6.6)を使っています。(会社で利用しているバージョンと同じバージョンにするため)

まず、事前にAtlassianのアカウントを作成する必要があります。
https://id.atlassian.com/signup
上記サイトにアクセスして、アカウントを作成しておきます。

下記のURLにアクセスして、Confluenceのセットアップ画面にいきます。
http://VMのIP:8090/
※ポート番号はインストール手順の中で変更出来ますので、変更している人は自分で指定したポート番号に読み替えて下さい。

画面右上の日本語をクリックして、表示を日本語に変換


トライアル版の使用を始めるをクリック


ライセンスキーの入力画面で、アカウントを持っており、キーを作成したいをチェック


先ほど作成したAtlassianのログイン情報を入力して、「I agree to ~」にチェックして、「サインインしてライセンスキーを作成」ボタンをクリック
クリック後に非常に時間が掛かった・・・。1時間位は放置しておく位の気持ちで挑んだ方がいいのかもしれない。


Manage users~ボタンをクリック(何故かここからは英語になってしまう・・・)


最初にシステム管理者のアカウントを作成するための情報を入力する。


初期設定完了。「Start using Confluence」をクリックしてウェルカムページへ遷移


以上でとりあえずConfluenceが利用出来る状態になる。 Confluence自体のインストール手順が書かれているサイトの一番下にインストール後の設定という項目があるので、 こちらも合わせてやっておくと良いかもしれません。 色々と試してみたいと思います。

2015年1月23日金曜日

MySQLからMongoDBへのデータ移行 まとめ

MySQLからMongoへのデータ移行手法に関してはほぼFixしたのでメモ。
過去記事に関しては以下を参照。

MySQLからMongoDBへのデータ移行
MySQLからMongoDBへのデータ移行 その2
MySQLからMongoDBへのデータ移行 その3

今回移行対象のデータ件数は4000万件程度。
件数としてはビックデータとは言えない微妙な件数・・・。

まず結論から。
  • MySQLからデータを抽出する方法に関してはeオプションを使って、標準出力をファイルにリダイレクトさせる。BSON形式っぽいTSVファイルにして出力する。
  • ちゃんとしたBSON形式に変換する。ダブルクォーテーションのエスケープとか、改行コードをCRLFに変換とか、変な文字列の削除とか諸々必要
  • mongoimportは決して早くない。と思う。(チューニングしてないので。)
  • BSON形式以外のインポートはお勧めできない。型変換に異常に時間がかかるため。
  • mongoimport中に重複があったとしてもエラーメッセージは出てこない。すでに重複するデータがmongoに入っていた場合はエラーが出る。

mongoimportの速度に関して

これに関してはあまり書くことはないが、とりあえず4000万件のデータを入れるのに7.5時間位掛かりました。
2.1系から2.6.5にバージョンアップしたら倍位遅くなりました。原因はまだ不明です。
上の時間はバージョンアップ後の時間です。
ちなみにサーバ構成はこんな感じです。
mongos×3台、mongod×6台(うちマスター3台、スレーブ3台)

mongoimportのファイル形式に関して

結果的にはファイル形式に関してはBSON形式一択でした。
CSVやTSV形式だと、データ型を定義することが出来ないため、
純粋な数値以外は全てテキスト型になってしまうので、日付のデータやNULLに関しては書き換えが必要になる。
データ量が多くなるとその書き換えに非常に時間がかかる。

mongoimportのエラーに関して

これに関しては色々調べたんですけど、結局良くわからず・・・。
エラーが出たらインポート止めるっていうオプションもあるらしいのですが、そのオプションをつけても重複エラーに関しては止まらないらしいです。

MySQLからMongoDBへのデータ移行 その3

前回MySQLの標準をファイルに出力する方法を採っていたが、
これより更に楽になるというか、処理が終わったかどうか分かるようになるやり方があったので紹介する。

mysql --quick -u root --password=password -h localhost mysql_databasename -e "SET NAMES utf8;" > "output.tsv"

このような記述で処理を実行すると、前回同様のメリットを得られる上に、デメリットだった処理の終わりが分かりづらいということも解消される。

ちなみに、「--quick」というオプションは出力結果をメモリ上に溜めずに、どんどんファイルに書き出す様にするためのオプション。
でかいデータを抽出する場合は、メモリ不足で処理が途中で終わってしまうことがあるので、このオプションをつけた。

「-e」オプションはMySQLにログイン後に実行するSQLを書くことが出来る。
ここに必要なSQLを書いておき、実行結果をファイルに出力することが可能になる。
セミコロン区切りで何個もSQLを記述することも可能なので、下記のような方法も可能。

mysql --quick -u root --password=password -h localhost mysql_databasename -e "SET NAMES utf8;
SELECT * FROM table_name_A;
SELECT * FROM table_name_B;" > "output.tsv"

2014年11月20日木曜日

MySQLからMongoDBへのデータ移行 その2

前回、MySQLからMongoDBへの移行作業を書いたが、実際に作業を行うMySQLユーザーにはFILE権限がなかった。
そのため、INTO OUTFILEコマンドが使用出来ず、別の方法を模索することになった。
で、同僚の方から標準出力をファイルに吐きだすという手法を使ってやってみることにした。
やり方自体はすごく簡単で、下記のようにするだけ。

mysql -u ユーザー名 データベース名 -p > output.tsv

これだけで、SQLの結果をTSV形式でファイルに出力することが出来る。
上のコマンドだけというのは少し語弊があるが、上のコマンドを入力すると、パスワードを入力後に入力待ちの状態になる。
この状態で結果をTSV出力したいSQLを流してやると、結果がTSVファイルに出力される。
自分なりにこれをやることでのメリット、デメリットを紹介

■メリット
・MySQLのデータ内に改行やタブが存在していたとしても、\tや\nといった文字列で出力されるため、ファイル上は必ず1レコード1列となっているため、
普通にSQL流した結果の件数と異なっているかどうかをwcコマンドですぐに確認出来る。
また、TSVで出力されるため、MySQLデータ内部にタブが入っていた場合、普通ならずれてしまうが「\t」という文字として出力されるためにそういった問題が起きない。
・ヘッダ行にフィールド名が出力されるため、mongoimportする時に別にファイルを用意する必要が無くなる。

■デメリット
・処理が終わったかどうかがわかりずらい。
入力待ち状態になった後、SQLを入力し、Enterキーを押下するが、改行された後は何も反応がない。
そのため、画面上でSQLが処理を終えたかどうかの判断がつけられない。
対象のコンソール上でわからないだけで、mysqlのSHOW PROCESSLISTコマンドを使用すれば処理が実行されているかどうかはすぐにわかる。
とはいえ、いちいち確認のためにMySQLにログインしてSHOW PROCESSLISTコマンドを打つのは面倒である。
SHOW PROCESSLISTコマンドで、該当のSQLが無くなりSLEEP状態になったら終了しても問題ない。
終了方法としてはexitコマンドを打つだけ。
exitの後にセミコロンをつけると抜けれないらしい。

それ以外の移行方法はほとんど変わらず。
置換の処理方法が異なるので、一応それだけ記載しておく。

cat test.tsv | sed -e 's/"/""/g' | sed -e 's/\t/","/g' | sed -e 's/\(^\|$\)/"/g' | sed -e 's/\(^Z^Z.*app_id=""\([0-9]\+\)"">^Z^Z\|^Z^Z.*^Z^Z\)/\2/g' | sed -e 's/\(^Z\(.*\)^Z\|^Z\(.*\)^Z\)/\2/g' | sed -e 's/\\n/\n/g' | sed -e 's/\\t/\t/g' | sed -e 's/^M//g' | sed -e 's/$/\r/' > convert.csv


あとはmongoimportするだけ。(ヘッダ行が出力されているので、ヘッダファイルは作らなくてもよい)
mongoimport -d freegame_message -c message --type csv --file convert.csv --headerline

とりあえずこんな感じでした。

MySQLからMongoDBへのデータ移行

MySQLからMongoDBへの移行案件があったので、その時に調べたことをメモ。
今回の移行案件は、ただ単純にMySQLのテーブルをMongoDBのコレクション(MySQLでいうテーブルのこと)に変えるというわけではなかった。
MySQLの4テーブルを条件によってJOINし、その結果をMongoDBのコレクションとして保存するというもので、
データの移行件数はおおよそ3億件~4億件。
文字コードはEUC-JP

まず移行方法に関して検討してみた。
過去に行った移行案件では、基本的にPHPを介して移行するといったイメージ。
今回はPHPは介さずにMySQL→CSVやTSV→mongoimportといった手順で出来るように色々と検討してみた。

まず、MySQLでの出力形式だが、mongoimportの仕様により、区切り文字(カンマ)、囲み文字(ダブルクォーテーションが)、改行(CRLF)に関しては自動的に決まる。
エスケープに関しては、移行データにどういった文字が入っているかによる。

・日本語あり
・TEXT型あり
・改行あり
・入力チェックは最低限(セキュリティ的な部分のみ)
・NULLもあり

こういった場合のデータが含まれていると、普通の文字でエスケープすると、
入力データ内部に存在している可能性が高く、うまく移行出来ない可能性が高くなってしまう。

ちなみに今回試しに移行してみたデータは

・日本語あり
・TEXT型あり
・入力チェックは最低限
・改行コードも混在(LFとCRLF)
・NULLもあり
・HTMLのタグも入っている

なんでこんなデータが存在しているのかというと、テストデータとして以前作成したものをそのまま利用しているからである。
こういった場合でもきちんとエスケープ出来る可能性を探した結果、
最終的に行きついたのが以下のSQLになる。

FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY "\Z" LINES TERMINATED BY "\r\n";

とりあえず"\Z"ならそうそう入ってこないであろうという推測の元、エスケープを行ってみた。
いろいろと加工は必要だが、とりあえずコマンドのみで目視する必要なく置換出来るのではないかと思う。
なお、エスケープに使える文字は以下の通り(MySQL公式サイトから抜粋)

Escape SequenceCharacter Represented by Sequence
\0An ASCII NUL (0x00) character.
\'A single quote (“'”) character.
\"A double quote (“"”) character.
\bA backspace character.
\nA newline (linefeed) character.
\rA carriage return character.
\tA tab character.
\ZASCII 26 (Control+Z). See note following the table.
\\A backslash (“\”) character.
\%A “%” character. See note following the table.
\_A “_” character. See note following the table.

とりあえずファイルの出力自体は上記の方法でやってみた。
11111,11111,"Test","テストメッセージ^Z
^Z
<link test_id=^Z"1^Z">",^ZN

NULLや改行部分もエスケープされてしまい、意図した感じにはなっていないが、ググってみるとこのような感じにならざるを得ないっぽい。
ということで、ここからmongoimport出来るまで置換処理を行っていく。

1.まず^ZNとなっているNULLを置換(^ZはCtrl+V Ctrl+Zの順番で入力すると出せる)
sed -i -e 's/^ZN,/"NULL",/g' test.csv

2.ダブルクォーテーションのエスケープ文字を修正
sed -i -e 's/^Z"/""/g' test.csv

3.LF、CRLFが混ざっているため、一度全てLFに変えてからCRLFに戻す(^MはCtrl+V Ctrl+Mの順番で入力すると出せる)
sed -i -e 's/^Z^M//g' test.csv

sed -i -e 's/^M//g' test.csv

sed -i -e 's/$/\r/' test.csv

4.文字コードを変換(mongoはUTF-8じゃないと読み込まないため)
iconv -f EUCJP -t UTF8 test.csv > test2.csv
※nkfコマンドは作業サーバに入っていなかったためiconvで代用

以上で変換作業は完了。
あとはmongoimportコマンドでインポート処理を行うだけ。
出力したCSVにはヘッダ行がないので、別で用意してやる。
$ vi header.txt
id
field_nameA
field_nameB
field_nameC
field_nameD

で、インポートコマンドは以下のような感じ。
mongoimport -d データベース名 -c コレクション名 --type csv --file test.csv --fieldFile header.txt


mongoimportでの注意点
1.csvの囲み文字は必ずダブルクォーテーションであること。シングルクォーテーションだと改行を含んだデータがある場合に、うまく取り込まれない。
2.元々のデータにダブルクォーテーションがあった場合は、""と記述することで、文中のダブルクォーテーションをエスケープすることが出来る。
3.改行コードは必ずCRLFである必要がある。空白行があった場合にLFだとうまく取り込まれない。

2014年11月19日水曜日

MySQLのお手軽インポート&エクスポート

MySQLのデータインポートやエクスポートのやり方色々。

■ローカルに書き出す
mysqldump -u ユーザー名 -p データベース名 テーブル名 > テーブル名.sql


■ローカルから読み込む
mysql -u ユーザー名 -p データベース名 < テーブル名.sql


■リモートサーバーに直接インポート
これが便利。コマンド1発で後は待つだけ。
mysqldump -u ユーザー名 -p データベース名 テーブル名 | ssh リモートユーザー@リモートホスト "mysql -u ユーザー名 -pパスワード データベース名"


■ローカルに書き出す(要FILE権限)
ここに指定してある条件は任意なので、気にしないように。
SELECT ~ FROM テーブル名 INTO OUTFILE '/tmp/dump.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY "\Z" LINES TERMINATED BY "\r\n";


■ローカル(MySQL Serverが動いているサーバ)から読み込む(要FILE権限)
IGNORE 1 LINESはヘッダ行を無視するための指定。
この方法だとMySQL Serverが動いているサーバ内の'/tmp/dump.csv'のファイルを読み込む。
$ mysql -uroot -p
LOAD DATA INFILE '/tmp/exittestmysql.csv' INTO TABLE テーブル名 IGNORE 1 LINES;


■ローカル(MySQL Clientが動いているサーバから、MySQL Serverが動いているサーバにログイン)から読み込む(FILE権限不要)
MySQL ClientでリモートのDBサーバへログインし、MySQL Clientが動いているサーバ上のファイルを取り込む。
$ mysql -uroot -h XXX.XXX.XXX.XXX -p
LOAD DATA LOCAL INFILE '/tmp/dump.csv' INTO TABLE テーブル名 IGNORE 1 LINES;


■MySQLの標準出力をファイルに書き込み。
処理がどうなっているかが確認するのが面倒だが、FILE権限がなくてデータを出力したい場合に使える。
処理中かどうかを確認するには別画面を立ち上げてshow processlistを見る。
sleepになったら処理終了。
exitする時には最後にセミコロンをつけてはいけない。

$ mysql -uroot -p DB名 > output.tsv
SELELCT * FROM テーブル名;
exit

2014年2月4日火曜日

MySQLのクエリログ出力をオンラインで変更する方法(MySQL5.1.12以降)

MySQLのクエリログの出力設定をオンラインで変更する方法です(MySQL5.1.12以降)。

まずMySQLのrootユーザーでログインします。

ログを出力するには

mysql> SET GLOBAL LOG = on;


ログ出力を停止するには

mysql> SET GLOBAL LOG = off;


ログ出力場所の確認は

mysql> SHOW VARIABLES LIKE "general_log_file";


ログ出力場所の変更は

mysql> SET GLOBAL general_log_file = '/var/log/mysql/mysql.log';


ログを出力しっぱなしにすると、ディスク容量を圧迫する可能性があるので、必要な時に出力するようにして、必要がなくなったら停止しておきます。

2013年9月13日金曜日

ファイルを削除したにも関わらずディスク容量が増えない場合

DBメンテナンス作業時にデータファイルのコピー作業をしていたら、コピー先のサーバのディスク容量が一杯になってしまい、書き込みが出来ない状況に陥ってしまいました。
そこで、今までコピーしたファイルをディレクトリごと全て削除してディスク容量を確保しようとしたが、dfコマンドで確認するとディスク使用量が40GB程なのに対し、duコマンドで各ディレクトリの使用量の合計を計算すると1GB程度しかなかった。

原因を調べてみると、どうやらゾンビファイルとやらがある状態のため、dfコマンドでは空き容量が増えていなかったらしい。
ゾンビファイルの確認するために現在開いているファイルのプロセスを特定する必要があるので、lsofコマンドを使って調べてみる。
※ちなみにゾンビファイルとは見た目上は消えているが、プロセスが掴んでいるのでkernel上はまだ残っている状態のことだそうです。

このコマンドを使用すると、使用しているプロセスと、掴んでいるファイル名、ファイル容量がわかるのだが、確認してみると、どうやら落としたはずのMySQLプロセスが落ちていなかった。
どうやら誤って別のプロセスであるApacheプロセスを落としてしまっていた。
改めてMySQLプロセスを落とすと、ディスク容量が一気に40GB増えた。
これで一安心。

2013年8月7日水曜日

GROUP_CONCATとDISTINCTの合わせ技

GROUP_CONCATとDISTINCTの合わせ技が結構便利な気がするのでメモ。 
 
以下の様なデータが登録されているテーブルがあるとする。 

mysql> SELECT * FROM TEST1;
+----+------+------+
| id | val1 | val2 |
+----+------+------+
|  1 |  100 |  115 |
|  2 |  100 |  100 |
|  3 |  120 |  100 |
|  4 |  100 |  115 |
|  5 |  100 |  115 |
+----+------+------+
 
GROUP_CONCATでまとめる。 
mysql> SELECT GROUP_CONCAT(val1) val1 FROM TEST1 GROUP BY val2;
+-------------+
| val1        |
+-------------+
| 100,120     |
| 100,100,100 |
+-------------+

GROUP_CONCATでまとめるだけだと、val1の中に重複した値が残ってしまう。
こういった値を無くしたい場合に使えるのがDISTINCTである。


SELECT GROUP_CONCAT(DISTINCT val1) val1 FROM test GROUP BY val2;
+---------+
| val1    |
+---------+
| 100,120 |
| 100     |
+---------+

重複していたデータが消えてすっきり。

2013年6月20日木曜日

MySQLのViewは高速化するわけではない

MySQLのViewはショートカットみたいなもので、Viewに対して処理をするとViewで書かれているSQLを毎回実行している。
SQL文自体はシンプルになるが、高速化されているわけではない。
 もし本当にViewを使って高速化を図るのであればoracleのマテリアライズドビューを使う必要がある。マテリアライズドビューはViewを作るために利用されているSQLを定期的に実行し、 その結果のスナップショットをとっておくようになっているため、Viewに対してSQLが流れても、そのスナップショットを元に取得するようになっているため、高速化が期待できる。
マテリアライズドビューを使用するにあたって一番の問題点はマテリアライズドビューのスナップショットを更新するタイミングにある。
スナップショットを更新するには当然負荷が掛かるので、どのタイミングで更新し、スナップショットを取っておくかが要検討事項となる。

2013年5月15日水曜日

MySQLの勉強法と構築法

最近MySQLに詳しい人と一緒に仕事をすることになり、結構色々と勉強になることを教えてもらったのでメモを残しておく。

プログラム全般に関して
プログラムのデザインパターンやソート関連のアルゴリズムは目を通しておく程度に勉強しておいた方がよい。
自分の中で概念のインデックスを作ることで、それを手がかりに実装方法を検索しプログラミングすることができる。

データベースソフトウェアに関して
データペースソフトに関してはOracleが最も優れているので、Oracleで実装されている機能を覚えておくとよい。(MySQLで実装されていなくとも、それに似たことをすることは出来る可能性がある。)

DB設計に関して
画面仕様書が出来る前にDB設計をすることはWeb系の案件ではほぼ皆無なので、画面からDB設計を行っていけるようにする。
設計の大まかな手順
1.画面上から保存しないといけない要素の洗い出し
2.正規化を行い、各テーブルに振り分ける

プログラミングに関して
プログラムを書く際には、DB側で出来る処理は全てDBに任せる。
DBでどうしても出来ないものに関してはWeb側で処理をする。
理由はユーザーの流入経路がWebからDBの順番であるから。
Web側にはユーザー数とイコールの関係で負荷が掛かるが、DBに関してはDBアクセスが必要なページ以外では負荷がかからないので、Web側の負担を軽くするために、なるべくDB側に寄せる方が懸命である。

データベースエンジンの選び方に関して
ログ系や認証系のものを保存するのであればMyISAMやKVSが向いている。
但し、1つのDBサーバにエンジンが異なるものを使用するのは現実的ではないため、大概のシステムでInnoDBが採用されている。
もし本当にDBを分ける必要があれば、エンジンごとに別のDBサーバを使用するのがよい。

MySQLのカラム数に関して
MySQLのカラム数が100を超えると格段にパフォーマンスが下がるので、その場合は正規化してやる必要がある。
そうすることで、インデックスの数も減るし、オプティマイザが迷うことが少なくなるので、高速化される。

とりあえず今日話した内容はざっくりこんな感じ。

2012年3月13日火曜日

mysqlに接続できない

会社で用意してもらったテスト用のサーバでローカル上のmysqlを使おうと思ったら
以下のようなエラーで出て接続ができなかった。

$ mysql -uroot
Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'

とりあえずググってみたら、mysqldが起動してない可能性があると。
で、psコマンドで調べてみた。

$ ps aux | grep mysqld

いない・・・。

じゃあmysqlを起動させようと思って、
$ /etc/init.d/mysqld start

へ移動しようと思ったらmysqldが存在してない!

mysqlコマンド自体は使えるから、インストールとかに失敗してるのかと思って、
何度かアンインストールしてから、再インストールしてみたりとかしたのですが、状況は変わらず・・・。

なぜかわからず、ググり続けてみたらありました。
mysql-serverがインストールされていないんじゃないかという・・・。

というか、よくよく見てみたら結構色々とインストールされていなかった・・・。
mysql-serverだけでなく、php-mysqlとかも入ってなかった。
勝手に使える状態だと思っていたのですが、確認は大事ですね。

2012年1月10日火曜日

mysql_real_escape_stringはMySQLの接続を確立していないと使えない

CSVを取り込む際にmysql_real_escape_stringを使ってエスケープする処理を入れていたのだが、
処理の順番を変更した際に、なぜかWarningが出てくるようになってしまった。
何かと思って原因を調べてみたら、MySQLと接続していなかったのが原因だった。

確かに、よく考えてみたらmysqlとの接続を確立できてないのに、
phpからmysqlの関数呼ぶことなんてできないよなーと納得の回答。

mysql_real_escape_stringを使う前にmysql_connectするように修正したんですが、
いまいち綺麗に書けてる気がしない・・・。
もうちょっと考えてソースを書こう。

2011年12月27日火曜日

mysql_pconnectはmysql_closeで閉じても意味がない

マニュアルに書いてありました。
mysql_close() は、mysql_pconnect() により生成された持続的リンクを閉じません。

へー。

2011年9月28日水曜日

MySQLって正規表現使えたんだ・・・。

今日初めて知った。
MySQLって正規表現使えるんだ…。
でもマルチバイトはうまくいかない場合があるみたい。
mregexpっていうユーザー定義関数があるらしく、それをインストールするとどの文字コードでもうまくいくって話。

でも、この記事とかこの記事とか見るとバイナリで比較するような感じで検索すればいけんじゃねって感じです。

まぁ時間がある時に試してみようと思います。

2011年9月2日金曜日

MySQLで1時間毎にまとめた情報を取得したい場合

SUBSTRINGで時間までをとってやり、GROUP BYをしてやればOK

以外にさっくりいった。

2011年6月16日木曜日

MySQLで特定のテーブルだけdumpする

最後にテーブル名を追加してやれば、問題なくdumpできる。

mysqldump -u ユーザー名 DB名 テーブル名 > dump.sql

dumpするテーブルは複数でもいける。
スペース区切りで追加していけばOK。

mysqldump -u ユーザー名 DB名 テーブル名1 テーブル名2 > dump.sql

2011年6月3日金曜日

MySQLの日付関連の便利関数のまとめ

MySQLで日付を取得したりするのにいろいろと便利な関数があるので、それをメモっておく。

現時刻を取得する方法
mysql> SELECT CURRENT_TIME;
+--------------+
| current_time |
+--------------+
| 10:43:15     |
+--------------+


日付を取得する方法
mysql> SELECT CURRENT_DATE;
+--------------+
| current_date |
+--------------+
| 2011-06-03   |
+--------------+


現在の日時を取得する方法(どちらで取っても同じ結果が取れる)
mysql> SELECT CURRENT_TIMESTAMP;
+---------------------+
| current_timestamp   |
+---------------------+
| 2011-06-13 10:14:47 |
+---------------------+

mysql> SELECT NOW();
+---------------------+
| now()               |
+---------------------+
| 2011-06-13 10:14:47 |
+---------------------+


曜日を取得する方法
mysql> SELECT DAYNAME(NOW());
+----------------+
| DAYNAME(NOW()) |
+----------------+
| Friday         |
+----------------+


曜日を数字で取得する方法(月曜日が0で1ずつ増えていく)
mysql> SELECT WEEKDAY(NOW());
+----------------+
| WEEKDAY(NOW()) |
+----------------+
|              0 |
+----------------+


今年に入って何日経過したかを取得する方法
mysql> SELECT DAYOFYEAR(NOW());
+-------------------+
| DAYOFYEAR(NOW())  |
+-------------------+
|               154 |
+-------------------+


今月に入って何日経過したかを取得する方法
mysql> SELECT DAYOFMONTH(NOW());
+-------------------+
| DAYOFMONTH(NOW()) |
+-------------------+
|                10 |
+-------------------+


月末の日付を取得する方法
mysql> SELECT LAST_DAY(NOW());
+-----------------+
| LAST_DAY(NOW()) |
+-----------------+
| 2011-06-30      |
+-----------------+


先月末を取得する方法
mysql> SELECT LAST_DAY(DATE_ADD(NOW(), INTERVAL -1 month));
+----------------------------------------------+
| LAST_DAY(DATE_ADD(NOW(), INTERVAL -1 month)) |
+----------------------------------------------+
| 2011-05-31                                   |
+----------------------------------------------+


日付を整形して取得する方法
mysql> SELECT DATE_FORMAT(NOW(), '%Y%m%d%H%i%s');
+------------------------------------+
| DATE_FORMAT(NOW(), '%Y%m%d%H%i%s') |
+------------------------------------+
| 20110603093243                     |
+------------------------------------+


文字列を整形して日付にする方法
mysql> SELECT STR_TO_DATE(201106030932, '%Y%m%d%H%i%s');
+------------------------------------+
| STR_TO_DATE(NOW(), '%Y%m%d%H%i%s') |
+------------------------------------+
| 2011-06-03 09:32:00                |
+------------------------------------+


といった感じでいろいろな関数が用意されている。
以下のページに詳しく載っているので参考にする。

http://www.limy.org/program/db/mysql/mysql_operators.html

2011年4月26日火曜日

MySQLでFLUSH PRIVILEGESを使うとエラーが出る

CentOSに入っているMySQLでFLUSH PRIVILEGESを実行したところ、

ERROR 1146 (42S02): Table ‘mysql.servers’ doesn’t exist

とでた。
ググってみるとmysqlのDB内のserversというテーブルがないってエラーでした。
消した記憶ないのに、こんな現象になっているのは腑に落ちないんですけど、
とりあえず以下のSQLを流してみたら問題無かった。

CREATE TABLE `servers` (
 `Server_name` char(64) NOT NULL,
 `Host` char(64) NOT NULL,
 `Db` char(64) NOT NULL,
 `Username` char(64) NOT NULL,
 `Password` char(64) NOT NULL,
 `Port` int(4) DEFAULT NULL,
 `Socket` char(64) DEFAULT NULL,
 `Wrapper` char(64) NOT NULL,
 `Owner` char(64) NOT NULL,
 PRIMARY KEY (`Server_name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='MySQL Foreign Servers table';


何でこのテーブル無くなったんだろう…。
間違えて消したのかな。。。

2011年4月25日月曜日

MySQLでユーザーの追加や権限等の設定

毎回忘れてググっているので、忘れてもいいようにメモ。

ユーザーの追加には以下のようなSQLを流す。
mysql> GRANT <操作名> ON <データベース名>.<テーブル名> TO <ユーザ名>@<ホスト名> IDENTIFIED BY '<パスワード>';
mysql> FLUSH PRIVILEGES;

操作名は下記にある表の中から選んで使用する。
セキュリティを全く考慮しないのであれば、ALLでも問題はない。
データベース名やテーブル名を指定することで、指定したデータベースやテーブル以外にはアクセスできないようなユーザーを作成することができる。
ユーザー名はDBに接続する際に使用するユーザー名
接続先のDBがあるホスト名またはIPを記載する。
WebサーバとDBサーバが一緒であれば、localhostで繋がる。
WebサーバとDBサーバが異なる場合は、DBサーバのホスト名またはIPを記載することで接続できる。
「FLUSH PRIVILEGES」はユーザー情報の反映のためのSQLで、これをしないと作成したユーザーで
ログインすることはできない。


操作名一覧
ALL
  すべての権限を設定出来るユーザを追加
ALTER
  ALTER TABLE(テーブル変更)の使用を許可
CREATE
  CREATE TABLE(テーブル作成) の使用を許可
CREATE TEMPORARY TABLES
  CREATE TEMPORARY TABLE(一時テーブルの作成) の使用を許可
DROP
  DROP TABLE(テーブルの削除) の使用を許可
INDEX
  CREATE INDEX(インデックス作成) および DROP INDEX(インデックス削除) の使用を許可
LOCK TABLES
  SELECT 権限を持つテーブルで LOCK TABLES(テーブルのロック) の使用を許可
PROCESS
  SHOW FULL PROCESSLIST の使用を許可
REPLICATION CLIENT
  スレーブおよびマスタのサーバーを知る権利を付与
REPLICATION SLAVE
  レプリケーションのスレーブに必要(マスタからバイナリログを読み取るため)
SHOW DATABASES
  SHOW DATABASES によりすべてのデータベースが表示される
SHUTDOWN
  mysqladmin shutdown の使用を許可