Thay đổi thư mục lưu trữ dữ liệu MongoDB


184

Cho đến bây giờ tôi vẫn chưa chỉ định thư mục dữ liệu MongoDB và chỉ có một phân vùng chính 30 GB.

Tôi vừa hết dung lượng và thêm một đĩa cứng mới. Làm cách nào tôi có thể chuyển dữ liệu của mình (rõ ràng là trong /var/lib/mongodb/) và định cấu hình MongoDB để mọi thứ chạy khỏi đĩa mới mà không ảnh hưởng đến cài đặt hiện tại của tôi?


Bạn cũng nên đảm bảo rằng các quyền của bạn trên điểm gắn kết mới có r + x: sudo chmod o+rx /mediaví dụ: nếu điểm gắn kết của bạn là media. R + x cần phải có sẵn cho các nhóm và người dùng 'khác' từ điểm gắn kết đầu tiên.
lời giới thiệu

Câu trả lời:


219

Câu trả lời ngắn gọn là --dbpaththam số trong MongoDB sẽ cho phép bạn kiểm soát thư mục MongoDB đọc và ghi dữ liệu từ đó.

mongod --dbpath / usr / local / mongodb-data

Sẽ bắt đầu mongodb và đặt các tập tin vào /usr/local/mongodb-data.

Tùy thuộc vào bản phân phối và cài đặt MongoDB của bạn, bạn cũng có thể định cấu hình mongod.conftệp để thực hiện việc này một cách tự động:

# Store data in /usr/local/var/mongodb instead of the default /data/db
dbpath = /usr/local/var/mongodb

Các gói Linux 10gen chính thức ( Ubuntu / Debian hoặc CentOS / Fedora ) có tệp cấu hình cơ bản được đặt /etc/mongodb.confvà dịch vụ MongoDB sẽ đọc thông tin này khi khởi động. Bạn có thể thực hiện thay đổi của bạn ở đây.


9
Trên hộp debian của tôi, nó là mongodb.conf, không phải mongod.conf
UpTheCalet

12
Tôi cập nhật /etc/mongodb.confmỗi giải pháp này. Sau đó, sau khi bắt đầu mongod, tôi thấy rằng /data/dbđã được sử dụng. Tại sao việc cập nhật mongodb.conf không ảnh hưởng đến nơi mongod lưu trữ db? (Lưu ý rằng việc sử dụng --dbpathđối số đã có hiệu quả.
Kevin Meredith

Trên hộp Fedora của tôi, nó đang /etc/mongodb.confcập nhật và hoạt động tốt với tôi.
tuxdna

4
Thư mục dữ liệu mới cần phải được chowngửi cho người dùng mongod cho các tập lệnh bắt đầu dịch vụ.
Pete Garafano

Làm thế nào để tôi làm chown?
chovy

102

Đã giải quyết nó trong 2 phút ngừng hoạt động :)
Chỉ cần di chuyển thư mục của bạn, thêm symlink, sau đó điều chỉnh quyền.

sudo service mongod stop
sudo mv mongodb /new/disk/mongodb/
sudo ln -s /new/disk/mongodb/ /var/lib/mongodb
sudo chown mongodb:mongodb /new/disk/mongodb/
sudo service mongod start

# test if mongodb user can access new location:
sudo -u mongodb -s cd /new/disk/mongodb/
# resolve other permissions issues if necessary
sudo usermod -a -G <newdisk_grp> mongodb

3
Tôi nghĩ rằng đây nên là câu trả lời. Tôi luôn thấy các liên kết tượng trưng là một giải pháp rất tốt và tôi quảng bá bất kỳ giải pháp nào sử dụng chúng thay đổi cấu hình, v.v.
chàng trai mograbi

Có lẽ không cần phải sử dụng. Bạn đang thiếu quyền + x thực thi đối với người dùng "khác" trên cây của dbpath chmod -R o+x /<home>. xem: stackoverflow.com/a/38193187/205049
oori

Tôi làm theo các hướng dẫn này (sử dụng dbpath trong một đĩa khác), tôi vẫn nhận được Permission denied: "/var/lib/mongodb"Đây là cách /home/../mongodb/mongodb/ trông giống như: drwxrwxr-x 3 mongodb mongodb 4096 oct 13 09:32 ../ drwxr-xr-x 2 mongodb nogroup 4096 oct 13 09:29 journal/ -rw------x 1 mongodb nogroup 67108864 sep 23 14:44 local.0* -rw------x 1 mongodb nogroup 16777216 sep 23 14:44 local.ns* -rwxr-xr-x 1 mongodb mongodb 0 oct 13 09:29 mongod.lock*
Machinerium

