Category Archives: MySQL

mysqliライブラリがインストールできない

mysqliライブラリがインストールできない!

CentOSなどで、

# yum install php55-mysqli

しても、php55-mysqliなパッケージが見つからない!
と思っていたら、パッケージ名が変わっていたのでした。

# yum install php55-mysqlnd

でインストールできます。

MySQLのrootパスワードを忘れて再更新

パスワードを忘れたというか、MySQLをインストールした時に設定したパスワードを入れてもログインできない!まあ同じ様なものですが(笑)

rootパスワードをリセットする方法、忘れがちなのでメモっておきます。

http://open-groove.net/mysql/forgetting-mysql-rootpass/

スタンダードな対処法
1.MySQLインスタンスを停止する。
2.認証スキップモードで起動する。セーフモード、ともいうらしい。

# /usr/bin/mysqld_safe –skip-grant-tables &

※mysqld_safeのパスは標準では上記のようになると思うが、環境によっては違うかも。

3.認証なしでログイン。

# mysql -u root

4.rootパスワードを更新

mysql > UPDATE mysql.user SET password=PASSWORD(‘new-passowrd’) WHERE User= ‘root’;
mysql > FLUSH PRIVILEGES;
mysql > ¥q

剣呑剣呑。

さくらインターネットMySQLを自動バックアップして『暗号化』してgmailに送る

さくらインターネットMySQLを自動バックアップしてgmailに送る: PHPの種 ブログで運用していたところ、記事にこんなコメントが。

ネットワーク越しにバックアップするとなると、何らかの暗号化をした方が望ましいと思いますが、何か良い方法はないものでしょうか。

確かに言われてみればそうですね。MySQLにブログデータしか入ってなかったので、セキュアな考えが抜け落ちてました。ありがとうございます。

さくらのレン鯖にはgpg2が入っているので、それを活用させてもらいましょう!

/usr/local/bin/mysqldump –opt -c -h [MySQL SERVER] -u [USERNAME] –password=[PASSWORD] [DB NAME] | /usr/local/bin/gpg -c –cipher-algo AES256 –batch –passphrase “[PASSPHRESE]” | /usr/local/bin/php ~/mailto.php -m [MAILADDRESS]

AES256で暗号化してから送るコマンドに変更です。gpgのデフォルトで出力結果が圧縮されるので、前回付けていたgzipはいらないでしょう。

復号も色々オプションを付けられますが、一番簡単なのは

$ gpg [filename]

です。

暗号化したら一応復号できるかどうかのチェックしておいてくださいね。

ちなみに共有鯖の悲哀か

Warning: using insecure memory!

と警告が出ることは避けられそうにないので、cronに登録する時は、

1> /dev/null

を追記しておくのが好ましいでしょうね。

さくらインターネットMySQLを自動バックアップしてgmailに送る

さくらインターネットで MySQL のバージョンを 4 から 5 に移行: PHPの種 ブログ
↑なんて感じでさくらインターネットでのMySQLを5に変えたのですが、これでmysqldumpが(文字コード的に)安定したということで、前諦めた自動バックアップを設定しておこうと思いました。

mysqldumpしてメールで送るうんぬんは今までも色んなところでやられていると思いますが、今回困った点としては

  • uuencodeの添付ファイルだとgmailでうまく扱えない

です。


~ | uuencode attached.file | mail -s attached.file hoge@gmail.com

なんてお手軽にしたかったんですが、どうもダメみたい。

で、普通に添付メールとして送れるコマンドを探していたらmuttやらemailやらあるものの、どうにもさくらインターネットのレン鯖に素直に入れられそうになかったので、phpでさくっと作ってみました。とりあえずZend Frameworkで。

このぐらいはワンライナーで作れそうですが、敢えて?のZend Frameworkで。Pear_Mailとかもきっとあるに違いないけど全く調べて無いです。きっとある。

[php]
getOption(‘m’)) {
echo(‘How to : mailto.php -m [mailaddress]’);exit;
}

