記一次Django級聯刪除引發的故障

事情是這樣的,運營那邊有2個員工離職了,讓後臺這邊刪除掉他們的賬號。
同事很利索的在Django shell中進行了這樣的操作:

>> users = User.objects.filter(username__in=[xxx, xxx])
>> users.delete()

一會過後,運營反饋說很多數據沒了。
一分析。原來是delete()方法是級聯刪除的。刪掉用戶後,跟這2個用戶相關聯的數據一併被刪除了。這可不是想要的結果。

怎麼恢復數據呢
一開始想通過binlog來恢復數據,後來發現AWS的RDS有快照備份(我們的備份策略是:每天備份一次,保留7天)。

於是

  1. 假設當前的rds實例爲instance current,恢復最近的一個快照爲一個新的rds實例instance old。兩個實例同時運行着。
  2. 導出instance old中2個員工的相關數據,然後導入instance current
  3. 關閉instance old

上面的步驟2中,怎樣導出和導入想要的數據呢?

  • 方案1: 命令行。用mysqldump導出爲sql,用source執行sql。其中mysqldump可以指定–databases –tables –where來篩選數據。需要注意的是,mysqldump導出的sql裏面,會先drop table再insert,把drop語句註釋掉,我們只需要insert就行了。
  • 方案2: 客戶端。用JetBrains的DataGrip。連接兩個實例。在一個實例select出來相關數據後,可以export爲文件,然後在另一個實例從文件import。

結論:

  1. 數據一定要做好備份
  2. 使用雲很省心
  3. 小心級聯刪除
  4. 儘量使用軟刪除
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章