1
cần làm rõ nơi bạn đang ở trong thư mục nào khi bạn chạy mvlệnh, nếu bạn chạy lệnh mv từ bên trong lib, bạn không còn có mongodb lnđến
Andy

1
Tôi đã thử giải pháp của bạn nhưng khi tôi khởi động lại ứng dụng, nó lại báo lỗi sau - 2019-11-18T18: 58: 45.215 + 1100 I STORAGE [initandlisten] ngoại lệ trong initAndListen: 28596 Không thể xác định trạng thái của tệp khóa trong thư mục dữ liệu / var / lib / mongo: boost :: filesystem :: status: Quyền bị từ chối: "/var/lib/mongo/mongod.lock", chấm dứt
Arun

33

Lệnh sau sẽ hoạt động cho bạn, nếu bạn muốn thay đổi đường dẫn mặc định. Chỉ cần gõ này trong thư mục bin của mongodb.

mongod --dbpath=yourdirectory\data\db

Trong trường hợp bạn cũng muốn di chuyển dữ liệu hiện có, thì chỉ cần sao chép tất cả các thư mục từ thư mục data \ db hiện có sang thư mục mới trước khi bạn thực hiện lệnh.

Và cũng dừng các dịch vụ mongodb hiện đang chạy.


1
Điều này cũng hoạt động trên Linux. Tôi đã tạo một thư mục có tên "data" bên cạnh tập lệnh mondod và chạy nó như thế này: ./mongod --dbpath = data
cagdasalagoz

29

Tạo một tệp có tên mongod.cfg trong thư mục MongoDB nếu bạn không có nó. Trong trường hợp của tôi: C: \ Users \ ivanbtrujillo \ MongoDB

Sau đó, chỉnh sửa mongod.cfg bằng notepad và thêm một dòng với dòng sau (dbpath tùy chỉnh của chúng tôi):

dbpath=C:\Users\ivanbtrujillo\MongoDB\data\db

Trong tập tin này, bạn cũng nên đặc biệt hóa logpath. Tập tin mongod.cfg của tôi là:

logpath=C:\Users\ivanbtrujillo\MongoDB\log\mongo.log
dbpath=C:\Users\ivanbtrujillo\MongoDB\data\db

Nếu bạn sử dụng mongoDB làm dịch vụ windows, bạn phải thay đổi khóa này và đặc biệt hóa tệp mongod.cfg.

Để cài đặt mongodb như một dịch vụ windows chạy lệnh này:

**"C:\Users\ivanbtrujillo\MongoDB\bin\mongod.exe" --config "C:\Users\ivanbtrujillo\MongoDB\mongod.cfg" install**

Mở regedit.exe và đi đến tuyến đường sau:

HKEYLOCALMACHINE\SYSTEM\CurrentControlSet\services\MongoDB

Dịch vụ MongoDB không hoạt động, chúng tôi phải chỉnh sửa khóa ImagePath, xóa nội dung của nó và đặt như sau:

**"C:\Users\ivanbtrujillo\MongoDB\bin\mongod.exe" --config "C:\Users\ivanbtrujillo\MongoDB\mongod.cfg" 
--logpath="C:\Users\ivanbtrujillo\MongoDB\log\mongo.log" service**

Chúng tôi chỉ ra cho tập tin cấu hình mongo và logpath của nó.

Sau đó, khi bạn khởi tạo dịch vụ mongodb, nó hoạt động.

Dưới đây là hướng dẫn đầy đủ để cài đặt mongoDB trong windows: http://ivanbtrujillo.herokuapp.com/2014/07/24/installing-mongodb-as-a-service-windows/

Hy vọng nó giúp,


1
MongoDB 2.6 và mới hơn sử dụng tệp cấu hình YAML. Định dạng cũ vẫn được hỗ trợ để tương thích ngược, nhưng bạn có thể muốn sử dụng định dạng mới. Chi tiết tại đây .
gronostaj 16/07/2015

biến dbpath cũng tồn tại cho linux. Tìm trong /etc/mongod.conf.
xpros

23

Sao chép nội dung của /var/lib/mongodbđể /data/db. Các tập tin bạn nên tìm kiếm nên có tên như your_db_name.nsyour_dbname.nnơi nlà một số bắt đầu với 0. Nếu bạn không thấy file đó theo /var/lib/mongodb, tìm kiếm chúng trên hệ thống tập tin của bạn.

Sau khi sao chép, sử dụng --dbpath=/data/dbkhi bắt đầu MongoDB thông qua mongodlệnh.


Có cách nào để điều này xảy ra mỗi khi máy chủ khởi động lại không?
dùng4951

1
@JimThio bạn có thể thêm công tắc này vào tập lệnh shell bắt đầu mongodb. Thông thường đó là /etc/init.d/mongod hoặc /etc/init.d/mongodb.
tôm hùm1234

19

