初心者のためのMongoDB管理コマンド必須ガイド

`mongosh`シェルを使ったMongoDBの管理コマンドをマスターしましょう。このガイドでは、データベースの切り替え、コレクションの作成/削除、ロール管理を含むユーザー管理、`serverStatus`などの重要なシステムヘルスチェックなど、初心者に必要な基本タスクをカバーします。NoSQL環境を安全に管理するために必要な基本コマンドを学びます。

初心者のためのMongoDB管理コマンド必須ガイド

MongoDBの管理はmongoshから始まりますが、目的はすべてのコマンドを暗記することではありません。目的は、安全に周囲を確認し、現在地を確認し、意図的に小さな変更を行い、間違ったデータベースで破壊的なコマンドを実行しないようにすることです。

MongoDBを始めたばかりの方は、まずローカルインスタンスまたは使い捨ての開発データベースでこれらのコマンドを練習してください。このガイドの一部のコマンド(dropDatabase()drop()など)は、データを完全に削除します。MongoDBはあなたの指示に従います。別の場所で実行するつもりだったとしても、それを察知することはありません。

mongoshで接続する

デフォルトポートのローカルMongoDBインスタンスに接続するには、次のようにします。

mongosh

リモートサーバーの場合は、管理者またはホスティングプロバイダーから提供された接続文字列を使用します。

mongosh "mongodb://[email protected]:27017/admin"

TLS、レプリカセット、MongoDB Atlasの場合は、URIにさらに多くのオプションが含まれます。可能な限り、パスワードをシェルの履歴に貼り付けないでください。プロンプト、環境固有のシークレット処理、またはプラットフォームの認証情報ツールを使用してください。

接続したら、現在地を確認します。

db

これにより、現在のデータベースコンテキストが表示されます。多くのミスは、シェルがあるデータベースを指していると思い込んで、実際には別のデータベースを指していることから始まります。

データベースの一覧表示と切り替え

表示可能なデータベースを表示します。

show dbs

ユーザーに権限がない場合、すべてのデータベースが表示されないことがあります。これはセキュリティで保護された環境では正常です。

useでデータベースコンテキストを切り替えます。

use myAppDB

MongoDBはuseを実行したときにすぐにデータベースを作成するわけではありません。データが最初に書き込まれたとき(ドキュメントを挿入したり、明示的にコレクションを作成したりしたとき)に作成されます。

現在のデータベースを再度確認します。

db

スクリプトでは、コードがシェルコンテキストに依存しないように、明示的なデータベースハンドルを使用することをお勧めします。

const appdb = db.getSiblingDB("myAppDB")
appdb.getCollectionNames()

コレクション: 一覧表示、作成、検査、削除

現在のデータベースのコレクションを一覧表示します。

show collections

またはJavaScriptを使用します。

db.getCollectionNames()

検証、キャップ動作、クラスター化/インデックスオプションなど、お使いのMongoDBバージョンでサポートされているオプションが必要な場合は、明示的にコレクションを作成します。

db.createCollection("logs")

ほとんどのアプリケーションコレクションは最初の挿入時に自動的に作成されますが、管理設定では明示的な作成の方が明確です。

コレクションの統計を検査します。

db.orders.stats()

インデックスを確認します。

db.orders.getIndexes()

コレクションの削除は破壊的です。

db.logs.drop()

共有環境で実行する前に、データベースとコレクションを確認します。

db
db.getCollectionNames()
db.logs.countDocuments({})

非常に大きなコレクションの場合、countDocuments({})はコストがかかる可能性があります。その場合は、メタデータ、サンプリング、または運用ダッシュボードを使用し、ピーク時に広範なカウントを実行しないでください。

テストドキュメントの挿入とクエリ

管理者でも検証のためにいくつかのCRUDの基本が必要です。小さなドキュメントを挿入します。

db.healthcheck.insertOne({ source: "admin-test", createdAt: new Date() })

読み戻します。

db.healthcheck.find({ source: "admin-test" }).sort({ createdAt: -1 }).limit(5)

テストドキュメントのみを削除します。

