ハードディスクメンテナンス ブログ

ハードディスクの診断、物理フォーマット、静音化、Linux、サーバー、MySQLなどがメインだったのですが、その後広がり、カメラやハードウェアの投稿も増えてきました。 モバイルデバイスは、MacBookAir(13型)、iPad Air2、ポメラ DM100(キングジム)OLYMPUS STYLUS XZ-2など。 これらを使いながら、ブログを更新しています。

カテゴリ: データベース






2万円以下の激安サーバーを紹介しよう。

富士通 PRIMERGY MX130 S2

PRIMERGY MX130 S2

19,800円が、2,000円引きクーポン使用で17,800円!!

在庫僅少!

OSレスタイプだが、自分でLinux入れるから不要だしね。

CPUもメモリーもハードディスク(250GB)もDVD-ROMドライブも載っているから、あとはLinuxを焼いてインストールするだけ。

激安サーバーはタワー型が大半だが、どうしても邪魔になる。

そんな中、スリム型縦置き可能なサーバーはイイね。

見た目がNAS風のサーバーもあるよ。

HP ProLiant MicroServer Turion II NEO N5

HP ProLiant MicroServer Turion II NEO N5

16,980円が、1,000円引きクーポン使用で15,980円!!

こちらも在庫僅少!

こちらはCPU、メモリー、ハードディスク(500GB)はあるが、光学ドライブがないので用意するか、USBメモリーからインストールすればよい。

Linuxを入れてファイルサーバーにしてもヨシ、MySQLを入れてDBの学習用にしてもヨシ!

サーバーの管理は、ハードを含めた知識が必要であると、私は考えている。

それならば、やはり実機だ。



MySQL全機能バイブル ~現場で役立つAtoZ~
鈴木 啓修
技術評論社
売り上げランキング: 61,578


実践ハイパフォーマンスMySQL 第3版
Baron Schwartz Peter Zaitsev Vadim Tkachenko
オライリージャパン
売り上げランキング: 112,943

[PR] au WALLETカードの情報 - auのプリペイドカードでショッピングをおトクに!

このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr Clip to Evernote






データベースで重要なindexであるが、全てのfieldにindexを定義するのは、多くの場合は無駄である。

定義しても、それが使用されなければ意味がない。

indexを定義することは、fieldのコピーを作ることに近く、更新性能の低下を招く。

全てのfieldにindexを追加すれば、テーブルが2つあるのと同じだ。

書込が発生すると、両方に書き込まねばならない(更新も同様)。

indexが役立つか分からないのに、全てのfieldに対してindexを設定するのは無駄。

読取がメインの場合は、ないよりはマシだろうが...

indexを設定しても全く使わないだろうfieldは、それほど考えなくても分かるはずだ。

よく見るのが、主キーには既にindexがあるのに、それとは別にindexを定義しているパターン。

冗長で無駄である。

なお、SQLによっては、indexが役に立たない(使われない)場合もある。

姓名の姓が●は、紙の電話帳で探せる。

紙の電話帳には、姓の順で並んでいるからだ。

しかし、名が●の場合は、これが使えない。

全ての姓に対して、名が●である可能性があるからだ。

複合indexを姓(sei),名(mei)の順で設定しても、名でのSELECT時には役に立たない。

同様に、名を第一基準にするORDER BY時にも役に立たない。

SELECT * FROM `user` ORDER BY `mei`,`sei` ;

また、LIKEで'%●'と前に%を入れた場合(後方一致)も、全てに一致する可能性があるのでindexが役立たない。

'%●%'と挟んだ中間一致も同様。

演算しての比較なども、indexは役に立たない。

WHERE `price` * 1.08 > 1000 ;

のような場合。

indexにあるデータは`price`であって`price` * 1.08ではないからだ。

これは、両辺を1.08で割って

WHERE `price` > 1000/1.08 ;

とすると、indexが使用できるようになる。

否定形(<>)や、IS NULL、ORも、indexが利用できない。

但し、ORはINで書き換えると、indexを使用できるようになる。

EXPLAINで、設定したindexがpossible_keysに含まれており、keyで実際し使用されているか確認しておく。



以下のSQLアンチパターンはおすすめ。

悪例を提示して解説してある。