Đây là những gì tôi đã làm, hy vọng nó hữu ích cho bất cứ ai khác:

Các bước:

  1. Dừng dịch vụ của bạn đang sử dụng mongodb
  2. Dừng mongod - cách làm của tôi là với tệp RC của tôi /etc/rc.d/rc.mongod stop, nếu bạn sử dụng cái gì khác, như systemd, bạn nên kiểm tra tài liệu của mình để làm điều đó
  3. Tạo một thư mục mới trên đĩa cứng mới -mkdir /mnt/database
  4. Đảm bảo rằng mongodb có đặc quyền đọc / ghi từ thư mục đó (thường chown mongodb:mongodb -R /mnt/database/mongodb) - cảm ơn @DanailGabenski.
  5. Sao chép thư mục dữ liệu của mongodb của bạn sang vị trí mới -cp -R /var/lib/mongodb/ /mnt/database/
  6. Xóa thư mục cơ sở dữ liệu cũ -rm -rf /var/lib/mongodb/
  7. Tạo liên kết tượng trưng đến thư mục cơ sở dữ liệu mới -ln -s /mnt/database/mongodb /var/lib/mongodb
  8. Bắt đầu mongod -/etc/rc.d/rc.mongod start
  9. Kiểm tra nhật ký của mongod của bạn và kiểm tra độ tỉnh táo (thử mongokết nối với cơ sở dữ liệu của bạn để xem mọi thứ có ổn không)
  10. Bắt đầu dịch vụ của bạn mà bạn đã dừng ở điểm 1

Không cần phải nói rằng bạn nên cẩn thận khi bạn làm điều này, đặc biệt với rm -rfnhưng tôi nghĩ đây là cách tốt nhất để làm điều đó.

Bạn không bao giờ nên cố gắng sao chép thư mục cơ sở dữ liệu trong khi mongod đang chạy, bởi vì có thể có các dịch vụ ghi / đọc từ nó sẽ thay đổi nội dung cơ sở dữ liệu của bạn.


1
Mặc dù một câu trả lời cũ, nó đã làm việc một phần cho tôi. Bạn cũng cần đảm bảo rằng người dùng mongodb sở hữu thư mục mới và symlik để nó hoạt động. chown mongodb:mongodb -R /mnt/database/mongodb
Danail Gabenski

3
Tại điểm 5, tạo lệnh để trông giống như cp -rp / var / lib / mongodb / / mnt / cơ sở dữ liệu / Điều này sẽ giữ quyền sở hữu và sự cho phép của thư mục nguyên vẹn.
Ketan Ghumatkar

Tôi đã thử giải pháp của bạn nhưng khi tôi khởi động lại ứng dụng, nó lại báo lỗi sau - 2019-11-18T18: 58: 45.215 + 1100 I STORAGE [initandlisten] ngoại lệ trong initAndListen: 28596 Không thể xác định trạng thái của tệp khóa trong thư mục dữ liệu / var / lib / mongo: boost :: filesystem :: status: Quyền bị từ chối: "/var/lib/mongo/mongod.lock", chấm dứt
Arun

10

Nếu được cài đặt qua apt-getUbuntu 12.04, đừng quên chown -R mongodb:nogroup /path/to/new/directory. Ngoài ra, thay đổi cấu hình tại /etc/mongodb.conf.

Xin nhắc lại, mongodb-10gengói hiện được bắt đầu thông qua khởi động, vì vậy tập lệnh cấu hình nằm trong/etc/init/mongodb.conf

Tôi vừa mới trải qua điều này, hy vọng các nhân viên của Google thấy nó hữu ích :)


1

Đối với tôi, người dùng đã mongodthay vìmongodb

sudo chown mongod:mongod /newlocation

Bạn có thể thấy các bản ghi lỗi nếu dịch vụ không thành công:

/var/log/mongodb/mongod.log


0

Trong debian / ubfox, bạn sẽ cần chỉnh sửa tập lệnh /etc/init.d/mongodb. Thực sự, tệp này sẽ kéo các cài đặt từ /etc/mongodb.conf nhưng dường như không kéo được thư mục mặc định (có thể là một lỗi)

Đây là một chút hack, nhưng thêm chúng vào kịch bản đã khiến nó bắt đầu chính xác:

thêm vào:

DBDIR=/database/mongodb

thay đổi:

DAEMON_OPTS=${DAEMON_OPTS:-"--unixSocketPrefix=$RUNDIR --config $CONF run"}

đến:

DAEMON_OPTS=${DAEMON_OPTS:-"--unixSocketPrefix=$RUNDIR --dbpath $DBDIR --config $CONF run"}

Điều gì nếu bạn muốn đặt cơ sở dữ liệu trong thư mục nhà của bạn thay vì root?
JesseBoyd
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.