db.healthcheck.deleteMany({ source: "admin-test" })

特定のフィルターを使用してください。学習中は広範な削除を避けてください。deleteMany({})のようなコマンドは、コレクション内のすべてのドキュメントを削除します。

ユーザー管理の基本

ユーザーコマンドは、ユーザーが定義されているデータベースに対して実行されます。管理ユーザーは多くの場合adminで作成されます。アプリケーションユーザーは、セキュリティモデルに応じて、アプリケーションデータベースで作成される場合があります。

adminに切り替えます。

use admin

プロンプトでパスワードを入力して管理ユーザーを作成します。

db.createUser({
  user: "appAdmin",
  pwd: passwordPrompt(),
  roles: [
    { role: "userAdminAnyDatabase", db: "admin" },
    { role: "readWriteAnyDatabase", db: "admin" }
  ]
})

通常のアプリケーションの場合は、より狭い権限を使用してください。たとえば、myAppDBの読み取りと書き込みのみを行うアプリケーションには、広範な管理ロールを付与しないでください。

use myAppDB

db.createUser({
  user: "myAppUser",
  pwd: passwordPrompt(),
  roles: [
    { role: "readWrite", db: "myAppDB" }
  ]
})

現在のデータベースのユーザーを一覧表示します。

show users

ロールを慎重に更新します。

db.grantRolesToUser("myAppUser", [ { role: "read", db: "reporting" } ])

同様に慎重にロールを削除します。

db.revokeRolesFromUser("myAppUser", [ { role: "read", db: "reporting" } ])

最も安全な習慣は最小権限です。ユーザーには、ジョブに必要なデータベースとロールのみを付与します。

サーバーステータスと現在の操作

serverStatusは、カウンターとランタイム情報を含む大きなドキュメントを返します。

db.serverStatus()

初心者は通常、ドキュメント全体を必要としません。関心のあるセクションだけを取得します。

db.serverStatus().connections
db.serverStatus().mem
db.serverStatus().opcounters

現在の操作は、何かがスタックしたり遅い場合に役立ちます。

db.currentOp()

ビジーなサーバーでは、フィルタリングします。

db.currentOp({ active: true, secs_running: { $gte: 5 } })

操作を軽率に強制終了しないでください。終了する必要がある場合は、最初にそれを検査し、ユーザークエリ、インデックスビルド、バックアップ、移行、または内部レプリケーション作業のいずれであるかを理解してください。

レプリカセットの確認

デプロイメントがレプリカセットの場合、以下のコマンドが一般的です。

rs.status()
rs.conf()

rs.status()は、メンバー、ヘルス、状態、optime情報、およびどのノードがプライマリかを示します。アプリケーションが書き込みエラーを報告したとき、ノードが再起動したとき、またはレプリケーションラグが疑われるときに実行します。

簡単な読み取り設定の健全性チェックとして、現在のノードが自分自身を誰だと思っているかを尋ねます。

db.hello()

古い例ではisMaster()を使用している場合があります。新しいMongoDBバージョンはhelloをサポートしています。既存のスクリプトでは古いコマンドがまだ見られる場合があります。

危険なコマンドには儀式が必要

破壊的な作業には、時間をかけてください。簡単な儀式で実際の障害を防ぐことができます。

db
show collections
// ターミナルプロンプトまたはメモでホスト名または接続文字列を確認
// 本番環境の場合は、バックアップまたは復元計画を確認
db.collectionName.drop()

データベースの削除の場合:

use databaseToRemove
db.dropDatabase()

このコマンドは現在のデータベースを削除します。危険なのは構文ではなく、間違ったコンテキストにいることです。

初心者向け管理チェックリスト

MongoDB環境に接続するときは、この順序に慣れてください。

db
show dbs
use myAppDB
show collections
db.orders.getIndexes()
db.serverStatus().connections
db.currentOp({ active: true })

これらのコマンドは、現在地、存在するもの、基本的なアクセスが機能するかどうか、そして今すぐに明らかなことが起こっているかどうかを示します。

mongoshを最初に検査ツールとして、次に変更ツールとして扱うと、MongoDB管理ははるかに怖くなくなります。確認し、確認してから行動します。狭いロール、プロンプトパスワード、フィルタリングされたクエリ、明示的なデータベース名を使用します。この習慣は、長いコマンドリストを暗記するよりも重要です。

データベースとコレクションのサイズを注意深く読む

初心者はshow dbsをサイジングツールとしてよく使用しますが、それは出発点にすぎません。ストレージエンジン、圧縮、インデックス、削除されたスペースにより、サイズの数値が驚くべきものになる可能性があります。より詳細な情報が必要な場合は、コレクション統計を使用します。

db.orders.stats()

インデックスサイズも確認します。

db.orders.totalIndexSize()

インデックスは無料ではありません。読み取りと一部のソートを高速化しますが、すべてのインデックスは書き込みオーバーヘッドとストレージを追加します。コレクションに多くのインデックスがあり、書き込みが遅い場合は、それらをリストし、どのクエリが実際にそれらを使用しているかを尋ねます。

db.orders.getIndexes()
db.orders.find({ customerId: "c123" }).explain("executionStats")

本番環境でインデックスを軽率に削除しないでください。使用されていないように見えるインデックスが、月次レポートやめったに使用されない管理画面をサポートしている可能性があります。削除する前に、クエリログ、アプリケーション所有者、および監視を確認してください。

基本的なバックアップの認識

コマンドライン管理は常にバックアップ習慣に結び付ける必要があります。破壊的なメンテナンスの前に、データベースがどのようにバックアップされているか、および復元がどのようにテストされているかを知っておいてください。自己管理型MongoDBでは、論理バックアップにmongodumpmongorestoreが表示される場合があります。

mongodump --uri "mongodb://user@host:27017/myAppDB" --out ./backup

大規模な本番システムでは、ファイルシステムスナップショット、クラウドプロバイダースナップショット、Ops Manager、またはAtlasバックアップの方が適切な場合があります。初心者レベルのポイントは単純です。テスト済みの復元パスがない限り、dropdeleteMany、またはロール変更を元に戻せるものとして扱わないでください。

復元したことのないバックアップは仮定です。インシデントが発生する前に、非本番環境で復元を練習して、資格情報、ネットワークアクセス、およびバージョンの互換性を確認してください。

コマンドだけでは不十分な場合はログを確認する

mongoshはサーバーの応答を表示しますが、ログに代わるものではありません。ユーザーが遅いクエリ、認証エラー、または接続の変動を報告した場合は、MongoDBログとプラットフォームログを確認してください。自己管理型Linuxデプロイメントでは、パッケージと構成に応じて、ログは/var/log/mongodb/の下にある場合があります。コンテナでは、コンテナランタイムログを使用します。Atlasでは、Atlas UIとダウンロード可能なログを使用します。

初心者のよくある間違いは、実際の手がかりがMongoDB外部のログにある認証エラー、DNS問題、TLSの不一致、またはアプリケーション接続プールの枯渇であるにもかかわらず、serverStatus()を凝視することです。

データベースロールとオペレーティングシステムアクセスの違いを知る

MongoDBユーザーはLinuxユーザーではありません。MongoDBでmyAppUserを作成しても、シェルアカウントは作成されません。誰かにデータベースサーバーへのSSHアクセスを許可しても、自動的にデータベース権限が付与されるわけではありませんが、サーバーの構成が不適切な場合、危険な間接アクセスを許可する可能性があります。

これらのレイヤーは分離しておきます。

Linuxユーザー: ホストとファイルへのアクセスを制御
MongoDBユーザー: データベースの認証と認可を制御
ネットワークポリシー: MongoDBポートに到達できるユーザーを制御
TLS: トラフィックを保護し、証明書ベースのIDをサポート可能

安全なデプロイメントには、これらすべてを考慮する必要があります。ファイアウォールルールなしでデータベースがパブリックにリッスンしている場合、強力なMongoDBパスワードだけでは不十分です。すべてのアプリケーションが管理者ロールを使用している場合、プライベートネットワークだけでは不十分です。

