Cách xóa dữ liệu cũ và điều chỉnh kích thước Mongo Database trên UniFi 

Ứng dụng UniFi Network có thể quản lý nhiều thiết bị hoặc ghi nhật ký log của nhiều máy khách, việc này dẫn đến dữ liệu lưu trữ sẽ rất lớn theo thời gian nếu chúng không được chọn lọc. Bài viết này sẽ giải thích cách sử dụng prune script để xóa bỏ các thống kê cũ trên UniFi, bao gồm báo động (alarms), sự kiện (events), mục nhập của khách (guest entries), phát hiện các AP giả mạo (detected rogue APs), máy khách (known clients), chứng từ hết hạn (expired vouchers) và các thống kê lưu lượng truy cập (traffic statistics).

Prune script sẽ không loại bỏ dữ liệu cần thiết cho các chức năng của ứng dụng UniFi Network, chẳng hạn như người dùng đã bị chặn.

Các lưu ý khi xóa bỏ dữ liệu cũ trên UniFi

Ứng dụng UniFi Network cần phải chạy trước khi thực hiện script. Nếu nó không chạy, bạn hãy khởi động ứng dụng trước khi thực hiện các bước được nêu trong bài viết này. Đừng quên tạo bản sao lưu ứng dụng Network của bạn trước khi thực hiện bất kỳ thay đổi lớn nào, chẳng hạn như thay đổi này.

Giới thiệu tổng quan về tính năng xóa dữ liệu cũ trên UniFi

UniFi sử dụng MongoDB để lưu trữ thông tin liên quan về thiết bị được kết nối, cấu hình ứng dụng, máy khách và các số liệu thống kê. Ứng dụng UniFi Network cung cấp tùy chọn để thu gọn cơ sở dữ liệu từ bên trong ứng dụng. Giả sử bạn có thể đăng nhập vào ứng dụng UniFi Network, vui lòng sử dụng nút compact database (thu nhỏ database) trong phần Services trong  Settings → Maintenance thay vì làm theo hướng thủ công trong bài viết này.

Tùy chọn compact database sẽ không xóa dữ liệu khỏi cơ sở dữ liệu mà chỉ thu nhỏ DataSize của những gì hiện có trong cơ sở dữ liệu. Thu gọn database bao gồm chống phân mảnh, nhưng không sửa lỗi. Nếu bạn nghi ngờ có mục nhập không hợp lệ hoặc bị hỏng trong cơ sở dữ liệu của bạn, vui lòng làm theo hướng dẫn bên dưới.

Cách xóa bớt các dữ liệu trên một ứng dụng UniFi Network được lưu trữ trên Windows.

1. Tải xuống mongo. Trình cài đặt Windows UniFi không bao gồm nhị phân mongo. Truy cập trang web tải xuống chính thức của MongoDB và tải xuống bản phát hành .zip tương ứng với hệ điều hành của bạn và MongoDB khớp với phiên bản ứng dụng UniFi Network đang sử dụng, như được thấy trong nhật ký MongoDB hoặc được nêu trong release notes của ứng dụng trên https://community.ui.com/releases/

2. Giải nén mongo. Giải nén \ bin \ mongo.exe vào một thư mục mà bạn chọn. Trong ví dụ này, chúng tôi sử dụng C: \ clene \. Bạn có thể bỏ qua tất cả các tệp khác có trong gói.

3. Tải xuống Script. Tải tập lệnh xuống máy chủ bằng cách nhập vào tệp ở cuối trang và lưu vào thư mục của bạn.

4. Mở Command Prompt. Nhấn WINDOWS + R. Trong cửa sổ bật lên, nhập cmd và nhấn ENTER.

5. Nhập Thư mục. Trong command prompt, thay đổi thư mục làm việc của bạn bằng cách nhập lệnh sau và nhấn enter:

cd C:\prune\

6. Thực hiện Test Run (Chạy thử nghiệm). Theo mặc định, tập lệnh ở chế độ “Test Run” và sẽ cho biết những gì sẽ được lược bỏ khỏi cơ sở dữ liệu mà không thực sự thực hiện nó. Bước này để đảm bảo tệp lệnh script chạy như mong đợi. Nhập lệnh sau và nhấn enter:

