SQL Server の日付

SQL Server の日付フィールドを php で select して
MySQL へ insert する処理を行ったら
日付が 00-00-00 00:00:00 になってしまった ❗

どうも select するときにフォーマットを指定する必要があったようです。

SELECT CONVERT(VARCHAR, DATE, 120) FROM hogetable;

めんどいですねー :mrgreen:

MySQL-5.5.13 ビルド

MySQL-5.5.13 をソースからビルドしたのでメモ。

OS は FreeBSD 7.1-RELEASE-p4 です。

MySQL-5.5.X は configure ではなく cmake を使うようになったようです。

> cmake
cmake: Command not found.

cmake が無いので、まずは cmake をインストールします。
ports からインストールします。

> whereis cmake
cmake: /usr/ports/devel/cmake
> su -
# cd /usr/ports/devel/cmake
# make configure
# make
# make install
# pkg_info | grep cmake
cmake-2.8.4_1       A cross-platform Makefile generator
# which cmake
/usr/local/bin/cmake
# make clean

次に MySQL-5.5.13 用にユーザを追加しました。

# pw groupadd mysql55
# pw useradd mysql55 -d /nonexistent -s /sbin/nologin
> id mysql55
uid=1001(mysql55) gid=1001(mysql55) groups=1001(mysql55)

いよいよ MySQL のビルドです。
MySQL も ports でインストールしようかと思ったのですが、イマイチ Makefile で指定した cmake のオプションがどのように影響するのか分からなかったのでソースからビルドする事にしました。 :mrgreen:

オプションは大体見れば分かると思いますが、 😎
既に MySQL-4.X が稼働しているサーバだったので、PREFIX 、ポート番号、socketのパスを変更しています。

> tar xfz mysql-5.5.13-freebsd7.0-i386.tar.gz
> cd mysql-5.5.13
> cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql55 
-DMYSQL_DATADIR=/usr/local/mysql55/data 
-DDEFAULT_CHARSET=utf8 
-DDEFAULT_COLLATION=utf8_general_ci 
-DWITH_INNOBASE_STORAGE_ENGINE=1 
-DWITH_ARCHIVE_STORAGE_ENGINE=1 
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 
-DMYSQL_TCP_PORT=3307 
-DMYSQL_UNIX_ADDR=/tmp/mysql55.sock 
-DWITH_READLINE=1
> make
> su -
# make install

これで MySQL-5.5.13 が /usr/local/mysql55/ にインストールされました。

次は MySQL-5.5.13 の起動です。

データディレクトリを作成します。

# mkdir -p /home/mysql55/db
# chown mysql55:mysql55 /home/mysql55/db

my.cnf コピー

# cp /usr/local/mysql55/support-files/my-medium.cnf /home/mysql55/db/my.cnf
# chown mysql55:mysql55 /home/mysql55/db/my.cnf

my.cnf の変更点。
user = mysql55 を追加。
skip-networking のコメントを外して有効化。コメントアウトって言うの? 🙂

# diff /usr/local/mysql55/support-files/my-medium.cnf /home/mysql55/db/my.cnf
26a27
> user          = mysql55
45c46
< #skip-networking
---
> skip-networking

MySQL データ初期化を行います。(mysql_install_db の実行)

# /usr/local/mysql55/scripts/mysql_install_db --basedir=/usr/local/mysql55 --datadir=/home/mysql55/db --user=mysql55
Installing MySQL system tables...
OK
Filling help tables...
OK
 
To start mysqld at boot time you have to copy
support-files/mysql.server to the right place for your system
 
PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:
 
/usr/local/mysql55/bin/mysqladmin -u root password 'new-password'
/usr/local/mysql55/bin/mysqladmin -u root -h server.example.com password 'new-password'
 
Alternatively you can run:
/usr/local/mysql55/bin/mysql_secure_installation
 
which will also give you the option of removing the test
databases and anonymous user created by default.  This is
strongly recommended for production servers.
 
