<?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>The Apple Geek &#187; database</title>
	<atom:link href="http://theapplegeek.ru/archives/tag/database/feed" rel="self" type="application/rss+xml" />
	<link>http://theapplegeek.ru</link>
	<description>Чему ты научился сегодня?</description>
	<lastBuildDate>Fri, 30 Jul 2010 13:48:39 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="http://superfeedr.com/hubbub"/>		<item>
		<title>Настройка блога WordPress на Mac OS X. Часть 1, MySQL</title>
		<link>http://theapplegeek.ru/archives/2714</link>
		<comments>http://theapplegeek.ru/archives/2714#comments</comments>
		<pubDate>Mon, 11 Jan 2010 07:04:52 +0000</pubDate>
		<dc:creator>ctrld</dc:creator>
				<category><![CDATA[Статьи]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[hosting]]></category>

		<guid isPermaLink="false">http://theapplegeek.ru/?p=2714</guid>
		<description><![CDATA[Недавно я подключился к провайдеру Интернет по Ethernet, да ещё с постоянным IP-адресом. Сервер, на котором у меня расположен сайт, периодически ведёт себя очень странно, я думаю, что вы могли это заметить. Иногда сервер перестаёт отвечать, я подозреваю вываливание в Kernel Panic (на сервере стоит FreeBSD 6.3). Подозреваю аппаратную проблему, но заменить сервер я пока [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://theapplegeek.ru/wp-content/uploads/2010/01/01_my-thumb1.png" height="84" align="right" width="160" style=" display: inline; float: right; margin: 0 0 10px 10px;" /></p>
<p>Недавно я подключился к провайдеру Интернет по Ethernet, да ещё с постоянным IP-адресом. Сервер, на котором у меня расположен сайт, периодически ведёт себя очень странно, я думаю, что вы могли это заметить. Иногда сервер перестаёт отвечать, я подозреваю вываливание в Kernel Panic (на сервере стоит FreeBSD 6.3). Подозреваю аппаратную проблему, но заменить сервер я пока не могу, а обновить систему до 8.0, или установить Linux можно, но непросто, так как я использую для сайтов <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://ru.wikipedia.org/wiki/FreeBSD_Jail" >jail&#8217;ы</a></noindex>. В итоге я решил временно перенести сайты на MacBook, который у меня используется в виде сервера.</p>
<p>Подъём сервера для хостинга WordPress состоит из нескольких этапов, и я рассмотрю их в серии статей. В этой части я опишу установку MySQL, затем &#8211; настройку web-сервера на базе nginx с использованием PHP в виде Fastcgi (можно было бы использовать и Apache, но мне нужен легковесный и быстрый web-сервер, хорошо работающий под большой нагрузкой). Итак, приступим.</p>
<p>Поставить MySQL под Mac OS X можно несколькими методами. Самый неинтересный для меня &#8211; это <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://www.mamp.info/en/index.html" >MAMP</a></noindex> (готовое решение, включающее MySQL, Apache, PHP с полным набором модулей). Объяснять почему мне это не нравится не буду, и так понятно.</p>
<p><span id="more-2714"></span></p>
<p>Второй &#8211; из бинарного пакета <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://dev.mysql.com/downloads/" >с сайта MySQL</a></noindex> (выбираем версию MySQL 5.1—Generally Available (GA) release for production use). Вот <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://dev.mysql.com/downloads/mysql/5.1.html#macosx-dmg" >более короткий линк</a></noindex> к нужному пакету, я ставлю из package format, Mac OS X 10.5 (x86_64), весь процесс описан <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://dev.mysql.com/doc/refman/5.1/en/mysql-installation-macosx-pkg.html" >в документации</a></noindex>. Во многих случаях этот способ предпочтительный, так как MySQL здесь собран гарантированно нормально. Но есть некоторая сложность в обновлении &#8211; я предполагаю, что автообновлений нет, и придётся устанавливать новые версии вручную.</p>
<p>Третий метод, привычный для большинства системных администраторов Unix &#8211; это использование пакетного менеджера <a href="http://theapplegeek.ru/archives/1011" >MacPorts</a>, мне он нравится из-за предсказуемости обновлений, да и в любом случае мне понадобятся порты для дальнейших шагов по запуску сайта.</p>
<p>Есть, конечно же, и четвёртый метод, заключающийся в компиляции MySQL из исходных текстов с накладыванием различных патчей, оптимизирующих работу MySQL, но я не любитель стиля Gentoo, и мне важнее предсказуемость работы системы и простота обновлений, чем выигрыш производительности на 15%.</p>
<p>Сначала нужно поставить <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://developer.apple.com/technology/xcode.html" >XCode</a></noindex>, в котором находятся средства разработки под Unix, необходимые для компиляции MySQL и других пакетов. Это просто, объяснять не буду.</p>
<p>Потом &#8211; <a href="http://theapplegeek.ru/archives/1011" >MacPorts</a>. <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://distfiles.macports.org/MacPorts/" >Списывается пакет последней версии</a></noindex> под нужную версию Mac OS X, в моём случае MacPorts-1.8.2-10.6-SnowLeopard.dmg, и устанавливается. Сразу же обновим дерево портов:</p>
<pre>
$ . ~/.profile
$ sudo port selfupdate
</pre>
<p>Ставим MySQL Server (на MacBook 2.2 GHz пакет поставился за 22 минуты):</p>
<pre>
$ sudo port install mysql5-server
</pre>
<p>При установке выдалось сообщение о том, как установить файлы базы данных и как запустить mysql. Выполняем:</p>
<pre>
$ sudo -u _mysql mysql_install_db5
$ sudo launchctl load -w /Library/LaunchDaemons/org.macports.mysql5.plist
</pre>
<p>Проверим, что MySQL запустился:</p>
<pre>
$ ps ax | grep mysql | grep -v grep
<small> 2050   ??  Ss     0:00.00 /opt/local/bin/daemondo --label=mysql5 --start-cmd /opt/local/etc/LaunchDaemons/org.macports.mysql5/mysql5.wrapper start ; --stop-cmd /opt/local/etc/LaunchDaemons/org.macports.mysql5/mysql5.wrapper stop ; --restart-cmd /opt/local/etc/LaunchDaemons/org.macports.mysql5/mysql5.wrapper restart ; --pid=none
 2060   ??  S      0:00.02 /bin/sh /opt/local/lib/mysql5/bin/mysqld_safe --datadir=/opt/local/var/db/mysql5 --pid-file=/opt/local/var/db/mysql5/ceiling-cat.local.pid
 2110   ??  S      0:00.07 /opt/local/libexec/mysqld --basedir=/opt/local --datadir=/opt/local/var/db/mysql5 --user=_mysql --log-error=/opt/local/var/db/mysql5/ceiling-cat.local.err --pid-file=/opt/local/var/db/mysql5/ceiling-cat.local.pid</small>
</pre>
<p>Я привык к именам программ вида mysqladmin и mysql, а в каталоге /opt/local/bin описаны симлинки вида mysqladmin5/mysql5. Можно сделать нужные симлинки, но я сделаю универсальнее, прописав путь к нужным утилитам без суффикса &#8220;5&#8243;. Путь после модификации должен быть таков:</p>
<pre>
$ vim ~/.profile
<small>export PATH=/opt/local/lib/mysql5/bin:/opt/local/bin:/opt/local/sbin:$PATH</small>
</pre>
<p>Перечитываем путь с помощью &#8220;source&#8221;:</p>
<pre>
$ . ~/.profile
$ echo $PATH
<small>/opt/local/lib/mysql5/bin:/opt/local/bin:/opt/local/sbin:/opt/local/bin:/opt/local/sbin:/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin</small>
</pre>
<p>Теперь можем привычно запускать утилиты MySQL</p>
<pre>
$ which mysql
<small>/opt/local/lib/mysql5/bin/mysql</small>
</pre>
<p>Проверить, запустился ли MySQL, можно и так:</p>
<pre>
$ mysql
<small>Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.1.42 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql&gt;</small>
</pre>
<p>Сразу же устанавливаем пароль root (этот пароль я сразу же после написания статьи изменю):</p>
<pre>
$ mysqladmin -u root password 'fc97a2060ec0775ed3b6aa011ee27e88'
</pre>
<p>Для того, чтобы не вводить пароль каждый раз, прописываем его в конфиг-файле:</p>
<pre>
$ touch ~/.my.cnf
$ chmod 600 ~/.my.cnf
$ vim ~/.my.cnf
[mysql]
user    =   root
pass    =   fc97a2060ec0775ed3b6aa011ee27e88
</pre>
<p>Обязательно нужно или поменять пароль для доступа через сеть, или удалить записи для хостов &#8220;hostname.local&#8221; и 127.0.0.1. Когда мне понадобится, я создам нужных пользователей, поэтому буду удалять.</p>
<pre>
$ mysql mysql
mysql> select Host, User, Password from user where user = 'root';
<small>+-------------------+------+-------------------------------------------+
| Host              | User | Password                                  |
+-------------------+------+-------------------------------------------+
| localhost         | root | *769F25A82BD5CC256FA4D47499CE6026D89D72E6 |
| ceiling-cat.local | root |                                           |
| 127.0.0.1         | root |                                           |
+-------------------+------+-------------------------------------------+</small>
mysql> delete from user where User = "root" and Host = "127.0.0.1";
Query OK, 1 row affected (0.00 sec)

mysql> delete from user where User = "root" and Host = "ceiling-cat.local";
Query OK, 1 row affected (0.00 sec)

mysql> select Host, User, Password from user where user = 'root';
<small>+-----------+------+-------------------------------------------+
| Host      | User | Password                                  |
+-----------+------+-------------------------------------------+
| localhost | root | *769F25A82BD5CC256FA4D47499CE6026D89D72E6 |
+-----------+------+-------------------------------------------+</small>
</pre>
<p>Можно было бы на этом и закончить, но лучше донастроить MySQL через конфиг-файл /etc/my.cnf. По крайней мере нужно выставить использование по умолчанию UTF8, включить INNODB, ограничить количество коннектов, и включить slow_query_log.</p>
<p>Примеры конфиг-файлов поставляются вместе с MySQL:</p>
<pre>
$ ls -al /opt/local/share/mysql5/mysql/my*cnf
<small>-rw-r--r--  2 root  admin   4851 Jan  7 22:26 /opt/local/share/mysql5/mysql/my-huge.cnf
-rw-r--r--  2 root  admin  20232 Jan  7 22:26 /opt/local/share/mysql5/mysql/my-innodb-heavy-4G.cnf
-rw-r--r--  2 root  admin   4825 Jan  7 22:26 /opt/local/share/mysql5/mysql/my-large.cnf
-rw-r--r--  2 root  admin   4836 Jan  7 22:26 /opt/local/share/mysql5/mysql/my-medium.cnf
-rw-r--r--  2 root  admin   2474 Jan  7 22:26 /opt/local/share/mysql5/mysql/my-small.cnf</small>
</pre>
<p>Меня устраивает конфигурация medium:</p>
<pre>
$ head -5 /opt/local/share/mysql5/mysql/my-medium.cnf
<small># Example MySQL config file for medium systems.
#
# This is for a system with little memory (32M - 64M) where MySQL plays
# an important part, or systems up to 128M where MySQL is used together with
# other programs (such as a web server)</small>
</pre>
<p>Копирую её в /etc/my.cnf:</p>
<pre>
$ sudo cp /opt/local/share/mysql5/mysql/my-medium.cnf /etc/my.cnf
</pre>
<p>Корректирую конфиг (если интересно, то одна из первых версий доступна <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://dl.dropbox.com/u/243759/Site/20100109/my.cnf" >для списывания</a></noindex>):</p>
<ul>
<li>Отключаю возможность доступа по сети: skip-networking</li>
<li>Выставляю везде default-character-set=utf8</li>
<li>Для mysqld включаю character-set-server = utf8 и default-character-set = utf8</li>
<li>Ограничиваю количество сессий max_connections=50</li>
<li>thread_cache_size = 16</li>
<li>query_cache_size  = 32M</li>
<li>Включаю секцию innodb</li>
<li>Выставляю логгирование (slow_query_log = 1, slow_query_log_file = /var/log/mysql-slow.log, log-error =  /var/log/mysql.log)</li>
</ul>
<p>Создаю нужные файлы логов, иначе они не воспримутся:</p>
<pre>
$ sudo touch /var/log/mysql-slow.log
$ sudo chown _mysql:_mysql /var/log/mysql-slow.log
$ sudo touch /var/log/mysql.log
$ sudo chown _mysql:_mysql /var/log/mysql.log
</pre>
<p>Перезагружаем сервер MySQL (-w отключает disable, т.е. MySQL загрузится при рестарте системы)</p>
<pre>
$ sudo launchctl unload -w /Library/LaunchDaemons/org.macports.mysql5.plist
$ sudo launchctl load -w /Library/LaunchDaemons/org.macports.mysql5.plist
</pre>
<p>Нужно посмотреть лог на предмет ошибок или проблем:</p>
<pre>
$ tail -100 /var/log/mysql.log
</pre>
<p>Очень важно сделать базовый аудит конфигурации MySQL, для этого я использую два скрипта. Первый &#8211; <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://blog.mysqltuner.com/" >mysqltuner.pl</a></noindex>:</p>
<pre>
$ curl http://mysqltuner.com/mysqltuner.pl -o mysqltuner.pl
$ chmod +x mysqltuner.pl
$ ./mysqltuner.pl
</pre>
<p>Второй &#8211; <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/https://launchpad.net/mysql-tuning-primer" >mysql-tuning-primer</a></noindex>:</p>
<pre>
$ curl http://launchpadlibrarian.net/36004840/tuning-primer.sh -o tuning-primer.sh
$ chmod +x tuning-primer.sh
$ ./tuning-primer.sh
</pre>
<p>Особых проблем скрипты не выявили. Если бы нашли, то нужно было бы подправить /etc/my.cnf и перезапустить MySQL.</p>
<p>Настройка закончена, осталось перезапустить Mac OS X для проверки, подымется ли MySQL после рестарта. У меня он поднялся.</p>
<p>Если вы хотите углубить свои знания по MySQL, то рекомендую ознакомиться с сайтом <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://www.mysqlperformanceblog.com/" >MySQL Performance Blog</a></noindex> (этот сайт ведут специалисты широкоизвестной в узких кругах фирмы Percona).</p>
<h2>Использование GUI для работы с базой данных</h2>
<p>Я не разработчик, и мне хватает командно-строковой утилиты mysql. Но если вам нужен GUI, то можно будет или поставить <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://www.phpmyadmin.net/home_page/index.php" >phpMyAdmin</a></noindex> (он будет доступен через web), или же утилиту под Mac OS X <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://www.sequelpro.com/" >Sequel Pro</a></noindex> (она бесплатная, приветствуются пожертвования).</p>
<p>Sequel Pro мне нравится тем, что он позволяет соединяться через туннель SSH, и на хосте с MySQL достаточно открыть сетевой доступ через 127.0.0.1. Для того, чтобы это сделать, нужно в /etc/my.cnf закомментировать опцию &#8220;skip-networking&#8221; (конечно же, после этого нужно перезагрузить MySQL) и открыть доступ пользователю (например, root):</p>
<pre>
$ mysql mysql
<small>mysql> GRANT ALL ON *.* TO root@127.0.0.1 IDENTIFIED BY 'fc97a2060ec0775ed3b6aa011ee27e88';
mysql> FLUSH PRIVILEGES;</small>
</pre>
<p>Настройка туннелирования:</p>
<p style="clear: both"><a href="http://theapplegeek.ru/wp-content/uploads/2010/01/02_my-full.png"  class="image-link" rel="lightbox[2714]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2010/01/02_my-thumb.png" height="478" width="410" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></p>
<p>Интерфейс программы:</p>
<p style="clear: both"><a href="http://theapplegeek.ru/wp-content/uploads/2010/01/03_my-full.png"  class="image-link" rel="lightbox[2714]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2010/01/03_my-thumb.png" height="370" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></p>
<h2>Проверка производительности MySQL</h2>
<p>Для того, чтобы знать, какую нагрузку выдержит MySQL, можно применить бенчмаркинг <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://dev.mysql.com/doc/refman/5.1/en/mysql-benchmarks.html" >sql-bench</a></noindex> (это необязательно, раздел можно пропустить). К сожалению, в портах его я не нашёл, поэтому сделаю не совсем правильно, но действенно &#8211; поставлю бинарный package с сайта MySQL (это второй описанный метод), но не буду запускать сам MySQL.</p>
<p>Списываю <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://dev.mysql.com/downloads/mysql/5.1.html#macosx-dmg" >package</a></noindex> Mac OS X 10.5 (x86_64) и устанавливаю его (только mysql-&#8230;..pkg, ни в коем случае не prefpane и не StartupItems). Система поставилась в /usr/local/mysql (это симлинк на каталог с установленной версией типа mysql-5.1.42-osx10.5-x86_64).</p>
<p>SQL-Bench использует Perl, для соединения с MySQL нужен DBD::mysql, поставим его (в ответ на предложение сконфигурировать CPAN нажимаем Enter или пишем &#8220;yes&#8221;):</p>
<pre>
$ sudo perl -MCPAN -eshell
<small>Would you like me to configure as much as possible automatically? [yes] <b>yes</b></small>
cpan[1]&gt; install DBD::mysql
<small>...
 CAPTTOFU/DBD-mysql-4.013.tar.gz
 /usr/bin/make install  -- OK</small>
cpan[2]&gt; quit
</pre>
<p>Запускаем бенчмаркинг. Сразу предупреждаю, что процесс длительный, у меня он занял 16 минут:</p>
<pre>
$ cd /usr/local/mysql/sql-bench/
$ <small>sudo ./run-all-tests --server=mysql --user=root -pass=fc97a2060ec0775ed3b6aa011ee27e88 --log</small>
</pre>
<p>Смотрим на результат, размышляем.</p>
<p>На этом заканчиваем, в следующей части приступим к настройке web-сервера.</p>
<h2>Замена паролей</h2>
<p>При необходимости меняем пароль (как я и обещал, я это сделал &#8211; лучше три лишние команды, чем потеря данных):</p>
<pre>
$ mysql mysql
mysql&gt; GRANT ALL ON *.* TO root@127.0.0.1 IDENTIFIED BY 'verysecretpassword';
mysql&gt; GRANT ALL ON *.* TO root@localhost IDENTIFIED BY 'verysecretpassword';
mysql&gt; FLUSH PRIVILEGES;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://theapplegeek.ru/archives/2714/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using memcached (user agent is rejected)
Page Caching using memcached (user agent is rejected)
Database Caching 4/8 queries in 0.004 seconds using memcached
Object Caching 418/419 objects using memcached

Served from: theapplegeek.ru @ 2010-07-31 02:45:40 -->