mongo.exe --port 27117 < mongo_prune_js.js

Output sẽ trông giống như sau:

Hướng dẫn cách xóa dữ liệu cũ và điều chỉnh kích thước Mongo Database trên UniFi 

7. Tắt “dry run”. Chỉnh sửa script để tắt dry run mode và định cấu hình số ngày dữ liệu cần lưu giữ. Theo mặc định, tập lệnh sẽ giữ dữ liệu có giá trị trong 7 ngày. Sử dụng Notepad ++ hoặc một trình soạn thảo văn bản thuần túy tương tự để sửa đổi script và lưu nó, không sử dụng trình soạn thảo văn bản Wordpad hoặc Word.

Chỉnh sửa var days=7; để thay đổi giá trị dữ liệu cần lưu giữ trong bao nhiêu ngày và thay đổi var dryrun=true; thành var dryrun=false; để cho phép script thực sự lược bỏ cơ sở dữ liệu thay vì chỉ chạy thử nghiệm.

Hướng dẫn cách xóa dữ liệu cũ và điều chỉnh kích thước Mongo Database trên UniFi 

8. Lược bỏ cơ sở dữ liệu. Sau khi các thay đổi đã được thực hiện và lưu, hãy chạy script đã sửa đổi và bạn sẽ thực sự xóa cơ sở dữ liệu lần này:

mongo.exe --port 27117 < mongo_prune_js.js

Lưu ý: Vì cơ sở dữ liệu thực sự đang được sửa đổi, nên bước này có thể mất nhiều thời gian đáng kể so với quá trình chạy thử nghiệm (dry run). Lưu ý không làm gián đoạn quá trình cho đến khi bạn nhận được thông báo bye.

9. Xác minh Hoàn thành quá trình lược bỏ dữ liệu. Xác minh rằng thao tác đã hoàn tất thành công và không có lỗi nào xảy ra. Output cần phải tương tự như sau:

Hướng dẫn cách xóa dữ liệu cũ và điều chỉnh kích thước Mongo Database trên UniFi 

9. Cleanup (đây là tùy chọn không bắt buộc). Xóa thư mục bạn đã tạo và các tệp bên trong nếu bạn không có ý định sử dụng lại chúng.

Cách xóa bỏ dữ liệu trên một ứng dụng UniFi Network được lưu trữ trên macOS

1. Tạo một thư mục Working Directory. Tạo thư mục trên máy tính. Với mục đích của bài viết này, chúng tôi sẽ tạo một thư mục có tên là / trimne.

2. Tải xuống mongo. Trình cài đặt macOS UniFi không bao gồm nhị phân mongo. Truy cập trang web tải xuống chính thức MongoDB và tải xuống bản phát hành .tgz tương ứng với kiến ​​trúc CPU của máy chủ của bạn. Phiên bản MongoDB chính xác sẽ xuất hiện trong release notes của ứng dụng UniFi Network trong https://community.ui.com/releases/

3. Giải nén mongo. Di chuyển gói đã tải xuống vào thư mục của bạn và giải nén nó bằng cách nhấp đúp vào nó hoặc sử dụng ứng dụng mà bạn chọn.

4. Di chuyển mongo đến thư mục Working Directory. Tìm tệp nhị phân bin / mongo và sao chép nó vào thư mục của bạn. Tại thời điểm này, gói .tgz đã tải xuống và bất kỳ tệp trích xuất bổ sung nào đều có thể bị xóa đi vì chúng tôi chỉ cần tệp nhị phân mongo.

5. Nhập vào thư mục. Mở cửa sổ Terminal và thay đổi các thư mục thành working directory được tạo ở bước 1 bằng lệnh sau:

cd /prune

6. Tải xuống Script. Tải xuống tập lệnh lược bỏ dữ liệu prune bằng lệnh sau:

curl -kO "https://help.ui.com/hc/article_attachments/115024095828/mongo_prune_js.js" -o "mongo_prune_js.js"

Hướng dẫn cách xóa dữ liệu cũ và điều chỉnh kích thước Mongo Database trên UniFi 

7. Thực hiện Test Run (Chạy thử nghiệm). Thực hiện chạy thử script. Theo mặc định, script ở chế độ “dry run” và nó sẽ cho biết những gì sẽ được lược bỏ khỏi cơ sở dữ liệu mà không thực sự làm điều đó. Bước này đảm bảo script chạy như mong đợi:

