2012-02-08 23 views

Trả lời

152

Không có. Xem https://jira.mongodb.org/browse/SERVER-701

Thật không may, đây không phải là tính năng đơn giản để chúng tôi triển khai do cách lưu trữ siêu dữ liệu cơ sở dữ liệu trong công cụ lưu trữ gốc (mặc định). Trong các tệp MMAPv1, không gian tên (ví dụ: dbName.collection) mô tả mọi bộ sưu tập và chỉ mục bao gồm tên cơ sở dữ liệu, do đó, để đổi tên một tập hợp các tệp cơ sở dữ liệu, mỗi chuỗi không gian tên sẽ phải được viết lại. tác động này:

  • các .ns nộp
  • mỗi tập tin được đánh số duy nhất cho bộ sưu tập
  • không gian tên cho mỗi chỉ số
  • tên duy nhất nội bộ của từng bộ sưu tập và chỉ số
  • nội dung của system.namespaces và system.indexes (hoặc tương đương của chúng trong tương lai)
  • các vị trí khác có thể bị thiếu

Điều này chỉ để thực hiện việc đổi tên một cơ sở dữ liệu đơn lẻ trong một cá thể mong muốn độc lập mongod. Đối với các bản sao, chúng ta cần phải thực hiện ở trên mỗi nút bản sao, cộng với mỗi nút mỗi mục nhập đơn lẻ tham chiếu đến cơ sở dữ liệu này sẽ bị vô hiệu hóa hoặc viết lại, và sau đó nếu nó là một cụm bị phân mảnh, thì cũng cần phải thêm thay đổi mọi phân đoạn nếu DB bị phân mảnh, cộng với các máy chủ cấu hình có tất cả siêu dữ liệu phân đoạn theo các không gian tên có tên đầy đủ của chúng.

Sẽ hoàn toàn không có cách nào để thực hiện việc này trên hệ thống trực tiếp.

Để làm điều đó trực tuyến, nó sẽ đòi hỏi tái viết mỗi tập tin cơ sở dữ liệu duy nhất để thích ứng với tên mới, và tại thời điểm đó nó sẽ là chậm như hiện tại "copydb" lệnh ...

+2

Vé đó đã được mở trong một thời gian rất dài. Tôi đã thêm phiếu bầu ít quan trọng của tôi vào danh sách dài. –

+2

Cách họ đã xây dựng DB và giải thích nó, đổi tên có vẻ không thể - có thể mất một kiến ​​trúc hoàn toàn mới. Có vẻ như một sự giám sát lớn nhưng tất cả đều công bằng trong tình yêu, chiến tranh và phát triển phần mềm. – staypuftman

+1

Điều này vẫn đúng với MongoDb 3.4 tháng 4, 30, 2017. – Daniel

314

Bạn có thể thực hiện việc này:

db.copyDatabase("db_to_rename","db_renamed","localhost") 
use db_to_rename 
db.dropDatabase(); 

Ghi chú biên tập: đây là phương pháp tương tự được sử dụng trong câu hỏi nhưng đã chứng tỏ hữu ích cho người khác bất kể.

+0

Câu trả lời là khó hiểu liên quan đến đối số thứ 3 của 'copyDatabase'. Xem [MongoDB Copy Database Commands] (http://www.mongodb.org/display/DOCS/Copy+Database+Commands) để làm rõ. –

+0

Đối với đối số thứ 3, tôi đề nghị đặt "localhost". Chỉnh sửa cho rõ ràng – bzmw

+28

Đối số thứ 3 thực sự có thể được bỏ qua và đối số thứ ba sẽ được mặc định cho cùng một máy chủ. – Haakon

103

Giải pháp thay thế: bạn có thể đổ db của bạn và khôi phục lại bằng tên khác. Như tôi đã trải nghiệm nó nhanh hơn nhiều so với db.copyDatabase().

$ mongodump -d old_db_name -o mongodump/ 
$ mongorestore -d new_db_name mongodump/old_db_name 

http://docs.mongodb.org/manual/tutorial/backup-with-mongodump/

+0

Giúp tôi rất nhiều !! – Cyborgz

+4

Điều này nhanh hơn và là "tác dụng phụ", cơ sở dữ liệu của bạn cũng được nén gọn. – Comtaler

+0

Điều này thật tuyệt! Tôi đã tạo ra một 'Mongodump'. Didnt biết bạn có thể khôi phục nó bằng một tên khác. Cảm ơn! –

4

Quá trình trên là chậm, bạn có thể sử dụng phương pháp dưới đây nhưng bạn cần phải di chuyển bộ sưu tập của bộ sưu tập để db khác.

use admin 
db.runCommand({renameCollection: "[db_old_name].[collection_name]", to: "[db_new_name].[collection_name]"}) 
+0

Đề xuất tuyệt vời IMHO. Tuy nhiên, cần lưu ý rằng điều này sẽ không giải phóng dung lượng từ DB gốc nhưng việc đổi tên sẽ nhanh hơn nhiều so với việc sao chép dữ liệu. – sirfz

+0

Cào rằng, nó không làm một bản sao anyway (vì nó không loại bỏ không gian, nó không thực sự là một đổi tên đơn giản) vì vậy không có lợi thế thực sự cho phương pháp này trên bản sao và thả. – sirfz

6

ALERT: Hey folks chỉ cần cẩn thận khi sao chép cơ sở dữ liệu, nếu bạn không muốn gặp rắc rối với các bộ sưu tập khác nhau theo cơ sở dữ liệu duy nhất.

Sau đây cho bạn thấy làm thế nào để đổi tên

> show dbs; 
testing 
games 
movies 

Để đổi tên bạn sử dụng cú pháp sau

db.copyDatabase("old db name","new db name") 

Ví dụ:

db.copyDatabase('testing','newTesting') 

Bây giờ bạn có thể xóa một cách an toàn cái cũ db theo cách sau

use testing; 

db.dropDatabase(); //Here the db **testing** is deleted successfully 

Bây giờ chỉ cần nghĩ rằng những gì xảy ra nếu bạn cố gắng đổi tên tên cơ sở dữ liệu mới với tên cơ sở dữ liệu hiện có

Ví dụ:

db.copyDatabase('testing','movies'); 

Vì vậy, trong bối cảnh này, tất cả các bộ sưu tập (bảng) của kiểm tra sẽ được sao chép sang phim cơ sở dữ liệu.

2

Trong trường hợp bạn đặt tất cả dữ liệu trong cơ sở dữ liệu quản trị (bạn không nên), bạn sẽ thấy db.copyDatabase() sẽ không hoạt động vì người dùng của bạn yêu cầu nhiều đặc quyền mà bạn có thể không muốn cung cấp. Đây là một kịch bản để sao chép cơ sở dữ liệu theo cách thủ công:

use old_db 
db.getCollectionNames().forEach(function(collName) { 
    db[collName].find().forEach(function(d){ 
     db.getSiblingDB('new_db')[collName].insert(d); 
    }) 
}); 
Các vấn đề liên quan