SQL Server の日付フィールドを php で select して
MySQL へ insert する処理を行ったら
日付が 00-00-00 00:00:00 になってしまった ❗
どうも select するときにフォーマットを指定する必要があったようです。
SELECT CONVERT(VARCHAR, DATE, 120) FROM hogetable; |
めんどいですねー
SQL Server の日付フィールドを php で select して
MySQL へ insert する処理を行ったら
日付が 00-00-00 00:00:00 になってしまった ❗
どうも select するときにフォーマットを指定する必要があったようです。
SELECT CONVERT(VARCHAR, DATE, 120) FROM hogetable; |
めんどいですねー
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 のオプションがどのように影響するのか分からなかったのでソースからビルドする事にしました。
オプションは大体見れば分かると思いますが、 😎
既に 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 も問題なく稼働しているようなので、セットアップはここまででひとまず完了です。
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 |
この変更を反映させます。
この時、起動オプションに –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 |
(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)(再起動完了) |
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 が増えて使用率が減りました 🙂
今後も使用量は増え続けるのでこの作業は繰り返し行う必要がありそうです
ざっくりとセットアップの内容をメモします。
3.4.8 というバージョンをダウンロードしました。
ファイル名はopenpne-OpenPNE3-OpenPNE-3.4.8-0-gb9d705e.zip
/usr/local/apache2/OpenPNE3 に解凍しました。
$ cd /usr/local/apache2/OpenPNE3 $ cp config/OpenPNE.yml.sample config/OpenPNE.yml $ vi config/OpenPNE.yml |
base_url と mail_envelope_from を環境に合わせたモノに変更しました。
特に変更せずデフォルトのままです。
$ cp config/ProjectConfiguration.class.php.sample config/ProjectConfiguration.class.php |
openpne3db という名前で作成しました。
mysql> CREATE DATABASE open3db DEFAULT CHARACTER SET utf8; |
そして、openpne ユーザがパスワード openpne で接続できるようにユーザを作成しました。
mysql> GRANT ALL ON *.openpne3db TO 'openpne'@'localhost' IDENTIFIED BY 'openpne'; |
対話的形式でデータベースへの接続情報を設定をした後、色々と表示されますが、
意味が分かりませんでした。
$ ./symfony openpne:install |
公開ディレクトリを /usr/local/apache2/htdocs として説明します。
/sns というサブディレクトリに公開します。
サーバ名を www.example.com とすると、URL は http://www.example.com/sns/ になります。
$ cd /usr/local/apache2/htdocs $ ln -s ../OpenPNE3/web sns |
RewriteBase 変更
$ vi web/.htaccess |
RewriteBase を /sns/ に変更しました。
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 |
簡単に参照先を変更できるかと思ったのですが、調べても分からなかったのでシンボリックリンクで対応してしまいました。
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 の予約投稿が上手くいきませんでしたが、解決できました 🙂
ただし 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 のパスワードなどが記述されているので注意してください
※ ❗ スクリプトは自分だけ、または管理者だけが読めるようにしましょう
mysql> SHOW CREATE DATABASE exampledb; |
mysql> SHOW FULL COLUMNS FROM exampletbl; |