./mongo --port 27117 < mongo_prune_js.js

Output sẽ trông giống như sau:

Hướng dẫn cách xóa dữ liệu cũ và điều chỉnh kích thước Mongo Database trên UniFi 

8. Tắt “dry run”. Nếu tất cả lệnh đều đúng, hãy chỉnh sửa tập lệnh để tắt chế độ dry run và định cấu hình số ngày dữ liệu cần lưu giữ. Theo mặc định, tập lệnh sẽ giữ dữ liệu có giá trị trong 7 ngày. Sử dụng nano hoặc một trình chỉnh sửa tương tự để sửa đổi script, chẳng hạn như:

nano mongo_prune_js.js

Giả sử bạn đang sử dụng nano để chỉnh sửa tệp, hãy sử dụng các phím mũi tên để điều hướng văn bản. Chỉnh sửa var days = 7; để thay đổi giá trị dữ liệu cần lưu giữ trong bao nhiêu ngày và thay đổi vardryrun = true; thành var dryrun = false; để cho phép script thực sự lược bỏ cơ sở dữ liệu thay vì chỉ chạy thử nghiệm. Khi đã sẵn sàng, nhấn CTRL + O để lưu tệp (nhấn Enter để xác nhận) và CTRL + X để thoát.

Hướng dẫn cách xóa dữ liệu cũ và điều chỉnh kích thước Mongo Database trên UniFi 

9. Lược bỏ cơ sở dữ liệu. Chạy script đã sửa đổi và xóa cơ sở dữ liệu:

./mongo --port 27117 < mongo_prune_js.js

Lưu ý: Vì cơ sở dữ liệu đang được sửa đổi thật nên bước này có thể mất nhiều thời gian hơn so với quá trình chạy thử nghiệm (dry run). Lưu ý không làm gián đoạn quá trình cho đến khi bạn nhận được thông báo bye.

10. Xác minh hoàn thành quá trình. Xác minh rằng thao tác đã hoàn tất thành công và không có lỗi nào được báo cáo. Output cần phải tương tự như sau:

Hướng dẫn cách xóa dữ liệu cũ và điều chỉnh kích thước Mongo Database trên UniFi 

11. Kết thúc phiên. Kết thúc phiên Terminal bằng cách gõ lệnh sau và nhấn enter. Sau đó đóng cửa sổ Terminal.

exit

12. Cleanup (không bắt buộc). Xóa thư mục đang làm việc nếu bạn không có ý định sử dụng lại.

Tips:

Nếu bạn thấy lỗi có nội dung:

WARNING: shell and server versions do not match

Vui lòng tải xuống phiên bản mongoDB cũ hơn. Thay vì phiên bản hiện tại, hãy thử v3.4.x:

https://fastdl.mongodb.org/osx/mongodb-osx-ssl-x86_64-3.4.24.tgz

Cách xóa bỏ dữ liệu trên một ứng dụng mạng UniFi được lưu trữ trên Linux (Ubuntu, Debian và Cloud Key)

Ứng dụng Network phải đang chạy trước khi thực hiện script. Nếu nó không chạy, vui lòng khởi động ứng dụng trước khi thực hiện các bước chạy lệnh sau Bước 2.

sudo service unifi start

1. Thiết lập kết nối. Kết nối với máy chủ của bạn qua SSH bằng máy khách ưa thích của bạn và xác thực. Ảnh chụp màn hình trong phần này của bài viết là từ PuTTY trên Windows. Nếu sử dụng máy khách Linux hoặc Mac, bạn có thể kết nối với máy chủ bằng ứng dụng Terminal được tích hợp sẵn.

2. Vào thư mục Working Directory. Thay đổi thành thư mục chính của bạn hoặc tạo một thư mục Working Directory theo lựa chọn của bạn. Đối với bài viết này, thư mục chính sẽ được sử dụng.

cd ~

3. Tải xuống Script. Tải prane script xuống máy chủ của bạn:

curl -kO https://help.ui.com/hc/article_attachments/115024095828/mongo_prune_js.js

Hướng dẫn cách xóa dữ liệu cũ và điều chỉnh kích thước Mongo Database trên UniFi 