See the manual for more instructions.
 
You can start the MySQL daemon with:
cd /usr/local/mysql55 ; /usr/local/mysql55/bin/mysqld_safe &
 
You can test the MySQL daemon with mysql-test-run.pl
cd /usr/local/mysql55/mysql-test ; perl mysql-test-run.pl
 
Please report any problems with the /usr/local/mysql55/scripts/mysqlbug script!
 
# ls -l /home/mysql55/db
total 12
-rw-r--r--  1 mysql55  mysql55  4699 Jun  7 08:52 my.cnf
drwx------  2 mysql55  mysql55  2048 Jun  7 09:02 mysql
drwx------  2 mysql55  mysql55  1024 Jun  7 09:02 performance_schema
drwx------  2 mysql55  mysql55   512 Jun  7 09:02 test

スタートアップスクリプトを作成します。

ソースと一緒に入っているスクリプトをコピーします。

# cp /usr/local/mysql55/support-files/mysql.server /usr/local/etc/rc.d/mysql55-server

スタートアップスクリプト修正。
元々 linux 用のスクリプトみたいですが、FreeBSD でも大丈夫みたいです。

# vi /usr/local/etc/rc.d/mysql55-server

以下変更点です。

diff /usr/local/mysql55/support-files/mysql.server /usr/local/etc/rc.d/mysql55-server
27c27,29
<
---
>
> name="mysql55"
>
57,58c59,60
< lockdir='/var/lock/subsys'
< lock_file_path="$lockdir/mysql"
---
> lockdir='/var/run'
> lock_file_path="$lockdir/mysql55"
70c72
<     datadir=/usr/local/mysql55/data
---
>     datadir=/home/mysql55/db
283c285
<       $bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null 2>&1 &
---
>       $bindir/mysqld_safe --defaults-file="$datadir/my.cnf" --datadir="$datadir" --pid-file="$mysqld_pid_file_path" --user=mysql55 $other_args >/dev/null 2>&1 &

それと、FreeBSD では rc.conf に OS 起動時にスタートさせるスクリプトを指定するようです。

# vi /etc/rc.conf
mysql55_enable="YES" を追加しました。

mysqld を起動します。

# /usr/local/etc/rc.d/mysql55-server start
Starting MySQL.. SUCCESS!
# ps awwux | grep mysql で mysql55 が起動した事を確認しました。

停止も確認しておきますか。

# /usr/local/etc/rc.d/mysql55-server stop
Shutting down MySQL. SUCCESS!
# ps awwux | grep mysql で mysql55 が停止した事を確認しました。

root のパスワードを設定します。

# /usr/local/mysql55/bin/mysqladmin -u root password 'hogehoge'
# /usr/local/mysql55/bin/mysql -uroot
 
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 4
Server version: 5.5.13-log Source distribution
 
Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
 
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

MySQL4.X も問題なく稼働しているようなので、セットアップはここまででひとまず完了です。 :mrgreen:

MySQL Cluster DataMemory, IndexMemory の増やし方

MySQL Cluster 7.1.3 でこんなエラーが発生 🙁

#1114 - The table '○○○' is full

色々調べたところ DataMemory 使用率が 96% に達している事が判明しました。

$ ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> all report memoryusage
Connected to Management Server at: localhost:1186
Node 11: Data usage is 96%(12800 32K pages of total 12288)
Node 11: Index usage is 60%(6826 8K pages of total 4096)
Node 12: Data usage is 96%(12800 32K pages of total 12288)
Node 12: Index usage is 60%(6826 8K pages of total 4096)
(※実際の数値とは違います)

DataMemory は config.ini で指定しますので、config.ini を変更して

DataMemory, IndexMemory を増やしました。

root# vi /var/lib/mysql-cluster/config.ini
[NDBD DEFAULT]
NoOfReplicas=2
DataDir=/var/lib/mysql-cluster
# ServerPort = 63132
# MaxNoOfConcurrentOperations=10000
DataMemory=1024M
IndexMemory=128M
# TimeBetweenWatchDogCheck=30000
# MaxNoOfOrderedIndexes=512

