Apakah mungkin untuk mengembalikan simpul yang dihapus?

18

Sementara revisi disimpan dan mudah untuk kembali ke revisi node sebelumnya, saya bertanya-tanya apakah mungkin untuk mengembalikan node yang benar-benar telah dihapus oleh pengguna?

Palmin
sumber

Jawaban:

20

Jika Anda memiliki cadangan basis data (yang seharusnya;) Anda dapat mengembalikan salinan situs yang lama dan mengambilnya seperti itu.

Drupal memberikan peringatan yang jelas kepada pengguna bahwa menghapus suatu simpul adalah final, dan ada dialog konfirmasi.

Chris Cohen
sumber
19

Apa kata Chris. Kode berbunyi

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

... jadi dihapus benar-benar berarti dihapus.

Untuk mencegah kecelakaan seperti ini, Anda mungkin ingin membatasi izin pengguna sehingga pengguna tidak dapat menghapus, tetapi hanya membatalkan publikasi node. Node yang tidak diterbitkan tidak akan muncul di situs Anda (dengan anggapan bahwa situs Anda dibuat dengan benar) tetapi mereka tetap tersedia dalam database.

marcvangend
sumber
6
Kiat ekstra: untuk tab khusus dan kendali lebih besar atas siapa yang dapat membatalkan publikasi apa, periksa modul Publish Content: drupal.org/project/publishcontent
marcvangend
2

Ya ada beberapa solusi untuk ini.

  • Yang pertama menggunakan backup penuh yang telah disebutkan oleh Chris di sini. ini adalah yang paling sulit khususnya jika node berisi bidang yang kompleks.
  • Menggunakan https://drupal.org/project/recover modul, yang memonitor
  • Menggunakan modul https://drupal.org/project/entity_soft_delete . Itu dibuat semacam recycle / trashbin untuk node / entitas sehingga ketika node tertentu dihapus, itu tidak akan dihapus dari database hanya perubahan statusnya yang dihapus. Jadi admin masih dapat melihat atau bahkan menggunakannya dan jika diperlukan ubah statusnya kembali normal atau hapus secara permanen
Sina Salek
sumber
0

Berikut adalah saran yang membangun tentang apa yang dikatakan Chris sebagai jawaban reverse engineer @ marcvangend. Saya suka menggunakan phpMyAdmin, tetapi Anda dapat melakukan proses yang sama dengan baris perintah jika Anda suka itu lebih baik.

Seperti jawaban lainnya, ini mengasumsikan Anda memiliki cadangan dari database Anda. Tidak ada alasan untuk tidak menggunakan modul yang luar biasa seperti Backup & Migrate di luar sana.

  1. Buat database MySQL kosong baru yang disebut "restore" atau "testing" atau yang serupa
  2. Buat cadangan manual baru sehingga Anda dapat kembali ke saat ini, bukan cadangan tadi malam jika perlu
  3. Impor cadangan Anda ke basis data "pemulihan" yang baru
  4. Buka nodetabel, cari simpul yang dihapus. Semoga Anda tahu nid, tetapi jika Anda tidak mengetahuinya sekarang.
  5. Pilih satu baris yang telah dihapus dan ekspor melalui phpMyAdmin. Seharusnya hanya ada satu baris.
  6. Sekarang pergi ke node_revisionsmeja. Cari di ujung simpul yang dihapus dan ekspor. Setidaknya harus ada satu baris, tetapi bisa lebih. Ekspor semuanya dengan id Anda.
  7. Kembali ke database situs langsung Anda di phpMyadmin
  8. Impor dua file yang baru saja Anda ekspor dari cadangan
  9. Periksa pekerjaan Anda di situs langsung

Dengan menggunakan metode ini, Anda dapat memulihkan satu simpul dari cadangan tanpa kehilangan perubahan apa pun pada basis data sejak cadangan terakhir. Jika Anda tidak khawatir tentang itu dan Anda tidak memikirkan apa pun kecuali penghapusan telah terjadi sejak cadangan terakhir, akan lebih mudah untuk hanya melakukan pemulihan penuh dari cadangan terakhir untuk menjalani proses di atas.

squarecandy
sumber
Bagaimana jika saya pergi ke nodemeja dan tidak melihat nid yang dihapus di sana? Apakah ini berarti segala sesuatu tampak suram? Omong-omong, situs ini adalah Drupal 8.
MadPhysicist