4. Thực hiện Chạy thử nghiệm. Thực hiện chạy thử tập lệnh. Theo mặc định, script ở chế độ “dry run” và sẽ cho biết những gì sẽ được lược bỏ khỏi cơ sở dữ liệu mà không thực sự làm điều đó. Bước này xác minh rằng tập lệnh chạy như mong đợi:

mongo --port 27117 < mongo_prune_js.js

Đầu ra sẽ trông giống như sau:

Hướng dẫn cách xóa dữ liệu cũ và điều chỉnh kích thước Mongo Database trên UniFi 

5. Tắt “dry run”. Chỉnh sửa tập lệnh để tắt chế độ dry run và định cấu hình số ngày dữ liệu cần lưu giữ. Theo mặc định, tập lệnh sẽ giữ dữ liệu có giá trị trong 7 ngày. Sử dụng nano hoặc một trình chỉnh sửa tương tự để sửa đổi tập lệnh, chẳng hạn như:

nano mongo_prune_js.js

Giả sử bạn đang sử dụng nano để chỉnh sửa tệp, hãy sử dụng các phím mũi tên để điều hướng văn bản. Và chỉnh sửa var days=7; để thay đổi giá trị dữ liệu cần lưu giữ trong bao nhiêu ngày và thay đổi vardryrun=true; thành var dryrun=false; để cho phép tập lệnh thực sự lược bỏ cơ sở dữ liệu thay vì chỉ chạy thử nghiệm. Khi đã sẵn sàng, nhấn CTRL + O để lưu tệp (nhấn Enter để xác nhận) và CTRL + X để thoát.

Hướng dẫn cách xóa dữ liệu cũ và điều chỉnh kích thước Mongo Database trên UniFi 

Lưu ý: Nếu bạn nhận được lỗi cho biết nano chưa được cài đặt, bạn có thể cài đặt nó bằng lệnh sau, sau đó chạy lại lệnh trước:

sudo apt-get update && sudo apt-get -y install nano

6. Prune Database. Chạy tập lệnh đã được sửa đổi để thực sự xóa cơ sở dữ liệu trong lần này:

mongo --port 27117 < mongo_prune_js.js

Lưu ý: Vì cơ sở dữ liệu đang được sửa đổi thực sự, bước này có thể mất nhiều thời gian hơn so với quá trình chạy thử nghiệm (dry run). Lưu ý không làm gián đoạn quá trình cho đến khi bạn nhận được thông báo bye.

7. Xác minh Hoàn thành quá trình. Xác minh rằng thao tác đã hoàn tất thành công và không có lỗi nào được báo cáo. Output phải tương tự như sau:

Hướng dẫn cách xóa dữ liệu cũ và điều chỉnh kích thước Mongo Database trên UniFi 

8. Cleanup (không bắt buộc). Xóa script khỏi thư mục chính của bạn nếu bạn không có ý định sử dụng lại:

rm mongo_prune_js.js

9. Kết thúc phiên. Kết thúc phiên terminal:

exit

Cách lược bỏ dữ liệu một ứng dụng UniFi Network được lưu trữ trên hệ điều hành UniFi (UDM-Pro)

1. Nhập shell và tải xuống script:

unifi-os shell
curl https://help.ui.com/hc/article_attachments/115024095828/mongo_prune_js.js -o /tmp/mongo_prune_js.js

2. Xác định ngày lưu giữ dữ liệu. Bạn hãy đưa ra các lệnh sau để thay đổi số ngày dữ liệu sẽ được lưu giữ. Ví dụ dưới đây đặt ‘số ngày lưu giữ dữ liệu’ thành 14 ngày; giá trị mặc định là 7. 

current_days=$(awk '/var days/{print$2}' /tmp/mongo_prune_js.js | sed -e 's/days=//g' -e 's/;//g')
days_to_keep="14"
sed -i "s/days=${current_days}/days=${days_to_keep}/g" /tmp/mongo_prune_js.js

Ví dụ: bằng cách thay đổi days_to_keep = “14” thành days_to_keep = “21”, bạn sẽ đặt ‘ngày giữ dữ liệu’ thành 21 và mọi dữ liệu cũ hơn 21 ngày sẽ bị lược bớt.

3. Thực hiện Test Run (chạy thử nghiệm). Để chạy “dry on”, hãy sử dụng các lệnh sau:

sed -i 's/dryrun=false/dryrun=true/g' /tmp/mongo_prune_js.js
mongo --port 27117 < /tmp/mongo_prune_js.js

4. Chạy script. Điều này sẽ chạy tập lệnh mà không “dry run”.

sed -i 's/dryrun=true/dryrun=false/g' /tmp/mongo_prune_js.js
mongo --port 27117 < /tmp/mongo_prune_js.js

5. Xóa tập lệnh và thoát khỏi trình shell:

rm /tmp/mongo_prune_js.js
exit

Prune Script tham khảo

Đây là kịch bản prune script để tham khảo hoặc bạn có thể tải xuống từ tệp đính kèm ở cuối bài viết:

// keep N-day worth of data
var days=7;

// change to false to have the script to really exclude old records
// from the database. While true, no change at all will be made to the DB
var dryrun=true;

var now = new Date().getTime(),
 time_criteria = now - days * 86400 * 1000,
 time_criteria_in_seconds = time_criteria / 1000;

print((dryrun ? "[dryrun] " : "") + "pruning data older than " + days + " days (" + time_criteria + ")... ");

use ace;
var collectionNames = db.getCollectionNames();
for (i=0; i<collectionNames.length; i++) {
 var name = collectionNames[i];
 var query = null;

if (name === 'event' || name === 'alarm') {
 query = {time: {$lt:time_criteria}};
 }

// rogue ap
 if (name === 'rogue') {
 query = {last_seen: {$lt:time_criteria_in_seconds}};
 }

// removes vouchers expired more than '$days' ago
 // active and unused vouchers are NOT touched
 if (name === 'voucher') {
 query = {end_time: {$lt:time_criteria_in_seconds}};
 }

// guest authorization
 if (name === 'guest') {
 query = {end: {$lt:time_criteria_in_seconds}};
 }

// if a user was only seen ONCE, $last_seen will not be defined
// so, if $last_seen not defined, lets use $first_seen instead
// also check if $blocked or $use_fixedip is set. If true, do NOT purge the
// entry no matter how old it is. We want blocked/fixed_ip users to continue
// blocked/fixed_ip. Also noted users should not be deleted.
if (name === 'user') {
 query = { blocked: { $ne: true}, use_fixedip: { $ne: true}, noted: { $ne: true}, $or: [
 {last_seen: {$lt:time_criteria_in_seconds} },
 {last_seen: {$exists: false}, first_seen: {$lt:time_criteria_in_seconds} }
 ]
 };
 }

if (query) {
 count1 = db.getCollection(name).count();
 count2 = db.getCollection(name).find(query).count();
 print((dryrun ? "[dryrun] " : "") + "pruning " + count2 + " entries (total " + count1 + ") from " + name + "... ");
 if (!dryrun) {
 db.getCollection(name).remove(query);
 db.runCommand({ compact: name });
 }
 }
}

if (!dryrun) db.repairDatabase();

use ace_stat;
var collectionNames = db.getCollectionNames();
for (i=0; i<collectionNames.length; i++) {
 var name = collectionNames[i];
 var query = null;

// historical stats (stat.*)
 if (name.indexOf('stat')==0) {
 query = {time: {$lt:time_criteria}};
 }

if (query) {
 count1 = db.getCollection(name).count();
 count2 = db.getCollection(name).find(query).count();
 print((dryrun ? "[dryrun] " : "") + "pruning " + count2 + " entries (total " + count1 + ") from " + name + "... ");
 if (!dryrun) {
 db.getCollection(name).remove(query);
 db.runCommand({ compact: name });
 }
 }
}

if (!dryrun) db.repairDatabase();

Vừa rồi là các hướng dẫn về cách xóa dữ liệu cũ và điều chỉnh kích thước Mongo Database trên UniFi cho nhiều hệ điều hành. Hy vong bài viết sẽ giúp ích được người dùng UniFi. Mọi thắc mắc bạn có thể liên hệ giải đáp qua 

FPT – Thiết Bị Mạng

Hỗ Trợ Kỹ Thuật: 028-7300-2222

Số máy lẻ (Ext): 89777 Hoặc 8654