この変更を反映させます。

  1. ndb_mgmd を再起動をします。
  2. この時、起動オプションに –reload を追加します。
    (この –reload が分かるまで何度も試行錯誤してしまいました 🙂 )

    root# kill {ndb_mgmd の PID}
    root# kill {ndb_mgmd の PID}(もういっちょ!)
    -bash: kill: ({ndb_mgmd の PID}) - No such process(停止したね!!)
    root# /usr/sbin/ndb_mgmd --config-dir=/var/lib/mysql-cluster --config-file=/var/lib/mysql-cluster/config.ini --reload
  3. データノードを順番に再起動
  4. (Node 11 を再起動します。)
    ndb_mgm> 11 restart(しばらく待ちます)
    Node 11: Node shutdown initiated
    Node 11: Node shutdown completed, restarting, no start.
    Node 11 is being restarted
     
    Node 11: Start initiated (version 7.1.3)
    ndb_mgm> Node 11: Started (version 7.1.3)(再起動完了)
     
    (Node 12 を再起動します。)
    ndb_mgm> 12 restart(しばらく待ちます)
    Node 12: Node shutdown initiated
    Node 12: Node shutdown completed, restarting, no start.
    Node 12 is being restarted
     
    Node 12: Start initiated (version 7.1.3)
    ndb_mgm> Node 12: Started (version 7.1.3)(再起動完了)
  5. メモリ使用率を確認
  6. ndb_mgm> ALL REPORT MemoryUsage
    Connected to Management Server at: localhost:1186
    Node 11: Data usage is 35%(11636 32K pages of total 32768)
    Node 11: Index usage is 10%(1652 8K pages of total 16416)
    Node 12: Data usage is 35%(11636 32K pages of total 32768)
    Node 12: Index usage is 10%(1651 8K pages of total 16416)

    DataMemory, IndexMemory が増えて使用率が減りました 🙂

    今後も使用量は増え続けるのでこの作業は繰り返し行う必要がありそうです :mrgreen:

OpenPNE3.4.8

ざっくりとセットアップの内容をメモします。

3.4.8 というバージョンをダウンロードしました。

