среда, 24 декабря 2008 г.

Краткий справочник по psql (текстовый интерфейс PostgreSQL)


В PostgreSQL есть немало интерфейсов. Из графических лично я предпочитаю pgadmin3 (он должен быть в репозитариях большинства Linux дистрибутивов). В этом справочнике будет описан текстовый - psql.
Его я нахожу даже более удобным, чем sqlplus для Oracle.

Справочник специально создавался кратким для того, чтобы описать команды, которые наиболее часто используются.
Разделим справочник на 3 части:

  1. Файлы (они же команды) PostgreSQL
  2. Команды запуска psql
  3. Команды интерактивной оболочки psql


1. Файлы (они же команды) PostgreSQL
  • psql - программа для работы с объектами PostgreSQL
  • createdb и dropdb - создание и удаление базы данных (соответственно)
  • createuser и dropuser - создание и пользователя (соответственно)
  • pg_ctl - программа предназначенная для решения общих задач управления (запуск, останов, настройка параметров и т.д.)
  • postmaster - многопользовательский серверный модуль PostgreSQL (настройка уровней отладки, портов, каталогов данных)
  • initdb - создание новых кластеровPostgreSQL (не запускайте под root !)
  • initlocation - программа для создания каталогов для вторичного хранения баз данных
  • vacuumdb - физическое и аналитическое сопровождение БД
  • pg_dump - архивация и восстановление данных
  • pg_dumpall - оболочка для pg_dump, которая работает сразу со всем кластером БДPostgreSQL
  • pg_restore - восстановление БД из архивов (.tar, .tar.gz)


2. Команды запуска psql
  • psql -c (или --command) - запуск команды без входа в интерактивный режим
  • -f (или --file) - также как и -c , но команда читается с файла
  • -l (или --list) - выводит список баз данных, к которым можно подключиться (если появляется ошибка: psql: FATAL: role "_your_userName_" does not exist ), то значит нужно указать имя пользователя явно.
  • -U (или --username) - указываем имя пользователя (например postgres)
  • -W (или --password) - приглашение на ввод пароля
  • -d - имя базы данных
  • -h - имя хоста (сервера)
  • -s - пошаговый режим, то есть, нужно будет подтверждать все команды
  • -S - одно-строчный режим, то есть, переход на новую строку будет выполнять запрос (когда надоело вводить ";" после каждой SQL команды! )
  • -V - (не строчная v) - версия PostgreSQL без входа в интерактивный режим
Примечание: Ключи можно комбинировать, например, psql -U postgres -c "select current_date"


3. Комманды интерактивной оболочки psql
(
Примечание: после этих команд точку с запятой ставить (как при выполнении SQL-запросов ) не нужно)
  • \connect db_name - подключиться к базе с именем db_name
  • \du - список пользователей
  • \dp (или \z) - список таблиц, представлений, последовательностей, прав доступа к ним
  • \di - индексы
  • \ds - последовательности
  • \dt - таблицы
  • \dv - представления
  • \dS - системные таблицы
  • \o - пересылка результатов запроса в файл (Пример: а) \o today.txt б) select select current_date ; и тогда все результаты будут записываться в today.txt. Чтобы все запросы снова выводились не в файл, а на консоль необходимо еще раз ввести \o (без указания параметров)
  • \l - список баз данных
  • \i - читать входящие данные из файла
  • \e - открывает текущее содержимое буфера запроса в редакторе (если не указана в окружении переменная EDITOR, то будет использоваться по умолчанию vi)
  • \d "table_name" - описание таблицы (вместо table_name указать свою таблицу)
  • \i запуск команды из внешнего файла, например \i /home/user/query.sql
  • \pset - команда настройки параметров форматирования
  • \echo - выводит сообщение
  • \set - устанавливает значение переменной среды. Эта команда без параметров выводит список текущих переменных (\unset - удаляет). Полезный пример: а) echo "'one','two', 'three'" > test.sql (создаем файл с данными test.sql)
  • б) \set data `cat test.sql`psql устанавливаем переменную data, которая получает результат от команды cat test.sql)
  • в) \echo :data (результат проверки переменной - 'one','two', 'three' )
  • г) select :data ; (используем переменную). Можно использовать любую SQL команду.
  • Вот так вот легко можно использовать параметры команд с внешних файлов!
  • \? - справочник psql
  • \help - справочник SQL
  • \q (или Ctrl+D) - выход с программы

Примечание: Рекомендую называть таблицы и поля строчными символами. PostgreSQL чувствителен к регистру в названиях объектов, но не к командам (select и SELECT - не имеет значения). Но если уже есть такие объекты БД, то тогда их нужно указывать в кавычках, например, SELECT * FROM "MyTable". Иначе будете удивлены почему выводится сообщение типа:
ERROR: relation "myTableName" does not exist

Успехов!

среда, 17 декабря 2008 г.

установка сканера Epson v10 на Mandriva Linux


В дистрибутиве Mandriva и в других крупных дистрибутивах есть графические утилиты установки и настройки принтеров, сканеров и др.
Чтобы долго не мучиться я решил тоже ее использовать. Запустить графические утилиты настройки в Mandriva можно с помощью команды mcc. На первом этапе установки сканера утилита предлагает установить XSANE (нужно установить, если еще не установлен). На втором этапе предлагается идет автоматический поиск драйвера. К сожалению, автоматическая установка драйвера не получилась поэтому было предложение самому найти в списке драйверов необходимое устройство. Но в списке устройств Epson V10 не было.
На официальном сайте Epson драйвера были только для Windows и Mac (Позор Epson-у !).
Необходимые драйвере для Epson V10 под нужный дистрибутив можно скачать с сайта http://www.avasys.jp/lx-bin2/linux_e/scan/DL1.do.
Там есть и исходники и документация (на англ. языке)
после установки драйвера iscan и iscan-plugin по идее все уже должно работать и можно запускать xSANE и сканировать.

Если проблемы все-таки есть:
В предыдущих версиях Mandriva, например 2008 у меня возникала проблема конфликта пакетов. Как вариант решения использовать
rpm -i
--force *.rpm
Возможна проблема доступа к сканеру для не-root пользователя.
Для этого можно
а) установить права вручную :
sane-find-scanner | grep 0x04b8
ответом должно быть что-то вроде
found USB scanner (vendor=0x04b8 [EPSON], product=0x012d [EPSON Scanner]) at libusb:006:025
потом под root-пользователем запустить
chmod 0666 /proc/bus/usb/006/025
две последние цифры взять от предыдущего результата вывода команды
В этом варианте придется каждый раз делать эту операцию после включения сканера или перезагрузки компьютера (или написать скрипит). Очевидно, это не очень удобно, поэтому лучше исаользовать вариант б)
б) использовать файл настроек /etc/sane.d/epkowa.conf
в нем нужно указать соответствующее Usb- устройство сканера, например
usb /dev/usb/scanner0
В этом файле есть примеры. Их можно использовать.

Успехов!

среда, 3 декабря 2008 г.

Интеграция Tomcat и Apache


Зачем?
Когда возникает необходимость размещать на сайте свои JSP-страницы и/или сервлеты на веб-сервере, то одним из самых лучших помощников есть Tomcat. Есть и другие бесплатные контейнеры сервлетов, например Jetty, но мне по душе Tomcat.
Зачем Tomcat связывать с Apache? Над этим вопросом я думал немало. На многих форумах пишут, что Apache быстрее работает со статистическими файлами (например, .gif, .html), но это было раньше. Последние версии Tomcat, в моем случае Tomcat 6, работают со статикой намного лучше, а на официальном сайте Tomcat пишут, что иногда даже лучше. Радует также то, что в Tomcat есть возможность использовать виртуальный хостинг (с алиасами), а также есть поддержка PHP! Для того чтобы клиентам не приходилось указывать порт веб-сервера (по умолчанию в Tomcat 8080) можно либо настроить в server.xml чтобы Tomcat запускался с обслуживание порта 80 либо сделать перенаправление с порта 8080 на порт 80 (если конечно никакой сервер этот порт еще не использует). В целях безопасности я предпочитаю второй вариант. В Linux это делается элементарно:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

Но в связке Tomcat и Apache есть свои преимущества:
можно использовать модуль mod_jk для балансировки нагрузки нескольких Tomcat серверов, а также для создания кластера.
Можно использовать разнообразные модули Apache (но не всегда они нужны и даже могут мешать безопасности)
Больше аргументов в пользу связки Apache и Tomcat для современных версий Tomcat я не нашел. Но этот первый пункт для меня был весомым. Возможно (и скорее всего) разработчики Tomcat реализуют эту функциональность и он станет достаточно самостоятельным веб-сервером. Но все-таки Tomcat в первую очередь нацелен на Java-разработчиков.

Как?
Есть 2 базовый варианта.
Первый: использовать модули Apache, а именно mod_proxy, mod_alias
Для этого нужно в httpd.conf или конфигурационном файле виртуально хоста (если он отдельно) прописать так:

RedirectMatch permanent ^/$ http://<домен>/<приложение>/
ProxyPass /<приложение> http://<домен>:8080/<приложение>/
ProxyPassReverse /<приложение> http://<домен>:8080/<приложение>/


mod_alias нужен для RedirectMatch и mod_proxy - для ProxyPass и ProxyPassReverse директив
В этом подходе есть преимущества — простота настройки и недостатки:
- Tomcat сервер не может находится во внутренней и/или DMZ-зоне (без специальных настроек фаервола и/или DNS)
- слабая поддержка балансировки и кластеризации (на официальном сайте пишут, что mod_proxy поддерживает балансировку, но производительность хуже)
- плохая производительность.

Второй. Использовать коннекторы. Из всего разнообразия коннектором на официальном сайте Apache указано, что сейчас для версии 6 поддерживается Jk и mod_proxy.
Коннекторы jserv, Jk2 (!), webapp — устарели. Первые два используют протокол AJP, последний — WARP.
Далее описывается как настроить коннектор jk (mod_jk).
Где взять модуль JK и как его установить?
Установить mod_jk можно используя репозитарий Linux. Просто сделайте поиск в репозитарии, например jk. Этот модуль я видел в дистрибутивах SuseOpenSuse), Mandriva, Debian, CentOS (соответственно должно быть и в RadHat и Fedora). В OpenSuse он назывался apache2-mod_jk. Я так понял, что этот модуль можно установить с репозитария во всех популярных дистрибутивах. Именно так я его установил.
Но, если нет такой возможности или хочется установить самый последний модуль, то его можно либо скачать в бинарном виде с этого сайта - обязательно учтите архитектуру процессора и версию Apache!
Либо установить с исходников. Для этого нужно скачать с этого сайта нужную версию, проверить на целостность, и установить. Важная заметка: для того чтобы при установке скомпилировалась именно та, версия, которая подходит для вашей версии Apache должна быть установлена программа apxs !

Как подключить mod_jk к Apache? На примере OpenSuse все очень просто:
В файле /etc/sysconfig/apache2 в строке APACHE_MODULES= дописываем mod_jk и перегружаем Apache. Чтобы убедиться, что он загружен используем команду:
apache2ctl -t -D DUMP_MODULES
В списке должно быть jk_module (shared)
Если модуль устанавливался НЕ с помощью репозитария дистрибутива, то модуль нужно скинуть в место где находятся библиотеки Apache (учитывайте архитектуру процессора), а загрузка модуля зависит от версии Apache, которую используете.
А теперь непосредственно настройка коннектора. Сделаем это в 4 шага
1) подключаем свой конфигурационный файл в httpd.conf
Include /etc/apache2/mod-jk.conf
2) в этом файле пишем:
JkWorkersFile /etc/apache2/workers.properties
JkLogFile /etc/apache2/mod-jk.log
JkLogLevel info
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
JkRequestLogFormat "%w %V %T"
JkExtractSSL On


/* пути исправляйте для собственных нужд */

Тут мы указываем на файл настроек так называемых workers (работники :) )
Обо всех остальных директивах и настройках для Apache можно почитать на этом сайте

3) описываем работу воркеров в файле workers.properties
worker.list=worker1, worker2
worker.worker1.port=8009
worker.worker1.host=hostname
worker.worker1.type=ajp13
worker.worker2.port=8010
worker.worker2.host=hostname
worker.worker2.type=ajp13


Что это значит?
worker.list — список воркеров
И ниже свойства каждого воркера, а именно port, host, type (порт, хост, тип).
Порт — это порт AJP, который слушает соответствующий Tomcat-сервер. По умолчанию это 8009
Хост — имя хоста или его Ip-адрес, где находится соответствующий Tomcat-сервер.
Тип — Тип воркера. В данном случае используется протокол AGP версии 1.3. Без особой необходимости его менять не нужно.
Дополнительно про настройку worker-ов можно почитать тут

4) Указываем как и когда использовать Tomcat, а не Apache.
Указать можно либо в самом файле httpd.conf например,
JkMount /jsp-examples worker1
либо непосредственно при настройке виртуального хоста
(внутри тега VirtualHost):
JkMount /* worker2


Вот и все ;)

И еще немного о виртуальных хостах (Virtual hosts).
Как делать виртуальные хосты в Apache написано тут
Например (внутри тега "VirtualHost"):

ServerAdmin webmaster@localhost
ServerName mysite.com.ua
ServerAlias www.mysite.com.ua
DocumentRoot /srv/www/htdocs/mysite.com.ua
ErrorLog /var/log/apache2/mysite.com.ua-error_log
CustomLog /var/log/apache2/mysite.com.ua_log combined
JkMount /* workername # если, конечно, необходим Tomcat

Создать виртуальный хост для Tomcat еще проще:
в /conf/server.xml создать разные хосты ()
Engine name="Catalina" defaultHost="ren"
Host name="site1.com" appBase="site1apps"
Host name="site2.com" appBase="site2apps"
Engine

Для создания алиасов используем элемент alias... внутри тега host, например alias> www.site1.com.ua /alias>
и создать соответствующие директории site1apps и site2apps.
При этом нужно чтобы эти директории не перекрывались (не находились друг в друге)
Контекст по умолчанию (например, сразу после того, как вводим site1.com) должен находиться в site1apps/ROOT или site1apps/root.war, а остальные контексты (например site1.com/mycontext) в той же директории, но не ROOT.
Подробней на английском читайте тут

А как связать виртуальные хосты (Virtual hosts) Apache c Tomcat?

Для этого нужно:
1) создать витруальные хосты в Apache.
2) Создать несколько директорий для разных хостов Tomcat, поменяв необходимые порты в каждом из них. Например, у нас уже есть директория с Tomcat, которая использует порты по умолчанию, а именно: 8080 — для веб, 8009 — для AJP, 8005 — для останова Tomcat (это значит останов или крах одного сайта не повлияет на другой).
Просто копируем и переименовуем новую директорию Tomcat, например, SITE1-Tomcat.
Потом в /conf/server.xml новой директории Tomcat меняем порты:
а) порт останова с 8005 на другой, например:
Server port="8006" shutdown="SHUTDOWN"
б) веб-порт с 8080 на другой, например:
Connector port="8081" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />

в) порт для AGP c 8009 на другой, например:
Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
3) В файле workers.properties мы для каждого сайта создаем свой worker, например site1worker

4) В настройках виртуального хоста Apache внутри тега VirtualHost используем соответствующий worker, например
JkMount /* site1worker

Если что-то не получается смотрим логи модуля mod_jk, в данном примере он был указал в файле mod-jk.conf в директории JkLogFile /etc/apache2/mod-jk.log. Также не забываем о логах Apache, логах Tomcat и системных логах.

Некоторые полезные ссылки:
http://www.opennet.ru/base/dev/apache2_tomcat5.txt.html — об интеграции Apache c Tomcat (на русском)
http://www.javatalks.ru/sutra31163.php — дополнительно о кластеризации (на русском)
http://voituk.kiev.ua/2007/06/25/tomcat-cluster/ - тоже хорошо о кластеризации (на русском)
http://people.apache.org/~mturk/docs/article/ftwai.html — о кластеризации Apache Tomcat (на английском)
http://tomcat.apache.org/tomcat-6.0-doc/connectors.html - рассуждение о коннекторах от разработчиков (на английском)