KiemTienOnline360

Chia sẻ hành trình kiếm tiền online bắt đầu từ con số 0

Kiến thức lập trình, Kỹ nghệ phần mềm

Hướng dẫn cài đặt và sử dụng MongoDB

Hướng dẫn cài đặt và sử dụng MongoDB

Hướng dẫn cài đặt và sử dụng MongoDB

Chia sẻ bài viết
5
(1)

Cài đặt MongoDB

Cài đặt trên Ubuntu

Chi tiết cài đặt tham khảo bài viết: How to Install MongoDB on Ubuntu 16.04

Các lệnh cài đặt như sau:

// Cài đặt
wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
sudo apt-get update
sudo apt-get install -y mongodb-org

// Kiểm tra
mongo --version

Các lệnh start/stop server:

// Mongo tự động chạy khi server bật
sudo systemctl enable mongod

// Start mongo
sudo systemctl start mongod

// Restart mongo
sudo systemctl restart mongod

// Xem trạng thái mongo
sudo systemctl status mongod

Mặc định sau khi cài đặt thì chỉ cho phép kết nối DB qua local thôi, để có thể kết nối từ client bất kỳ bạn phải sửa têp /etc/mongod.conf:
Tìm dòng:
bindIp: 127.0.0.1
thành
bindIp: 0.0.0.0

Sau đó restart lại mongo. Việc mở thế này rất rủi ro, vì thế bạn phải cấu hình Firewall để chỉ một số IP có thể kết nối đến thôi.

Cài đặt trên Windows

Trên Windows bạn chỉ cần tải tệp cài đặt về rùi chạy. Chi tiết xem: Cài đặt cơ sở dữ liệu MongoDB trên Windows

Một số thao tác cơ bản trên MongoDB

Lệnh kết nối vào tạo Database

Lệnh kết nối database:

// Kết nối DB trên local, không yêu cầu xác thực
mongo mongodb://127.0.0.1/MyDatabase

// Kết nối DB trên local, có yêu cầu xác thực
mongo mongodb://testuser:MatKhauManh@127.0.0.1/MyDatabase

Một số lệnh cơ bản trên DB

// Hiển thị các DB hiện có
show databases
show dbs

// Chọn một DB
use MyDatabase

// Xóa một Database
user MyDatabase
db.dropDatabase()

// Hiển thị các Collections trong DB hiện tại
show collections

// Lệnh tạo một collection mới
db.createCollection("NewCollection")

// Lệnh xóa 1 collection
db.NewCollection.drop()

