Установка и настройка PostgreSQL

PostgreSQL - это объектно-реляционная система управления базами данных, базирующаяся на СУБД Postgres, которая разработана в Калифорнийском университете в Беркли. ОРСУБД PostgreSQL поддерживает большую часть возможностей стандарта SQL и большинство современных технологий:

  • Сложные запросы
  • Внешние ключи
  • Триггеры
  • Представления
  • Транзакции
  • Управление конкурентным доступом с помощью многоверсионности

Так же PostgreSQL позволяет пользователю добавлять свои:

  • Типы данных
  • Функции
  • Операторы
  • Агрегатные функции
  • Методы индексирования
  • Языки программирования

Установку  и настройку PostgreSQL я буду производить на FreeBSD 7.4. Для установки я выбрал версию сервера - 8.3, ибо ее возможностей мне вполне хватает. Идем в порты и устанавливаем:

# cd /usr/ports/databases/postgresql83-server
# make install clean

Описание доступных опций (опции, которые выбрал я - подчеркнуты):

  • NLS - использовать многоязычные сообщения
  • PAM - поддержка PAM
  • LDAP - поддержка аутентификации через LDAP
  • MIT_KRB5 - поддержка MIT kerberos
  • HEIMDAL_KRB5 - поддержка Heimdal kerberos
  • OPTIMIZED_CFLAGS - использовать ключи оптимизации для компилятора при компиляции
  • XML - поддержка типа данных XML
  • TZDATA - использовать внутреннюю базу данных временных зон
  • DEBUG - включить отладочные символы
  • ICU - использовать ICU для работы с текстом в юникоде
  • INTDATE - использовать 64-х битный тип данных data/time

После завершения установки нужно инициализировать кластер базы данных и только потом запускать сервис. Добавим сервис в автозагрузку и укажем дополнительные параметры инициализации в /etc/rc.conf:

postgresql_enable="YES"
postgresql_data="/usr/local/pgsql/data"
postgresql_initdb_flags="--encoding=utf-8 --lc-collate=C"
postgresql_class="postgresql"

Так же я создал новый класс пользователей с кодировкой по умолчанию UTF8 специально для сервиса postgresql и задал его пользователю pgsql (не забываем ребилдидь базу данных классов пользователей командой cap_mkdb).

# cat /etc/login.conf
---[вырезано]---
postgresql|PostgreSQL User Account:\
       :charset=UTF-8:\
       :lang=ru_RU.UTF-8:\
       :tc=default:
---[вырезано]---

Теперь можно инициализировать кластер:

# service postgresql initdb

Теперь переходим к настройке сервиса. По умолчанию все конфигурационные файлы хранятся в корне кластера, в моей конфигурации это /usr/local/pgsql/data. Управление параметрами сервиса осуществляется тремя конфигурационными файлами:

  • postgresql.conf - основной конфигурационный файл
  • pg_hba.conf - в этом файле описываются клиентские компьютеры сети, с которых разрешен доступ к серверу, а также методы идентификации клиентов
  • pg_ident.conf - этот файл используется при установке способа идентификации клиентов через ident сервер

Приведу пример моего конфигурационного файла postgresql.conf, далее в статье я опишу подробно некоторые опции.

# -----------------------------
# Конфигурационный файл PostgreSQL
# -----------------------------
#
# Формат файла такой:
#
#   name = value
#
# Знак "=" не обязателен, можно просто использовать пробел. Комментарии
# начинается со знака "#" и может находиться в любой части строки. Полный
# список возможных параметров можно найти в документации PostgreSQL.
#
# Прокомментированные настройки в этом файле инициализированы значениями 
# по умолчанию. Не забывайте перезагружать сервер после изменения параметров.
#
# Этот файл читается при запуске сервера и при получении им сигнала
# SIGHUP. После редактирования конфигурационного файла вы должны
# послать сигнал SIGHUP серверу, чтобы он перечитал его и изменения
# вступили в силу (так же, вы можете использовать команду pg_ctl reload).
# Некоторые параметры, представленные ниже, требуют перезапуска сервера.
#
# Любой параметр также можно задать с помощью аргументов командной строки,
# например "postgres -c log_connections=on". Некоторые параметры можно
# задать во время сессии с помощью SQL команды "SET".
#
# Memory units:  kB = kilobytes MB = megabytes GB = gigabytes
# Time units:    ms = milliseconds s = seconds min = minutes h = hours d = days


#------------------------------------------------------------------------------
# Директории и файлы
#------------------------------------------------------------------------------

# Значения по умолчанию для этих опций передаются с помощью
# параметра командной строки -D или переменной окружения PGDATA,
# которая представлена здесь как ConfigDir.

#data_directory = 'ConfigDir'        # путь до кластера БД
                    # (требуется перезагрузка)
#hba_file = 'ConfigDir/pg_hba.conf'    # host-based authentication file
                    # (требуется перезагрузка)
#ident_file = 'ConfigDir/pg_ident.conf'    # ident configuration file
                    # (требуется перезагрузка)

# Если этот параметр не задан, то PID файл создаваться не будет.
#external_pid_file = '(none)'        # Записывать PID файл
                    # (требуется перезагрузка)


#------------------------------------------------------------------------------
# Подключения и аутентификация
#------------------------------------------------------------------------------

# - Параметры подключения -

listen_addresses = '*'            # на каком IP адресе(ах) принимать подключения;
                    # список разделенный запятыми;
                    # по умолчанию 'localhost', '*' = all
                    # (требуется перезагрузка)
port = 5432                # (требуется перезагрузка)
max_connections = 30            # (требуется перезагрузка)
# Внимание: Увеличение значения параметра max_connections потребует
# приблизительно 400 байт в разделяемой памяти на подключение, плюс
# блокировка пространства (смотрите max_locks_per_transaction). Так же
# вы должны увеличить параметр shared_buffers, чтобы принимать больше
# подключений. 
superuser_reserved_connections = 1    # (требуется перезагрузка)
#unix_socket_directory = ''        # (требуется перезагрузка)
#unix_socket_group = ''            # (требуется перезагрузка)
#unix_socket_permissions = 0777        # 0 вначале означает 8-ую систему счисления
                    # (требуется перезагрузка)
#bonjour_name = ''            # По умолчанию - имя компьютера
                    # (требуется перезагрузка)

# - Безопасность и аутентификация -

authentication_timeout = 1min        # 1s-600s
ssl = on                # (требуется перезагрузка)
#ssl_ciphers = 'ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH'    # allowed SSL ciphers
                    # (требуется перезагрузка)
#ssl_renegotiation_limit = 512MB    # amount of data between renegotiations
password_encryption = on
#db_user_namespace = off

# Kerberos and GSSAPI
#krb_server_keyfile = ''        # (требуется перезагрузка)
#krb_srvname = 'postgres'        # (требуется перезагрузка, только Kerberos)
#krb_server_hostname = ''        # пустая строка, значит любая запись keytab
                    # (требуется перезагрузка, только Kerberos)
#krb_caseins_users = off        # (требуется перезагрузка)
#krb_realm = ''                   # (требуется перезагрузка)

# - TCP Keepalives -
# смотрите "man 7 tcp"

#tcp_keepalives_idle = 0        # TCP_KEEPIDLE, in seconds;
                    # 0 - использовать системное значение
#tcp_keepalives_interval = 0        # TCP_KEEPINTVL, in seconds;
                    # 0 - использовать системное значение
#tcp_keepalives_count = 0        # TCP_KEEPCNT;
                    # 0 - использовать системное значение


#------------------------------------------------------------------------------
# Использование ресурсов (кроме WAL)
#------------------------------------------------------------------------------

# - Память -

shared_buffers = 128MB            # минимум 128kB или max_connections*16kB
                    # (требуется перезагрузка)
temp_buffers = 8MB            # минимум 800kB
max_prepared_transactions = 0        # может быть 0 или больше
                    # (требуется перезагрузка)
# Внимание: Увеличение значения параметра max_prepared_transactions потребует
# приблизительно 600 байт в разделяемой памяти на подключение, плюс
# блокировка пространства (смотрите max_locks_per_transaction).
work_mem = 2MB                # минимум 64kB
maintenance_work_mem = 16MB        # минимум 1MB
max_stack_depth = 32MB            # минимум 100kB

# - Карта свободного пространства -

max_fsm_pages = 179200            # минимум max_fsm_relations*16, 6 байт на каждую
                    # (требуется перезагрузка)
#max_fsm_relations = 1000        # минимум 100, ~70 байт на каждый
                    # (требуется перезагрузка)

# - Использование ядерных ресурсов -

#max_files_per_process = 1000        # минимум 25
                    # (требуется перезагрузка)
#shared_preload_libraries = ''        # (требуется перезагрузка)

# - Cost-Based Vacuum Delay -

#vacuum_cost_delay = 0            # 0-1000 milliseconds
#vacuum_cost_page_hit = 1        # 0-10000 credits
#vacuum_cost_page_miss = 10        # 0-10000 credits
#vacuum_cost_page_dirty = 20        # 0-10000 credits
#vacuum_cost_limit = 200        # 1-10000 credits

# - Background Writer -

#bgwriter_delay = 200ms            # 10-10000ms between rounds
#bgwriter_lru_maxpages = 100        # 0-1000 max buffers written/round
#bgwriter_lru_multiplier = 2.0        # 0-10.0 multipler on buffers scanned/round


#------------------------------------------------------------------------------
# Ведение лога
#------------------------------------------------------------------------------

# - Установки -

fsync = on                # Вкл/выкл синхронизацию
synchronous_commit = on        # Вызов fsync при коммите
wal_sync_method = fsync        # the default is the first option 
                    # supported by the operating system:
                    #   open_datasync
                    #   fdatasync
                    #   fsync
                    #   fsync_writethrough
                    #   open_sync
full_page_writes = on            # recover from partial page writes
wal_buffers = 128kB            # минимум 32kB
                    # (требуется перезагрузка)
#wal_writer_delay = 200ms        # 1-10000 milliseconds

#commit_delay = 0            # диапазон 0-100000, в микросекундах
#commit_siblings = 5            # диапазон 1-1000

# - Контрольные точки -

#checkpoint_segments = 3        # сегменты в лог файле, минимум 1, каждый 16MB
#checkpoint_timeout = 5min        # диапазон 30s-1h
#checkpoint_completion_target = 0.5    # checkpoint target duration, 0.0 - 1.0
#checkpoint_warning = 30s        # 0 is off

# - Архивирование -

archive_mode = off        # разрешить архивирование
                # (требуется перезагрузка)
#archive_command = ''        # команда, используемая для архивирования сегментов
#archive_timeout = 0        # принудительно переключать сегмент в лог файле
                # по истечению времени; 0 - выключено


#------------------------------------------------------------------------------
# Тюнинг планировщика запросов
#------------------------------------------------------------------------------

# - Конфигурация методов планирования  -

enable_bitmapscan = on
enable_hashagg = on
enable_hashjoin = on
enable_indexscan = on
enable_mergejoin = on
enable_nestloop = on
enable_seqscan = on
enable_sort = on
enable_tidscan = on

# - Planner Cost Constants -

#seq_page_cost = 1.0            # measured on an arbitrary scale
#random_page_cost = 4.0            # same scale as above
#cpu_tuple_cost = 0.01            # same scale as above
#cpu_index_tuple_cost = 0.005        # same scale as above
#cpu_operator_cost = 0.0025        # same scale as above
#effective_cache_size = 128MB

# - Оптимизатор запросов -

geqo = on
#geqo_threshold = 12
#geqo_effort = 5            # диапазон 1-10
#geqo_pool_size = 0            # selects default based on effort
#geqo_generations = 0            # selects default based on effort
#geqo_selection_bias = 2.0        # диапазон 1.5-2.0

# - Другие параметры планировщика -

#default_statistics_target = 10        # диапазон 1-1000
#constraint_exclusion = off
#from_collapse_limit = 8
#join_collapse_limit = 8        # 1 disables collapsing of explicit 
                    # JOIN clauses


#------------------------------------------------------------------------------
# Лог ошибок
#------------------------------------------------------------------------------

# - Куда слать логи -

#log_destination = 'syslog'
log_destination = 'stderr'        # Возможные значение:
                    # stderr, csvlog, syslog and eventlog,
                    # зависят от платформы.  csvlog
                    # требует, чтобы logging_collector был включен.

# This is used when logging to stderr:
logging_collector = on            # Разрешить сбор сообщений с stderr или csvlog
                    # в лог файлы. Требуется для
                    # csvlogs.
                    # (требуется перезагрузка)

# Эти параметры используются только, если параметр logging_collector включен:
log_directory = 'pg_log'            # директория - куда писать логи,
                    # может будь абсолютной или релятивной относительно PGDATA
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'    # шаблон имени лог файла,
                    # можно использовать последовательности strftime()
#log_truncate_on_rotation = off        # Если включено, то существующий файл будет
                    # очищен, а запись будет начата сначала файла.
                    # Файл будет очищаться только по срабатыванию
                    # таймера, то есть при перезапуске сервера или
                    # при достижении определенного размера,
                    # файл очищаться не будет. По умолчанию
                    # выключено, что означает дописывание
                    # в конец существующих файлов во всех случаях.
#log_rotation_age = 1d            # Автоматическая ротация логов будет производиться
                    # по истечению заданного времени. 0 - выключено.
#log_rotation_size = 10MB            # Автоматическая ротация логов будет производиться
                    # при достижении размера файла заданных размеров.
                    # 0 - выключено.

# Эти параметры имеют значение, если логи шлются в syslog:
#syslog_facility = 'LOCAL0'
#syslog_ident = 'postgres'


# - Уровень информативности -

#client_min_messages = notice        # значения представлены в порядке
                    #  понижения информативности:
                    #   debug5
                    #   debug4
                    #   debug3
                    #   debug2
                    #   debug1
                    #   log
                    #   notice
                    #   warning
                    #   error

#log_min_messages = notice        # values in order of decreasing detail:
                    #   debug5
                    #   debug4
                    #   debug3
                    #   debug2
                    #   debug1
                    #   info
                    #   notice
                    #   warning
                    #   error
                    #   log
                    #   fatal
                    #   panic

#log_error_verbosity = default        # terse, default, or verbose messages

#log_min_error_statement = error    # values in order of decreasing detail:
                     #   debug5
                    #   debug4
                    #   debug3
                    #   debug2
                    #   debug1
                     #   info
                    #   notice
                    #   warning
                    #   error
                    #   log
                    #   fatal
                    #   panic (effectively off)

#log_min_duration_statement = -1        # -1 is disabled, 0 logs all statements
                    # and their durations, > 0 logs only
                    # statements running at least this time.

silent_mode = on
#silent_mode = off                # не используйте без syslog или
                    # logging_collector
                    # (требуется перезагрузка)

# - Что писать в лог -

#debug_print_parse = off
#debug_print_rewritten = off
#debug_print_plan = off
#debug_pretty_print = off
#log_checkpoints = off
#log_connections = off
#log_disconnections = off
#log_duration = off
#log_hostname = off
#log_line_prefix = ''                # специальные значения:
                    #   %u = имя пользователя
                    #   %d = имя БД
                    #   %r = удаленный хост и порт
                    #   %h = удаленный хост
                    #   %p = идентификатор процесса
                    #   %t = время без миллисекунд
                    #   %m = время с миллисекундами
                    #   %i = command tag
                    #   %c = идентификатор сессии
                    #   %l = session line number
                    #   %s = время старта сессии
                    #   %v = идентификатор виртуальной транзакции
                    #   %x = идентификатор транзакции (0, если нет)
                    #   %q = stop here in non-session
                    #        processes
                    #   %% = '%'
                    # e.g. '<%u%%%d> '
#log_lock_waits = off            # log lock waits >= deadlock_timeout
#log_statement = 'none'            # none, ddl, mod, all
#log_temp_files = -1            # log temporary files equal or larger
                    # than specified size;
                    # -1 disables, 0 logs all temp files
#log_timezone = unknown            # actually, defaults to TZ environment
                    # setting


#------------------------------------------------------------------------------
# Сбор статистики
#------------------------------------------------------------------------------

# - Query/Index Statistics Collector -

track_activities = on
track_counts = on
#update_process_title = on

# На FreeBSD включение этого параметра приведет к падению производительности,
# так что оставьте его выключенным, если вам важна производительность.
update_process_title = off

# - Statistics Monitoring -

#log_parser_stats = off
#log_planner_stats = off
#log_executor_stats = off
#log_statement_stats = off


#------------------------------------------------------------------------------
# Параметры AUTOVACUUM
#------------------------------------------------------------------------------

autovacuum = on                # Разрешить запуск процесса autovacuum?  'on' 
                    # требует включенного параметра track_counts.
#log_autovacuum_min_duration = -1        # -1 disables, 0 logs all actions and
                    # their durations, > 0 logs only
                    # actions running at least that time.
autovacuum_max_workers = 1        # максимальное кол-во autovacuum процессов
#autovacuum_naptime = 1min        # период запуска autovacuum процессов
#autovacuum_vacuum_threshold = 50        # минимальное кол-во обновлений строк,
                    # перед vacuum
#autovacuum_analyze_threshold = 50        # минимальное кол-во обновление строк,
                    # перед analyze
#autovacuum_vacuum_scale_factor = 0.2    # fraction of table size before vacuum
#autovacuum_analyze_scale_factor = 0.1    # fraction of table size before analyze
#autovacuum_freeze_max_age = 200000000    # maximum XID age before forced vacuum
                    # (требуется перезапуск)
#autovacuum_vacuum_cost_delay = 20    # default vacuum cost delay for
                    # autovacuum, -1 means use
                    # vacuum_cost_delay
#autovacuum_vacuum_cost_limit = -1        # default vacuum cost limit for
                    # autovacuum, -1 means use
                    # vacuum_cost_limit


#------------------------------------------------------------------------------
# Настройки по умолчанию для клиентов
#------------------------------------------------------------------------------

# - Statement Behavior -

#search_path = '"$user",public'        # имена схем
#default_tablespace = ''            # a tablespace name, '' uses the default
#temp_tablespaces = ''            # a list of tablespace names, '' uses
                    # only default tablespace
#check_function_bodies = on
#default_transaction_isolation = 'read committed'
#default_transaction_read_only = off
#session_replication_role = 'origin'
#statement_timeout = 0            # 0 - выключено
#vacuum_freeze_min_age = 100000000
#xmlbinary = 'base64'
#xmloption = 'content'

# - Locale and Formatting -

datestyle = 'iso, dmy'
#timezone = unknown            # actually, defaults to TZ environment
                    # setting
#timezone_abbreviations = 'Default'             # Select the set of available time zone
                    # abbreviations.  Currently, there are
                    #   Default
                    #   Australia
                    #   India
                    # You can create your own file in
                    # share/timezonesets/.
#extra_float_digits = 0            # min -15, max 2
#client_encoding = sql_ascii            # actually, defaults to database
                    # encoding

# Эти параметры установлены командой initdb, но их можно изменять.
lc_messages = 'en_US.UTF-8'        # локаль для системных сообщений
lc_monetary = 'ru_RU.KOI8-R'        # локаль для денежного формата
lc_numeric = 'ru_RU.KOI8-R'            # локаль для числового формата
lc_time = 'ru_RU.KOI8-R'            # локаль для формата времени

# Настройки по умолчанию для полнотекстового поиска
default_text_search_config = 'pg_catalog.russian'

# - Other Defaults -

#explain_pretty_print = on
#dynamic_library_path = '$libdir'
#local_preload_libraries = ''


#------------------------------------------------------------------------------
# Управление блокировками
#------------------------------------------------------------------------------

#deadlock_timeout = 1s
#max_locks_per_transaction = 64        # min 10
                    # (требуется перезагрузка)
# Внимание: Для каждой блокировки таблицы используется приблизительно 270 байт
# в разделяемой памяти, и max_locks_per_transaction * (max_connections + max_prepared_transactions).


#------------------------------------------------------------------------------
# Совместимость версий
#------------------------------------------------------------------------------

# - Previous PostgreSQL Versions -

#add_missing_from = off
#array_nulls = on
#backslash_quote = safe_encoding    # on, off, or safe_encoding
#default_with_oids = off
#escape_string_warning = on
#regex_flavor = advanced        # advanced, extended, or basic
#sql_inheritance = on
#standard_conforming_strings = off
#synchronize_seqscans = on

# - Other Platforms and Clients -

#transform_null_equals = off


#------------------------------------------------------------------------------
# CUSTOMIZED OPTIONS
#------------------------------------------------------------------------------

#custom_variable_classes = ''        # list of custom variable class names

Вот описание некоторых важных опций:

  • max_connections - максимальное количество одновременных подключений к серверу БД. Используйте этот параметр, чтобы не допустить запуска большого количества процессов сервера. Иначе есть вероятность, что серер БД исчерпает весь объем ОЗУ и будет активно использоваться подкачка, что в свою очередь повлечет за собой падение производительности.
  • shared_buffers - объем разделяемой памяти, используемый сервером БД. По умолчанию - 32 Мб, но может быть меньше, если настройки вашего ядра не позволяют выделить такой объем памяти, определяется при инициализации кластера БД утилитой initdb. Большие значения этого параметра положительно сказываются на производительности сервера БД.
    Если у вас выделенный компьютер с ОЗУ 1 Гб и больше под сервер БД, то хорошим значением этой переменной будет 25% от объема памяти. При большой нагрузке даже большие значения этого параметра могут быть эффективными, но так как PostgreSQL полагается на кэш ОС, то выделение более 40% от объема памяти вряд ли имеет смысл. Для больших значений этого параметра требуется так же увеличить значение параметра checkpoint_segments.
    На системах с ОЗУ меньше 1 Гб правильнее будет использовать меньший объем памяти (чем 25%), чтобы не исчерпать весь объем оперативной памяти. На винде большие значения этого параметра могут оказаться эффективными. Вы можете добиться большей производительности сохраняя это значение маленьким и больше используя средства кэширования ОС. Хорошим диапазоном значений для Windows является 64-512 Мб.
  • temp_buffers - максимальный размер временных буферов для каждой сессии. Эта память используется только локально в сессии для временных таблиц. По умолчанию - 8 МБ. Значение может быть изменено во время сессии, но только до первого использования этой памяти.
  • max_prepared_transactions - максимальное количество "prepared" транзакций (смотрите описание SQL команды PREPARE TRANSACTION в документации). Чтобы отключить эту фишку, поставьте значение в 0.
  • work_mem - определяет объем памяти, который будет использоваться внутренними операциями сортировки и хэш-таблицами прежде, чем переключиться на временные дисковые файлы. Учтите, что для сложных запросов несколько внутренних операций сортировки и работа с хэш-таблицами могут работать параллельно (одновременно). Кроме того, несколько сессий могут делать такие операции одновременно. В итоге необходимый объем памяти для этих операций может в несколько раз превышать значение параметра work_mem. Учтите это при выборе значения для этого параметра. Под внутренними операциями сортировки подразумевается - ORDER BY, DISTINCT и слияния.
  • maintenance_work_mem - максимальный объем памяти, используемый для внутренних операций, таких как VACUUM, CREATE INDEX и ALTER TABLE ADD FOREIGN KEY. По умолчанию - 16 Мб. Эти команды выполняются только во во время сессии, так что можно выбирать большие значения для этого параметра, чем для параметра work_mem. Большие значения могут положительно сказаться на производительности vacuuming и скорости восстановления БД из дампа. Только учтите, что процесс autovacuum запускается autovacuum_max_workers раз, поэтому может потребоваться больше свободной памяти.
  • max_stack_depth - максимальная глубина стека. Хорошим значением этого параметра является максимально разрешенная глубина стека в системе.
  • max_fsm_pages - с помощью этого параметра можно управлять картой свободного пространства. Когда что-то удаляется из таблицы, то место занимаемое этим что-то не освобождается на диске, вместо этого занимаемое место просто помечается как "свободно" в карте свободного пространства. Потом это место используется для новых записей. Если на вашем сервере очень много удаляется/добавляется данных из/в таблицы, то большие значения этого параметра могут положительно сказаться на производительности.
  • fsync - если этот параметр включен, то PostgreSQL будет дожидаться физической записи данных на диск, используя системную функцию fsync() или аналогичную ей (смотрите wal_sync_method). Это означает, что кластер БД будет возможно восстановить после системного или аппаратного сбоя.
    Однако, включение данного параметра очень сильно снижает производительность: когда транзакция завершена, то PostgreSQL будет ждать пока операционная система физически запишет данные на диск. Когда данный параметр выключен, тогда операционная система может оставлять данные в буфере, то есть она сама будет решать в какой момент сбросить его на диск. Такой подход сильно увеличивает производительность. Однако, если произойдет сбой системы (или аппаратный), то данные нескольких последний транзакций могут быть частично или полностью утеряны. В худшем случае, кластер вообще не удастся восстановить. Стоит отметить, что сбой самого сервера БД не вызовет таких проблем, к этому может привести только системный или аппаратный сбой.
  • synchronous_commit - данный параметр определяет, что результат об успешном завершении транзакции (который отправляется клиенту) будет отправлен только тогда, когда физически запишутся данные WAL на диск. По умолчанию - включен. Если выключить, то может быть некоторая разница во времени между положительным результатом завершения транзакции, отправленным клиенту, и физической записи данных этой транзакции на диск (то есть клиент может получить сообщение о том, что транзакция выполнена раньше, чем она физически запишется на диск на сервере). (максимальная разница может составлять 3 * wal_writer_delay). Выключение данного параметра не приведет к необратимому повреждению кластера (как в случае с fsync): системный сбой мог бы привести только к потери нескольких последних транзакций, но кластер остался бы не поврежденным. Так что данный параметр может оказаться хорошей альтернативой для повышения производительности, чем параметр fsync.
  • full_page_writes - если этот параметр включен, то PostgreSQL записывает все содержимое каждой страницы диска в WAL при первом изменении этой страницы после контрольной точки. Это необходимо, потому что запись страницы может быть осуществлена лишь частично, наример, из-за системного сбоя. Что приведет к тому, что на диске окажется страница, в которой новые данные смешаны со старыми. Изменений на уровне строк данных, которые обычно хранятся в WAL, может быть не достаточно для восстановления страницы после системного сбоя. Сохранение содержимого всей страницы гарантирует корректное восстановление, ценой увеличения записываемых данных в WAL.
    Отключение этого параметра повышает производительность, но может привести к повреждению базы данных в случае системного сбоя или отключения питания. Риск такой же, ка и при отключении fsync, но немного меньше. Отключение данного параметра может быть более безопасно, если у вас железо (например, контроллер с батареей резервного питания) или файловая система (например, ReiserFS 4) уменьшают риск частичной записи страницы на низком уровне.
  • wal_buffers - объем из разделяемой памяти (shared_buffers), используемый для хранения данных WAL. По умолчанию 64Кб. Объем памяти должен быть достаточным, чтобы вместить данные WAL, сгенерированные одной типичной транзакцией.
  • wal_writer_delay - время между раундами записи WAL на диск. В каждом раунде происходит сброс WAL на диск. После чего происходит пауза, на указанное здесь время, и повтор операции. По умолчанию 200 миллисекунд. Во многих системах хорошим значением является значение кратное 10. Установка значения не кратным 10 может приносить такой же эффект как и значение большее, но кратное 10.
  • commit_delay - задержка в микросекундах между записью транзакции в буфер WAL и сбросом его на диск. Ненулевое значение означает, что несколько транзакций может быть обработано одним вызовом fsync(). То есть во время задержки могут поступить еще транзакции, которые будут помещены в буфер WAL, который по окончании задержки будет сброшен на диск. Это полезно при большом количестве транзакций. Но если их не так уж и много, то лучше не использовать данную возможность, чтобы эта задержка не была сделана впустую. Если при успешном завершении транзакции есть еще активные транзакции, количество которых не менее commit_siblings, то будет сделана данная задержка. По умолчанию 0, то есть без задержек.
  • commit_siblings - минимальное количество активных транзакций, чтобы вызвать задержку commit_delay. По умолчанию 5.

Ну вот с основным конфигурационным файлом покончено, теперь можно переходить к настройке параметров доступа к серверу в файле pg_hba.conf. Только сначала очень желательно задать пароль для главного пользователя в кластере БД - pgsql. Для этого запустите сервис и подключитесь к серверу под главным пользователем, и задайте пароль для него, например так:

ALTER ROLE "pgsql" ENCRYPTED PASSWORD '***';

Вот так файл pg_hba.conf выглядит у меня:

# Конфигурационный файл аутентификации клиентов PostgreSQL
# ===================================================
#
# Смотрите главу "Client Authentication" в документации
# PostgreSQL, в которой представлено полное описание этого
# файла. Далее изложены краткие инструкции.
#
# С помощью этого файла можно управлять: каким хостам можно 
# подключаться к серверу, методами аутентификации клиентов,
# каким пользователям разрешено подключаться к серверу,
# к каким БД разрешено подключаться. Формат файла такой:
#
# local      DATABASE  USER  METHOD  [OPTION]
# host       DATABASE  USER  CIDR-ADDRESS  METHOD  [OPTION]
# hostssl    DATABASE  USER  CIDR-ADDRESS  METHOD  [OPTION]
# hostnossl  DATABASE  USER  CIDR-ADDRESS  METHOD  [OPTION]
#
# (Слова в верхнем регистре должны быть заменены актуальными значениями.)
#
# В первой колонке задается тип подключения:
#   "local" - доменные сокеты Unix
#   "host" - TCP/IP сокет с шифрованием и без него
#   "hostssl" - TCP/IP сокет с шифрованием
#   "hostnossl" - TCP/IP сокет без шифрования
#
# DATABASE может быть - "all", имя базы данных или список БД, 
# разделенных запятыми.
#
# USER может быть - "all", имя пользователя, имя группы (начинающееся
# со знака"+") или список, разделенный запятыми.
#
# В колонках DATABASE и USER вы можете указать файл, в котором
# содержаться необходимые данные, для этого просто укажите имя 
# файла, поставив вначале знак "@".
#
# В колонке CIDR-ADDRESS указываются хосты, которым разрешено
# подключаться. 
#
# В колонке METHOD можно указывать такие значения "trust", "reject", "md5",
# "crypt", "password", "gss", "sspi", "krb5", "ident", "pam" или "ldap".
# Учтите, что при методе "password" пароли на сервер отправляются в
# открытом виде, а при методе "md5" - в зашифрованном.
#
# OPTION -  ident или имя PAM сервиса, зависит от колонки METHOD.
#
# Имена БД и пользователей, содержащие пробелы, запятые, кавычки и 
# другие специальные символы должны заключаться в каычки. Если
# заключить в кавычки специальные слова "all", "sameuser" или "samerole",
# то они теряют свое специальное назначение и просто используются, как
# обычный текст.
#
# Этот файл читается при запуске сервера и при получении им сигнала
# SIGHUP. После редактирования конфигурационного файла вы должны
# послать сигнал SIGHUP серверу, чтобы он перечитал его и изменения
# вступили в силу (так же, вы можете использовать команду pg_ctl reload).

# Поместите сюда актуальные данные
# ----------------------------------
#
# Если вам нужно управлять не только локальными соединениями,
# то добавляетйте больше записей "host". Так же вам необходимо,
# чтобы сервер принимал подключения не только с локального
# интерфейса, это можно сделать с помощью параметра listen_addresses
# в основном конфигурационном файле или с помощью аргументов
# командной строки -i или -h.
#
# Предупреждение: для локальных подключений ключевое слово "trust"
# будет значить, что любой локальный пользователь сможет подключится
# к серверу PostgreSQL под любым пользователем, даже под
# суперпользователем.


# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD

# "local" is for Unix domain socket connections only
local   all         all                                md5
# IPv4 local connections:
host    all         all           0.0.0.0/0            md5
# IPv6 local connections:
#host    all         all         ::1/128               trust

В принципе, о настройке сервера все. Более подробно обо всех параметрах смотрите описание в документации. Теперь когда сервер настроен, можно его запускать или перезапустите, если он был запущен, чтобы изменения вступили в силу. Убедиться, что сервер запущен можно попробовав подключиться к нему или посмотреть - слушает ли сервис на нужных портах:

# sockstat -4 -l | grep postgres
pgsql    postgres   70634 3  tcp4   192.168.7.253:5432    *:*

Если сервер не запускается, то читайте логи и проверяйте конфиги. Так же хочу сказать пару слов про различные утилиты, облегчающие работу с сервером - полный список всех тулз можно посмотреть на официальном сайте вот здесь. Отмечу только два приложения: кроссплатформенная утилита с хорошим и удобным интерфесом для работы с сервером, называется pgAdmin (в портах /usr/ports/databases/pgadmin3) и веб-морда - phpPgAdmin (в портах /usr/ports/databases/phppgadmin).

Добавить комментарий

CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.
Яндекс.Метрика