PostgreSQL 11: Ошибка [57P03]: ФАТАЛЬНО: система базы данных находится в режиме восстановления - PullRequest
0 голосов
/ 17 января 2020

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

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

CREATE EXTENSION plpython3u;

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

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

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

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

Но при ее выполнении выдается следующая ошибка:

SQL Ошибка [57P03]: ФАТАЛЬНО: система баз данных находится в режиме восстановления

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

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'

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

Ответы [ 2 ]

2 голосов
/ 17 января 2020

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

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

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

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

0 голосов
/ 17 января 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...