PostgreSQL 11: ошибка [57P03]: FATAL: система базы данных находится в режиме восстановления

Я пытаюсь заставить язык plpython3u работать в PostgreSQL 11 (я работаю на компьютере с Windows 10).

Мне удалось успешно установить его с помощью следующей команды.

CREATE EXTENSION plpython3u;

Мне пришлось загрузить python36.dll и сохранить его в C:\Windows\System32, чтобы успешно выполнить это, потому что ранее я получал следующую ошибку.

не удалось загрузить библиотеку "C:/Program Files/PostgreSQL/11/lib/plpython3.dll": указанный модуль не найден.

Чтобы проверить установку, я попытался создать следующую функцию, которую я получил из PostgreSQL Docs< /а>.

CREATE FUNCTION pymax (a integer, b integer)
  RETURNS integer
AS $$
  if a > b:
    return a
  return b
$$ LANGUAGE plpython3u;

Но его выполнение дает мне следующую ошибку.

Ошибка SQL [57P03]: FATAL: система базы данных находится в режиме восстановления

Вот что я получил из журналов.

Current thread 0x000035b8 (most recent call first):
2020-01-16 20:10:17.136 CST [6980] LOG:  server process (PID 12532) was terminated by exception 0xC0000409
2020-01-16 20:10:17.136 CST [6980] DETAIL:  Failed process was running: CREATE FUNCTION public.pymax (a integer, b integer)

      RETURNS integer

    AS $$

      if a > b:

        return a

      return b

    $$ LANGUAGE plpython3u
2020-01-16 20:10:17.136 CST [6980] HINT:  See C include file "ntstatus.h" for a description of the hexadecimal value.
2020-01-16 20:10:17.136 CST [6980] LOG:  terminating any other active server processes
2020-01-16 20:10:17.229 CST [5636] WARNING:  terminating connection because of crash of another server process
2020-01-16 20:10:17.229 CST [5636] DETAIL:  The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.
2020-01-16 20:10:17.229 CST [5636] HINT:  In a moment you should be able to reconnect to the database and repeat your command.
2020-01-16 20:10:17.246 CST [6980] LOG:  all server processes terminated; reinitializing
2020-01-16 20:10:17.373 CST [4944] LOG:  database system was interrupted; last known up at 2020-01-16 20:09:02 CST
2020-01-16 20:10:17.392 CST [9880] FATAL:  the database system is in recovery mode
2020-01-16 20:10:17.509 CST [11412] FATAL:  the database system is in recovery mode
2020-01-16 20:10:17.623 CST [12472] FATAL:  the database system is in recovery mode
2020-01-16 20:10:17.730 CST [12480] FATAL:  the database system is in recovery mode
2020-01-16 20:10:17.843 CST [12432] FATAL:  the database system is in recovery mode
2020-01-16 20:10:17.951 CST [12492] FATAL:  the database system is in recovery mode
2020-01-16 20:10:18.060 CST [12744] FATAL:  the database system is in recovery mode
2020-01-16 20:10:18.175 CST [12160] FATAL:  the database system is in recovery mode
2020-01-16 20:10:18.298 CST [13084] FATAL:  the database system is in recovery mode
2020-01-16 20:10:18.828 CST [4944] LOG:  database system was not properly shut down; automatic recovery in progress
2020-01-16 20:10:18.835 CST [4944] LOG:  redo starts at 0/17FF400
2020-01-16 20:10:18.835 CST [4944] LOG:  redo done at 0/17FF438
2020-01-16 20:10:19.044 CST [6980] LOG:  database system is ready to accept connections
Fatal Python error: Py_Initialize: unable to load the file system codec
ModuleNotFoundError: No module named 'encodings'

Любая помощь будет оценена.


person Bilesh Ganguly    schedule 17.01.2020    source источник


Ответы (2)


Мне пришлось скачать python36.dll и сохранить в C:\Windows\System32

Из-за отсутствия контроля версий библиотеки, того факта, что каталог, содержащий исполняемый файл, всегда находится на пути к общей библиотеке, и вытекающей из этого небрежной привычки хранить случайные копии одной и той же общей библиотеки в разных каталогах, пользователи Windows привыкли загружать исполняемый файл. код откуда-то в Интернете и запустить его.

Это опасная и вредная практика. Очевидно, у вас неправильное воплощение разделяемой библиотеки Python, или вам не хватает каких-то других важных файлов, и, как следствие, PostgreSQL аварийно завершает работу при ее использовании.

Удалите все файлы DLL из мошеннических загрузок, получите установочный пакет Python 3 и установите его обычным способом.

person Laurenz Albe    schedule 17.01.2020

Как предположил Laurenz Albe в своем ответе, ошибка, скорее всего, была вызвана загруженным мной файлом DLL.

Далее следует то, чему я следовал.

  1. Удалите расширение, используя DROP EXTENSION plpython3u
  2. Удалите скачанный python36.dll из C:\Windows\System32
  3. Удалите все установленные версии Python на моем компьютере
  4. Скачал и установил (для всех пользователей) 64-разрядную версию Python 3.6 (потому что plpython3.dll именно этого и ожидал)
  5. Добавлен путь Python к переменной Path переменных среды (я сделал это во время установки Python).
  6. Снова установите расширение, используя CREATE EXTENSION plpython3u (удалось успешно создать расширение)

Я смог успешно протестировать это, используя следующий пример функции.

Пример кода:

CREATE FUNCTION pymax (a integer, b integer)
  RETURNS integer
AS $$
  if a > b:
    return a
  return b
$$ LANGUAGE plpython3u;

Запрос

SELECT pymax(4,2)

Вывод

4
person Bilesh Ganguly    schedule 17.01.2020