MongoDB не запускається після аварії сервера


76

Мій комп’ютер Ubuntu зазнав аварії, і коли я перезапустив його, MongoDB не працював. Я спробував наступні команди і отримав такий результат:

$ mongo
Error: couldn't connect to server 127.0.0.1:27017 src/mongo/shell/mongo.js:91
exception: connect failed

$ service mongodb status
mongodb stop/waiting

$ service mongodb restart
stop: Unknown instance: 
start: Rejected send message, 1 matched rules; type="method_call",
       sender=":1.57" (uid=1000 pid=2227 comm="start mongodb ")
       interface="com.ubuntu.Upstart0_6.Job" member="Start" error name="(unset)"
       requested_reply="0"
       destination="com.ubuntu.Upstart" (uid=0 pid=1 comm="/sbin/init")

$ tail /var/log/mongodb/mongodb.log
[initandlisten] exception in initAndListen: 12596 old lock file, terminating
dbexit: 
[initandlisten] shutdown: going to close listening sockets...
[initandlisten] shutdown: going to flush diaglog...
[initandlisten] shutdown: going to close sockets...
[initandlisten] shutdown: waiting for fs preallocator...
[initandlisten] shutdown: closing all files...
[initandlisten] closeAllFiles() finished
dbexit: really exiting now

(Результат переформатований відповідно до макета веб-сайту.)

Що трапилось? Як я можу це виправити?

Відповіді:


175

Файл журналу повідомляє, що у вас є "старий файл блокування" . MongoDB зберігає файл блокування під час запуску. Він створює цей файл під час його запуску та видаляє його після зупинки. Коли комп'ютер виходить з ладу (або MongoDB, наприклад, через kill), цей файл не видаляється, і, отже, база даних не запускається. Існування цього файлу свідчить про нечисте вимкнення MongoDB.

Можна зробити дві речі:

  1. Якщо це машина для розробки, і ви не використовували свою базу даних (і у вас немає програм), ви можете видалити файл вручну. Для MongoDB 2.2.2, що працює на Ubuntu 12.10, це /var/lib/mongodb/mongod.lock. Для інших версій файл може мати інший шлях або його можна назвати mongo.lock.

  2. Більш безпечний шлях - слідувати керівництву MongoDB щодо довговічності та ремонту . Таким чином, для машини з наведеною вище конфігурацією слід виконати такі команди:

    sudo -u mongodb mongod --repair --dbpath /var/lib/mongodb/
    sudo service mongod start
    


1
Шановний @HosamAly! Як я можу це вирішити, бо зазвичай сервер виходить з ладу. так що я повинен робити вручну після виходу сервера? це настільки погано, тому що інші бази даних (mysql, postgresql, ..) завжди успішно запускаються після збою сервера
Джон Нгуєн,

1
@JohnNguyen Ви могли б це автоматизувати, але я б цього не радив, оскільки ви не отримаєте шансу подивитися на збитки, які може бути заподіяний процесом "ремонту".
Хосам Алі

Чи не повинен перший рядок бути: sudo mongod -u mongodb --repair --dbpath / var / lib / mongodb /? - joshy 7 хв. Тому
joshy

@joshy Я не знаю, чи працює ваша версія. Шахта працює mongodз дозволами користувача "mongodb". Ваш запускає його з правами root.
Хосам Алі

3

мені потрібно було лише запустити: sudo mongod --repair

тоді:

sudo mongod


2
sudo mongodозначає, що ваша база даних працює як root, що не рекомендується з точки зору безпеки.
Хосам Алі

2

Виходячи зі свого досвіду, я зазвичай видаляю файл "mongod.lock", який знаходиться всередині папки бази даних - У моєму випадку:

* Я переглядаю місце встановлення бази даних на моєму ubuntu, тобто папку "дані". (Дані на компакт-дисках); перелічити файли (ls) * Потім я видалю файл "mongod.lock", який автоматично створювався при збої бази даних, видаючи файл "rm mongod.lock".

Після чого я або випущу "./mongod" для запуску монго-демона, або монго для запуску оболонки монго. І все буде добре.


1

Якщо ви не використовували такі інструменти , як моніторингу BluePill або монят і т.д. , вам доведеться зіткнутися з цією проблемою , тому що після аварії на сервері з - за яке - то причини Монго didnot почати свій демон автоматично , то ви повинні зробити його роботу вручну, як sudo service mongod restart я зрозумів це питання , але для цього потрібно ще кілька завдань, які потрібно виконати, будь ласка, переконайтеся, що ваш dbpath на /etc/mongod.confпочатку, перш ніж запускати ваш демон mongo.

Для мене це було

storage:
  dbPath: /var/lib/mongodb

Коли я вводжу mongodкоманду, вона показує мені, MongoDB starting : pid=10795 port=27017 dbpath=/data/db 64-bit host=xyz.comпереконайтеся, що ваш dbpath такий же, як згадано в /etc/mongod.conf

Для цього ви можете ввести, sudo mongod --dbpath /var/lib/mongodbа потім скористатися mongodкомандою, щоб запустити процес mongo з потрібного dbpath.

FYI: запустіть процес mongo за допомогою mongodкоманди


0

Перевірте, чи достатньо вільного місця на вашому сервері. Якщо місця не залишиться, mongodb не запуститься.


1
Це щось хороше перевірити, навіть якщо в цьому випадку воно неправильне.
asmacdo

0

Це, мабуть, не найкраще рішення, але якщо ви відчайдушні, можете спробувати це. Здавалося, для мене проблемою був лише журнал, тому я зробив такі кроки:

  1. Створіть новий каталог даних . Можливо / var / lib / mongodb2
  2. Оновіть свій mongod.conf, щоб вказати на новий каталог даних.
  3. Запустіть mongoDB.
  4. Якщо він успішно починається, ви можете знову вимкнути mongo і продовжити, інакше ви можете припинити читати тут.
  5. Знайдіть попередній каталог даних і скопіюйте файли для бази даних (баз даних) у ваш новий каталог даних (наприклад, admin.0 admin.1 admin.ns тощо)
  6. Почніть mongoDB знову (все ще використовуючи новий каталог даних)

Після завершення цих кроків (зайняло менше 5 хв.) Я працював, і всі дані виявилися нормальними.


0

Спасибі, хлопці. Ми також зіткнулися з проблемою, коли MongoDB перезавантажувався знову і знову, і він скаржився на старий файл блокування . Я зупинив MongoDB зі списку служб Windows, а потім видалив mongod.lockфайл. Після цього я зміг правильно запустити службу MongoDB, і вона працювала нормально.


0

Видалення .lockфайлу з каталогу даних mongo dbpathмені підходить .

напр sudo sudo rm {data-directory}/mongod.lock

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.