乾貨 | 阿里雲資料庫RDS MySQL數據安全預防與恢復

數據庫技術達摩院 發佈 2020-04-13T22:28:12+00:00

|__recycle_bin__ | __innodb_1064 | product_db | t2 | 2019-08-08 11:01:46 | 2019-08-15 11:01:46 | | __recycle_bi

作者:凌洛,阿里雲資料庫運維專家

背景


前一段時間「刪庫跑路」引起大家對資料庫安全的關注,都在擔心如果誤刪的數據能不能恢復?如何恢復?阿里雲資料庫RDS MySQL的數據安全機制怎麼樣呢?怎麼才能做到事前預防、事後恢復呢?阿里雲資料庫全方位保護您的數據安全,多角度恢複數據,這篇文章我們就來聊聊這個話題。


事前預防


事前預防可以從以下幾方面看:

  • 權限隔離
  • 環境隔離
  • 庫表備份設置
  • 資料庫管理DMS
  • 備份服務DBS

RDS MySQL從產品上做了以下完善:

權限隔離


RDS MySQL的帳號明細:

環境隔離

曾經有一個開發誤把生產當測試環境,誤修改很多數據,我們要儘量的把測試、預發、生產環境隔開,降低因為環境識別錯誤導致的數據安全事件。

內核回收站


適用版本

MySQL 8.0


回收機制

執行DROP TABLE/DATABASE語句時,只保留相關的表對象,並移動到專門的recycle bin目錄中。其它對象的刪除策略如下:

如果是與表無關的對象,根據操作語句決定是否保留,不做回收。

如果是表的附屬對象,可能會修改表數據的,做刪除處理,例如Trigger和Foreign key。 但Column statistics不做清理,隨表進入回收站。


清理機制

回收站會啟動一個後台線程,來異步清理超過recycle_bin_retention時間的表對象。在清理回收站表的時候,如果遇到大表,會再啟動一個後台線程異步刪除大表。


設置實例備份規則

RDS MySQL默認選擇整實例備份,但從去年開始我們支持了可以按庫表備份,為了儘快的恢複數據,可以指定庫表備份。


資料庫管理DMS

DMS是一款強大的資料庫管理和設計工具,直觀的GUI開發環境讓用戶簡單管理多達23種資料庫,包括表結構設計、數據操作、數據開發及性能診斷優化等操作。

DMS通過研發規範、權限控制、操作攔截、數據脫敏、安全審計及變更回滾等功能有效保障數據安全。


可以將權限細分,識別出數據安全風險,從原來的審計變成攔截:



設置安全規則

建議您在剛開始就設置執行DDL、DML的規則


全流程把控

DMS從代碼變更、數據變更、代碼發布一條龍服務,特別是企業版融合了阿里十年的經驗,審批、審計、定時執行等功能。


DBS

為資料庫提供連續數據保護、低成本的備份服務。它可以為多種環境的數據提供強有力的保護,包括企業數據中心、其他雲廠商、混合雲及公共雲。


產品功能

  • 可恢復任1秒數據
    實例、單庫、多表、單表,備份及恢復粒度自由選擇,RTO大幅降低,備份有效性實時驗證
  • 安全加密
    無論傳輸,還是存儲使用最嚴苛的加密技術,保護用戶數據安全
  • 低成本,免運維
    低成本異地備份,讓企業快速滿足三級等保要求,無需為災備提供前期成本,配置到運行只需幾分鐘
  • 多環境支持
    支持自建IDC、雲上自建資料庫、其他雲環境的資料庫備份


和RDS自帶備份的區別

針對RDS資料庫,DBS提供轉儲備份和邏輯備份,滿足RDS客戶的異地備份和靈活備份訴求。

針對RDS資料庫,RDS提供物理備份,滿足RDS客戶的本地備份和快速恢復訴求。

此外,DBS還可以查詢和數據分析,而RDS自帶的備份是不行的。


DBS的入口

  • DBS控制台/官網入口
  • DMS側入口

事中謹慎


DDL使用回收站

MySQL 8.0

mysql> SET SESSION RECYCLE_BIN=ON;---------------------------------------打開會話級回收站
mysql> CALL DBMS_RECYCLE.SHOW_TABLES();-------------------------------看回收站里的表
mysql> DROP TABLE tablename;--------------------------------------------------刪除表
mysql> CALL DBMS_RECYCLE.PURGE_TABLE (『<TABLE>』);-------------------清理回收站里的表
mysql> call dbms_recycle.show_tables(); 
+------------------+-----------------+---------------------+------------------+------------------------+------------------------+ 
|       SCHEMA     |         TABLE     | ORIGIN_SCHEMA  | ORIGIN_TABLE |    RECYCLED_TIME   |       PURGE_TIME      | 
+------------------+-----------------+---------------------+------------------+------------------------+------------------------+ 
| __recycle_bin__ | __innodb_1063 |     product_db      |             t1         | 2019-08-08 11:01:46 | 2019-08-15 11:01:46 | 
| __recycle_bin__ | __innodb_1064 |     product_db      |             t2         | 2019-08-08 11:01:46 | 2019-08-15 11:01:46 | 
| __recycle_bin__ | __innodb_1065 |     product_db      |         parent      | 2019-08-08 11:01:46  | 2019-08-15 11:01:46 | 
| __recycle_bin__ | __innodb_1066 |     product_db      |        child          | 2019-08-08 11:01:46 | 2019-08-15 11:01:46 | 
+------------------+------------------+--------------------+------------------+------------------------+-------------------------+