あー、これこれ、あるある!みたいなwwwww

問題なく動いているから、というSQLの書き方をしていると、レコードが増えると重くなったりしない?

あとのことを考えていないのね。

また、予想した結果がSELECTされているからOK!と判断したりしてない?

様々なレコードが増えてきた場合、予期しない結果を返してこない?

SQLアンチパターン
SQLアンチパターン
posted with amazlet at 14.06.29
Bill Karwin
オライリージャパン
売り上げランキング: 7,908


SQL中で型の変換を「意識せずに」してしまい、あれ?index使用してない?とかwww
[PR] au WALLETカードの情報 - auのプリペイドカードでショッピングをおトクに!

このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr Clip to Evernote






あるサイトに対する、無駄なアクセスが多いのは分かっている。

放置していたのだが、この機会に、少し追ってみる。

アクセスログを取っており、DB(MySQL)に格納しているので、

SELECT * FROM `log` WHERE `date` = '2014-05-XX' ;

として、特定の1日分を抽出。

約7.2MB(非圧縮)のログをダウンロードし、解析開始。

■ PVが多杉

レコード数は、37,705件。

1PVが1レコードなので、PV=37,705となる。

コンテンツ的に、日に三万PVを出すようなサイトではないwww

■ トップページが大半

トップページへのPVは、37,705件中の35,426件。

つまり、PVの94%がトップページ。

だいたい、アクセスの大半がトップページというのは異常。

認証不要なサイトであり、どのページからも入れるので、普通は末端のページから検索エンジン経由で入ってくるはずだ。

■ 163data.com.cn

hostを見ていると、163data.com.cnが目立つので調べてみると、28,098件あった。

全体の75%wwwwwwwwww

さすがはSN。

IPアドレスを抽出し、重複を除去した上で、.htaccessのdenyにヴチ込む。

-----

order allow,deny
allow from all

