作者

黄忠,阿里云数据库技术专家


数据库的一些非常不错的企业级功能都是“养兵千日,用兵一时”,比如Oracle 10g中的回收站(Recycle Bin)功能,可以在特殊情况下发挥特种兵的功能,比如当你删除一个表空间、一个用户(Schema)时,可能会删除很多的表,包括你不想删除的一些表。

这种例子还是很多的,早些年很多的DBA使用图形工具来访问数据库,所连接的用户权限又比较高,当查询大量数据引起图形工具短暂失去响应时,很容易多打几下键盘或者多点几下鼠标,等到图形工具响应过来,发现些表或某些用户已经不见了。

前面讲的是无心之过,还可以看到一些有心的恶意操作,比如因员工和公司的关系不够友善引起的破坏性操作。这时就可以检查一下Oracle数据库回收站中是否还有被删除的表。

AliSQL是阿里云RDS MySQL团队精心打造的一个分支,在性能、功能、稳定性上都有极大的提升和突破。在2019年12月份发布的版本中也带了Recycle Bin功能,只需要设置一个参数就可以开启:


*请左右滑动阅览

mysql>setglobalrecycle_bin=on;
QueryOK,0rowsaffected(0.00sec)
mysql>showglobalvariableslike'recycle_bin';
+---------------+-------+
|Variable_name|Value|
+---------------+-------+
|recycle_bin|ON|
+---------------+-------+
1rowinset(0.00sec)
接下来让我们来创建一个表,插入一些数据,进行功能测试和验证。如下所示:
*请左右滑动阅览

mysql>usetest;
Databasechanged
mysql>createtablet_recycle_bin_demo(col1intnotnull);
QueryOK,0rowsaffected(0.01sec)
mysql>insertintot_recycle_bin_demovalues(1),(2);
QueryOK,2rowsaffected(0.00sec)
Records:2Duplicates:0Warnings:0
mysql>select*fromt_recycle_bin_demo;
+------+
|col1|
+------+
|1|
|2|
+------+
2rowsinset(0.00sec)
假设这是一张很重要的表,并且被意外Drop掉了,让我们来看一下如何找回这张表的数据。如下所示:
*请左右滑动阅览

mysql>droptablet_recycle_bin_demo;
QueryOK,0rowsaffected(0.01sec)
mysql>calldbms_recycle.show_tables();
+-----------------+---------------+---------------+--------------------+---------------------+---------------------+
|SCHEMA|TABLE|ORIGIN_SCHEMA|ORIGIN_TABLE|RECYCLED_TIME|PURGE_TIME|
+-----------------+---------------+---------------+--------------------+---------------------+---------------------+
|__recycle_bin__|__innodb_1073|test|t_recycle_bin_demo|2020-02-2706:48:24|2020-03-0506:48:24|
+-----------------+---------------+---------------+--------------------+---------------------+---------------------+
1rowinset(0.00sec)
mysql>select*from`__recycle_bin__`.`__innodb_1073`;
+------+
|col1|
+------+
|1|
|2|
+------+
2rowsinset(0.00sec)
可以看到,AliSQL在开启回收站功能的情况下,被删除的表被移到了“__recycle_bin__”数据库下面,可以通过Select语句直接访问读出被删除的数据以进行恢复,这样就找回了你的重要数据。和Oracle不同的地方是,“__recycle_bin__”数据库访问需要明确的授权操作,这样可以防止表的所有者(可能是恶意者)同步清理回收站中的表。比如我用一般用户登进去操作,就会报权限错误,如下所示:
*请左右滑动阅览

mysql>select*from`__recycle_bin__`.`__innodb_1073`;
ERROR1142(42000):SELECTcommanddeniedtouser'test'@'localhost'fortable'__innodb_1073'
mysql>calldbms_recycle.purge_table('__innodb_1073');
ERROR1142(42000):DROPcommanddeniedtouser'test'@'localhost'fortable'__innodb_1073'


可以看到通过AliSQL的回收站功能,以及精心规划的权限管理机制,可以有效地处理表被意外或恶意删除的问题,确保你的数据安全。