// Thao tác trên 1 collection
db.<Collection>.<function>(<param>)
db.getCollection("<Collection>".<function>(<param>)

Để tạo DB mới thì bạn sử dụng lệnh use, sau đó tạo ít nhất 1 collection trên DB mới:

use NewDatabase
db.createCollection("users")

Tạo user cho một database

Để tạo user cho DB, bạn sử dụng lệnh sau:

use MyDatabase
db.createUser({user:"testuser", pwd:"MatKhauManh", roles:[{ role: "root", db: "admin" }]});

Sau khi tạo xong bạn có thể thử kết nối đến DB bằng lệnh:

mongo mongodb://testuser:MatKhauManh@localhost/NewDatabase

Xuất nhập dữ liệu

Để xuất dữ liệu ta dụng lệnh mongodump trên command line:

mongodump --uri mongodb://testuser:MatKhauManh@localhost/MyDatabase -o backup

Để xuất dữ liệu từ lệnh trên mongo ra tệp, sử dụng lệnh sau:

mongo mongodb://testuser:MatKhauManh@localhost/MyDatabase --eval "db.currencystatuses.find().pretty()" > sample.json 

Để import dữ liệu ta dùng lệnh mongostore:

mongorestore --uri mongodb://testuser:MatKhauManhj@127.0.0.1/MyDatabase --dir ./backup

Muốn xuất dữ liêu

Thao tác trên các Collections

Một số lệnh thao tác cơ bản

Cú pháp chung thao tác chung với Collection:

// Cú pháp chung
db.[Tên collection].[Tên hàm 1]([Tham số]).[Tên hàm 2]([Tham số])...

Một số lệnh hay dùng:

// Đếm số bản ghi trong một collection
db.MyCollection.countDocuments({})
db.MyCollection.countDocuments({name: "test"})

// Đổi tên collection
db.MyCollection.renameCollection("NewCollection")

// Hiển thị tất cả bản ghi
db.MyCollection.find({})

// Tìm và hiển thị 10 bản ghi
db.MyCollection.find({}).limit(10)

// Tìm và hiển thị 10 bản ghi, mỗi bản ghi chỉ lấy một số trường xác định
// Ví dụ: item, status và _id
// Trường _id mặc định luôn có trừ khi bạn báo rõ là không lấy nó.
db.MyCollection.find({}, { item: 1, status: 1}).limit(10)

// Tìm và hiển thị 10 bản ghi, mỗi bản ghi chỉ lấy một số trường xác định
// VD: item, status
db.MyCollection.find({}, { item: 1, status: 1, _id: 0}).limit(10)

// Tìm và hiển thị 10 bản ghi nhưng hiển thị dễ nhìn hơn
db.MyCollection.find({}).limit(10).pretty()

// Hiển thị 10 bản ghi mới nhất
db.MyCollection.find({}).sort({createdAt: -1}).limit(10).pretty()

Copy bảng ghi collection sang collection khác

Cách 1: Sử dụng lệnh clone qua hàm:

// Chạy 1 lệnh
db.runCommand(command)

// Ví dụ => Chưa chạy thật :))
use marketing
db.runCommand( { clone: "db1.example.net:27017" })

Cách 2: Sử dụng kết hợp lệnh find() và insert() như sau:

Copy trong cùng Database:

use MyDatabase
db.createCollection("MyCollection_BK");
db.MyCollection.find({}).forEach(function(item) {
  db.MyCollection_BK.insert(item);
});

Copy trên Database khác nhau:

use MyDatabase
db.MyCollection.find({}).forEach(function(item) {
  db.getSiblingDB('MyOtherDatabase')['MyOtherCollection'].insert(item);
});

Tìm kiếm các bản ghi theo yêu cầu

Bạn sử dụng lệnh find(), findOne() để tìm kiếm các bản ghi theo yêu cầu của mình. Ngoài ra bạn có thể kết hợp với lệnh sort(), limit(), pretty() để nhiều cách hiển thị hơn. Cú pháp như sau:

db.<Collection>.find(<CONDITION>)
db.<Collection>.findOne(<CONDITION>)

Trong đó CONDITION theo chuẩn JSON và khá linh hoạt:

// Điều kiện bằng đơn giản
{name: "test"}

// Điều kiện lớn hơn nhỏ hơn với $lt, $lte, $gt, $gte
{name: "test", quantity: { $lt: 1250 } }
{name: "test", quantity: { $lt: 1550, $gt: 3000 } }

Thêm bản ghi vào collection

Sử dụng hàm insert() để thêm dữ liệu cho 1 collection:

// Cú pháp lệnh
db.<Collection>.insert(document)

// Ví dụ 1 lệnh thêm
db.softwares.insert({
   title: "MongoDB",
   description: "MongoDB is no sql database",
})

Cập nhật bản ghi vào collection

Sử dụng hàm update(), updateOne() để cập nhật dữ liệu cho 1 bản ghi. Sử dụng updateMany() để cập nhật dữ liệu cho nhiều bản ghi.

// Cú pháp lệnh
db.<COLLECTION_NAME>.update(<CONDITION>, <UPDATED_DATA>)
db.<COLLECTION_NAME>.updateOne(<CONDITION>, <UPDATED_DATA>)
db.<COLLECTION_NAME>.updateMany(<CONDITION>, <UPDATED_DATA>)

// Ví dụ lệnh
db.softwares.update({title: "MongoDB"}, { $set: { description: "It is only MongoDB" } })

Phần CONDITION bạn có thể xem ở phần trên, phần UPDATED_DATA cũng rất linh hoạt:

// Thiết lập giá trị mới cho 1 trường dữ liệu sử dụng $set
{ $set: { orderId: "678974329166" } }

// Cập nhật giá trị cho 1 phần tử trong mảng
// Dữ liệu bảng có trường symbol và transactions. Trong đó transactions là một mảng
// Cập nhật trường entryTime của phần tử thứ 0 trong mảng
db.investingtrans.updateOne({symbol: "TKOUSDT"}, { $set: { "transactions.0.entryTime": "2021-09-07 22:39:44" }}, { upsert: true })
// Cập nhật trường entryTime cho tất cả các phần tử trong mảng
db.investingtrans.updateOne({symbol: "TKOUSDT"}, { $set: { "transactions.$[].entryTime": "2021-09-07 22:39:44" }}, { upsert: true })
// Bỏ một trường dữ liệu sử dụng $unset
{ $unset: { orderId: "" } }
{ $unset: { "assets.BNB": "" } }

Một số chú ý khi sử dụng NodeJs để thao tác Mongo

Trên NodeJs hầu hết mọi người sử dụng thư viện mongoose. Nói chung thư viện nào cũng được, nhưng ở đây có một số chú ý phần hiệu năng:

Nên đánh Index để tăng tốc độ truy vấn

Để đánh index trường nào thì bạn xem xét lại code các truy vấn DB của mình, từ đó chọn trường cho hợp lý.

Lệnh đánh index như sau:

db.pairinfos.createIndex({ network: 1, dexName: 1 });

Cập nhật từng bản ghi hay nhiều bản ghi

Bạn có thể cập nhật bản ghi bằng hàm sau:

  • Hàm save() => Cập nhật từng bản ghi 1
  • Hàm updateMany() => Cập nhật nhiều bản ghi theo điều kiện tìm thấy

Thông thường cập nhật 1 lúc nhiều bản ghi thì sẽ nhanh hơn, nhưng nhiều khi nó lại chậm hơn. Ví dụ: Bạn có CSDL hàng triệu bản ghi, lệnh của bạn trung bình chỉ cập nhật 10 bản ghi thì có khi cập nhật từng bản ghi sẽ nhanh hơn. Bởi chi phí tìm kiếm dữ liệu lớn trừ khi bạn có đánh index.

Ưu tiên thêm dữ liệu theo lô thay vì thêm từng bản ghi

Nếu bạn thêm đồng thời nhiều dữ liệu một lúc thì bạn không nên thêm từng bản ghi 1 mà phải thêm cả lô một lúc bằng hàm insertMany().

Xử lý một số lỗi trên MongoDB

Dưới đây là một số lỗi liên quan tới MongoDB mà mình từng gặp.

An incomplete repair has been detected! This is likely because a repair operation unexpectedly failed before completing

Lỗi này do một DEV của mình không hiểu bị lỗi DB gì đó mới lên mạng search để sửa, nhưng không hiểu các lệnh trên mạng lên đã thực hiện lệnh sau (Cũng không nhớ hết còn lệnh nào không):

// Lần 1 sửa
ps ax | grep mongod
sudo killall -15
sudo mkdir -p /data/db
sudo systemctl unmask mongodb
sudo mongod --dbpath /usr/local/var/mongodb --logpath /usr/local/var/log/mongodb/mongo.log --fork
sudo mongod --dbpath /var/lib/mongodb/ --repair
sudo mongod --dbpath /var/lib/mongodb/ --journal

// Chạy tiếp lệnh
sudo rm /var/lib/mongodb/mongod.lock 
sudo mongod --repair --dbpath /var/lib/mongodb 
sudo mongod --fork --logpath /var/lib/mongodb/mongodb.log --dbpath /var/lib/mongodb 
sudo service mongodb start

// Vẫn lỗi cài đè DB
brew install mongodb-community@4.2

Khi mình vào xem thì không thể start được server, xem log mongo từ tệp “/var/log/mongodb/mongod.log” có thông báo lỗi bằng lệnh:
tail -n 1000 /var/log/mongodb/mongod.log -f
Thấy log lỗi như sau

{"t":{"$date":"2022-06-23T08:48:33.228+00:00"},"s":"I",  "c":"CONTROL",  "id":20698,   "ctx":"main","msg":"***** SERVER RESTARTED *****"}
{"t":{"$date":"2022-06-23T08:48:33.230+00:00"},"s":"I",  "c":"CONTROL",  "id":23285,   "ctx":"main","msg":"Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'"}
{"t":{"$date":"2022-06-23T08:48:33.302+00:00"},"s":"W",  "c":"ASIO",     "id":22601,   "ctx":"main","msg":"No TransportLayer configured during NetworkInterface startup"}
{"t":{"$date":"2022-06-23T08:48:33.303+00:00"},"s":"I",  "c":"NETWORK",  "id":4648601, "ctx":"main","msg":"Implicit TCP FastOpen unavailable. If TCP FastOpen is required, set tcpFastOpenServer, tcpFastOpenClient, and tcpFastOpenQueueSize."}
{"t":{"$date":"2022-06-23T08:48:33.303+00:00"},"s":"I",  "c":"STORAGE",  "id":4615611, "ctx":"initandlisten","msg":"MongoDB starting","attr":{"pid":9684,"port":27017,"dbPath":"/var/lib/mongodb","architecture":"64-bit","host":"TRADE-SERVER-09"}}
{"t":{"$date":"2022-06-23T08:48:33.303+00:00"},"s":"I",  "c":"CONTROL",  "id":23403,   "ctx":"initandlisten","msg":"Build Info","attr":{"buildInfo":{"version":"4.4.9","gitVersion":"b4048e19814bfebac717cf5a880076aa69aba481","openSSLVersion":"OpenSSL 1.1.1  11 Sep 2018","modules":[],"allocator":"tcmalloc","environment":{"distmod":"ubuntu1804","distarch":"x86_64","target_arch":"x86_64"}}}}
{"t":{"$date":"2022-06-23T08:48:33.303+00:00"},"s":"I",  "c":"CONTROL",  "id":51765,   "ctx":"initandlisten","msg":"Operating System","attr":{"os":{"name":"Ubuntu","version":"18.04"}}}
{"t":{"$date":"2022-06-23T08:48:33.303+00:00"},"s":"I",  "c":"CONTROL",  "id":21951,   "ctx":"initandlisten","msg":"Options set by command line","attr":{"options":{"config":"/etc/mongod.conf","net":{"bindIp":"127.0.0.1","port":27017},"processManagement":{"timeZoneInfo":"/usr/share/zoneinfo"},"storage":{"dbPath":"/var/lib/mongodb","journal":{"enabled":true}},"systemLog":{"destination":"file","logAppend":true,"path":"/var/log/mongodb/mongod.log"}}}}
{"t":{"$date":"2022-06-23T08:48:33.305+00:00"},"s":"E",  "c":"NETWORK",  "id":23024,   "ctx":"initandlisten","msg":"Failed to unlink socket file","attr":{"path":"/tmp/mongodb-27017.sock","error":"Operation not permitted"}}
{"t":{"$date":"2022-06-23T08:48:33.305+00:00"},"s":"F",  "c":"-",        "id":23091,   "ctx":"initandlisten","msg":"Fatal assertion","attr":{"msgid":40486,"file":"src/mongo/transport/transport_layer_asio.cpp","line":919}}
{"t":{"$date":"2022-06-23T08:48:33.305+00:00"},"s":"F",  "c":"-",        "id":23092,   "ctx":"initandlisten","msg":"\n\n***aborting after fassert() failure\n\n"}

Lỗi này liên quan tới quyền tệp “/tmp/mongodb-27017.sock“, mình sửa bằng lệnh:

sudo chown mongodb:mongodb /tmp/mongodb-27017.sock

Tiếp theo lại báo lỗi “An incomplete repair has been detected! This is likely because a repair operation unexpectedly failed before completing. MongoDB will not start up again without –repair.“:

{"t":{"$date":"2022-06-23T08:09:21.512+00:00"},"s":"I",  "c":"CONTROL",  "id":20698,   "ctx":"main","msg":" SERVER RESTARTED "}
 {"t":{"$date":"2022-06-23T08:09:21.515+00:00"},"s":"I",  "c":"CONTROL",  "id":23285,   "ctx":"main","msg":"Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'"}
 {"t":{"$date":"2022-06-23T08:09:21.525+00:00"},"s":"W",  "c":"ASIO",     "id":22601,   "ctx":"main","msg":"No TransportLayer configured during NetworkInterface startup"}
 {"t":{"$date":"2022-06-23T08:09:21.525+00:00"},"s":"I",  "c":"NETWORK",  "id":4648601, "ctx":"main","msg":"Implicit TCP FastOpen unavailable. If TCP FastOpen is required, set tcpFastOpenServer, tcpFastOpenClient, and tcpFastOpenQueueSize."}
 {"t":{"$date":"2022-06-23T08:09:21.527+00:00"},"s":"I",  "c":"STORAGE",  "id":4615611, "ctx":"initandlisten","msg":"MongoDB starting","attr":{"pid":8561,"port":27017,"dbPath":"/var/lib/mongodb","architecture":"64-bit","host":"TRADE-SERVER-09"}}
 {"t":{"$date":"2022-06-23T08:09:21.527+00:00"},"s":"I",  "c":"CONTROL",  "id":23403,   "ctx":"initandlisten","msg":"Build Info","attr":{"buildInfo":{"version":"4.4.9","gitVersion":"b4048e19814bfebac717cf5a880076aa69aba481","openSSLVersion":"OpenSSL 1.1.1  11 Sep 2018","modules":[],"allocator":"tcmalloc","environment":{"distmod":"ubuntu1804","distarch":"x86_64","target_arch":"x86_64"}}}}
 {"t":{"$date":"2022-06-23T08:09:21.527+00:00"},"s":"I",  "c":"CONTROL",  "id":51765,   "ctx":"initandlisten","msg":"Operating System","attr":{"os":{"name":"Ubuntu","version":"18.04"}}}
 {"t":{"$date":"2022-06-23T08:09:21.527+00:00"},"s":"I",  "c":"CONTROL",  "id":21951,   "ctx":"initandlisten","msg":"Options set by command line","attr":{"options":{"config":"/etc/mongod.conf","net":{"bindIp":"127.0.0.1","port":27017},"processManagement":{"timeZoneInfo":"/usr/share/zoneinfo"},"storage":{"dbPath":"/var/lib/mongodb","journal":{"enabled":true}},"systemLog":{"destination":"file","logAppend":true,"path":"/var/log/mongodb/mongod.log"}}}}
 {"t":{"$date":"2022-06-23T08:09:21.529+00:00"},"s":"F",  "c":"STORAGE",  "id":50922,   "ctx":"initandlisten","msg":"An incomplete repair has been detected! This is likely because a repair operation unexpectedly failed before completing. MongoDB will not start up again without --repair."}
 {"t":{"$date":"2022-06-23T08:09:21.529+00:00"},"s":"F",  "c":"-",        "id":23091,   "ctx":"initandlisten","msg":"Fatal assertion","attr":{"msgid":50922,"file":"src/mongo/db/storage/storage_engine_init.cpp","line":87}}
 {"t":{"$date":"2022-06-23T08:09:21.529+00:00"},"s":"F",  "c":"-",        "id":23092,   "ctx":"initandlisten","msg":"\n\n***aborting after fassert() failure\n\n"}

Mình phải chạy lệnh sau để sửa:
/usr/bin/mongod –config /etc/mongod.conf –repair
Lệnh này khá lâu bạn phải chờ nó chạy xong nhé. Check log để biết nó chạy xong hay chưa.

Sau đó lại có báo lỗi khác:

{"t":{"$date":"2022-06-23T08:50:15.270+00:00"},"s":"I",  "c":"CONTROL",  "id":20698,   "ctx":"main","msg":" SERVER RESTARTED "}
 {"t":{"$date":"2022-06-23T08:50:15.272+00:00"},"s":"I",  "c":"CONTROL",  "id":23285,   "ctx":"main","msg":"Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'"}
 {"t":{"$date":"2022-06-23T08:50:15.282+00:00"},"s":"W",  "c":"ASIO",     "id":22601,   "ctx":"main","msg":"No TransportLayer configured during NetworkInterface startup"}
 {"t":{"$date":"2022-06-23T08:50:15.283+00:00"},"s":"I",  "c":"NETWORK",  "id":4648601, "ctx":"main","msg":"Implicit TCP FastOpen unavailable. If TCP FastOpen is required, set tcpFastOpenServer, tcpFastOpenClient, and tcpFastOpenQueueSize."}
 {"t":{"$date":"2022-06-23T08:50:15.283+00:00"},"s":"I",  "c":"STORAGE",  "id":4615611, "ctx":"initandlisten","msg":"MongoDB starting","attr":{"pid":9746,"port":27017,"dbPath":"/var/lib/mongodb","architecture":"64-bit","host":"TRADE-SERVER-09"}}
 {"t":{"$date":"2022-06-23T08:50:15.283+00:00"},"s":"I",  "c":"CONTROL",  "id":23403,   "ctx":"initandlisten","msg":"Build Info","attr":{"buildInfo":{"version":"4.4.9","gitVersion":"b4048e19814bfebac717cf5a880076aa69aba481","openSSLVersion":"OpenSSL 1.1.1  11 Sep 2018","modules":[],"allocator":"tcmalloc","environment":{"distmod":"ubuntu1804","distarch":"x86_64","target_arch":"x86_64"}}}}
 {"t":{"$date":"2022-06-23T08:50:15.283+00:00"},"s":"I",  "c":"CONTROL",  "id":51765,   "ctx":"initandlisten","msg":"Operating System","attr":{"os":{"name":"Ubuntu","version":"18.04"}}}
 {"t":{"$date":"2022-06-23T08:50:15.283+00:00"},"s":"I",  "c":"CONTROL",  "id":21951,   "ctx":"initandlisten","msg":"Options set by command line","attr":{"options":{"config":"/etc/mongod.conf","net":{"bindIp":"127.0.0.1","port":27017},"processManagement":{"timeZoneInfo":"/usr/share/zoneinfo"},"storage":{"dbPath":"/var/lib/mongodb","journal":{"enabled":true}},"systemLog":{"destination":"file","logAppend":true,"path":"/var/log/mongodb/mongod.log"}}}}
 {"t":{"$date":"2022-06-23T08:50:15.290+00:00"},"s":"I",  "c":"STORAGE",  "id":22270,   "ctx":"initandlisten","msg":"Storage engine to use detected by data files","attr":{"dbpath":"/var/lib/mongodb","storageEngine":"wiredTiger"}}
 {"t":{"$date":"2022-06-23T08:50:15.290+00:00"},"s":"I",  "c":"STORAGE",  "id":22297,   "ctx":"initandlisten","msg":"Using the XFS filesystem is strongly recommended with the WiredTiger storage engine. See http://dochub.mongodb.org/core/prodnotes-filesystem","tags":["startupWarnings"]}
 {"t":{"$date":"2022-06-23T08:50:15.290+00:00"},"s":"I",  "c":"STORAGE",  "id":22315,   "ctx":"initandlisten","msg":"Opening WiredTiger","attr":{"config":"create,cache_size=1460M,session_max=33000,eviction=(threads_min=4,threads_max=4),config_base=false,statistics=(fast),log=(enabled=true,archive=true,path=journal,compressor=snappy),file_manager=(close_idle_time=100000,close_scan_interval=10,close_handle_minimum=250),statistics_log=(wait=0),verbose=[recovery_progress,checkpoint_progress,compact_progress],"}}
 {"t":{"$date":"2022-06-23T08:50:16.034+00:00"},"s":"E",  "c":"STORAGE",  "id":22435,   "ctx":"initandlisten","msg":"WiredTiger error","attr":{"error":13,"message":"[1655974216:34198][9746:0x7fcaa69e7ac0], wiredtiger_open: __posix_open_file, 805: /var/lib/mongodb/WiredTiger.turtle: handle-open: open: Permission denied"}}
 {"t":{"$date":"2022-06-23T08:50:16.034+00:00"},"s":"E",  "c":"STORAGE",  "id":22435,   "ctx":"initandlisten","msg":"WiredTiger error","attr":{"error":13,"message":"[1655974216:34812][9746:0x7fcaa69e7ac0], wiredtiger_open: __posix_open_file, 805: /var/lib/mongodb/WiredTiger.turtle: handle-open: open: Permission denied"}}
 {"t":{"$date":"2022-06-23T08:50:16.035+00:00"},"s":"E",  "c":"STORAGE",  "id":22435,   "ctx":"initandlisten","msg":"WiredTiger error","attr":{"error":13,"message":"[1655974216:35083][9746:0x7fcaa69e7ac0], wiredtiger_open: __posix_open_file, 805: /var/lib/mongodb/WiredTiger.turtle: handle-open: open: Permission denied"}}
 {"t":{"$date":"2022-06-23T08:50:16.035+00:00"},"s":"W",  "c":"STORAGE",  "id":22347,   "ctx":"initandlisten","msg":"Failed to start up WiredTiger under any compatibility version. This may be due to an unsupported upgrade or downgrade."}
 {"t":{"$date":"2022-06-23T08:50:16.036+00:00"},"s":"F",  "c":"STORAGE",  "id":28595,   "ctx":"initandlisten","msg":"Terminating.","attr":{"reason":"13: Permission denied"}}
 {"t":{"$date":"2022-06-23T08:50:16.036+00:00"},"s":"F",  "c":"-",        "id":23091,   "ctx":"initandlisten","msg":"Fatal assertion","attr":{"msgid":28595,"file":"src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.cpp","line":954}}
 {"t":{"$date":"2022-06-23T08:50:16.036+00:00"},"s":"F",  "c":"-",        "id":23092,   "ctx":"initandlisten","msg":"\n\n***aborting after fassert() failure\n\n"}

Mình kiểm tra quyền các tệp và thực mục con trong thư muc “/var/lib/mongodb” bằng lệnh:
ls -l /var/lib/mongodb/
thì thấy sai rất nhiều tệp và thư mục bị sai quyền:

Tệp bị sai quyền trong thu mục dữ liệu của mongo
Tệp bị sai quyền trong thu mục dữ liệu của mongo
Tệp bị sai quyền trong thu mục dữ liệu của mongo
Tệp bị sai quyền trong thu mục dữ liệu của mongo

Mình thực hiện các lệnh sau để cập nhật lại quyền (Tùy vào thực tế các file có thể khác nhau):

sudo chown mongodb:mongodb /var/lib/mongodb/WiredTiger.turtle
sudo chown mongodb:mongodb /var/lib/mongodb/journal/WiredTigerLog.0000001162
sudo chown mongodb:mongodb /var/lib/mongodb/journal/WiredTigerLog.0000000001
sudo chown mongodb:mongodb /var/lib/mongodb/journal/WiredTigerLog.0000000002
sudo chown mongodb:mongodb /var/lib/mongodb/mongodb.log
sudo chown mongodb:mongodb /var/lib/mongodb/mongodb.log.2022-06-19T16-10-48

Vì ông DEV cài lại DB bằng lệnh “brew install mongodb-community@4.2” nên mình quyết định cài lại DB bằng lệnh trước đây:

wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
sudo apt-get update
sudo apt-get install -y mongodb-org

Cuối cùng thì mongo đã chạy lại bình thường với lệnh:
sudo service mongod start

Tham khảo:

Bài viết này có hữu ích với bạn?

Kích vào một biểu tượng ngôi sao để đánh giá bài viết!

Xếp hạng trung bình 5 / 5. Số phiếu: 1

Bài viết chưa có đánh giá! Hãy là người đầu tiên đánh giá bài viết này.

Trả lời

Giao diện bởi Anders Norén