操作注意事項


  • 前台業務和後台運維/數據分析隔離
  • 帶WHERE條件
    注意讀寫分離,數據統計分析類/定時任務類/大批量操作類
  • 儘量避免業務高峰
  • 如果有後台非程序批量修改語句,需要多人REVIEW,或走正規流程
  • 操作前備份
    每次執行DML/DDL之前,導出執行前的SQL,作為回滾腳本
  • DMS上備份


事務控制

默認不開啟為「否」,逐條提交,遇到失敗則終止但不回滾;

開啟則遇到失敗則全部回滾(僅限DML,DDL不在範圍內)

備份數據

默認開啟為「是」,針對update、delete進行將要影響數據的全記錄行insert腳本生成附件


事後恢復


DMS工單操作歷史


適用場景

  • MySQL 5.5/5.6/5.7/8.0
  • DELETE/UPDATE/INSERT
  • 開通了企業版的DMS


恢複方法

  • 對於變更執行後出現異常不符合訴求需要回滾的,可直接工單頁面內右側-工單操作歷史-查看備份,找到備份文件
  • 下載備份腳本下載,做相應處理
  • 重新提交變更工單


DMS數據追蹤


適用場景

  • MySQL 5.5/5.6/5.7/8.0
  • 少量DELETE/UPDATE/INSERT


功能特點

  • 在線搜索日誌內容,無需手工下載Binlog
  • 支持數據的插入/更新/刪除日誌搜索,無需手工解析Binlog
  • 支持逐條數據恢復,無需手工生成回滾語句
  • OSS Binlog(RDS會定時將Binlog備份到OSS上)
  • 本地熱Binlog(資料庫伺服器上Binlog)
  • 支持非通過DMS操作的DML


內核回收站


適用場景

  • MySQL 8.0
  • DROP TABLE/SCHEMA
  • 其它對象的刪除策略是:
    與表無關的對象,比如 procedure,根據操作語句決定是否保留,不做回收。
    表的附屬對象,比如 trigger,Foreign key,column statistics等,只要存在可能修改表數據的,做刪除,比如 trigger,Foreign key。 但columns statistics不做清理,隨表進入回收站。


找回方法


  • 查看回收站表
mysql> CALL DBMS_RECYCLE.SHOW_TABLES();----------------------------------------------- 看回收站里的表
mysql>CREATE TABLE SRC_SCHEMA.SRC_TABLE LIKE SCHEMA.TABLE;-------------------- 橙色是要替換的內容
mysql>INSERT INTO SRC_SCHEMA.SRC_TABLE SELECT * FROM SCHEMA.TABLE; -------- 橙色是要替換的內容
mysql> call dbms_recycle.show_tables(); 
+------------------+------------------+---------------------+------------------+-----------------------+------------------------+ 
|       SCHEMA     |          TABLE     | ORIGIN_SCHEMA  | ORIGIN_TABLE |   RECYCLED_TIME   |       PURGE_TIME      | 
+------------------+------------------+---------------------+------------------+-----------------------+-------------------------+ 
| __recycle_bin__ | __innodb_1063 |       product_db      |           t1          | 2019-08-08 11:01:46 | 2019-08-15 11:01:46 | 
| __recycle_bin__ | __innodb_1064 |       product_db      |           t2          | 2019-08-08 11:01:46 | 2019-08-15 11:01:46 | 
| __recycle_bin__ | __innodb_1065 |       product_db      |           parent    | 2019-08-08 11:01:46 | 2019-08-15 11:01:46 | 
| __recycle_bin__ | __innodb_1066 |       product_db      |           child       | 2019-08-08 11:01:46 | 2019-08-15 11:01:46 | 
+------------------+------------------+----------------------+------------------+---------------------+---------------------+ 
4 rows in set (0.00 sec)
mysql>create table product_db.t1 like __recycle_bin__. __innodb_1063;
mysql>insert into product_db.t1 select * from __recycle_bin__. __innodb_1063;


RDS克隆實例


適用場景

  • MySQL 所有版本
  • 通過備份克隆出整個實例
  • 所有誤操作(DDL/DML)


指定方式

  • 指定時間點
  • 指定備份集


操作步驟

  • 恢復到一個新實例
  • 驗證數據準確性
  • 將數據遷回原實例

RDS庫/表恢復


適用場景

  • MySQL所有版本
  • 通過備份指定恢復誤刪的資料庫或表
  • 所有誤操作(DDL/DML)
  • 打開了庫表備份的實例


注意事項

  • 必須打開庫/表級別備份
  • 每次最多選擇50個庫/表
  • 運行中且沒有被鎖定
  • 如果要按時間點進行恢復,需要確保日誌備份已開啟
  • 若要按備份集恢復,則原實例必須至少有一個備份集

DBS恢復


適用場景

  • 支持整個實例、多個資料庫、單個資料庫、多張表或一張表恢復
  • 支持秒級任意時間點恢復,並且用戶可以靈活選擇恢復對象
關鍵字: