MongoDB sẽ không bắt đầu sau sự cố máy chủ


76

Máy tính Ubuntu của tôi đã bị lỗi và khi tôi khởi động lại thì MongoDB không hoạt động. Tôi đã thử các lệnh sau và nhận được kết quả sau:

$ 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

(Đầu ra được định dạng lại để phù hợp với bố cục trang web.)

Chuyện gì đã xảy ra? Làm thế nào tôi có thể sửa chữa nó?

Câu trả lời:


175

Tệp nhật ký cho bạn biết rằng bạn có "tệp khóa cũ" . MongoDB giữ một tệp khóa khi nó đang chạy. Nó tạo tệp này khi nó được khởi động và xóa nó khi nó dừng lại. Khi máy tính gặp sự cố (hoặc MongoDB bị treo, ví dụ như qua kill), tệp này sẽ không bị xóa và do đó cơ sở dữ liệu không khởi động. Sự tồn tại của tệp này cho biết MongoDB đã tắt không sạch.

Hai điều có thể được thực hiện:

  1. Nếu đây là một máy phát triển và bạn chưa sử dụng cơ sở dữ liệu của mình (và cả các chương trình của bạn), bạn có thể xóa tệp theo cách thủ công. Đối với MongoDB 2.2.2 chạy trên Ubuntu 12.10, nó có trong /var/lib/mongodb/mongod.lock. Đối với các phiên bản khác, tệp có thể ở một đường dẫn khác hoặc có thể được đặt tên mongo.lock.

  2. Cách an toàn hơn là làm theo hướng dẫn về Độ bền và Sửa chữa của MongoDB . Tóm lại, đối với máy có cấu hình trên, bạn nên thực hiện các lệnh sau:

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

2
Đối với Windows, hãy xem stackoverflow.com/questions/11877930/…
TrueWill

1
Kính gửi @HosamAly, Làm cách nào để giải quyết vấn đề này, vì máy chủ thường bị treo. vì vậy tôi phải làm thủ công sau khi máy chủ bị treo? này là rất xấu, bởi vì những người khác cơ sở dữ liệu (mysql, postgresql, ..) luôn bắt đầu thành công sau khi máy chủ bị rơi
John Nguyễn

1
@JohnNguyen Bạn có thể tự động hóa nó, nhưng tôi khuyên bạn không nên làm điều đó, vì bạn sẽ không có cơ hội xem xét những hư hỏng có thể do quá trình "sửa chữa" gây ra.
Hosam Aly

Dòng đầu tiên không được giả sử là: sudo mongod -u mongodb --repair --dbpath / var / lib / mongodb /? - joshy 7 phút trước
joshy

@joshy Tôi không biết liệu phiên bản của bạn có hoạt động không. Của tôi chạy mongodvới quyền người dùng "mongodb". Yours chạy nó với quyền root.
Hosam Aly

3

tất cả những gì tôi phải làm là chạy: sudo mongod --repair

sau đó:

sudo mongod


2
sudo mongodcó nghĩa là cơ sở dữ liệu của bạn đang chạy dưới dạng root, điều này không được khuyến nghị theo quan điểm bảo mật.
Hosam Aly

2

Dựa trên kinh nghiệm của mình, tôi thường xóa tệp "mongod.lock" nằm trong thư mục cơ sở dữ liệu - Trong trường hợp của tôi:

* Tôi duyệt đến nơi cơ sở dữ liệu được cài đặt trên ubuntu của tôi tức là thư mục "dữ liệu". (Dữ liệu cd); liệt kê các tệp (ls) * Sau đó, tôi sẽ xóa tệp "mongod.lock" được tạo tự động khi cơ sở dữ liệu gặp sự cố, bằng cách phát hành tệp "rm mongod.lock".

Sau đó, tôi sẽ đưa ra "./mongod" để bắt đầu deamon mongo hoặc mongo để khởi động trình bao mongo. Và mọi thứ sẽ ổn thôi.


1

Nếu bạn không sử dụng các công cụ giám sát như Bluepill hoặc Monit, v.v., bạn sẽ phải đối mặt với vấn đề này vì sau khi máy chủ gặp sự cố do một số lý do mongo không tự động khởi động daemon của nó thì bạn phải làm cho nó hoạt động theo cách thủ công, giống như sudo service mongod restart tôi đã tìm ra vấn đề này nhưng nó cần một số nhiệm vụ khác cần được thực hiện, vui lòng đảm bảo rằng dbpath của bạn tại/etc/mongod.conf trước khi khởi động daemon mongo của bạn.

Đối với tôi đó là

storage:
  dbPath: /var/lib/mongodb

Khi tôi nhập mongodlệnh, nó sẽ hiển thị cho tôiMongoDB starting : pid=10795 port=27017 dbpath=/data/db 64-bit host=xyz.com rằng dbpath của bạn giống như được đề cập trong /etc/mongod.conf

Để làm điều này, bạn có thể nhập sudo mongod --dbpath /var/lib/mongodbvà sau đó sử dụngmongod lệnh để bắt đầu quá trình mongo của bạn tại dbpath mong muốn của bạn.

FYI: bắt đầu quy trình mongo của bạn bằng mongodlệnh


0

Kiểm tra xem bạn có đủ dung lượng trống trên máy chủ của mình không. Nếu không còn chỗ trống, mongodb sẽ không bắt đầu.


1
Đây là điều tốt để kiểm tra, ngay cả khi nó không chính xác trong trường hợp này.
asmacdo

0

Đây có lẽ không phải là giải pháp tốt nhất, nhưng nếu tuyệt vọng, bạn có thể thử cách này. Có vẻ như chỉ có tạp chí là vấn đề đối với tôi, vì vậy tôi đã thực hiện các bước sau:

  1. Tạo một thư mục dữ liệu mới . Có thể / var / lib / mongodb2
  2. Cập nhật mongod.conf của bạn để trỏ đến dir dữ liệu mới.
  3. Khởi động mongoDB.
  4. Nếu nó bắt đầu thành công, thì bạn có thể tắt mongo một lần nữa và tiếp tục, nếu không bạn có thể dừng đọc tại đây.
  5. Xác định vị trí dir dữ liệu trước đó của bạn và sao chép các tệp cho (các) cơ sở dữ liệu của bạn vào thư mục dữ liệu mới (ví dụ: admin.0 admin.1 admin.ns, v.v.)
  6. Khởi động lại mongoDB (vẫn sử dụng thư mục dữ liệu mới)

Sau khi hoàn thành các bước này (mất chưa đến 5 phút), tôi đã thiết lập và chạy và tất cả dữ liệu dường như ổn.


0

Cảm ơn các bạn. Chúng tôi cũng gặp phải sự cố trong đó MongoDB khởi động lại nhiều lần và phàn nàn về tệp khóa cũ . Tôi đã dừng MongoDB khỏi danh sách dịch vụ của Windows và sau đó tôi đã xóa mongod.locktệp. Sau đó, tôi đã có thể khởi động dịch vụ MongoDB một cách chính xác và nó hoạt động tốt.


0

Xóa .locktệp khỏi thư mục dữ liệu mongo dbpathphù hợp với tôi.

ví dụ sudo sudo rm {data-directory}/mongod.lock

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.