事情是這樣的,運營那邊有2個員工離職了,讓後臺這邊刪除掉他們的賬號。
同事很利索的在Django shell中進行了這樣的操作:
>> users = User.objects.filter(username__in=[xxx, xxx])
>> users.delete()
一會過後,運營反饋說很多數據沒了。
一分析。原來是delete()方法是級聯刪除的。刪掉用戶後,跟這2個用戶相關聯的數據一併被刪除了。這可不是想要的結果。
怎麼恢復數據呢。
一開始想通過binlog來恢復數據,後來發現AWS的RDS有快照備份(我們的備份策略是:每天備份一次,保留7天)。
於是
- 假設當前的rds實例爲instance current,恢復最近的一個快照爲一個新的rds實例instance old。兩個實例同時運行着。
- 導出instance old中2個員工的相關數據,然後導入instance current
- 關閉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。
結論:
- 數據一定要做好備份
- 使用雲很省心
- 小心級聯刪除
- 儘量使用軟刪除