mongodb表索引備份,索引的導出導入
背景
- 發現有兩個mongodb環境的資料庫表索引不一致,另一個資料庫有索引缺失,需要將一個資料庫里的所有表索引導入到另一個資料庫
- 也可用於單獨備份資料庫所有表的索引
寫mongo shell的js腳本可參考官方文檔//docs.mongodb.com/manual/tutorial/write-scripts-for-the-mongo-shell
導出導入索引的js腳本
// 當前腳本名為exportImportIndexes.js
let joinStr = "*_*";
// 查詢所有表的索引
function findAllIndexes() {
// 獲取所有表
let allCollections = db.getCollectionNames();
for (var colName of allCollections) {
let indexes = db.getCollection(colName).getIndexes();
// 輸出表索引資訊
print(colName, joinStr, JSON.stringify(indexes));
}
}
// 添加所有表的索引
// 前提是通過findAllIndexes函數將所有表的索引寫入了當前執行路徑下的all_indexes.txt文件
function addAllIndexes() {
// 獲取所有索引,一行代表一張表的索引
let indexes = cat('./all_indexes.txt');
lines = indexes.split('\n');
// 遍歷所有表的索引
for (var line of lines) {
print("line:", line);
let items = line.split(joinStr);
if (items.length !== 2) {
continue
}
let colName = items[0].trim();
let indexes = items[1].trim();
if (indexes === "") {
continue
}
for (var index of JSON.parse(indexes)) {
print("begin add collectionName:", colName, "index:", JSON.stringify(index));
// 一次只創建一個索引,防止批量創建索引過程中的錯誤可能導致多個索引創建失敗
let rs = db.runCommand(
{
createIndexes: colName,
indexes: [index]
}
);
print("operation result:", JSON.stringify(rs),"\n");
}
print("\n");
}
}
// 導出索引執行findAllIndexes
// findAllIndexes();
// 導入索引執行addAllIndexes
// addAllIndexes();
導出導入索引的執行過程
假設要導出的mongodb地址是localhost:27011,db是test1
要導入的mongodb地址是localhost:27012,db是test2
- 導出時只將”findAllIndexes();”這一行取消注釋,執行命令: mongo localhost:27011/test1 exportImportIndexes.js > all_indexes.txt
- 導入時只將”addAllIndexes();”這一行取消注釋,執行命令: mongo localhost:27012/test2 exportImportIndexes.js > index_result.txt