# MongoDB in Window Server
###### tags: `Tag(MongoDB)`
####
Env : window server 2019
VM : Mac VM Fusion
### Step 1: Get Files from MongDB website
注意版次及安裝格式
- MongoDB Community Server ➜ [官網下載頁面](https://www.mongodb.com/try/download/community)

- MongoDB 管理工具 Download ➜ [官網下載頁面](https://www.mongodb.com/try/download/database-tools)
- MongoDB Shell Download ➜ [官網下載頁面](https://www.mongodb.com/try/download/shell)
- MongoDB compass Download ➜ [官網下載頁面](https://www.mongodb.com/try/download/compass)
### Step 2: mongodb 基本安裝
建議以window server下,以admin角色進行安裝及設定修改。
4.1 安裝參考網頁 ➜ [官網](https://www.mongodb.com/docs/v5.0/tutorial/install-mongodb-on-windows/)
4.2 預設設定檔位置
<install directory>\bin\mongod.cfg
4.3 安裝 mongodb安裝文件 as a Windows service
> 雙擊 mongodb安裝文件 .msi file
> Run the service as Network Service user (Default)

> Data Directory 修改為客戶指定目錄
> Log Directory 修改為客戶指定目錄
4.4 服務啟動
如安採”Installed MongoDB as a Windows Service”,則會安裝後自動運行服務。
# 確認 mongod 運行
takslist

> 使用 mongo 連入 mongodb


> 服務運行確認:
Window/Linux:
命令提示字元輸入「telnet + IP 位址或主機名稱 + 連接埠號碼」(例如:telnet www.example.com 1723 或 telnet 10.17.xxx.xxx 5000),以執行 Telnet 指令並測試 TCP 連接埠狀態
若連接埠開啟,Window僅會顯示游標。
若連接埠關閉,會顯示 Connect failed 訊息。
在 Mac 電腦上
輸入「nc -zv + IP 位址或主機名稱 + 連接埠號碼」(例如:nc -zv www.synology.com 443 或 nc -zv 10.17.xxx.xxx 5000),以執行 Telnet 指令並測試連接埠狀態
相關指令參考 ➜ [連接](https://kb.synology.com/zh-tw/DSM/tutorial/Whether_TCP_port_is_open_or_closed#x_anchor_id55)
### Step 3: mongodb 相關設定調整
3.0 建立對應目錄:
例如c下opt下mongodb:
C:\opt\mongodb\log
C:\opt\mongodb\data
C:\opt\mongodb\data\ra31000
若 rs:
另外調整rs相關設定並加上keyfile
C:\Program Files\MongoDB\Server\5.0\bin\Ra.keyfile
> 設定檔修改內容

>
設定檔參考
# mongod.conf
註: 要是更換設定檔設定(如pid),若發生錯誤,須清除data下相mongodb生成文件。
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# Where and how to store data.
storage:
dbPath: C:\opt\mongodb\data
directoryPerDB: true
engine: wiredTiger
journal:
enabled: true
wiredTiger:
engineConfig:
cacheSizeGB: 1
directoryForIndexes: true
# where to write logging data.
systemLog:
destination: file
logAppend: true
logRotate: reopen
path: C:\opt\mongodb\log\mongod.log
# network interfaces
net:
port: 31000
bindIp: 127.0.0.1,WIN-BVMH438QON0
#bindIp: 0.0.0.0
processManagement:
pidFilePath: C:\opt\mongodb\data\ra31000\ra31000.pid
security:
authorization: enabled
#keyFile: C:\Program Files\MongoDB\Server\5.0\bin\Ra.keyfile
#operationProfiling:
#replication:
#sharding:
## Enterprise-Only Options:
#auditLog:
#snmp:
註: cacheSizeGB: (#max_mem/2) - 1
安裝設定基本範例 :

> 確認 hostname
hostname
註: 增加設定檔處,網路項目mongodb服務ip綁定位置
> 重啟服務

在圖片藍色標系處之mongodb服務,選用對應狀態
### Step 4: Check firewall 設定
在window,擬對往返mongod.exe实例的流量, 針對port方式進行,指令如下
netsh advfirewall firewall add rule name="Open mongod port 27017" dir=in action=allow protocol=TCP localport=27017
该规则允许所有传入的通信流到port 27017,这允许应用程序服务器连接到 mongod.exe实例。
Windows防火墙还允许为整个应用程序而不是特定端口启用网络访问,可依參考文件進行。
參考文件 ➜ [中文官網](https://mongodb.net.cn/manual/tutorial/configure-windows-netsh-firewall/)
或者,手動安裝設定
=> search firewall => 輸入規則

註: window server 外ping功能

### Step 5: mongoDB 角色設定
確認mongodb相關設定完成且能正常運作後,再建行角色設定。
在mongo shell 執行下列動作:
>
#建立資料庫管理者角色
use admin
db.createUser( { user: "admin", pwd: "admin123", roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] });
>
or
# 或建立超級使用者 root
use admin
db.createUser( { user: "admin",
pwd: "admin123",
roles: [ { role: "root", db: "admin" } ] });
或簡略:
db.creatUser({user: 'admin',
pwd:'admin123',
roles:['root']})
>
之後,再使用db.auth(),取得權限來建立其他角色,如專供資料庫資料讀寫用角色。
>
db.auth('*帳號*','*密碼*')
db.createUser({user:'apuser',
pwd:'apuser123',
roles:['readWriteAnyDatabase']})
> 確定使用者清單
show users

更改帳戶密碼:
db.changeUserPassword('apuser','123456');
註:改完後,不會有"設定更改完成"msg,請登出帳號後,重登入驗証修改成功。
>
更改帳戶參數
db.updateUser(
"reportUser256",
{
mechanisms: [ "SCRAM-SHA-256" ]
}
)
- 更多請參考 ➜ [官網連結](https://www.mongodb.com/docs/v5.0/reference/method/db.updateUser/)
刪除使用者
db.dropUser(username, writeConcern)
ex: db.dropUser("reportUser1", {w: "majority", wtimeout: 5000})
### Step 6: 連入mongodb
6.1 使用 mongo
下圖,用的預設mongodb port

若有採自設port,則需加進,例如:
mongo --port 31000 admin -u apuser
若發生錯誤,需把對應mongo檔案目錄,設進環境變數。如: C:\Program Files\MongoDB\Server\5.0\bin




6.2 使用 mongosh
安裝mongosh後
mongosh admin -u admin
mongosh admin -u apuser
輸入密碼後即可登入使用mongodb
mongosh admin -u apuser --port 27017 --host 192.168.X.X
更多mongodb 連線細節 ➜ [官網](https://www.mongodb.com/docs/manual/reference/connection-string/)
更多mongosh 用法 ➜ [官網](https://www.mongodb.com/docs/mongodb-shell/connect/#std-label-mdb-shell-connect)
6.3 使用 mongodb compass 連入
透過 mongodb compass 登入

外部透過mongodb compass 登入

### Step 7: mongodb log logrotate
提示: window server 所用logRotate套件為第三方套件且久未更新,諸多功能多有限制或不足之處。
7.0 下載並安裝:logrotatewin
https://sourceforge.net/projects/logrotatewin/files/
安裝目錄: C:\opt\logrotate
7.1 設定logrotate 環境變數
設定位置=> 控制台\使用者帳戶\使用者帳戶

7.2 設定mongodb config
關閉 mongodb服務
對 mongod.cfg 進行新增下列
logAppend: true
logRotate: reopen
刪除 mongod.log
重啟 mongodb服務
7.3 設定 logRotate服務
預設設定檔位置(或可以搬出放置在外層):
C:\opt\LogRotate\Content\logrotate.conf
# 加上以下內容 注意程式對應位置要正確
# 要被切分的log位置
C:\opt\mongodb\log\mongod.log {
nocompress
daily
size 100m
missingok
rotate 9
postrotate # 調用與mongodb互動腳本
C:\opt\logrotate\notify_mongodb_service.bat
endscript
}
註: 視需求作調整,但是別期望能完全如linux的logrotate操作指令
註: 網路提示,rotate檔案數量不要超過9,會發生錯誤
7.4 建立執行mongoDB logRotate指令執行檔
檔案名: notify_mongodb_service.bat
#加上以下內容(帳密要注意 check)
mongo admin --port 31000 -u admin -p admin123 --eval "db.adminCommand({ logRotate: 1 })"
註: 目錄中別帶上任何中文文字
7.5 測試 logroate
確定腳臺及對應mongodb log生成無誤,執行:
logrotate C:\opt\LogRotate\Content\logrotate.conf -f

7.6 設定window server排程
7.6.1 為了方便測試及使用,可以建立bat檔(task_mongodb_logrotate.bat),內容如下:
logrotate C:\opt\LogRotate\Content\logrotate.conf -f
註: 路徑別含任何中文文字
7.6.2 在window 排程中排入設定(win版次間地雷很多,實測久點)
> search : task => 工作排程器
> 建立工作排程
參考設定:





>可使用工程器程式庫中的重新整理及執行來驗証執行狀況。
確定成功執行


註: 別忘了測試成功後,把時間改回半夜12點。
官網:
https://www.mongodb.com/docs/manual/reference/command/logRotate/
參考:
https://stackoverflow.com/questions/67079426/mongo-log-rotation-does-not-work-on-windows
### step 8: mongodb服務關閉或重啟
關閉服務
net shutdown mongodb
or
連入資料庫後,執行:
db.shutdownServer({timeoutSecs : 5})
重啟服務:
net start mongodb
註:別同時使用mongoshell跟net 開啟或關閉服務,容易發生沖突lock。
- And MORE ➜ [HackMD Tutorials](https://hackmd.io/c/tutorials)