2014/11/24(月)FreeBSD における mysql のアップデート手順
2017/10/12 17:50
情報量が多いので何とかなっているというところでしょうか。
1)先ずは、バックアップ。 これは常識的に行う作業です。
# mysqldump -A -u user -p > dumpfile.sql
これで、全てのデータベースクラスタを SQL にてダンプ出力します。
SQL でないと、バージョンが異なるアップデートの際、データを元に戻せません。
2)FreeBSD ports にてインストール(例示は mysql 5.5 の場合)
# cd /usr/ports/databases/mysql55-server
# make BATCH=yes WITH_CHARSET=utf8 WITH_XCHARSET=all install clean
# rehash
3)データベースクラスタの設置場所をこしらえる
# mkdir /home/db/mysql
# chown -R mysql:mysql /home/db/mysql
4)設定情報の雛形をコピー
# cp /usr/local/share/mysql/my-medium.cnf /home/db/mysql/my.cnf
# chown mysql:mysql /home/db/mysql/my.cnf
# chmod 644 /home/db/mysql/my.cnf
5)サーバ起動時に自動起動するようにする
# vi /etc/rc.conf
〔/etc/rc.conf に下記を追記〕
mysql_enable="YES"
mysql_dbdir="/home/db/mysql"
6)mysql の設定
# vi /home/db/mysql/my.cnf
〔/home/db/mysql/my.cnf の [mysqld]セクションに追記〕
skip-character-set-client-handshake
character-set-server = utf8
datadir = /home/db/mysql
〔/home/db/mysql/my.cnf の [client]セクションに追記〕
default-character-set = utf8
7)mysql サーバを起動
# /usr/local/etc/rc.d/mysql-server start
Starting mysql.
8)データベースの初期設定
# mysql -u root
mysql> SET PASSWORD FOR root@localhost=password('mysql_root_pass');
(mysql root ユーザのパスワード設定。任意の文字列を指定。)
mysql> SELECT user,host FROM mysql.user;
+------+---------------------+
| user | host |
+------+---------------------+
| root | 127.0.0.1 |
| root | ::1 |
| | hoge.basekernel.jp |
| root | hoge.basekernel.jp |
| | localhost |
| root | localhost |
+------+---------------------+
6 rows in set (0.00 sec)
#上から3つめと上から5つ目は、空ユーザで、誰でもログインできてしまうため、削除。
mysql> DELETE FROM mysql.user WHERE user='';
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
+--------------------+
3 rows in set (0.00 sec)
#データベース test を削除。
mysql> DROP DATABASE test;
mysql> EXIT;
Bye.
9)リストア
# mysql -u user -p < dumpfile.sql
Enter password: mysql_root_pass
(パスワードを入力)
#以下は任意
mysql> CREATE DATABASE db_name;
mysql> GRANT ALTER,CREATE,DELETE,DROP,INSERT,LOCK TABLES,SELECT,UPDATE ON db_name.* TO user_name@localhost IDENTIFIED BY 'user_pass';
mysql> EXIT;
Bye.
○ ログイン
# mysql -u root -p
Enter password: mysql_root_pass
(パスワードを入力)
○ バージョン表示
# mysql --version
mysql Ver 14.14 Distrib 5.5.40, for FreeBSD9.3 (i386) using 6.3
○ ユーザ削除
mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'user_name'@'localhost';
mysql> DELETE FROM mysql.user WHERE user='user_name' and host='localhost';
〔参考〕FreeBSD サーバ構築マニュアル MySQL5 インストール
freebsd.server-manual.com
〔参考〕FreeBSD 9.1-RELEASEにMySQL 5.5をインストール
クソゲ~製作所
2014/11/23(日)FreeBSD における PHP 5.5.x の mysql サポート
2017/10/12 17:48
PHP 5.5系にて mysql アクセスのサポートをしようと構築をかけると、
構築の最終段階(本当に構築の最終工程)で、
ext/mysqlnd/.libs/mysqlnd_ps_codec.o: In function `ps_fetch_float': ext/mysqlnd/mysqlnd_ps_codec.c:233: undefined reference to `__extendsfsd' ext/mysqlnd/mysqlnd_ps_codec.c:233: undefined reference to `__extendsddf'のようなエラーが出て構築できない現象に嵌りました。
FreeBSD 10.x系 ではこのようなエラーは出ません。
おそらく gcc コンパイラ と clang コンパイラの違いなのでしょう。
PHP 5.5 におけるmysql サポートは複雑で、先ず、
・ mysql インタフェース
・ mysqli インタフェース
・ PDO-mysql インタフェース
の3種類あります。
このうち、最初の mysql インタフェースは古いので、利用は非推奨。
将来のバージョンでは削除されることが決まっています。
mysqli は拡張 mysql インタフェース、 PDO-mysql は Perl で言うところの DBI インタフェースみたいなものです。
今どきの PHP アプリケーションは、mysqli と PDO-mysql を使うように強い推奨がなされている状態です。
さらに、この内部モジュールは、各インタフェース専用以外に3つを統合した mysqlnd というものがあり、構築オプションによっては mysqlnd をインストールするようになっている感じです。全部で mysql サポートがモジュール4つあるらしく、何故こういう面倒なことになっているのか、利用者には理解不能です。
どうやら、configure で指定する構築オプションの組み合わせで mysqlnd を使う場合に、上記のエラーとなるようです。
今のところ、FreeBSD 9.x 以下のバージョンで PHP 5.5 を mysql 対応にする場合、 configure のオプションは、必ず以下をつけるといいです。
--with-mysql=/usr/local --with-pdo-mysql=/usr/local --with-mysqli=/usr/local/bin/mysql_config --disable-mysqlnd --with-mysql-sock=/tmp/mysql.sockポイントは --disable-mysqlnd でmysqlnd を外す指定です。
環境によっては mysql の unix ソケットが検出できず、この場合も mysqlnd を使うように強制されてしまうようなので、明示的に指定します。
筆者は PHP も mysql も使いません。昔からこの類の変更が多いからです。
アプリケーションの寿命が長い perl と postgreSQL を多用しており、長い目でのメンテナンス工数の面からお勧めしています。
2014/10/24(金)xml 関係のライブラリを最新にしたら・・・
2014/07/28(月)FreeBSD9/FreeBSD10 - オンラインマニュアルをUTF-8 で日本語化
2017/10/12 17:41
% man lsとかすると、以下のように表示されます。
しかしながら、筆者は日本人ですから、出来れば日本語で使いたいものです。
FreeBSD については、以下のところで継続的に翻訳・メンテナンスをして下さっている方がおります。→ http://www.koganemaru.co.jp/ 〔小金丸コンピュータエンジニアリングサービス〕
当方もお世話になっています。
ただ、FreeBSD 9/FreeBSD 10 で UTF-8 環境の場合、上記サイトに記されている方法では、上手く日本語マニュアルが表示できません。
自分メモとして以下に手順を残しておきます:
1)該当バージョンのマニュアルをインストール
〔FreeBSD 9.3 の場合〕 % pkg add ftp://ftp.koganemaru.co.jp/pub/jman9/ja-man-doc-9.3.20140726.txz 〔FreeBSD 10.0 の場合〕 % pkg add ftp://ftp.koganemaru.co.jp/pub/jman10/ja-man-doc-10.0.20140522.txz2)小金丸さん作成のマニュアルは、EUC-JP コードでインストールされるため、
これを手作業で UTF-8 に変換・保存する。]
#あらかじめ、nkf (portsカテゴリ:japanese)を インストールしておく必要があります。
〔FreeBSD 9.3/FreeBSD 10.0 共通〕 % cd /usr/share/man % cp -r ja ja_JP.UTF-8 % find ja_JP.UTF-8 -name '*.gz' -exec gunzip '{}' ';' % find ja_JP.UTF-8 -name '*.[0-9]' -exec nkf -Ew --overwrite '{}' ';' % find ja_JP.UTF-8 -name '*.[0-9]' -exec gzip '{}' ';' % nkf -Ew --overwrite ja_JP.UTF-8/whatis3)新しい groff を、ports でインストールします。
〔FreeBSD 9.3/FreeBSD 10.0 共通〕 % cd /usr/ports/textproc/groff (groff 1.22 では、インストールの最終段階でエラーが出るので、 ファイル plist 内の img を含む行を、コンパイル前に削除する必要あり) % make install % make clean4)/usr/bin/man を変更します。
FreeBSD 9.0 からは、man コマンドが 伝統的な shスクリプトで構成されているようです。
〔FreeBSD 9.3/FreeBSD 10.0 共通〕 333c333 < NROFF="$NROFF -T$nroff_dev" --- > NROFF="$NROFF -D$nroff_dev -T$nroff_dev" 936c936 < NROFF='groff -S -P-h -Wall -mtty-char -man' --- > NROFF='/usr/local/bin/groff -S -P-h -Wall -mtty-char -man' 940c940 < TROFF='groff -S -man' --- > TROFF='/usr/local/bin/groff -S -man'ここで、再び、
% man lsとして、以下のように日本語になっていればインストール完了です。
(参考:http://d.hatena.ne.jp/akira_you/20120316/p1
〔FreeBSD 9.0RELASEで日本語manを使う-akira_youの私見〕)
2014/06/20(金)再度 FreeBSD10.0 で clang 環境構築検証(3) ~ mod_perl2.0.9 は Apache 2.4対応
2017/10/12 17:31
つい最近の 6/12 に Apache2.4 対応のコードが本流にまとめられたようなので、早速入手してみました。正式提供ではないので、開発元から、subversion で取得するしか入手方法がありません。
〔入手方法〕
svn checkout https://svn.apache.org/repos/asf/perl/modperl/trunk ローカルdir問題なく、 Apache 2.4.9 に組み込まれ、動作するようです。
# Windows 対応でリリースが1年以上遅延している模様・・・
mod_perl 2.0.9-dev は、ソースコードの修正が2箇所必要です。
○1つ目
ERROR from evaluation of Apache-Reload/Makefile.PL: Use of uninitialized value in substitution (s///) at Apache-Test/lib/Apache/TestRun.pm line 1100.このエラーはかなり前から出ていて、一向に対処されないのですが、
以下のようないつもの暫定対処で対応です。
(Apache-Test/lib/Apache/TestRun.pm 1100行目付近) while (my($k, $v) = each %args) { + if (defined $v) { $v =~ s/\|/\\|/g; $body .= "\n\$Apache::TestConfig::Argv{'$k'} = q|$v|;\n"; + } }(2013/09/26(木)の拙作記事 Apache 2.4.6 + mod_perl2 でも紹介済み)
○2つ目
コンパイルが順調に進んでいるかのように思えるところで、最終段階(オブジェクトファイルリンク処理)で、
/usr/local/src/mod_perl-2.0.9-dev/src/modules/perl/mod_perl.a(mod_perl.o): In function `modperl_startup': mod_perl.c:(.text+0xe6): undefined reference to `modperl_io_apache_init' /usr/local/src/mod_perl-2.0.9-dev/src/modules/perl/modperl_io_apache.h:37:16: warning: inline function 'modperl_io_apache_init' is not defined [-Wundefined-inline] MP_INLINE void modperl_io_apache_init(pTHX); ^ mod_perl.c:252:5: note: used here modperl_io_apache_init(aTHX);のようなメッセージがかなり大量に出て、エラー終了してしまいます。
これは clang 環境固有のもので、gcc 環境では出ません。
原因はやや難しい話ですが、 __inline__ 属性を与えているC言語関数の取り扱いの問題になります。
__inline__ 属性を与えた場合、 clang ではコンパイル時の最適化処理途上でその属性を適用しないと決めたときに、外部シンボルとして登録しない仕様のため、リンクすると「シンボルが見当たりません」的な不可 解なエラーになるということです。
こちらの後半のほうに簡単な説明があります → [C++11対応記念] clang/LLVMのインストールとGMPを使って円周率ベンチ。 〔ぞうさんの何でもノート〕
具体的には、__inline__ 属性を外してしまうことで対処してしまいます。
(src/modules/perl/modperl_common_util.h 22行目付近) - #ifdef MP_DEBUG + // #ifdef MP_DEBUG #define MP_INLINE - #else - #define MP_INLINE APR_INLINE - #endif + // #else + // #define MP_INLINE APR_INLINE + // #endifこの件は、バグ報告したほうがいいかも・・・ですね。
当方は英語がダメダメなので、他力本願で誰かお願い・・・というところですが。。
これらの対処を行ってから、コンパイルを行うことで、問題なく Apache 2.4.9 + mod_perl 2.0.9-dev 環境が構築できます。
2014/06/19(木)再度 FreeBSD10.0 で clang 環境構築検証(2)
2017/10/12 17:28
『共有ライブラリ .so が作成されない』
という現象になります。
原因は、FreeBSD 10.x を configure スクリプト側で FreeBSD 1.x と認識することにあります。
こちらがズバリです → FreeBSD 10-Releaseで共有ライブラリが生成されない問題 解決
PHP 5.5.13 の場合は、上記で示しているとおり、
sed -e 's/freebsd1\*/freebsd1\.\*/g' -i .bak aclocal.m4 configure /build/libtool.m4として、FreeBSD 10.x を FreeBSD 1.x として取り違えないようにすることでこの問題はあっさり回避できます。
また、OpenLDAP 2.4.39 の場合は、
sed -e 's/freebsd1\*/freebsd1\.\*/g' -i .bak aclocal.m4 build/openldap.m4 sed -e 's/freebsd1\*/freebsd1\.\*/g' -i .bak contrib/ldapc++/aclocal.m4とやれば、同様にこの問題は回避されます。
ですが、これは gcc 環境では、どういうわけか出たり出なかったりで、正直今までよく判っていなかったというのが真相。。orz
前回は、PHP5.5 の .so ファイルを手動で作ったし、、
PHP 5.5.13 の場合、これでも いざ configure を実行すると、
checking for DB4 major version... Header contains different version
と出て、途中で止まってしまう場合がある。
これは、FreeBSD ports にて BerkeleyDB をインストールした場合に、ディレクトリ構成が、configure スクリプトが意図していない構造であるのが原因です。
この問題を解決するために、configure スクリプトに下記の追加を行います。
(BerkeleyDB 4.8.30 を ports でインストールした場合・31,287行目付近~) elif test -f "$i/include/db4.8/db.h"; then THIS_PREFIX=$i THIS_INCLUDE=$i/include/db4.8/db.h break + elif test -f "$i/include/db48/db.h"; then + THIS_PREFIX=$i + THIS_INCLUDE=$i/include/db48/db.h + break elif test -f "$i/include/db4.7/db.h"; then THIS_PREFIX=$i THIS_INCLUDE=$i/include/db4.7/db.h break
これらの対策をコンパイル前に講じることが、現時点でのリリースバージョンでは必要です。
2014/06/18(水)再度 FreeBSD10.0 で clang 環境構築検証(1)
2017/10/12 17:27
したがって、検証の質としては低いのです。
ということで、今度は FreeBSD 10.0 をクリーンインストールしてやってみました。
今回から、BerkeleyDB 4.8.30 をPorts から入れることにしました。
特に問題が無かった(従来と同じ手順にて構築出来る)のは
・SpamAssassin 3.4.0
・ProFTPD 1.3.5
・PostgreSQL 9.3.4
BerkeleyDB 4.8.30 を Ports からインストールしたために手順の変更が必要なのは
・Courier-Authentication Library 0.66.1
・Maildrop 2.7.1
・dovecot 2.2.13
構築環境が FreeBSD10 に対応していないため、ソースコードなどの変更が必要なのは
・OpenLDAP 2.4.39
・mod_perl 2.0.9-dev
・Apache 2.4.9
・PHP 5.5.13
・postfix 2.11.1
といった状況になりました。
FreeBSD10 にて、BerkelayDB をports からインストールした場合、そのディレクトリ構成が標準と異なりますので、Ports以外でアプリケーションをソースコードから構築する際、環境変数でその旨をコンパイラに教 え込む必要があります。
具体的には、アプリケーションのうち、ソースコードから構築する際、configure スクリプトを最初に実行させるタイプのものは、環境変数 CPPFLAGS に include ファイルパスを列挙する必要があります。こんな感じです:
setenv CPPFLAGS '-I/usr/local/include -I/usr/local/include/db48 -I/usr/include'また、Courier-Authentication Library 0.66.1 と maildrop 2.7.1 は、環境変数 LIBS に -lssl を指定する必要があります。こんな感じ:
setenv LIBS -lsslこうしないと、どういうわけか、SSL ライブラリがまともにリンクできず、コンパイルが見かけ上成功してように見えても実際は失敗していた、という羽目になります。
2014/02/17(月)FreeBSD 9.1/9.2 における ports/packages 管理に異変
2017/10/12 17:08
当方管轄で FreeBSD 10 を突っ込むのは 2台だけにして、残りは FreeBSD 9.1/8.4 を従来どおり稼動させています。
ですが、ports にてアプリケーションソフトウェアの更新をしていると、
/!\ WARNING /!\ pkg_install EOL is scheduled for 2014-09-01. Please consider migrating to pkgng http://blogs.freebsdish.org/portmgr/2014/02/03/time-to-bid-farewell-to-the-old-pkg_-tools/ If you do not want to see this message again set NO_WARNING_PKG_INSTALL_EOL=yes in your make.confというメッセージが時折出てくるようになりました。
要するに
・ pkg_install ユーティリティは 2014/09/01 には使えなくなる予定です。
・ だから pkgng に切り替えることを検討して欲しいです。
・ このメッセージがウザい場合は、貴方のマシンの /etc/make.conf に
NO_WARNING_PKG_INSTALL_EOL=yes という設定を追加してください。
というメッセージです。
FreeBSD 9.1/9.2 にて pkgng に切り替えるには、
まず、
/usr/sbin/pkgを、コマンドラインで実行し、更に、
rehash pkg2ngと順番にコマンドラインで実行して、管理データを変換し、最後に /etc/make.conf に
WITH_PKGNG=yesを追加することで、使用できます。
筆者は、/etc/make.conf への設定追加を忘れて、しばし嵌りました・・orz
(引用:http://www.freebsd.org/doc/ja/books/handbook/pkgng-intro.html 〔5.5. pkgng によるバイナリ package の管理〕)
2014/02/15(土)FreeBSD 10 上で Apache 2.4.7 やPHP は動作しない?
2017/10/12 17:06
具体的には Apache 2.4.7 + mod_perl 2.0.8(スタティックリンク) + PHP 5.5.9
という組み合わせ。
Apache 2.4 において、mod_perl は公式には使えないですが、Apache 2.4 用にパッチを充てているため、使用可能にしております。
FreeBSD 10.0R の openssl バージョンは 1.0.1e が組み込まれています。
蛇足ですが、openssl のこのバージョンではブラウザ側さえ対応すれば、ネームベースのバーチャルセキュアSSLサーバが提供できるようになります。(普及の足を引っ張っているのは IE なわけだが・・)
まず、clang 環境で構築すると、mod_perl ライブラリをリンクするところで、原因不明の「シンボルが未定義っす。。」みたいなメッセージをかなり大量に吐いてコケます。つまり、「使えそうに無い」のです。
Apache 2.4.7 単体、あるいは動的リンクだと clang 環境でも構築可能かもしれませんが、こちらでは未検証です。
ならば、gcc 環境を強制すればいいのですが、環境変数 CC を gcc に設定するだけでは駄目で、mod_perl 側の Makefile をコンパイル前に書き換える必要があります。
mod_perl のトップディレクトリにて、
perl -pi -e 's/CC = cc/CC = gcc/' Makefile perl -pi -e 's/CC = cc/CC = gcc/' */Makefile perl -pi -e 's/CC = cc/CC = gcc/' */*/Makefile perl -pi -e 's/CC = cc/CC = gcc/' */*/*/Makefile perl -pi -e 's/LD = cc/LD = gcc/' */Makefile perl -pi -e 's/LD = cc/LD = gcc/' */*/Makefile perl -pi -e 's/LD = cc/LD = gcc/' */*/*/Makefile perl -pi -e 's/\tcc \-E/\tgcc \-E/' Makefile perl -pi -e 's/\tcc \-E/\tgcc \-E/' */Makefile perl -pi -e 's/\tcc \-E/\tgcc \-E/' */*/Makefile perl -pi -e 's/\tcc \-E/\tgcc \-E/' */*/*/Makefileのようにして、コンパイラ gcc 使用を強制させる必要があります。
(このままでは、デフォルトコンパイラ clang 使用が強制されるため)
ところがこのようにして構築しても、Apache 2.4.7 + mod_perl を起動させても、
表示はハングしてしまい、まともに使えません。
Apache 2.4.6 まで使えていた mod_perl の Apache 2.4 パッチが利用できない状況になったのかもしれません。
Apache 2.4.6 であれば、上記の手法にて FreeBSD 10 上で運用できます。
もうひとつの問題は、PHP 5.5.9。
どういうわけか libphp5.so が作成されません。
configure でも shered Library Support は no とされてしまいます。。
原因は判らないが、構築環境の問題であることは確か。
下記ページを参考に、手動で .so ファイルを作成しました。
Permanent Link to How to compile PHP5 on 64bit Linux (CentOS) [hiro345]
ところで、提起ページでいう「かなり長いコマンド」は、実に20000文字近い長さがあり、通常環境では、上手くいきません。こんなときは、バイナリエディトするのです。
unix 環境では、hexedit とかあるのですが、インストールが面倒なので以下で示すようにして、「かなり長いコマンド」をファイルにして、編集しました。こんな感じです:
vimでバイナリを表示し、値を変更したい [rdera ブログ]
これで、こんな感じで構築できました。
2014/02/15(土)FreeBSD10 でアプリケーションを構築してみる
2017/10/12 17:04
この方法だと、構築に要する時間はかかりますが、旧環境は温存できます。
それはさておき、FreeBSD 10 はどんなものか、を把握するために、ちょっとやってみたところが・・・
正直、嵌ったので・・・orz
情報で得る内容と、実際に実務作業して得る内容は概して異なることが多いので、こうして経験することが重要なのです。
まず、ports の内部管理方法が変わり、portupgrade コマンドでアプリケーションの更新をしようとすると、「pkgng をインストールしろ」みたいなメッセージが出て怒られてしまい、以下のような手順が表示される :
- switch to pkgng: 1) Add WITHOUT_PKGNG to /etc/make.conf 2) Install ports-mgmt/pkg 3) Convert your package database by running pkg2ng 4) Remove WITHOUT_PKGNG from /etc/make.conf提示されたとおりにして、再び portupgrade コマンドでアプリケーションの更新を行うことができました。
portsnap コマンド、portversion コマンドなどは、画面表示が若干変更されていますが、従来どおり使用できます。
気になる(ここからが本題)のが、デフォルトのコンパイラが clang に変わったことによる影響です。
当方では、痒いところに手が届くよう、一部の主要ソフトウェアをソースコードから構築しています。それらソフトウェアに対する影響です。
結果、これに嵌りました・・・ 以下、こちらで判明した内容です。
ただ、十分な確認はしていません。
筆者の通常環境である、環境変数 CC を未定義にしておいたときの状態です。
・Postfix : clang 環境でも問題無さそう
・dovecot : clang 環境でも問題無さそう
・PostgreSQL : configure が gcc を強制する。
・OpenLDAP : clang 環境でも問題無さそう
・Courier-Authlib: configure が gcc を強制する。
・Maildrop : configure が gcc を強制する。
・ClamAV : configure が gcc を強制する。
・Apache 2.4 : clang 環境では構築不可。 環境変数 CC で gcc を強制要。
・PHP 5.5 : clang 環境では構築不可。 環境変数 CC で gcc を強制要。
・mod_perl : clang 環境では構築不可。 環境変数 CC で gcc を強制要。
・rsyncd : configure が gcc を強制する。
・proftpd : configure が gcc を強制する。
筆者の環境では、Web サーバにて Apache 2.4 + mod_perl + PHP 5.5 という組み合わせと、 Apache 2.2 + mod_perl + PHP 5.4 という組み合わせで運用しています。
実は、この組み合わせでも嵌ったのですが、別記事にします。