Archive for the ‘MySQL’ Category

MySQL Casual Talks @gumi福岡、いってきた( #mysqlcf )

先月下旬にありましたが、記事に書くのは今頃になってしまいました。ごめんなしあ〜〜〜!
(今回は聞くだけ側でしたw)

twitterに投げた内容は、以下にまとめておきました。
MySQL Casual Talks @gumi福岡 個人的記録まとめ。 – Togetter

特に気になった話や記憶に残ったとこはこんなところかな

  • collationのはなし。→collationはutf8mb4にしましょう
  • HandlerSocketしゅごい
  • MySQLのバックアップについてあれこれ。ちゃんとリストアのテストも忘れずに!
  • パーティショニング
  • CVE-2012-2122を実際にやってみた
  • perl+MySQL使いいないの〜〜〜?(;_;)
  • もつ鍋_(゚ཀ゚」∠ )_ウマー

スライドのまとめはこちら(主催者さんとこ)にあります。
MySQL Casual Talks @gumi福岡を主催 & Talkしてきました – CubicLouve

そして。
主催の会場提供してくださったgumi様、ありがとうございました!

CakePHP で最後に追加したレコードのIDをとってくる。

getInsertID()とgetLastInsertID() という関数。
2つあるらしく。
CakePHP:getLastInsertIDって、どうよ(PHP)–WEBシステム開発 技術的備忘録(通称 技忘録)

何してるのかわからんかったので調べた。
from cake/libs/model/model.php :

        function getLastInsertID() {
                return $this->getInsertID();
        }

ヽ(`Д´)ノもう来ねぇよウワァァァァン

というわけで気をとりなおして、getInsertID()。

        function getInsertID() {
                return $this->__insertID;
        }

modelクラス変数 $__insertID を見に行ってるのね。
そんなわけで、$__insertID を探したら・・・

        function setInsertID($id) {
                $this->__insertID = $id;
        }

・・・。
ヽ(`Д´)ノもう来ねぇよウワァァァァン

またまた気を取り直して。

ちなみに、setInsertID は、データソースのほうで使用してます。
cake/libs/model/datasources/dbo_source.php

function create(&$model, $fields = null, $values = null) {
// 中略
    if ($this->execute($this->renderStatement('create', $query))) {
        if (empty($id)) {
            $id = $this->lastInsertId($this->fullTableName($model, false),
                    $model->primaryKey);
            }
            $model->setInsertID($id);
// 以下略

そして、lastInsertID は各DBによって違う挙動となります。
一番最後に挿入したレコードのidを取得する方法はRDBMSによってまちまちですからね。

MySQLの場合:datasources/dbo/dbo_mysql.php

        function lastInsertId($source = null) {
                $id = $this->fetchRow('SELECT LAST_INSERT_ID() AS insertID', false);
// 以下略

つまり、LAST_INSERT_ID() の値。

PostgreSQLの場合:datasources/dbo/dbo_postgres.php

        function lastInsertId($source, $field = 'id') {
                $seq = $this->getSequence($source, $field);
                $data = $this->fetchRow("SELECT currval('{$seq}') as max");
                return $data[0]['max'];

$seq というのはシーケンスの名前。
詳しくはPostgreSQLのシーケンス操作関数あたり参照。

mmeasureをMySQL5で動かすために。

mMeasureって便利なツールがあります。
残念ながらMySQL5では動きがおかしいです。
一番おかしいのが、「データ操作クエリ比率」で、Com_Selectの値がとれない、ってあたりです。なぜか0のまんま。
・・・理由を調べたら、どうやら、show status の Com_select とかの値の処理が変わったようです。
参考:Bug Report id=13756 The server variable “Com_select” seems session local variable. – mir the developer
要約すると「show global statusしる!」ってことです。

というわけでパッチ。

diff -ur mmeasure/daemon/data-mysql/read-data.pl mmeasure-upd/daemon/data-mysql/read-data.pl
--- mmeasure/daemon/data-mysql/read-data.pl     2006-01-16 18:23:02.000000000 +0900
+++ mmeasure-upd/daemon/data-mysql/read-data.pl 2009-12-04 19:09:38.000000000 +0900
@@ -47,7 +47,7 @@
                $conf{ 'MYSQL_PORT' },
                $conf{ 'MYSQL_SOCKET' } );

-       my %status = select_2column( $db, "show status" );
+       my %status = select_2column( $db, "show global status" );
        my %variables = select_2column( $db, "show variables" );

        $db->disconnect;
diff -ur mmeasure/web/detail.php mmeasure-upd/web/detail.php
--- mmeasure/web/detail.php     2006-01-06 13:23:18.000000000 +0900
+++ mmeasure-upd/web/detail.php 2009-12-04 19:49:18.000000000 +0900
@@ -42,7 +42,7 @@
                }
                if ( $key == "status" )
                {
-                       $query = "show status";
+                       $query = "show global status";
                }
                $result = mysql_query( $query ) or die( "Query failed : " . mysql_error() );
                $items = array();
diff -ur mmeasure/web/index.php mmeasure-upd/web/index.php
--- mmeasure/web/index.php      2006-01-16 17:21:59.000000000 +0900
+++ mmeasure-upd/web/index.php  2009-12-04 19:49:10.000000000 +0900
@@ -10,7 +10,7 @@
        $report = array();
        $report[ 'now' ] = strftime( "%Y/%m/%d %H:%M:%S" );

-       $query = "show status";
+       $query = "show global status";
        $result = mysql_query( $query ) or die( "Query failed : " . mysql_error() );
        $status = array();
        $comms_raw = array();

あと。
イメージのpathの指定がおかしいのでなおす。

diff -u mmeasure/mmeasure_template.conf mmeasure-upd/mmeasure_template.conf
--- mmeasure/mmeasure_template.conf     2006-01-16 18:45:17.000000000 +0900
+++ mmeasure-upd/mmeasure_template.conf 2009-12-04 20:18:27.000000000 +0900
@@ -80,7 +80,7 @@
 #------------------------------------------------------------------------------
-
 #      Web settings
 #------------------------------------------------------------------------------
-
-WEBDIR="$PATH_MMEASURE/web/graphs"
+WEBDIR="$PATH_MMEASURE/web/images/graphs"
 WIDTH="400"
 HEIGHT="100"
 IMAGEFORMAT="gif"

そうそう。
あと、このパラメータを入れないとだめです。画像が出ないしエラーがてんこ盛りと出ます。

WIDTH_SMALL="200"
HEIGHT_SMALL="100"
WIDTH_LARGE="400"
HEIGHT_LARGE="100"

参考:FreeBSD(とLinux)雑記:いけてる?けどいろいろいけてないmmeasure – livedoor Blog(ブログ)

・・・と、ここまで書いて。
全部まとめてあるサイトあるやん!ってこと気づいた。
オデの日記@WEB系: mmeasureのインストール


おまけ。
debianで実行用ソフトウェアを簡単に入れるための手順。

  • rrdtool → コマンドラインから aptitude install rrdtool
  • perl関連
    • Socket → そのままでOK
    • DBI → cpan で install DBI
    • DBD::mysql → cpan で install DBD::mysql
    • RRDs → コマンドラインから aptitude install librrds-perl
    • jcode.pm → cpan で install Jcode
  • PHP関連
    • mysqlモジュール → コマンドラインで aptitude install php5-mysql

    2009/12/08 11:40追記。
    CPANを実行するとき、デフォルトのままでは入らないので、さらに最低でもこれだけやらないとだめ。

    $  aptitude install yaml
    $  aptitude install make
    $  aptitude install gcc
    $  aptitude install mysql-client
    $  aptitude install libmysqlclient15-dev
    

    ※yamlが必要かはちょっと疑わしいが・・・。
    libmysqlclient15-dev が入ってないと、どうしてもDBD::mysqlが入らない。怒られます。(『Can’t exec “mysql_config”』と怒られる)
    参考:DBD::mysqlインストール時のエラー – jitsu102の日記