Не удалось сохранить состояние транзакции, так как отсутствует коллекция транзакций сеанса - PullRequest
0 голосов
/ 09 января 2019

Я случайно удалил все базы данных из моей базы данных mongo. Затем я попытался вставить документ в новую базу данных. Выдает ошибку «Невозможно сохранить состояние транзакции, поскольку коллекция транзакций сеанса отсутствует. Это означает, что коллекция config.transactions была удалена вручную.»

Код моего образца:

doc_client = MongoClient(host=host,
                         port=port,
                         connect=True,  # Connect on first operation to avoid multi-threading related errors
                         j=True,  # Requests only return once write has hit the DB journal
                         )
print(doc_client.database_names()) # It works fine
doc_client['test'].insert({'a': 'ss'}) # Throws Error

1 Ответ

0 голосов
/ 14 января 2019

Я случайно удалил все базы данных из моей базы данных mongo

Вероятно, вы также удалили коллекцию config.transactions . Это коллекция для внутреннего использования, в которой хранятся записи, используемые для поддержки повторяющихся записей для наборов реплик и сегментированных кластеров. См. Также Базы данных конфигурации .

Начиная с MongoDB v3.6 +, пользователи не смогут удалить базу данных config из набора реплик из оболочки mongo . Хотя если вы подключаетесь с использованием оболочки mongo до версии 3.6, вы все равно можете это сделать, убедитесь, что обновили оболочку в соответствии с версией сервера.

"Невозможно сохранить состояние транзакции, поскольку коллекция транзакций сеанса отсутствует. Это указывает на то, что коллекция config.transactions была удалена вручную."

Вы можете вручную заново создать коллекцию на первичном узле:

use config
db.createCollection("transactions");

В качестве альтернативы, выборы набора реплик также автоматически воссоздают его. Это связано с тем, что создание коллекции config.transactions является частью шага узла реплики. session_catalog_mongod.cpp # L156

Новая коллекция config.transactions будет реплицирована на вторичные серверы после того, как первичный завершит фазу догоняющего.

...