Czy można przywrócić usunięty węzeł?

18

Podczas gdy zmiany są zachowywane i łatwo jest wrócić do poprzedniej wersji węzła, zastanawiałem się, czy można przywrócić węzeł, który naprawdę został usunięty przez użytkownika?

Palmin
źródło

Odpowiedzi:

20

Jeśli masz kopię zapasową bazy danych (którą powinieneś;) możesz przywrócić starą kopię witryny i pobrać ją w ten sposób.

Drupal daje użytkownikom dość wyraźne ostrzeżenie, że usunięcie węzła jest ostateczne i pojawia się okno dialogowe potwierdzenia.

Chris Cohen
źródło
19

Co mówi Chris. Kod czyta

    db_query('DELETE FROM {node} WHERE nid = %d', $node->nid);
    db_query('DELETE FROM {node_revisions} WHERE nid = %d', $node->nid);

... tak usunięte oznacza tak naprawdę usunięte.

Aby zapobiec takim wypadkom, możesz ograniczyć uprawnienia użytkowników, aby użytkownicy nie mogli usuwać, ale jedynie cofać publikacji węzłów. Niepublikowane węzły nie pojawią się w Twojej witrynie (zakładając, że witryna została poprawnie zbudowana), ale pozostają dostępne w bazie danych.

marcvangend
źródło
6
Dodatkowa wskazówka: aby uzyskać dedykowaną kartę i mieć większą kontrolę nad tym, kto może cofnąć publikację, sprawdź moduł Publikuj zawartość: drupal.org/project/publishcontent
marcvangend
2

Tak, istnieje na to kilka rozwiązań.

  • Pierwszy wykorzystuje pełne kopie zapasowe, o których wspomniał już Chris. jest to najtrudniejsze, zwłaszcza jeśli węzeł zawiera złożone pola.
  • Za pomocą modułu https://drupal.org/project/recover , który monitoruje
  • Korzystanie z modułu https://drupal.org/project/entity_soft_delete . Stworzył rodzaj kosza / kosza na śmieci dla węzłów / podmiotów, więc kiedy dany węzeł zostanie usunięty, nie zostanie usunięty z bazy danych, a tylko jego status zmieni się na usunięty. Dzięki temu administrator nadal może go zobaczyć, a nawet z niego korzystać, aw razie potrzeby zmienić jego status z powrotem na normalny lub usunąć go na stałe
Sina Salek
źródło
0

Oto sugestia oparta na tym, co Chris powiedział, że odpowiedź inżynierów odwrotnych @ marcvangend. Lubię używać phpMyAdmin, ale możesz zrobić ten sam proces z linii poleceń, jeśli bardziej ci się to podoba.

Podobnie jak inne odpowiedzi, zakłada się, że masz kopię zapasową bazy danych. Nie ma wymówki, żeby nie mieć wspaniałych modułów, takich jak Backup & Migrate.

  1. Utwórz nową pustą bazę danych MySQL o nazwie „przywróć” lub „testowanie” lub coś podobnego
  2. Utwórz nową ręczną kopię zapasową, aby w razie potrzeby móc wrócić do tej chwili, a nie ostatniej kopii zapasowej
  3. Zaimportuj kopię zapasową do nowej bazy danych „przywracania”
  4. Przejdź do nodetabeli, wyszukaj usunięty węzeł. Mam nadzieję, że wiesz, co to jest, ale jeśli nie zrozumiesz tego teraz.
  5. Wybierz jeden wiersz, który został usunięty i wyeksportuj przez phpMyAdmin. Powinien być tylko jeden rząd.
  6. Teraz idź do node_revisionsstołu. Wyszukaj na nid usuniętego węzła i wyeksportuj. Powinien być co najmniej jeden rząd, ale może być więcej. Eksportuj wszystko za pomocą NID.
  7. Wróć do bazy danych swojej witryny w phpMyadmin
  8. Zaimportuj dwa pliki, które właśnie wyeksportowałeś z kopii zapasowej
  9. Sprawdź swoją pracę na stronie na żywo

Zastosowanie tej metody pozwoli przywrócić pojedynczy węzeł z kopii zapasowej bez utraty jakichkolwiek zmian w bazie danych od czasu ostatniej kopii zapasowej. Jeśli nie przejmujesz się tym i nie uważasz, że nic poza usunięciem nastąpiło od czasu ostatniej kopii zapasowej, łatwiej byłoby po prostu wykonać pełne przywrócenie ostatniej kopii zapasowej, która zostanie poddana powyższemu procesowi.

Squarecandy
źródło
Co jeśli pójdę do nodetabeli i nie zobaczę tam usuniętego identyfikatora? Czy to oznacza, że ​​wszystko wygląda ponuro? Nawiasem mówiąc, ta strona to Drupal 8.
MadPhysicist