本番シェルでのより安全な習慣

本番環境で作業する場合、プロンプトと接続を明確にします。一部のチームは、ターミナルの色、シェルエイリアス、または検査用の読み取り専用ユーザーを使用します。最低でも、接続後にいくつかのIDチェックを実行します。

db.runCommand({ connectionStatus: 1 })
db
db.hello()

connectionStatusは認証されたユーザーとロールを表示します。dbはコンテキストを表示します。helloはトポロジ情報を提供します。これら3つのチェックで、驚くほど多くのミスを防ぐことができます。

定期的な検査には、読み取り専用アカウントを使用します。特定の変更ウィンドウにのみ特権アカウントに切り替えます。この小さな摩擦は有用です。これにより、データを変更できることを行おうとしていることに気付くことができます。

いつ停止して助けを求めるか

一部のMongoDBコマンドは初心者に優しいものですが、そうでないものもあります。レプリカセットの再構成、シャーディングメタデータ、強制再構成、操作の強制終了、コレクションの圧縮、および稼働中のシステムでの認証設定の変更には注意してください。これらのアクションは可用性に影響を与える可能性があります。

コマンドがクラスタトポロジを変更したり、データを削除したりする場合は、一時停止してセカンドレビューを取得してください。最善の管理者は、最も速くタイピングできる人ではありません。彼らは、どのコマンドがバックアップ、メンテナンスウィンドウ、および別の目を必要とするかを知っている人です。

読み取り保証と書き込み保証を高レベルで理解する

初心者は初日に読み取り保証と書き込み保証を調整する必要はありませんが、これらの設定が存在することを知っておく必要があります。書き込み保証は、書き込み後にMongoDBが与える確認応答を制御します。より強い書き込み保証は、より多くのメンバーへのレプリケーションを待つことができます。より弱いものはより早く戻る可能性がありますが、障害発生時の耐久性に関する保証は低くなります。

読み取り保証は、読み取りが要求するデータの一貫性のレベルを制御します。多くの単純なアプリケーションではデフォルトで問題ありませんが、レプリカセットや分散システムでは、これらの設定は、フェイルオーバー後またはレプリケーションラグ中にアプリケーションが安全に想定できる内容に影響を与えます。

管理上の教訓は実用的です。「MongoDBが書き込みを失った」または「アプリが古いデータを読み取った」と誰かが報告した場合、挿入コマンドだけを見ないでください。ドライバー設定、書き込み保証、読み取り設定、読み取り保証、レプリカセットのヘルス、およびアプリケーションの再試行動作を確認してください。

インターネットからコピーした例に注意する

MongoDBの構文は時間の経過とともに変更されています。古いブログ投稿では、mongoshの代わりにレガシーmongoシェル、古いヘルパー名、またはまだ動作するが推奨されなくなったコマンドを使用している場合があります。また、認証を無効にして実行する例もありますが、これは本番環境では安全な前提ではありません。

コマンドをコピーするときは、3つの質問をしてください。

これはどのMongoDBバージョン用に書かれましたか?
どのデータベースコンテキストで実行されますか?
接続ユーザーにはどのような権限が必要ですか?

コマンドが破壊的な場合は、4つ目の質問を追加します。これがうまくいかなかった場合、どうやって復元しますか?

シェルを放棄せずにCompassとAtlasを使用する

グラフィカルツールは便利です。MongoDB Compassは、ドキュメント、インデックス、クエリプランの検査に役立ちます。Atlasは、ホスト型クラスターの監視、バックアップ、アラート、ユーザー管理を提供します。これらのツールは、生のシェル出力よりも視覚的な検査に適していることがよくあります。

それでも、シェルコマンドを学んでください。インシデント、自動化、SSHのみの環境、またはドキュメントレビュー中は、正確なmongoshコマンドの方が「UIの3番目のタブをクリック」よりも共有しやすいです。最善のワークフローは、シェルとGUIのどちらかではありません。GUIを使用して探索し、シェルを使用して反復可能なアクションを明確に表現します。