W nazwie bazy danych MongoDB jest literówka i chcę zmienić nazwę bazy danych.
Mogę tak kopiować i usuwać ...
db.copyDatabase('old_name', 'new_name');
use old_name
db.dropDatabase();
Czy istnieje polecenie zmiany nazwy bazy danych?
W nazwie bazy danych MongoDB jest literówka i chcę zmienić nazwę bazy danych.
Mogę tak kopiować i usuwać ...
db.copyDatabase('old_name', 'new_name');
use old_name
db.dropDatabase();
Czy istnieje polecenie zmiany nazwy bazy danych?
Odpowiedzi:
Nie, nie ma. Zobacz https://jira.mongodb.org/browse/SERVER-701
Niestety nie jest to łatwa funkcja do wdrożenia ze względu na sposób, w jaki metadane bazy danych są przechowywane w oryginalnym (domyślnym) silniku pamięci. W plikach MMAPv1 przestrzeń nazw (np .: dbName.collection), która opisuje każdą pojedynczą kolekcję i indeks, zawiera nazwę bazy danych, więc aby zmienić nazwę zestawu plików bazy danych, każdy ciąg przestrzeni nazw musiałby zostać przepisany. Wpływa to na:
- plik .ns
- każdy numerowany plik dla kolekcji
- przestrzeń nazw dla każdego indeksu
- wewnętrzne unikalne nazwy każdej kolekcji i indeksu
- zawartość system.namespaces i system.indexes (lub ich odpowiedniki w przyszłości)
- inne lokalizacje, których może mi brakować
Ma to na celu zmianę nazwy pojedynczej bazy danych w trybie autonomicznym instancji mongod. W przypadku zestawów replik powyższe czynności należy wykonać na każdym węźle repliki, a na każdym węźle każdy wpis oplog, który odnosi się do tej bazy danych, musiałby zostać w jakiś sposób unieważniony lub przepisany, a następnie, jeśli jest to klaster dzielony, należy również dodać te zmienia się w każdym fragmencie, jeśli DB jest dzielony, a ponadto serwery konfiguracji mają wszystkie metadane fragmentu pod względem przestrzeni nazw z ich pełnymi nazwami.
Nie byłoby absolutnie żadnego sposobu, aby to zrobić w systemie na żywo.
Aby to zrobić w trybie offline, konieczne będzie ponowne zapisanie każdego pliku bazy danych w celu dostosowania go do nowej nazwy, a w tym momencie będzie on tak wolny, jak obecne polecenie „copydb” ...
Możesz to zrobić:
db.copyDatabase("db_to_rename","db_renamed","localhost")
use db_to_rename
db.dropDatabase();
Nota redakcyjna: to samo podejście zastosowano w samym pytaniu, ale okazało się przydatne dla innych niezależnie.
copyDatabase
metoda
copyDatabase
metodzie * jest niepotrzebny, a zatem gorsze rozwiązanie niż to, o którym OP wiedział już. * cc @GurbakhshishSingh
Alternatywne rozwiązanie: możesz zrzucić swoją bazę danych i przywrócić ją pod inną nazwą. Jak się przekonałem, jest to o wiele szybsze niż 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/
mongodump
stworzone. Nie wiedziałem, że możesz przywrócić go pod inną nazwą. Dzięki!
--gzip
i tworzysz archiwum
db.copyDatabase()
jest już przestarzały
--db
( -d
) również jest przestarzały. Wygląda na to, że impreza o charakterze wycofującym się trwa copyDatabase
. Szturchnąłem SERVER-701 notatkami .
UWAGA: Mam nadzieję, że zmieniło się to w najnowszej wersji.
Nie można kopiować danych między instancją MongoDB 4.0 (niezależnie od wartości FCV) a instancją MongoDB 3.4 i wcześniejszą mongod. https://docs.mongodb.com/v4.0/reference/method/db.copyDatabase/
ALERT : Hej, bądźcie ostrożni podczas kopiowania bazy danych, jeśli nie chcecie zepsuć różnych kolekcji w ramach jednej bazy danych.
Poniżej pokazano, jak zmienić nazwę
> show dbs;
testing
games
movies
Aby zmienić nazwę, użyj następującej składni
db.copyDatabase("old db name","new db name")
Przykład:
db.copyDatabase('testing','newTesting')
Teraz możesz bezpiecznie usunąć starą bazę danych w następujący sposób
use testing;
db.dropDatabase(); //Here the db **testing** is deleted successfully
Teraz zastanów się, co się stanie, jeśli spróbujesz zmienić nazwę nowej bazy danych na istniejącą
Przykład:
db.copyDatabase('testing','movies');
W tym kontekście wszystkie kolekcje (tabele) testowania zostaną skopiowane do bazy filmów .
copyDatabase
przepadło. Szturchnąłem SERVER-701 notatkami .
Chociaż Mongodb nie udostępnia polecenia zmiany nazwy Bazy danych, udostępnia polecenie Kolekcja nazwy , które nie tylko modyfikuje nazwę kolekcji, ale także modyfikuje nazwę bazy danych.
db.adminCommand({renameCollection: "db1.test1", to: "db2.test2"})
To polecenie modyfikuje tylko metadane, koszt jest bardzo mały, wystarczy przejrzeć wszystkie kolekcje db1
, których nazwa została zmieniona, db2
aby uzyskać nazwę bazy danych.
możesz to zrobić w tym skrypcie Js
var source = "source";
var dest = "dest";
var colls = db.getSiblingDB(source).getCollectionNames();
for (var i = 0; i < colls.length; i++) {
var from = source + "." + colls[i];
var to = dest + "." + colls[i];
db.adminCommand({renameCollection: from, to: to});
}
foo
w bar
bazie danych ma przestrzeń nazw bar.foo
. Indeks on _id
ma zatem przestrzeń nazw bar.foo._id_
. Zmień nazwę kolekcji (należy) wykonać wyszukiwanie prefiksu i zastąpić wszystkie znane przestrzenie nazw, podobne do opcji--nsFrom
i . --nsTo
mongorestore
Powyższy proces jest powolny, możesz użyć poniższej metody, ale musisz przenieść kolekcję według kolekcji do innej bazy danych.
use admin
db.runCommand({renameCollection: "[db_old_name].[collection_name]", to: "[db_new_name].[collection_name]"})
Nie ma mechanizmu zmiany nazw baz danych. Obecnie akceptowane odpowiedź w chwili pisania jest prawdziwa i oferuje pewne ciekawe tło szczegółowo, jak do Upstream wybaczyć, ale nie oferuje żadnych sugestii dla replikacji zachowania. Inne odpowiedzi wskazują na copyDatabase
, która nie jest już opcją, ponieważ funkcjonalność została usunięta w 4.0 . Zaktualizowałem SERVER-701 za pomocą moich notatek i niedowierzaniem. 🙃
Równoważne zachowanie polega mongodump
i mongorestore
na kawałku tańca:
Wyeksportuj dane, zwracając uwagę na „używane przestrzenie nazw”. Na przykład w jednym z moich zestawów danych mam kolekcję z przestrzenią nazw byzmcbehoomrfjcs9vlj.Analytics
- ten przedrostek ( właściwie nazwa bazy danych ) będzie potrzebny w następnym kroku.
Importuj swoje dane, dostarczając --nsFrom
i --nsTo
argumenty. ( Dokumentacja. ) Kontynuując mój powyższy hipotetyczny (i niezwykle nieczytelny) przykład, aby przywrócić bardziej sensowną nazwę, wzywam:
mongorestore --archive=backup.agz --gzip --drop \
--nsFrom 'byzmcbehoomrfjcs9vlj.*' --nsTo 'rita.*'
Niektórzy mogą również wskazywać na --db
argument dotyczący sklepu mongorestore, jednak to również jest przestarzałe i powoduje ostrzeżenie przed użyciem w kopiach zapasowych folderów spoza BSON z całkowicie błędną sugestią „ use --nsInclude instead
”. Powyższe tłumaczenie przestrzeni nazw jest równoważne z użyciem tej --db
opcji i jest poprawnym ustawieniem manipulacji przestrzenią nazw, którego należy użyć, ponieważ nie próbujemy filtrować przywracanych plików.
--nsFrom
i --nsTo
pracował dla mnie. Dziękuję Ci!
Próbowałem zrobić.
db.copyDatabase('DB_toBeRenamed','Db_newName','host')
i dowiedział się, że został wycofany przez społeczność mongo, chociaż utworzył kopię zapasową lub zmienił nazwę DB.
WARNING: db.copyDatabase is deprecated. See http://dochub.mongodb.org/core/copydb-clone-deprecation
{
"note" : "Support for the copydb command has been deprecated. See
http://dochub.mongodb.org/core/copydb-clone-deprecation",
"ok" : 1
}
Więc nie przekonany powyższym podejściem, musiałem wziąć zrzut lokalnego za pomocą polecenia poniżej
mongodump --host --db DB_TobeRenamed --out E://FileName/
podłączony do Db.
use DB_TobeRenamed
następnie
db.dropDatabase()
następnie przywrócono DB za pomocą polecenia.
mongorestore -host hostName -d Db_NewName E://FileName/
Jeśli umieścisz wszystkie dane w bazie danych administratora (nie powinieneś), zauważysz, db.copyDatabase()
że nie będzie działać, ponieważ użytkownik wymaga wielu uprawnień, których prawdopodobnie nie chcesz mu nadać. Oto skrypt do ręcznego skopiowania bazy danych:
use old_db
db.getCollectionNames().forEach(function(collName) {
db[collName].find().forEach(function(d){
db.getSiblingDB('new_db')[collName].insert(d);
})
});
copyDatabase
jest przestarzałe