ファイル名はopenpne-OpenPNE3-OpenPNE-3.4.8-0-gb9d705e.zip

  1. zip ファイルを解凍して DOCUMENT_ROOT 以外の任意の場所に保存します。
  2. /usr/local/apache2/OpenPNE3 に解凍しました。

  3. OpenPNE.yml 作成
  4. $ cd /usr/local/apache2/OpenPNE3
    $ cp config/OpenPNE.yml.sample config/OpenPNE.yml
    $ vi config/OpenPNE.yml

    base_url と mail_envelope_from を環境に合わせたモノに変更しました。

  5. ProjectConfiguration.class.php 作成
  6. 特に変更せずデフォルトのままです。

    $ cp config/ProjectConfiguration.class.php.sample config/ProjectConfiguration.class.php
  7. DB 作成
  8. openpne3db という名前で作成しました。

    mysql> CREATE DATABASE open3db DEFAULT CHARACTER SET utf8;

    そして、openpne ユーザがパスワード openpne で接続できるようにユーザを作成しました。

    mysql> GRANT ALL ON *.openpne3db TO 'openpne'@'localhost' IDENTIFIED BY 'openpne';
  9. インストール
  10. 対話的形式でデータベースへの接続情報を設定をした後、色々と表示されますが、
    意味が分かりませんでした。

    $ ./symfony openpne:install
  11. web ディレクトリを公開ディレクトリから参照できるようにシンボリックリンクを作成
  12. 公開ディレクトリを /usr/local/apache2/htdocs として説明します。
    /sns というサブディレクトリに公開します。
    サーバ名を www.example.com とすると、URL は http://www.example.com/sns/ になります。

    $ cd /usr/local/apache2/htdocs
    $ ln -s ../OpenPNE3/web sns
  13. .htaccess 変更
  14. RewriteBase 変更

    $ vi web/.htaccess

    RewriteBase を /sns/ に変更しました。

  15. ブラウザからアクセス
  16. http://www.example.com/sns/

    ページは表示されますが、CSS が適用されていない状態です 😥
    apache の error_log を見たら DOCUMENT_ROOT 直下の opSkinBasicPlugin を
    参照している事が分かったので、DOCUMENT_ROOT に opSkinBasicPlugin/web へ
    のシンボリックリンクを作成しました。

    # cd /usr/local/apache2/htdocs
    # ln -s ../OpenPNE3/plugins/opSkinBasicPlugin/web opSkinBasicPlugin

    簡単に参照先を変更できるかと思ったのですが、調べても分からなかったのでシンボリックリンクで対応してしまいました。

  17. 再度ブラウザでアクセス
  18. CSS が適用されたデザインされたページになりました 🙂

    プリセットされているユーザでログインします。

    メールアドレス: sns@example.com
    パスワード: password

    すると今度は以下のエラー 😥

    現在、サーバが混み合っているか、メンテナンス中です。
    ご迷惑をおかけいたしますが、しばらく時間を空けて再度アクセスしてください。
     
    Currently, our service is too busy or is under maintenance.
    We're sorry and please retry accessing later.

    またまた apache の error_log を見ると以下が記録されていました。

    SQLSTATE[HY000]: General
     error: 2014 Cannot execute queries while other unbuffered queries are active.
    Consider using PDOStatement::fetchAll().  Alternatively, if your code is only ev
    er going to run against mysql, you may enable query buffering by setting the PDO
    ::MYSQL_ATTR_USE_BUFFERED_QUERY attribute., referer: http://www.example.com/sns/
    pc_backend.php/

    エラーメッセージのとおり、PDO::MYSQL_ATTR_USE_BUFFERED_QUERY を true
    にする必要があるようです。

    色々と調べたところ以下のファイルを変更したところ解決しました。
    (これで正しいのかわかりませんが 😎 )

    lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection/Mysql.php

    以下のように PDO::MYSQL_ATTR_USE_BUFFERED_QUERY を追加。

    public function connect()
         {
             $connected = parent::connect();
             $this->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
             $this->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
     
             return $connected;
         }

    これでとりあえず動くようになりました 🙂

    ※この対応方法は DB が MySQL の場合にのみ有効です

WordPress 予約投稿

WordPress の予約投稿が上手くいきませんでしたが、解決できました 🙂

ただし cron と wget が使える事が前提条件となります。

例えば blog の URL が http://example.com/myblog/ だった場合、
example.com 上で、cron から wget で以下のように wp-cron.php に
アクセスすると上手くいくようです。

* * * * * wget http://localhost/myblog/wp-cron.php 
--header="Host: example.com"

私は WordPress MU で全てのブログで予約投稿ができるように
以下のようなスクリプトを作成して cron から実行しています。
(WordPress MU 2.8.4a で実際に使っています)

#!/bin/sh
MYSQL=/usr/bin/mysql
OUT=/tmp/wp-cron.out
paths=`$MYSQL --user=DBユーザ名 --password=DBパスワード -D DB名 
-e "SELECT path FROM wp_blogs" -N -s`
 
for path in ${paths[0]}
do
wget http://localhost${path}wp-cron.php 
--header="Host: example.com" 
-O $OUT
rm -f $OUT
done

上記スクリプトに実行権(chmod +x)をつけて cron から実行しています。

* * * * * /usr/local/path/to/wpcron.sh

今のところ問題なさそうです 🙂

※ ❗ スクリプトに MySQL のパスワードなどが記述されているので注意してください
※ ❗ スクリプトは自分だけ、または管理者だけが読めるようにしましょう :mrgreen: