Вопрос или проблема
Я пытаюсь запустить сервер PostgreSQL 10.10 на устройстве Armbian (Ubuntu Bionic с Armbian Linux 4.14.133-odroidxu4) (Odroid Xu4). Сервер ранее работал, но после отключения питания он отказывается запускаться. Я проверил, что файловая система в порядке. В логах [email protected]
я получаю следующие ошибки:
14 сен 14:03:07 odroidxu4 postgresql@10-main[663]: Ошибка: /usr/lib/postgresql/10/bin/pg_ctl /usr/lib/postgresql/10/bin/pg_ctl start -D /data/postgres/postgresql/10/main -l /var/log/postgresql/postgresql-10-main.log -s -o -c config_file="/etc/postgresql/10/main/postgresql.conf" завершился с кодом 1:
14 сен 14:03:07 odroidxu4 systemd[1]: [email protected]: Не удалось открыть файл PID /var/run/postgresql/10-main.pid (пока?) после старта: Нет такого файла или директории
14 сен 14:03:07 odroidxu4 systemd[1]: [email protected]: Сбой с результатом 'протокол'.
14 сен 14:03:07 odroidxu4 systemd[1]: Не удалось запустить кластер PostgreSQL 10-main.
Я проверил, что каталог /var/run/postgresql
существует и принадлежит postgres
в группе postgres
. Я пытался переустановить сервер PostgreSQL. Он может создавать файлы в папке /var/run/postgresql
, так как после удаления папки и перезапуска службы он может создать папку и добавить файл 10-main.pg_stat_tmp
.
Вот содержание /lib/systemd/system/[email protected]
:
# шаблон службы systemd для кластеров PostgreSQL. Фактические экземпляры будут
# называться "postgresql@version-cluster", например, "[email protected]". Переменная %i расширяется до "version-cluster", %I расширяется до "version/cluster".
# (%I не работает для имен кластеров, содержащих дефисы.)
[Unit]
Description=Кластер PostgreSQL %i
ConditionPathExists=/etc/postgresql/%I/postgresql.conf
PartOf=postgresql.service
ReloadPropagatedFrom=postgresql.service
Before=postgresql.service
[Service]
Type=forking
# -: игнорировать неудачу запуска (восстановление может занять произвольно долго)
# фактически тайм-аут pg_ctl настраивается в pg_ctl.conf
ExecStart=-/usr/bin/pg_ctlcluster --skip-systemctl-redirect %i start
# 0 это то же самое, что и бесконечность, но "бесконечность" требует systemd 229
TimeoutStartSec=0
ExecStop=/usr/bin/pg_ctlcluster --skip-systemctl-redirect -m fast %i stop
TimeoutStopSec=1h
ExecReload=/usr/bin/pg_ctlcluster --skip-systemctl-redirect %i reload
PIDFile=/var/run/postgresql/%i.pid
SyslogIdentifier=postgresql@%i
# предотвратить выбор OOM killer для postmaster (индивидуальные backend'ы будут
# сбрасывать счетчик до 0)
OOMScoreAdjust=-900
# автоматический перезапуск предотвратит работу "pg_ctlcluster ... stop",
# поэтому мы отключаем его здесь. Также postmaster сам перезапустится при большинстве
# проблем в любом случае, поэтому сомнительно, стоит ли включать внешний
# автоматический перезапуск.
# Restart=on-failure
# (Это должно заставить pg_ctlcluster stop работать, но не работает:)
# RestartPreventExitStatus=SIGINT SIGTERM
[Install]
WantedBy=multi-user.target
Вот содержание /etc/postgresql/10/main/postgresql.conf
:
# -----------------------------
# Файл конфигурации PostgreSQL
# -----------------------------
#
# Этот файл состоит из строк формата:
#
# name = значение
#
# (символ "=" является необязательным). Пробелы могут использоваться. Комментарии начинаются с
# "#" в любом месте на строке. Полный список имен параметров и допустимых
# значений можно найти в документации PostgreSQL.
#
# Закомментированные настройки в этом файле представляют собой значения по умолчанию.
# Повторное комментирование настройки НЕ является достаточным для возвращения
# ее к значению по умолчанию; необходимо перезагрузить сервер.
#
# Этот файл читается при запуске сервера и когда сервер получает сигнал SIGHUP.
# Если вы редактируете файл на работающей системе, вам нужно послать SIGHUP
# серверу, чтобы изменения вступили в силу, выполнить "pg_ctl reload" или выполнить
# "SELECT pg_reload_conf()". Некоторые параметры, которые отмечены ниже,
# требуют остановки и перезапуска сервера, чтобы вступить в силу.
#
# Любой параметр также может быть указан как опция командной строки серверу, например,
# "postgres -c log_connections=on". Некоторые параметры могут быть изменены во время выполнения
# с помощью SQL-команды "SET".
#
# Единицы памяти: kB = килобайты Единицы времени: ms = миллисекунды
# MB = мегабайты s = секунды
# GB = гигабайты min = минуты
# TB = терабайты h = часы
# d = дни
#------------------------------------------------------------------------------
# МЕСТОПРИБЫЛЬ
#------------------------------------------------------------------------------
# Значения по умолчанию для этих переменных задаются опцией командной строки -D
# или переменной окружения PGDATA, представленной здесь как ConfigDir.
data_directory = '/data/postgres/postgresql/10/main' # использовать данные в другом каталоге
# (изменение требует перезапуска)
hba_file="/etc/postgresql/10/main/pg_hba.conf" # файл аутентификации на основе хоста
# (изменение требует перезапуска)
ident_file="/etc/postgresql/10/main/pg_ident.conf" # файл конфигурации ident
# (изменение требует перезапуска)
# Если external_pid_file не установлен явно, дополнительный PID файл не записывается.
external_pid_file="/var/run/postgresql/10-main.pid" # записать дополнительный PID файл
# (изменение требует перезапуска)
#------------------------------------------------------------------------------
# СОЕДИНЕНИЯ И АУТЕНТИФИКАЦИЯ
#------------------------------------------------------------------------------
# - Настройки соединения -
#listen_addresses="localhost" # какие IP-адреса прослушивать;
# запятая-разделенный список адресов;
# по умолчанию 'localhost'; используйте '*' для всех
# (изменение требует перезапуска)
port = 5432 # (изменение требует перезапуска)
max_connections = 100 # (изменение требует перезапуска)
#superuser_reserved_connections = 3 # (изменение требует перезапуска)
unix_socket_directories="/var/run/postgresql" # запятая-разделенный список каталогов
# (изменение требует перезапуска)
#unix_socket_group = '' # (изменение требует перезапуска)
#unix_socket_permissions = 0777 # начинайте с 0 для использования восьмеричного представления
# (изменение требует перезапуска)
#bonjour = off # рекламировать сервер через Bonjour
# (изменение требует перезапуска)
#bonjour_name="" # по умолчанию имя компьютера
# (изменение требует перезапуска)
# - Безопасность и аутентификация -
#authentication_timeout = 1min # 1s-600s
ssl = on
#ssl_ciphers="HIGH:MEDIUM:+3DES:!aNULL" # разрешенные шифры SSL
#ssl_prefer_server_ciphers = on
#ssl_ecdh_curve="prime256v1"
#ssl_dh_params_file=""
ssl_cert_file="/etc/ssl/certs/ssl-cert-snakeoil.pem"
ssl_key_file="/etc/ssl/private/ssl-cert-snakeoil.key"
#ssl_ca_file=""
#ssl_crl_file=""
#password_encryption = md5 # md5 или scram-sha-256
#db_user_namespace = off
#row_security = on
# GSSAPI с использованием Kerberos
#krb_server_keyfile=""
#krb_caseins_users = off
# - TCP Keepalives -
# смотрите "man 7 tcp" для получения подробностей
#tcp_keepalives_idle = 0 # TCP_KEEPIDLE, в секундах;
# 0 выбирает системное значение по умолчанию
#tcp_keepalives_interval = 0 # TCP_KEEPINTVL, в секундах;
# 0 выбирает системное значение по умолчанию
#tcp_keepalives_count = 0 # TCP_KEEPCNT;
# 0 выбирает системное значение по умолчанию
#------------------------------------------------------------------------------
# ИСПОЛЬЗОВАНИЕ РЕСУРСОВ (кроме WAL)
#------------------------------------------------------------------------------
# - Память -
shared_buffers = 512MB # мин 128kB
# (изменение требует перезапуска)
#huge_pages = try # включено, выключено или попробовать
# (изменение требует перезапуска)
#temp_buffers = 8MB # мин 800kB
#max_prepared_transactions = 0 # ноль отключает эту функцию
# (изменение требует перезапуска)
# Осторожно: не рекомендуется устанавливать max_prepared_transactions ненулевым значением, если
# вы не собираетесь активно использовать подготовленные транзакции.
#work_mem = 4MB # мин 64kB
#maintenance_work_mem = 64MB # мин 1MB
#replacement_sort_tuples = 150000 # ограничивает использование выборки с заменой
#autovacuum_work_mem = -1 # мин 1MB, или -1 для использования maintenance_work_mem
#max_stack_depth = 2MB # мин 100kB
dynamic_shared_memory_type = posix # по умолчанию это первый вариант
# поддерживается операционной системой:
# posix
# sysv
# windows
# mmap
# используйте none, чтобы отключить динамическую совместно используемую память
# (изменение требует перезапуска)
# - Диск -
#temp_file_limit = -1 # ограничения по временным файлам на процесс
# в кБ, или -1 для отсутствия лимита
# - Использование ресурсов ядра -
#max_files_per_process = 1000 # мин 25
# (изменение требует перезапуска)
#shared_preload_libraries="" # (изменение требует перезапуска)
# - Отсрочка затрат на вакуум -
#vacuum_cost_delay = 0 # 0-100 миллисекунд
#vacuum_cost_page_hit = 1 # 0-10000 кредитов
#vacuum_cost_page_miss = 10 # 0-10000 кредитов
#vacuum_cost_page_dirty = 20 # 0-10000 кредитов
#vacuum_cost_limit = 200 # 1-10000 кредитов
# - Фоновый писатель -
#bgwriter_delay = 200ms # 10-10000ms между раундами
#bgwriter_lru_maxpages = 100 # 0-1000 макс буферов, записанных/раунд
#bgwriter_lru_multiplier = 2.0 # 0-10.0 множитель на буферах, просканированных/раунд
#bgwriter_flush_after = 512kB # измеряется в страницах, 0 отключает
# - Асинхронное поведение -
#effective_io_concurrency = 1 # 1-1000; 0 отключает предвкушение
#max_worker_processes = 8 # (изменение требует перезапуска)
#max_parallel_workers_per_gather = 2 # взято из max_parallel_workers
#max_parallel_workers = 8 # максимальное количество max_worker_processes, которые
# могут использоваться в параллельных запросах
#old_snapshot_threshold = -1 # 1min-60d; -1 отключает; 0 немедленно
# (изменение требует перезапуска)
#backend_flush_after = 0 # измеряется в страницах, 0 отключает
#------------------------------------------------------------------------------
# ЖУРНАЛ ВПЕРЕД
#------------------------------------------------------------------------------
# - Настройки -
#wal_level = replica # минимальный, реплика или логический
# (изменение требует перезапуска)
#fsync = on # сбросить данные на диск для защиты от сбоев
# (выключение этого может вызвать
# необратимую порчу данных)
#synchronous_commit = on # уровень синхронизации;
# off, local, remote_write, remote_apply или on
#wal_sync_method = fsync # по умолчанию это первый вариант
# поддерживается операционной системой:
# open_datasync
# fdatasync (по умолчанию на Linux)
# fsync
# fsync_writethrough
# open_sync
#full_page_writes = on # восстанавливать из частичных записей страниц
#wal_compression = off # включить сжатие полных записей страниц
#wal_log_hints = off # также делать полные записи страниц критически важных обновлений
# (изменение требует перезапуска)
#wal_buffers = -1 # мин 32kB, -1 устанавливает на основе shared_buffers
# (изменение требует перезапуска)
#wal_writer_delay = 200ms # 1-10000 миллисекунд
#wal_writer_flush_after = 1MB # измеряется в страницах, 0 отключает
#commit_delay = 0 # диапазон 0-100000, в микросекундах
#commit_siblings = 5 # диапазон 1-1000
# - Контрольные точки -
#checkpoint_timeout = 5min # диапазон 30s-1d
#max_wal_size = 1GB
#min_wal_size = 80MB
#checkpoint_completion_target = 0.5 # целевая продолжительность контрольной точки, 0.0 - 1.0
#checkpoint_flush_after = 256kB # измеряется в страницах, 0 отключает
#checkpoint_warning = 30s # 0 отключает
# - Архивирование -
#archive_mode = off # включает архивирование; off, on или always
# (изменение требует перезапуска)
#archive_command = '' # команда для архивирования сегмента файла журнала
# заполнитель: %p = путь к файлу для архивирования
# %f = только имя файла
# напр. 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'
#archive_timeout = 0 # принудительное переключение сегмента файла журнала после этого
# числа секунд; 0 отключает
#------------------------------------------------------------------------------
# РЕПЛИКАЦИЯ
#------------------------------------------------------------------------------
# - Отправляющий сервер(ы) -
# Установите это на мастер-сервере и на любом резервном сервере, который будет отправлять данные репликации.
#max_wal_senders = 10 # максимальное количество процессов walsender
# (изменение требует перезапуска)
#wal_keep_segments = 0 # в сегментах файла журнала, по 16 МБ каждый; 0 отключает
#wal_sender_timeout = 60s # в миллисекундах; 0 отключает
#max_replication_slots = 10 # максимальное количество слотов репликации
# (изменение требует перезапуска)
#track_commit_timestamp = off # сбор временной метки коммита транзакции
# (изменение требует перезапуска)
# - Мастер-сервер -
# Эти настройки игнорируются на резервном сервере.
#synchronous_standby_names="" # резервные серверы, которые предоставляют синхронную репликацию
# метод для выбора синхронных резервов, количество синхронных резервов,
# и запятая-разделенный список application_name
# от резервов; '*' = все
#vacuum_defer_cleanup_age = 0 # количество xacts, по которому откладывается очистка
# - Резервные серверы -
# Эти настройки игнорируются на мастер-сервере.
#hot_standby = on # "off" запрещает запросы во время восстановления
# (изменение требует перезапуска)
#max_standby_archive_delay = 30s # максимальная задержка перед отменой запросов
# при чтении WAL из архива;
# -1 позволяет неограниченную задержку
#max_standby_streaming_delay = 30s # максимальная задержка перед отменой запросов
# при чтении потокового WAL;
# -1 позволяет неограниченную задержку
#wal_receiver_status_interval = 10s # отправлять ответы как минимум с такой частотой
# 0 отключает
#hot_standby_feedback = off # отправлять информацию с резервного сервера, чтобы предотвратить
# конфликты запросов
#wal_receiver_timeout = 60s # время, которое приемник ждет
# связи от мастера
# в миллисекундах; 0 отключает
#wal_retrieve_retry_interval = 5s # время ожидания перед повторной попыткой
# извлечь WAL после неудачной попытки
# - Подписчики -
# Эти настройки игнорируются на издателе.
#max_logical_replication_workers = 4 # взято из max_worker_processes
# (изменение требует перезапуска)
#max_sync_workers_per_subscription = 2 # взято из max_logical_replication_workers
#------------------------------------------------------------------------------
# НАСТРОЙКА ЗАПРОСОВ
#------------------------------------------------------------------------------
# - Конфигурация метода планировщика -
#enable_bitmapscan = on
#enable_hashagg = on
#enable_hashjoin = on
#enable_indexscan = on
#enable_indexonlyscan = on
#enable_material = on
#enable_mergejoin = on
#enable_nestloop = on
#enable_seqscan = on
#enable_sort = on
#enable_tidscan = on
# - Константы стоимости планировщика -
#seq_page_cost = 1.0 # измеряется по произвольной шкале
#random_page_cost = 4.0 # та же шкала, что и выше
#cpu_tuple_cost = 0.01 # та же шкала, что и выше
#cpu_index_tuple_cost = 0.005 # та же шкала, что и выше
#cpu_operator_cost = 0.0025 # та же шкала, что и выше
#parallel_tuple_cost = 0.1 # та же шкала, что и выше
#parallel_setup_cost = 1000.0 # та же шкала, что и выше
#min_parallel_table_scan_size = 8MB
#min_parallel_index_scan_size = 512kB
effective_cache_size = 1GB
# - Генетический оптимизатор запросов -
#geqo = on
#geqo_threshold = 12
#geqo_effort = 5 # диапазон 1-10
#geqo_pool_size = 0 # выбирает значение по умолчанию на основе усилия
#geqo_generations = 0 # выбирает значение по умолчанию на основе усилия
#geqo_selection_bias = 2.0 # диапазон 1.5-2.0
#geqo_seed = 0.0 # диапазон 0.0-1.0
# - Другие опции планировщика -
#default_statistics_target = 100 # диапазон 1-10000
#constraint_exclusion = partition # on, off или partition
#cursor_tuple_fraction = 0.1 # диапазон 0.0-1.0
#from_collapse_limit = 8
#join_collapse_limit = 8 # 1 отключает сжатие явных
# JOIN выражений
#force_parallel_mode = off
#------------------------------------------------------------------------------
# ОТЧЕТ ПО ОШИБКАМ И ЖУРНАЛИРОВАНИЕ
#------------------------------------------------------------------------------
# - Где журналировать -
#log_destination = 'stderr' # Допустимые значения - комбинации
# stderr, csvlog, syslog и eventlog,
# в зависимости от платформы. csvlog
# требует, чтобы logging_collector был включен.
# Это используется при журналировании в stderr:
#logging_collector = off # Включить захват stderr и csvlog
# в файлы журналов. Требуется, чтобы было включено для
# csvlogs.
# (изменение требует перезапуска)
# Эти опции используются только если logging_collector включен:
#log_directory = 'log' # каталог, куда записываются файлы журналов,
# может быть абсолютным или относительным к PGDATA
#log_filename="postgresql-%Y-%m-%d_%H%M%S.log" # шаблон имени файла журнала,
# может включать символы замены strftime()
#log_file_mode = 0600 # режим создания для файлов журналов,
# начинайте с 0 для использования восьмеричного представления
#log_truncate_on_rotation = off # Если включено, существующий файл журнала с тем же именем,
# что и новый файл журнала, будет
# обрезан, а не добавлен в него.
# Но такое обрезание происходит только на
# основе времени, а не при перезапусках
# или изменениях размера. По умолчанию -
# отключено, что означает добавление к существующим файлам
# во всех случаях.
#log_rotation_age = 1d # Автоматическая ротация файлов журналов
# произойдет после этого времени. 0 отключает.
#log_rotation_size = 10MB # Автоматическая ротация файлов журналов
# произойдет после этого объема вывода журнала.
# 0 отключает.
# Эти параметры актуальны при журналировании в syslog:
#syslog_facility = 'LOCAL0'
#syslog_ident="postgres"
#syslog_sequence_numbers = on
#syslog_split_messages = on
# Это актуально только при журналировании в eventlog (win32):
# (изменение требует перезапуска)
#event_source="PostgreSQL"
# - Когда журналировать -
#client_min_messages = notice # значения по убыванию детализации:
# debug5
# debug4
# debug3
# debug2
# debug1
# log
# notice
# warning
# error
#log_min_messages = warning # значения по убыванию детализации:
# debug5
# debug4
# debug3
# debug2
# debug1
# info
# notice
# warning
# error
# log
# fatal
# panic
#log_min_error_statement = error # значения по убыванию детализации:
# debug5
# debug4
# debug3
# debug2
# debug1
# info
# notice
# warning
# error
# log
# fatal
# panic (по сути отключен)
#log_min_duration_statement = -1 # -1 отключает, 0 записывает все выражения
# и их продолжительность, > 0 записывает только
# выражения, выполняющиеся как минимум такое количество
# миллисекунд
# - Что журналировать -
#debug_print_parse = off
#debug_print_rewritten = off
#debug_print_plan = off
#debug_pretty_print = on
#log_checkpoints = off
#log_connections = off
#log_disconnections = off
#log_duration = off
#log_error_verbosity = default # краткие, стандартные или подробные сообщения
#log_hostname = off
log_line_prefix = '%m [%p] %q%u@%d ' # специальные значения:
# %a = имя приложения
# %u = имя пользователя
# %d = имя базы данных
# %r = удалённый хост и порт
# %h = удалённый хост
# %p = ID процесса
# %t = временная метка без миллисекунд
# %m = временная метка с миллисекундами
# %n = временная метка с миллисекундами (как эпоха Unix)
# %i = тег команды
# %e = состояние SQL
# %c = ID сессии
# %l = номер строки сессии
# %s = временная метка начала сессии
# %v = виртуальный ID транзакции
# %x = ID транзакции (0, если нет)
# %q = остановитесь здесь в процессе без сессии
# процессы
# %% = '%'
# напр. '<%u%%%d> '
#log_lock_waits = off # журналировать ожидания блокировки >= deadlock_timeout
#log_statement="none" # none, ddl, mod, all
#log_replication_commands = off
#log_temp_files = -1 # журналировать временные файлы равные или большие
# чем указанный размер в килобайтах;
# -1 отключает, 0 записывает все временные файлы
log_timezone="localtime"
# - Заголовок процесса -
cluster_name="10/main" # добавляется к заголовкам процессов, если не пусто
# (изменение требует перезапуска)
#update_process_title = on
#------------------------------------------------------------------------------
# СТАТИСТИКА В РЕАЛЬНОМ ВРЕМЕНИ
#------------------------------------------------------------------------------
# - Сбор статистики запросов/индексов -
#track_activities = on
#track_counts = on
#track_io_timing = off
#track_functions = none # none, pl, all
#track_activity_query_size = 1024 # (изменение требует перезапуска)
stats_temp_directory = '/var/run/postgresql/10-main.pg_stat_tmp'
# - Мониторинг статистики -
#log_parser_stats = off
#log_planner_stats = off
#log_executor_stats = off
#log_statement_stats = off
#------------------------------------------------------------------------------
# ПАРАМЕТРЫ АВТОВАКУУМ
#------------------------------------------------------------------------------
#autovacuum = on # Включить подсистему автовакиума? 'on'
# требует включения track_counts.
#log_autovacuum_min_duration = -1 # -1 отключает, 0 записывает все действия и
# их продолжительности, > 0 записывает только
# действия, выполняющиеся как минимум такое количество
# миллисекунд.
#autovacuum_max_workers = 3 # максимальное количество процессов автовакиума
# (изменение требует перезапуска)
#autovacuum_naptime = 1min # время между запусками автовакиума
#autovacuum_vacuum_threshold = 50 # минимальное количество обновлений строк перед
# вакуумом
#autovacuum_analyze_threshold = 50 # минимальное количество обновлений строк перед
# анализом
#autovacuum_vacuum_scale_factor = 0.2 # доля размера таблицы перед вакуумом
#autovacuum_analyze_scale_factor = 0.1 # доля размера таблицы перед анализом
#autovacuum_freeze_max_age = 200000000 # максимальный возраст XID перед принудительным вакуумом
# (изменение требует перезапуска)
#autovacuum_multixact_freeze_max_age = 400000000 # максимальный возраст multixact
# перед принудительным вакуумом
# (изменение требует перезапуска)
#autovacuum_vacuum_cost_delay = 20ms # стандартная задержка затрат на вакуум для
# автовакиума, в миллисекундах;
# -1 означает использовать задержку затрат на вакуум
#autovacuum_vacuum_cost_limit = -1 # стандартный лимит затрат на вакуум для
# автовакиума, -1 означает использовать
# лимит затрат на вакуум
#------------------------------------------------------------------------------
# У DEFAULT СОЕДИНЕНИЯ КЛИЕНТА
#------------------------------------------------------------------------------
# - Поведение выражения -
#search_path=""$user", public" # имена схем
#default_tablespace="" # имя tablespace, '' использует значение по умолчанию
#temp_tablespaces="" # список имен tablespace, '' использует
# только значение по умолчанию
#check_function_bodies = on
#default_transaction_isolation = 'read committed'
#default_transaction_read_only = off
#default_transaction_deferrable = off
#session_replication_role="origin"
#statement_timeout = 0 # в миллисекундах, 0 отключает
#lock_timeout = 0 # в миллисекундах, 0 отключает
#idle_in_transaction_session_timeout = 0 # в миллисекундах, 0 отключает
#vacuum_freeze_min_age = 50000000
#vacuum_freeze_table_age = 150000000
#vacuum_multixact_freeze_min_age = 5000000
#vacuum_multixact_freeze_table_age = 150000000
#bytea_output="hex" # hex, escape
#xmlbinary = 'base64'
#xmloption = 'content'
#gin_fuzzy_search_limit = 0
#gin_pending_list_limit = 4MB
# - Локаль и формат -
datestyle="iso, mdy"
#intervalstyle="postgres"
timezone="localtime"
#timezone_abbreviations="Default" # Выберите набор доступных временных зон
# сокращений. В настоящее время есть
# Default
# Australia (историческое использование)
# India
# Вы можете создать свой собственный файл в
# share/timezonesets/.
#extra_float_digits = 0 # мин -15, макс 3
#client_encoding = sql_ascii # на самом деле, по умолчанию используется кодировка базы данных
# Эти настройки инициализируются initdb, но могут быть изменены.
lc_messages="C" # локаль для системных сообщений об ошибках
# строки
lc_monetary = 'C' # локаль для денежного форматирования
lc_numeric="C" # локаль для форматирования чисел
lc_time="C" # локаль для форматирования времени
# значение по умолчанию для текстового поиска
default_text_search_config = 'pg_catalog.english'
# - Другие значения по умолчанию -
#dynamic_library_path="$libdir"
#local_preload_libraries=""
#session_preload_libraries=""
#------------------------------------------------------------------------------
# УПРАВЛЕНИЕ БЛОКИРОВКАМИ
#------------------------------------------------------------------------------
#deadlock_timeout = 1s
#max_locks_per_transaction = 64 # мин 10
# (изменение требует перезапуска)
#max_pred_locks_per_transaction = 64 # мин 10
# (изменение требует перезапуска)
#max_pred_locks_per_relation = -2 # отрицательные значения означают
# (max_pred_locks_per_transaction
# / -max_pred_locks_per_relation) - 1
#max_pred_locks_per_page = 2 # мин 0
#------------------------------------------------------------------------------
# СОВМЕСТИМОСТЬ С ВЕРСИЯМИ/ПЛАТФОРМАМИ
#------------------------------------------------------------------------------
# - Предыдущие версии PostgreSQL -
#array_nulls = on
#backslash_quote = safe_encoding # on, off или safe_encoding
#default_with_oids = off
#escape_string_warning = on
#lo_compat_privileges = off
#operator_precedence_warning = off
#quote_all_identifiers = off
#standard_conforming_strings = on
#synchronize_seqscans = on
# - Другие платформы и клиенты -
#transform_null_equals = off
#------------------------------------------------------------------------------
# ОБРАБОТКА ОШИБОК
#------------------------------------------------------------------------------
#exit_on_error = off # завершить сессию при любой ошибке?
#restart_after_crash = on # повторно инициализировать после сбоя заднего плана?
#data_sync_retry = off # повторная попытка или паника при сбое fsync
# данных?
# (изменение требует перезапуска)
#------------------------------------------------------------------------------
# ВКЛЮЧЕНИЯ В ФАЙЛЕ КОНФИГУРАЦИИ
#------------------------------------------------------------------------------
# Эти параметры позволяют загружать настройки из файлов, отличных от
# файла postgresql.conf по умолчанию.
include_dir="conf.d" # включить файлы, заканчивающиеся на '.conf' из
# каталога, например, 'conf.d'
#include_if_exists="" # включить файл только если он существует
#include="" # включить файл
#------------------------------------------------------------------------------
# КАСТОМНЫЕ ПАРАМЕТРЫ
#------------------------------------------------------------------------------
# Добавьте настройки для расширений здесь
Это может быть не совсем удовлетворительный ответ с точки зрения восстановления причины ошибки; но я все равно опубликую свое решение…
У меня практически такая же настройка, использующая ODROID-HC2 и тот же образ Ubuntu.
Сначала я сделал резервную копию на уровне файловой системы /var/lib/postgresql/10/main
, следуя примеру из документации PostgreSQL
sudo tar -cf /mnt/backup/postgres_filebackup_$(date -I).tar /var/lib/postgresql/10/main
Затем я удалил текущий кластер с помощью pg_dropcluster 10 main
.
Затем я apt purge
d postgresql-10 и переустановил его. Установка создает кластер с правильными настройками локали и всем прочим. Новый, пустой кластер был успешно запущен.
После повторной остановки Postgres, обмена вновь созданными файлами в /var/lib/postgresql/10/main
с файлами в архиве резервной копии, я смог успешно перезапустить сервер… Уф 🙂
Надеюсь, это сработает и для вас.
Ответ или решение
Проблема запуска сервиса PostgreSQL на Armbian
Если вы столкнулись с проблемой запуска сервиса PostgreSQL 10.10 на устройстве Armbian (Ubuntu Bionic), особенно после внезапного отключения питания, существует ряд шагов, которые помогут вам диагностировать и решить эту проблему. Для начала важно рассмотреть сообщение об ошибке, которое вы получили:
Can't open PID file /var/run/postgresql/10-main.pid (yet?) after start: No such file or directory
Это сообщение указывает на то, что служба PostgreSQL не может создать или открыть файл PID (Process ID), необходимый для управления процессами сервера. Последующий анализ данной ошибки включает несколько ключевых аспектов.
1. Проверка состояния директории /var/run/postgresql
Вы уже упомянули, что директория /var/run/postgresql
существует и принадлежит пользователю postgres
. Это первый шаг. Убедитесь, что в этой директории есть необходимые права доступа:
ls -ld /var/run/postgresql
Вывод должен быть следующим (права могут варьироваться):
drwxr-s--- 2 postgres postgres 4096 Sep 14 14:03 /var/run/postgresql
Если права доступа неверные, исправьте их:
sudo chown postgres:postgres /var/run/postgresql
sudo chmod 755 /var/run/postgresql
2. Проверка логов PostgreSQL
Логи могут содержать дополнительную информацию о том, что происходит во время попытки запуска сервера. Проверьте файл лога, на который ссылается вывод ошибки:
cat /var/log/postgresql/postgresql-10-main.log
Ищите ошибки или предупреждения, которые могут дать больше информации о проблеме.
3. Файлы конфигурации
Проверьте файлы конфигурации PostgreSQL. Ваша конфигурация, найденная в /etc/postgresql/10/main/postgresql.conf
, выглядит корректно на первый взгляд. Убедитесь, что data_directory
указывает на правильную директорию:
data_directory = '/data/postgres/postgresql/10/main'
Попробуйте временно закомментировать настройку external_pid_file
, чтобы увидеть, изменится ли поведение:
#external_pid_file="/var/run/postgresql/10-main.pid"
4. Восстановление после сбоя
После проверки всех вышеуказанных пунктов, если проблема не будет решена, вы можете попробовать удалить существующий кластер, как вы и сделали, и переустановить PostgreSQL. Вот последовательность действий, которую вы указали в своём решении:
sudo pg_dropcluster 10 main
sudo apt purge postgresql-10
sudo apt install postgresql-10
Установка создаст новый кластер с корректными параметрами, что может решить проблемы, связанные с повреждением кластера после сбоя питания.
5. Восстановление данных
Когда новая установка будет успешной и PostgreSQL заработает, вы сможете восстановить необходимые данные:
- Сделайте резервную копию текущего состояния кластера:
sudo tar -cf /mnt/backup/postgres_filebackup_$(date -I).tar /var/lib/postgresql/10/main
- Замените данные восстановленными файлами из резервной копии.
Заключение
Проблема с запуском PostgreSQL после сбоя питания может быть решена последовательной диагностикой и восстановлением структуры кластера. Регулярное создание резервных копий и мониторинг состояния системы помогут избежать подобных ситуаций в будущем. Надеемся, что описанные шаги помогут вам восстановить работоспособность сервера PostgreSQL на вашем устройстве.