<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Groove Labo &#187; MySQL</title>
	<atom:link href="http://labo.opengroove.com/blog/category/mysql/feed/" rel="self" type="application/rss+xml" />
	<link>http://labo.opengroove.com/blog</link>
	<description>株式会社オープングルーヴの開発者のブログ</description>
	<lastBuildDate>Tue, 28 Sep 2010 06:09:57 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
		<item>
		<title>CentOS 5.3 で Trac 0.11 + MySQL を実行すると TypeError になる</title>
		<link>http://labo.opengroove.com/blog/2009/07/10/typeerror-on-trac-mysql-centos5/</link>
		<comments>http://labo.opengroove.com/blog/2009/07/10/typeerror-on-trac-mysql-centos5/#comments</comments>
		<pubDate>Fri, 10 Jul 2009 13:31:13 +0000</pubDate>
		<dc:creator>omae</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Trac]]></category>

		<guid isPermaLink="false">http://labo.opengroove.com/blog/?p=122</guid>
		<description><![CDATA[omae です。 CentOS 5.3 で Trac 0.11 を MySQL を使って実行しようとしたら、以下のようなエラーでしばらく悩んでしまいました。 Traceback (most recent call last): File "/usr/lib/python2.4/site-packages/Trac-0.11.4-py2.4.egg/trac/web/main.py", line 467, in _dispatch_request File "/usr/lib/python2.4/site-packages/Trac-0.11.4-py2.4.egg/trac/web/main.py", line 234, in dispatch File "/usr/lib/python2.4/site-packages/Trac-0.11.4-py2.4.egg/trac/web/chrome.py", line 761, in render_template File "/usr/lib/python2.4/site-packages/Trac-0.11.4-py2.4.egg/trac/web/api.py", line 199, in __getattr__ File "/usr/lib/python2.4/site-packages/Trac-0.11.4-py2.4.egg/trac/util/compat.py", line 72, in newfunc File "/usr/lib/python2.4/site-packages/Trac-0.11.4-py2.4.egg/trac/web/chrome.py", line 516, in prepare_request File "/usr/lib/python2.4/site-packages/Trac-0.11.4-py2.4.egg/trac/ticket/web_ui.py", line 171, [...]]]></description>
			<content:encoded><![CDATA[<p>omae です。
CentOS 5.3 で Trac 0.11 を MySQL を使って実行しようとしたら、以下のようなエラーでしばらく悩んでしまいました。</p>

<pre><code>Traceback (most recent call last):
  File "/usr/lib/python2.4/site-packages/Trac-0.11.4-py2.4.egg/trac/web/main.py", line 467, in _dispatch_request
  File "/usr/lib/python2.4/site-packages/Trac-0.11.4-py2.4.egg/trac/web/main.py", line 234, in dispatch
  File "/usr/lib/python2.4/site-packages/Trac-0.11.4-py2.4.egg/trac/web/chrome.py", line 761, in render_template
  File "/usr/lib/python2.4/site-packages/Trac-0.11.4-py2.4.egg/trac/web/api.py", line 199, in __getattr__
  File "/usr/lib/python2.4/site-packages/Trac-0.11.4-py2.4.egg/trac/util/compat.py", line 72, in newfunc
  File "/usr/lib/python2.4/site-packages/Trac-0.11.4-py2.4.egg/trac/web/chrome.py", line 516, in prepare_request
  File "/usr/lib/python2.4/site-packages/Trac-0.11.4-py2.4.egg/trac/ticket/web_ui.py", line 171, in get_navigation_items
  File "/usr/lib/python2.4/site-packages/Trac-0.11.4-py2.4.egg/trac/perm.py", line 526, in has_permission
  File "/usr/lib/python2.4/site-packages/Trac-0.11.4-py2.4.egg/trac/perm.py", line 539, in _has_permission
  File "/usr/lib/python2.4/site-packages/Trac-0.11.4-py2.4.egg/trac/perm.py", line 427, in check_permission
  File "/usr/lib/python2.4/site-packages/Trac-0.11.4-py2.4.egg/trac/perm.py", line 283, in check_permission
  File "/usr/lib/python2.4/site-packages/Trac-0.11.4-py2.4.egg/trac/perm.py", line 359, in get_user_permissions
  File "/usr/lib/python2.4/site-packages/Trac-0.11.4-py2.4.egg/trac/perm.py", line 183, in get_user_permissions
TypeError: unhashable type
</code></pre>

<p>よくよく確認すると4月末ぐらいも同じエラーでしばらく悩んだみたいです。
今回はここにメモを残すことに。</p>

<p>まずはこのエラーで検索。検索するとすぐに trac.edgewall.org にこのエラーそのものが ticket として作成されていることが解りました。</p>

<p><a href="http://trac.edgewall.org/ticket/7481">#7481 (Project not work affter successfull initenv)</a>
このチケットによれば「MySQL-python を 1.2.2 にアップデートしろ」とあります。</p>

<p>いま入っている MySQL-python を確認すると MySQL-python-1.2.1-1.i386 でした。
CentOS のパッケージをそのままインストールしているだけなのですが、これは修正されないのかなぁ…。
それはともかく 1.2.2 に対応した rpm を自分で作って入れ替えることにしました。</p>

<p>まず MySQL-python の SRPM をとって来る為に次のコマンドを実行。</p>

<pre><code># yumdownloader --source MySQL-python
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: www.ftp.ne.jp
 * updates: www.ftp.ne.jp
 * addons: www.ftp.ne.jp
 * extras: www.ftp.ne.jp
extras-source                                            |  951 B     00:00
updates-source                                           |  951 B     00:00
base                                                     | 1.1 kB     00:00
updates                                                  |  951 B     00:00
base-source                                              |  951 B     00:00
addons                                                   |  951 B     00:00
extras                                                   | 1.1 kB     00:00
MySQL-python-1.2.1-1.src.rpm                             |  71 kB     00:00
</code></pre>

<p>srpm をインストールしてみます。</p>

<pre><code># rpm -ivv MySQL-python-1.2.1-1.src.rpm
D: ============== MySQL-python-1.2.1-1.src.rpm
D: Expected size:        72317 = lead(96)+sigs(344)+pad(0)+data(71877)
D:   Actual size:        72317
D: opening  db environment /var/lib/rpm/Packages joinenv
D: opening  db index       /var/lib/rpm/Packages rdonly mode=0x0
D: locked   db index       /var/lib/rpm/Packages
D: opening  db index       /var/lib/rpm/Pubkeys rdonly mode=0x0
D:  read h#     346 Header sanity check: OK
D: ========== DSA pubkey id a8a447dc e8562897 (h#346)
D: MySQL-python-1.2.1-1.src.rpm: Header V3 DSA signature: OK, key ID e8562897
D:      added source package [0]
D: found 1 source and 0 binary packages
D: Expected size:        72317 = lead(96)+sigs(344)+pad(0)+data(71877)
D:   Actual size:        72317
D: InstallSourcePackage: Header V3 DSA signature: OK, key ID e8562897
MySQL-python-1.2.1-1
D: ========== Directories not explicitly included in package:
D:          0 /usr/src/redhat/SOURCES/
D:          1 /usr/src/redhat/SPECS/
D: ==========
D: fini      100664  1 ( 500, 500)     64628 /usr/src/redhat/SOURCES/MySQL-python-1.2.1.tar.gz;4a573e54
D: fini      100664  1 ( 500, 500)      4987 /usr/src/redhat/SPECS/MySQL-python.spec;4a573e54
GZDIO:       9 reads,    70004 total bytes in 0.000573 secs
D: closed   db index       /var/lib/rpm/Pubkeys
D: closed   db index       /var/lib/rpm/Packages
D: closed   db environment /var/lib/rpm/Packages
D: May free Score board((nil))
</code></pre>

<p>次に MySQL-python-1.2.2 を /usr/src/redhat/SOURCES/ に配置します。</p>

<pre><code># wget -nd -P /usr/src/redhat/SOURCES http://downloads.sourceforge.net/sourceforge/mysql-python/MySQL-python-1.2.2.tar.gz
</code></pre>

<p>tarball と spec ファイルしかないので、spec ファイルのバージョン部分だけを変更することにします。変更は以下のような感じ。</p>

<pre><code>--- SPECS/MySQL-python.spec.orig        2009-07-10 22:15:55.000000000 +0900
+++ SPECS/MySQL-python.spec     2009-07-10 22:16:01.000000000 +0900
@@ -3,8 +3,8 @@

 Summary: An interface to MySQL
 Name: MySQL-python
-Version: 1.2.1
-Release: 1
+Version: 1.2.2
+Release: 0.1
 License: GPL
 Group: Development/Libraries
 Source0: http://prdownloads.sourceforge.net/mysql-python/MySQL-python-%{version}.tar.gz
</code></pre>

<p>下準備はそろったので rpmbuild します。</p>

<pre><code># rpmbuild -ba SPECS/MySQL-python.spec
</code></pre>

<p>これで /usr/src/redhat/RPMS/ 配下に rpm が作成されているので、これでアップデートします。</p>

<pre><code># rpm -Uvh RPMS/i386/MySQL-python-1.2.2-0.1.i386.rpm
</code></pre>

<p>これで完了です。無事に Trac が参照できるようになりました。</p>
]]></content:encoded>
			<wfw:commentRss>http://labo.opengroove.com/blog/2009/07/10/typeerror-on-trac-mysql-centos5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQLでバックスラッシュの入った文字列を比較する際の注意点</title>
		<link>http://labo.opengroove.com/blog/2008/12/19/mysql%e3%81%a7%e3%83%90%e3%83%83%e3%82%af%e3%82%b9%e3%83%a9%e3%83%83%e3%82%b7%e3%83%a5%e3%81%ae%e5%85%a5%e3%81%a3%e3%81%9f%e6%96%87%e5%ad%97%e5%88%97%e3%82%92%e6%af%94%e8%bc%83%e3%81%99%e3%82%8b/</link>
		<comments>http://labo.opengroove.com/blog/2008/12/19/mysql%e3%81%a7%e3%83%90%e3%83%83%e3%82%af%e3%82%b9%e3%83%a9%e3%83%83%e3%82%b7%e3%83%a5%e3%81%ae%e5%85%a5%e3%81%a3%e3%81%9f%e6%96%87%e5%ad%97%e5%88%97%e3%82%92%e6%af%94%e8%bc%83%e3%81%99%e3%82%8b/#comments</comments>
		<pubDate>Fri, 19 Dec 2008 08:19:18 +0000</pubDate>
		<dc:creator>sugimoto</dc:creator>
				<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://labo.opengroove.com/blog/index.php/2008/12/19/mysql%e3%81%a7%e3%83%90%e3%83%83%e3%82%af%e3%82%b9%e3%83%a9%e3%83%83%e3%82%b7%e3%83%a5%e3%81%ae%e5%85%a5%e3%81%a3%e3%81%9f%e6%96%87%e5%ad%97%e5%88%97%e3%82%92%e6%af%94%e8%bc%83%e3%81%99%e3%82%8b/</guid>
		<description><![CDATA[MySQLを使っていて、次の2つの文字列比較 = で比較する場合 Likeで比較する場合 でバックスラッシュの入った文字列を検索する場合、で \ の数が違いました。 = で比較の場合、2重にすることでマッチする mysql> select 'foo\\bar' = 'foo\\bar'; +-------------------------+ &#124; 'foo\\bar' = 'foo\\bar' &#124; +-------------------------+ &#124; 1 &#124; +-------------------------+ 1 row in set (0.00 sec) = で比較の場合、4重にするとマッチしない mysql> select 'foo\\bar' = 'foo\\\\bar'; +---------------------------+ &#124; 'foo\\bar' = 'foo\\\\bar' &#124; +---------------------------+ &#124; 0 &#124; +---------------------------+ 1 row in set (0.00 sec) [...]]]></description>
			<content:encoded><![CDATA[<p>MySQLを使っていて、次の2つの文字列比較</p>

<ul>
<li>= で比較する場合</li>
<li>Likeで比較する場合</li>
</ul>

<p>でバックスラッシュの入った文字列を検索する場合、で \ の数が違いました。</p>

<h4>= で比較の場合、2重にすることでマッチする</h4>

<pre>
mysql> select 'foo\\bar' = 'foo\\bar';
+-------------------------+
| 'foo\\bar' = 'foo\\bar' |
+-------------------------+
|                       1 |
+-------------------------+
1 row in set (0.00 sec)
</pre>

<h4>= で比較の場合、4重にするとマッチしない</h4>

<pre>
mysql> select 'foo\\bar' = 'foo\\\\bar';
+---------------------------+
| 'foo\\bar' = 'foo\\\\bar' |
+---------------------------+
|                         0 |
+---------------------------+
1 row in set (0.00 sec)
</pre>

<h4>like で比較の場合、2重だとマッチしない</h4>

<pre>
mysql> select 'foo\\bar' like '%\\%';
+------------------------+
| 'foo\\bar' like '%\\%' |
+------------------------+
|                      0 |
+------------------------+
1 row in set (0.00 sec)
</pre>

<h4>like で比較の場合、4重だとマッチする</h4>

<pre>
mysql> select 'foo\\bar' like '%\\\\%';
+--------------------------+
| 'foo\\bar' like '%\\\\%' |
+--------------------------+
|                        1 |
+--------------------------+
1 row in set (0.02 sec)
</pre>

<p>
<a href="http://dev.mysql.com/doc/refman/5.1/ja/string-comparison-functions.html">MySQLのマニュアル</a>にありました。
</p>

<blockquote>
注記 :MySQL は C エスケープ構文をストリングで使用するため ( 例えば、‘\n’ で改行文字を表現 ) 、LIKE ストリングで使用する ‘\’ はすべて二重にする必要があります。例えば、‘\n’ を検索するには、‘\\n’ と指定します。‘\’ の検索には、‘\\\\’ と指定します。これは、バックスラッシュがパーサによってストリップされ、そしてパターンのマッチが実行された時にもストリップされるため、ひとつのバックスラッシュを残してマッチさせるためです。( 例外 :パターン ストリングの最後では、バックスラッシュは ‘\\’ と指定できます。ストリングの末尾では、エスケープの後に連なるものがないため、バックスラッシュはそのもので独立することができます ) 。
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://labo.opengroove.com/blog/2008/12/19/mysql%e3%81%a7%e3%83%90%e3%83%83%e3%82%af%e3%82%b9%e3%83%a9%e3%83%83%e3%82%b7%e3%83%a5%e3%81%ae%e5%85%a5%e3%81%a3%e3%81%9f%e6%96%87%e5%ad%97%e5%88%97%e3%82%92%e6%af%94%e8%bc%83%e3%81%99%e3%82%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MODxのサイトをテスト環境から本番環境へコピーする</title>
		<link>http://labo.opengroove.com/blog/2008/04/21/modx%e3%81%a7staging%e7%92%b0%e5%a2%83%e3%81%8b%e3%82%89production%e7%92%b0%e5%a2%83%e3%81%b8/</link>
		<comments>http://labo.opengroove.com/blog/2008/04/21/modx%e3%81%a7staging%e7%92%b0%e5%a2%83%e3%81%8b%e3%82%89production%e7%92%b0%e5%a2%83%e3%81%b8/#comments</comments>
		<pubDate>Mon, 21 Apr 2008 01:56:02 +0000</pubDate>
		<dc:creator>sugimoto</dc:creator>
				<category><![CDATA[CMS]]></category>
		<category><![CDATA[MODx]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[rsync]]></category>

		<guid isPermaLink="false">http://labo.opengroove.com/blog/index.php/2008/04/21/modx%e3%81%a7staging%e7%92%b0%e5%a2%83%e3%81%8b%e3%82%89production%e7%92%b0%e5%a2%83%e3%81%b8/</guid>
		<description><![CDATA[OpenGrooveの検索アプライアンスサーバ「zeera document search」の製品サイトはMODx CMSを利用して構築しています。 サイトの更新は 別に用意したテスト環境で更新 更新に問題がないか社内でチェック 本番環境に更新分を反映 という手順でやっているのですが、#3の反映作業は手作業にすると、手間がかかり、反映漏れが出るもとになります。 そこで、ssh, rsync, mysqldumpを使って、#3の手順を自動化し、更新分を確実に反映することにしました。 1. 反映の方法 自動化の方法の概要を簡単に説明すると以下の通りです。 - rsyncでディレクトリの同期 MODx CMSは、 top --- manager +- assets というディレクトリ構造をしていて、assetsにテンプレート,CSS,imageなどが保存されています。 逆にmanagerにはMODxのコアスクリプトと設定ファイルがあります。 そのため、assetsをrsyncで同期することにします。 - データベースの更新 MODx CMSはMySQLでデータを保存しています。 環境依存なデータはsite_settingsテーブルに集約されているため、このテーブル以外をコピーします。 - サーバ間の接続はSSHを使用する 自動化するためにパスフレーズなしの鍵をつくり、自動接続して本番環境にデータを転送します。 2. サーバの設定 自動化のためにテストサーバから本番サーバにSSHで接続するための環境を作ります。 - 鍵の作成 テストサーバで鍵を作成します。 &#62; ssh-keygen -t rsa パスフレーズを聞かれますが、入力せずにリターンキーを押し、パスフレーズなしで作成します。 出来上がった公開鍵は本番サーバに転送し、/home/[user]/.ssh/authorized_keysに入れておきます。 3. データベースの更新の設定 mysqldumpでテスト環境のデータベースをdumpして、本番環境にdumpデータを反映します。 まず、テスト環境のデータをコピーし、本番環境に反映するためのSQL文のファイルを生成するシェルスクリプトを用意します。 [dump_modx_data.sh] #!/bin/bash work_dir=/home/user/xxxxx filename=dumpfile.dump [...]]]></description>
			<content:encoded><![CDATA[<p>
OpenGrooveの検索アプライアンスサーバ「<a href="http://search.opengroove.com/" title="ジーラ・検索サーバー">zeera document search</a>」の製品サイトは<a href="http://modxcms.com/" title="MODx CMS">MODx CMS</a>を利用して構築しています。</p>

<p>サイトの更新は</p>

<ol>
    <li>別に用意したテスト環境で更新</li>

    <li>更新に問題がないか社内でチェック</li>
    <li>本番環境に更新分を反映</li>
</ol>

<p>という手順でやっているのですが、#3の反映作業は手作業にすると、手間がかかり、反映漏れが出るもとになります。</p>

<p>そこで、ssh, rsync, mysqldumpを使って、#3の手順を自動化し、更新分を確実に反映することにしました。</p>

<h3>1. 反映の方法</h3>

<p>自動化の方法の概要を簡単に説明すると以下の通りです。</p>

<h4>- rsyncでディレクトリの同期</h4>

<p>MODx CMSは、</p>

<pre>
   top --- manager
        +- assets</pre>

<p>というディレクトリ構造をしていて、assetsにテンプレート,CSS,imageなどが保存されています。
逆にmanagerにはMODxのコアスクリプトと設定ファイルがあります。
そのため、assetsをrsyncで同期することにします。</p>

<h4>- データベースの更新</h4>

<p>MODx CMSはMySQLでデータを保存しています。
環境依存なデータはsite_settingsテーブルに集約されているため、このテーブル以外をコピーします。</p>

<h4>- サーバ間の接続はSSHを使用する</h4>

<p>自動化するためにパスフレーズなしの鍵をつくり、自動接続して本番環境にデータを転送します。</p>

<h3>2. サーバの設定</h3>

<p>自動化のためにテストサーバから本番サーバにSSHで接続するための環境を作ります。</p>

<h4>- 鍵の作成</h4>

<p>テストサーバで鍵を作成します。</p>

<pre>
&gt; ssh-keygen -t rsa
</pre>

<p>パスフレーズを聞かれますが、入力せずにリターンキーを押し、パスフレーズなしで作成します。
出来上がった公開鍵は本番サーバに転送し、/home/[user]/.ssh/authorized_keysに入れておきます。</p>

<h3>3. データベースの更新の設定</h3>

<p>mysqldumpでテスト環境のデータベースをdumpして、本番環境にdumpデータを反映します。</p>

<p>まず、テスト環境のデータをコピーし、本番環境に反映するためのSQL文のファイルを生成するシェルスクリプトを用意します。</p>

<p>[dump_modx_data.sh]</p>

<pre>
#!/bin/bash
work_dir=/home/user/xxxxx
filename=dumpfile.dump
file_path=$work_dir$filename

echo "" &gt; $file_path

# データを削除するSQL文をファイルに書き込み
echo "TRUNCATE TABLE active_users;" &gt;&gt; $file_path
...site_settings 以外のテーブルについて同じ

# データを INSERT するSQL文をファイルに書き込み
mysqldump -u [user] -p[password] [database] --no-create-info \
        --tables [テーブルを列挙] &gt;&gt; $file_path</pre>

<p>これで、データベース反映用のSQLスクリプトがダンプされます。</p>

<h3>4. データベース反映用のSQLスクリプトを本番サーバで実行する</h3>

<p>次に、先ほどのシェルスクリプトで作成したデータベース反映用のSQLスクリプトを本番サーバで実行します。</p>

<p>[insert_dumpfile.sh]</p>

<pre>
#!/bin/bash
work_dir=/home/user/workdirectory
filename=dumpfile.dump
file_path=$work_dir$filename
#本番サーバで実行するシェルスクリプト
command=remote_commands.sh

#SQLスクリプトを本番サーバにコピー
scp $file_path remoteuser@remoteserver:/temporary/dir/.
#sshでログインしてSQLスクリプトを実行
ssh -l remoteuser remoteserver &lt; $work_dir$command
#作業後に削除
rm -f $file_path</pre>

<p>[remote_commands.sh] &lt; 本番サーバー上で実行されるシェルスクリプト</p>

<pre>
#!/bin/bash
filename=/temporary/dir/dumpfile.dump
mysql -u [user] -p[password] [database] &lt; $filename
rm -f $filename
</pre>

<h3>5. rsync でディレクトリをコピーする</h3>

<p>スタイルシートや、画像ファイルはデータベースには保存されていないので、rsyncでディレクトリの同期をして本番サーバに反映します。assets ディレクトリ全体を同期の対象にします。</p>

<p>[rsync_assets.sh]</p>

<pre>
#!/bin/bash
#rsyncコマンドでassetsディレクトリの同期
#削除されたファイルも反映する
#remoteディレクトリは親ディレクトリを指定する
rsync -a --delete --exclude "cache/docid_*.pageCache.php" /path/to/local remoteserver:/parent/path/to/remote    

</pre>

<h3>6. 反映の実行</h3>

<p>これまでに作成したシェルスクリプトを</p>

<ol>
    <li>dump_modx_data.sh</li>

    <li>insert_dumpfile.sh</li>
    <li>rsync_assets.sh</li>

</ol>

<p>の順に実行すると自動的にテストサーバーのデータが本番サーバーに反映されます。</p>

<p>3つのファイルを一つにまとめて、cronに登録しておけば、毎晩、自動的にテストサーバーのデータが本番サーバーに反映されます。</p>

<ul>
    <li><a href="http://samba.anu.edu.au/rsync/" title="rsync">rsync</a></li>

</ul>
]]></content:encoded>
			<wfw:commentRss>http://labo.opengroove.com/blog/2008/04/21/modx%e3%81%a7staging%e7%92%b0%e5%a2%83%e3%81%8b%e3%82%89production%e7%92%b0%e5%a2%83%e3%81%b8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