deny from 110.84.194.102
deny from 110.85.105.250
deny from 110.85.106.249
deny from 110.85.107.127
deny from 110.85.107.145
deny from 110.85.113.210
deny from 110.85.113.82
deny from 110.85.125.52
deny from 110.85.69.241
deny from 110.85.69.53
deny from 110.85.70.227
deny from 110.85.71.252
deny from 110.85.71.28
deny from 110.85.74.168
deny from 110.86.164.90
deny from 110.86.167.96
deny from 110.86.185.88
deny from 110.86.186.125
deny from 110.86.187.227
deny from 110.87.40.69
deny from 110.89.10.147
deny from 110.89.11.128
deny from 110.89.11.236
deny from 110.89.12.104
deny from 110.89.12.161
deny from 110.89.12.196
deny from 110.89.34.120
deny from 110.89.34.149
deny from 110.89.34.193
deny from 110.89.34.196
deny from 110.89.34.83
deny from 110.89.35.14
deny from 110.89.35.27
deny from 110.89.36.234
deny from 110.89.36.237
deny from 110.89.37.133
deny from 110.89.49.193
deny from 110.89.60.187
deny from 110.89.61.127
deny from 110.89.61.157
deny from 110.89.61.48
deny from 110.89.61.98
deny from 110.89.62.146
deny from 110.89.8.203
deny from 110.89.8.34
deny from 110.89.8.39
deny from 117.25.48.110
deny from 117.26.116.232
deny from 117.26.117.36
deny from 117.26.118.25
deny from 117.26.192.143
deny from 117.26.193.0
deny from 117.26.193.29
deny from 117.26.200.134
deny from 117.26.202.70
deny from 117.26.222.54
deny from 117.26.41.8
deny from 117.26.77.177
deny from 117.26.77.215
deny from 117.26.79.23
deny from 117.26.85.110
deny from 117.26.86.52
deny from 117.27.64.129
deny from 117.29.217.178
deny from 117.29.44.223
deny from 120.32.36.224
deny from 120.32.37.248
deny from 120.33.245.6
deny from 120.37.206.182
deny from 120.37.206.241
deny from 120.37.206.39
deny from 120.37.206.42
deny from 120.37.206.55
deny from 120.37.207.130
deny from 120.37.207.166
deny from 120.37.207.179
deny from 120.37.207.81
deny from 120.37.208.193
deny from 120.37.208.4
deny from 120.37.209.63
deny from 120.37.210.121
deny from 120.37.228.171
deny from 120.37.229.59
deny from 120.37.230.85
deny from 120.37.231.109
deny from 120.37.231.217
deny from 120.37.232.115
deny from 120.37.232.160
deny from 120.37.232.93
deny from 120.37.233.133
deny from 120.37.233.168
deny from 120.37.233.192
deny from 120.37.233.227
deny from 120.37.236.41
deny from 120.37.237.217
deny from 120.37.238.125
deny from 120.37.241.142
deny from 120.37.241.195
deny from 120.37.241.196
deny from 120.37.242.4
deny from 120.37.243.36
deny from 120.43.10.176
deny from 120.43.11.102
deny from 120.43.21.143
deny from 120.43.27.204
deny from 120.43.4.159
deny from 120.43.4.213
deny from 120.43.5.179
deny from 120.43.6.138
deny from 120.43.8.182
deny from 120.43.9.250
deny from 120.43.9.92
deny from 121.204.38.108
deny from 121.204.38.133
deny from 121.204.39.244
deny from 121.204.39.84
deny from 121.205.196.75
deny from 121.205.198.8
deny from 121.205.199.127
deny from 121.205.212.26
deny from 121.205.213.134
deny from 121.205.213.46
deny from 121.205.214.248
deny from 121.205.238.254
deny from 121.205.240.80
deny from 121.205.243.95
deny from 121.205.247.146
deny from 121.205.247.199
deny from 121.205.249.99
deny from 218.86.50.104
deny from 218.86.50.139
deny from 218.86.50.15
deny from 218.86.50.254
deny from 222.77.202.226
deny from 222.77.204.2
deny from 222.77.205.189
deny from 222.77.205.229
deny from 222.77.207.119
deny from 222.77.212.125
deny from 222.77.212.160
deny from 222.77.212.161
deny from 222.77.213.105
deny from 222.77.213.164
deny from 222.77.213.85
deny from 222.77.215.191
deny from 222.77.225.143
deny from 222.77.225.159
deny from 222.77.225.207
deny from 222.77.226.215
deny from 222.77.227.254
deny from 222.77.229.111
deny from 222.77.229.25
deny from 222.79.5.53
deny from 27.150.196.221
deny from 27.150.198.48
deny from 27.150.198.68
deny from 27.150.199.127
deny from 27.150.199.210
deny from 27.150.221.102
deny from 27.150.221.58
deny from 27.150.223.19
deny from 27.150.229.90
deny from 27.150.230.156
deny from 27.150.231.71
deny from 27.150.240.165
deny from 27.150.240.169
deny from 27.150.240.248
deny from 27.150.240.86
deny from 27.150.241.151
deny from 27.150.241.174
deny from 27.150.242.114
deny from 27.151.108.213
deny from 27.151.111.25
deny from 27.153.160.80
deny from 27.153.161.115
deny from 27.153.163.19
deny from 27.153.184.95
deny from 27.153.186.127
deny from 27.153.186.201
deny from 27.153.187.194
deny from 27.153.203.46
deny from 27.153.204.12
deny from 27.153.204.171
deny from 27.153.205.123
deny from 27.153.205.131
deny from 27.153.207.205
deny from 27.153.207.66
deny from 27.153.208.62
deny from 27.153.208.89
deny from 27.153.209.102
deny from 27.153.209.161
deny from 27.153.211.24
deny from 27.153.211.4
deny from 27.153.216.85
deny from 27.153.217.148
deny from 27.153.218.11
deny from 27.153.218.163
deny from 27.153.218.47
deny from 27.153.219.6
deny from 27.153.232.8
deny from 27.153.233.36
deny from 27.153.233.45
deny from 27.153.235.171
deny from 27.153.236.202
deny from 27.153.248.143
deny from 27.153.249.58
deny from 27.153.250.174
deny from 27.153.251.74
deny from 27.156.56.161
deny from 27.156.57.20
deny from 27.156.58.199
deny from 27.156.58.25
deny from 27.156.60.139
deny from 27.156.60.168
deny from 27.156.63.122
deny from 27.159.217.182
deny from 27.159.217.182
deny from 27.159.219.185
deny from 27.159.220.28
deny from 27.159.221.52
deny from 27.159.223.194
deny from 27.159.225.6
deny from 27.159.226.146
deny from 27.159.226.30
deny from 27.159.228.240
deny from 27.159.228.89
deny from 27.159.230.221
deny from 27.159.231.94
deny from 27.159.233.71
deny from 27.159.235.83
deny from 27.159.236.25
deny from 27.159.238.195
deny from 27.159.238.47
deny from 27.159.239.44
deny from 59.58.113.135
deny from 59.58.136.96
deny from 59.58.159.113
deny from 59.58.159.115
deny from 59.58.159.19

-----

全てをallow(許可)し、その後、リストのIPをdenyする方法ね。

まぁ、リスト外のIPから来るとはじけないのは分かっているが...

関連:163data.com.cnからの謎のアクセス多数

サーバ構築の実際がわかる Apache[実践]運用/管理 (Software Design plus)
鶴長 鎮一
技術評論社
売り上げランキング: 74,922

[PR] au WALLETカードの情報 - auのプリペイドカードでショッピングをおトクに!






DebianMySQLを入れてDBサーバーとし、ローカル環境に置く。

試験サーバーをローカルに立てて、作業用端末からアクセスすることはよくあることだ。

が、デフォルトでは、MySQLの入った端末からは当然アクセスできるが(自己内)、ローカル内の他の端末からはアクセスできない。

これを可能にするには、MySQLの入った端末(DBサーバー)の

/etc/mysql/my.cnf (MySQLの設定ファイル)

を編集する。

なお、Debianに限らずLinuxでは、/etcは設定ファイルを格納するディレクトリである。

/etc/mysql/my.cnf



bind-address = 127.0.0.1

という記述があるので、これを削除するか、先頭に#(コメント行)を付けて、

# bind-address = 127.0.0.1

とし、

/etc/init.d/mysql restart

で、MySQLの再起動。

再起動後、DBサーバーに接続できるかを確認する。

これで解決はするのだが、このbind-addressは、接続したいMySQLが動いている端末のIPアドレスであり、接続を許可するIPアドレスではないのだ。

従って、接続できる端末を増やそうとして

bind-address = 127.0.0.1

bind-address = 192.168.0.10

bind-address = 192.168.0.20

と併記しても意味がない、というか、そもそも無効。

繰り返すが、bind-addressは接続を許可するIPアドレスではなく、これで接続してくる端末のIPを制限するものではない。

なお、MySQLの入った端末(DBサーバー)にApache等のWEBサーバーが入っており、そのWEBサーバーからMySQLにアクセスする場合は、自己内なので何もする必要はない。

MySQLの入った端末(DBサーバー)が複数台あり、各々他方へアクセスするような場合も、上記の設定変更が必要。

MySQL全機能バイブル ~現場で役立つAtoZ~
鈴木 啓修
技術評論社
売り上げランキング: 199,175

[PR] au WALLETカードの情報 - auのプリペイドカードでショッピングをおトクに!

このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr Clip to Evernote






自鯖(自由度高)を使うことが多いが、さくらインターネットのユーザーから質問を受けたのでメモ。





WEBサーバー内にcsvファイルを置いて、それをDB(MySQL)にインポートする。

phpMyAdminのインポート機能を使えば可能だが、phpプログラムで実行したい。

となると、LOAD DATA LOCAL INFILEが考えられる。

LOAD DATA INFILE
インポート先のDBがあるサーバーにcsvファイルがある場合

LOAD DATA LOCAL INFILE
クライアントにあるcsvファイルをサーバーのDBへ

MySQL全機能バイブルの381ページ

この場合は,使用可能と思えるが、csvファイルのあるサーバー(WEBサーバー)とMySQLのあるサーバー(DBサーバー)が別の場合(さくらインターネット等)は、この方法では不可能では?

ネットで調べると、成功したとかしなかったとか、mysqlimportで成功した等の情報があるが、同じレンタルサーバー業者でも、DBのバージョンや設定が異なるので、実際は自分で試してみないとならない。

また、情報の日付に注意。

以前は有効でも今は無効ということがあるからだ。