$mail = new Zend_Mail();
$mail->setBodyText(‘This is the text of the mail.’);
$mail->setFrom(‘somebody@example.com’, ‘Some Sender’);
$mail->addTo($address, ‘Some Recipient’);
$mail->setSubject(‘MYSQL DUMP’);
$mail->createAttachment(file_get_contents(“php://stdin”));
$mail->send();
[/php]

何も考えずにモジュールを持ってくるだけで簡単に作れますね。

Zend_Mail部分はZend Frameworkマニュアルそのまんまなので、本文や差出人とか、自由に変更してくださいね。添付ファイルに名前をつけたい場合は、マニュアルを参考に。

このスクリプトに標準入力からdumpを流し込みます。
スクリプトはmailto.phpと名付けてホームディレクトリに保存しました。

/usr/local/bin/mysqldump --opt -c -h [MySQL SERVER] -u [USERNAME] --password=[PASSWORD] [DB NAME] | gzip | /usr/local/bin/php ~/mailto.php -m [MAILADDRESS]

無事dumpしたgzファイルが添付されましたでしょうか。

上のコマンドが無事成功したなら、さくらコンパネからcronで登録しておきましょう!

ちなみに私はgmail宛に送信して、すぐにゴミ箱に行くようにフィルタリングしています。これなら30日は保存されますし、gmailの容量も食わないですしね。

はてな流大規模データ処理

KOF 2008 の発表資料 – naoyaのはてなダイアリー

はてな流大規模データ処理の発表資料を見てたら、データベースのパーティショニングを前提とした設計、というのが載っていて興味を引きました。

普通にテーブルが分かれている場合、JOINを使って、

mysql> select url from entry INNER JOIN bookmark on entry.eid = bookmark.eid
-> where bookmark.uid = 169848 limit 5;

こんな感じでSQL文を発行しますが、テーブルがパーティショニングで分けられている場合、

mysql> select eid from bookmark where uid = 169848 limit 5;
+—–+
| eid |
+—–+
| 0 |
| 4 |
| 5 |
| 6 |
| 7 |
+—–+
5 rows in set (0.01 sec)

mysql> select url from entry where eid in (0, 4, 5, 6, 7);

こう、JOINせずに求めるという・・・。力業ですね(^_^;)
まだパーティショニングしたことないですが、こうなりますよねー。やはり。

SET NAMESを使わない方が良い

PHPからSET NAMESを使わない方が良い理由と対策まとめ | twk @ ふらっと

MySQL4なサバでは使ったりしてましたが。。

SQLの実行により文字コードが変更されるように思えるが、PHPのMySQL関連の関数で考慮される文字コードは変更されない。このため、エスケープ関数mysql_real_escape_string()等で、必要なエスケープがなされず脆弱性を引き起こすケースがある。

とのこと。mysql_set_charset()のほうを使おう!とのことです。

使いたい文字コードがShift_JISなら
入力文字列が正しい文字コードかチェックして、その上で自前のエスケープ用の関数を通せばOK
文字コードのチェックにはmb_check_encoding()またはmb_convert_encoding()を使えば良い。
自前のエスケープ用の関数では、Shift_JISの x00, n, r, , ‘, ” そして x1a をエスケープすれば良いはず。

これは良い情報ですね。古いPHPでShift_JIS使う時には覚えておこう。

1ファイルのMySQLフロントエンド「phpMinAdmin」

MOONGIFT: » たった1ファイルのMySQLフロントエンド「phpMinAdmin」:オープンソースを毎日紹介

1ファイルというのがすごいですよね。また、動作も軽快です。
しかし出来ることは限られているので、(これもですが、リレーション設定が出来ないのがつらい。GUIからリレーション設定できるのは便利なんですよね……) 限定的な用途で、さくっと設置、さくっと使用という感じで使えそうです!

SQL Buddy:WEBベースのMySQL管理ソフト

MOONGIFT: » WebベースのMySQL管理インタフェースの新参「SQL Buddy」:オープンソースを毎日紹介

WEBベースのMySQL管理といえば、phpMyAdminですが、リンク先のMOONGIFTさんの

ずっと同じものを使うのは利点もあるが、欠点もある。使わずとも代替えの存在は知っておくべきだろう。

仰ることもごもっともなので、ちょっと触ってみました。

http://www.sqlbuddy.com/

なんか、自分で作ったらこうなるだろうなーという感じ。今風なインターフェイスで速度も悪くなく、良い出来だと思います。
ただ、InnoDBなどのテーブルリレーションを表示したり作成したりする画面が無い(ですよね?)。
SQLでやれってことなのかな。そこがちょっと不便に感じました。

とりあえず、まだまだphpMyAdminのお世話になりそうです。

MysqliでCouldn’t fetch mysqliなWarning

PHPでMysqliモジュールを使っていて、

Warning: mysqli_query() [function.mysqli-query]: Couldn’t fetch mysqli in hoge~

などと出たら、まずDBとまともに接続出来てるかを疑ったほうがよいです。私の場合はほぼパスワードのタイポ(^_^;)
というわけで、上記エラーが出て困っている方は、ユーザ権限らへんを悉に確認すると吉かもしれません。。

データベースの項目を1回の操作で加算処理

TRASH-NEWS:ネットでは自明の理として書かれないプログラムの基本事項

データベースから何かしらのkeyを元にデータを持ってきて、それを加算して、アップデートして、みたいな流れではなく一度に処理してしまおう、というお話です。

データベースの項目を1回の操作で加算処理するSQL文

UPDATE `(テーブルの名前)` SET COUNTER = COUNTER + 1 WHERE ID=1

この例文だとID=1のCOUNTERを1加算します。

な、なるほどー。これは便利。さっそく取り入れるしかっ
使える時にこれを覚えているかどうかが問題だ。そのためのブログだけど。