phpMyAdminでのインポートでは、最大サイズの制限がある(最長:16MiB)。

自己管理のローカルサーバー等、自由度のある場合は上限値を変更できるが、レンタルサーバーの場合は困難だろう。

そのような場合、FTPでcsvファイルを上げておいて、以下の方法でDBにインポートするとよいだろう。

phpでプログラムを書いておくと、コマンド打たなくてもいいしね。

以下、手順。

■csvファイルの準備

WEBサーバー上の /home/aaa/www/ に test.csv を置く。

aaaは、さくらインターネットでのアカウント名。

test.csvの中身は

1,first
2,second
3,third
4,forth
5,fifth

という、カンマ区切りの簡単なもの。

■DBの準備

mysql***.db.sakura.ne.jp - aaa_xxx - test

に、以下のようなテーブル(test)を作成しておく。

テーブル

・id int
・name text

***は、さくらインターネットから割り当てられたDBの番号。

aaa_xxxはDB名だが、必ずaaa_が付加されるのは、さくらインターネットの仕様。

テーブル名は、

■コマンドを記したphpファイルを作成、実行

WEBサーバーのtest.csvと同じディレクトリに

<?PHP

$import = "mysqlimport -h mysql***.db.sakura.ne.jp -u aaa -p(パスワード) -L --fields-terminated-by=',' aaa_xxx /home/aaa/www/test.csv" ;
system($import) ;

?>


というphpファイル(import.phpとする)を置き、これを実行。

・-h mysql***.db.sakura.ne.jp ホスト
・-u aaa DBアクセス用のユーザ名
・-p(パスワード) DBアクセス用のパスワード、-pに続けて(スペースなしに)書くこと
・-L ローカルファイルから読み込むオプション
・--fields-terminated-by=',' csvファイルの区切文字、今回は「,(半角カンマ)」
・aaa_xxx DB名
・/home/aaa/www/test.csv csvファイルの場所

すると、

aaa_xxx.test: Records: 5 Deleted: 0 Skipped: 0 Warnings: 0

と表示され、以下のようにデータが格納される。

csvの内容が格納されている
csvの内容が格納されている

さて、上のmysqlimport〜にて、DB名の指定はあるが、テーブル名の指定はないのか?

と疑問に思うが、test.csvの拡張子を取ったものが、テーブル名なのだ。

つまり、ファイルがtest.txtの場合も、testがテーブル名。

ファイル名とテーブル名が異なる場合は?

import.phpをリロードすると、データが「追記」されてしまう。

2回格納されている
2回格納されている

これを防ぐには、

--delete インポートする前にテーブルを空にする

のオプションを追加する。

これで、格納前に空にしてくれるので、追記は回避できる。

なお、原因は不明だが -D ではエラーとなる(エラー表示はないが格納されない)。

--delete なら問題なし。

--オプションに対し、-省略形、つまり、

--delete と -D は同意という理解は間違っているのか?

関連:mysqlimport --helpの内容

このphpファイルを定期的に実行するには、cronに登録すればよい。

cd /home/aaa/www ; /usr/local/bin/php test.php > /dev/null

test.phpのあるディレクトリ ; PHPのコマンドパス プログラムを記したphpファイル メール設定

最後の >/dev/null は postmaster@aaa.sakura.ne.jp へメールを送らない場合に書く。

そして、cronが実行できるように、test.phpのパーミッションを755に設定。

設定後は、指定した間隔や時間に、問題なくDBに格納されるかを確認する。

メールを送る設定であれば Permission denied 等のエラーが postmaster@aaa.sakura.ne.jp に送られるので、確実に動くことを確認するまでは >/dev/null を付けない方がいい。

cronは5個までしか設定できないようだが、コントロールパネルからではなく、サーバーに接続しコマンドでやれば、5個以上可能?

関連:さくらインターネットのCRONの設定画面(1.CRONの設定)

関連:さくらインターネットのCRONの設定画面(2.CRONスケジュール設定)





MySQL全機能バイブル ~現場で役立つAtoZ~
鈴木 啓修
技術評論社
売り上げランキング: 170,416
[PR] au WALLETカードの情報 - auのプリペイドカードでショッピングをおトクに!

このページのトップヘ