故障分析 | 报错 ERROR 5270 HY000 object not in RECYCLE BIN 引发的几个思考

作者:姚嵩

不知道是地球人还是外星人,知道的可以留言告诉小编...

本文来源:原创投稿

*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

现象:

通过 show recyclebin 中的 OBJECT_NAME / ORIGINAL_NAME 闪回表时,

报错:对象不在回收站中。

报错复现:

MySQL [mysql]> create table test.a (i int) ;<br>Query OK, 0 rows affected (0.04 sec)<br>MySQL [mysql]> set session recyclebin = 1 ;<br>Query OK, 0 rows affected (0.00 sec)<br>MySQL [mysql]> drop table test.a ;<br>Query OK, 0 rows affected (0.01 sec)<br>MySQL [mysql]> show recyclebin ;<br>+-----------------------------------------+---------------+-------+----------------------------+<br>| OBJECT_NAME                             | ORIGINAL_NAME | TYPE  | CREATETIME                 |<br>+-----------------------------------------+---------------+-------+----------------------------+<br>| __recycle_$_1677212890_1680250599065600 | a             | TABLE | 2023-03-31 16:16:39.065038 |<br>+-----------------------------------------+---------------+-------+----------------------------+<br>1 row in set (0.01 sec)<br>MySQL [mysql]> flashback table a to before drop ;   <br>ERROR 5270 (HY000): object not in RECYCLE BIN<br>MySQL [oceanbase]> flashback table __recycle_$_1677212890_1680250599065600 to before drop ;<br>ERROR 5270 (HY000): object not in RECYCLE BIN<br>

原因:

还原的时候,默认使⽤当前的 database 做为表的上级对象;

如果表不是当前 database 的对象,则需要使⽤ database.table 格式指定表;

引发的⼏个思考:

  1. 如何获取回收站中表的 database ?

  2. 回收站中是否可以保存多个同名的表?闪回的时候是哪个?

  3. 关闭回收站后,是否能看到回收站中的对象?

  4. 回收站是全租户可⻅,还是只有当前租户可⻅?

  5. 关闭回收站后,是否能闪回表?

  6. 关闭回收站后,是否能闪回租户?

    测试:

    1. 如何获取回收站中表的 database ?

    MySQL [oceanbase]> create table test.a(i int) ;      -- 在test库中创建表a<br>Query OK, 0 rows affected (0.05 sec)<br>MySQL [oceanbase]> set session recyclebin=1 ;        -- 开启回收站<br>Query OK, 0 rows affected (0.00 sec)<br>MySQL [oceanbase]> use oceanbase ;                   -- 切换到oceanbase库中<br>Database changed<br>MySQL [oceanbase]> drop table test.a ;               -- 删除test.a表<br>Query OK, 0 rows affected (0.01 sec)<br>MySQL [oceanbase]> show recyclebin ;                 -- 查看test.a表是否在回收站中(在)<br>+-----------------------------------------+---------------+-------+----------------------------+<br>| OBJECT_NAME                             | ORIGINAL_NAME | TYPE  | CREATETIME                 |<br>+-----------------------------------------+---------------+-------+----------------------------+<br>| __recycle_$_1677212890_1680257357905408 | a             | TABLE | 2023-03-31 18:09:17.904933 |<br>+-----------------------------------------+---------------+-------+----------------------------+<br>1 row in set (0.00 sec)<br>MySQL [oceanbase]> select rb.tenant_id, rb.database_id, db.database_name, rb.table_id,<br>    ->        rb.tablegroup_id, rb.original_name from __all_recyclebin rb<br>    ->  inner join __all_virtual_database db<br>    ->          on rb.database_id=db.database_id;    -- 查看回收站中表a对应的database_name<br>+-----------+---------------+---------------+---------------+---------------+---------------+<br>| tenant_id | database_id   | database_name | table_id      | tablegroup_id | original_name |<br>+-----------+---------------+---------------+---------------+---------------+---------------+<br>|         1 | 1099511628776 | test          | 1099511677793 |            -1 | a             |<br>+-----------+---------------+---------------+---------------+---------------+---------------+<br>1 row in set (0.00 sec)<br>MySQL [oceanbase]> purge recyclebin ;                -- 清理回收站<br>Query OK, 0 rows affected (0.02 sec)<br>

    2. 回收站中是否可以保存多个同名的表?闪回的时候是哪个?

    MySQL [oceanbase]> create table test.a(i int) ;      -- 在test库中创建表a<br>Query OK, 0 rows affected (0.05 sec)<br>MySQL [oceanbase]> set session recyclebin=1 ;        -- 开启回收站<br>Query OK, 0 rows affected (0.00 sec)<br>MySQL [oceanbase]> drop table test.a ;               -- 删除test.a表<br>Query OK, 0 rows affected (0.02 sec)<br>MySQL [oceanbase]> create table test.a(i int) ;insert into test.a values(1);   -- 再次在test库中创建表a,此次写⼊⼀条数据<br>Query OK, 0 rows affected (0.04 sec)<br>Query OK, 1 row affected (0.01 sec)<br>MySQL [oceanbase]> drop table test.a ;               -- 再次删除test.a表<br>Query OK, 0 rows affected (0.01 sec)<br>MySQL [oceanbase]> show recyclebin ;                 -- 查看2个test.a表是否都在回收站中(在)<br>+-----------------------------------------+---------------+-------+----------------------------+<br>| OBJECT_NAME                             | ORIGINAL_NAME | TYPE  | CREATETIME                 |<br>+-----------------------------------------+---------------+-------+----------------------------+<br>| __recycle_$_1677212890_1680258454351360 | a             | TABLE | 2023-03-31 18:27:34.351415 |<br>| __recycle_$_1677212890_1680258454423040 | a             | TABLE | 2023-03-31 18:27:34.422931 |<br>+-----------------------------------------+---------------+-------+----------------------------+<br>2 rows in set (0.01 sec)<br>MySQL [oceanbase]> flashback table test.a to before drop ;   -- 闪回test.a表<br>Query OK, 0 rows affected (0.02 sec)<br>MySQL [oceanbase]> show recyclebin ;                 -- 恢复的是最晚删除的对象,所以回收站中留存的是较早删除的对象<br>+-----------------------------------------+---------------+-------+----------------------------+<br>| OBJECT_NAME                             | ORIGINAL_NAME | TYPE  | CREATETIME                 |<br>+-----------------------------------------+---------------+-------+----------------------------+<br>| __recycle_$_1677212890_1680258454351360 | a             | TABLE | 2023-03-31 18:27:34.351415 |<br>+-----------------------------------------+---------------+-------+----------------------------+<br>1 row in set (0.00 sec)<br>MySQL [oceanbase]> select * from test.a ;            -- 确认闪回的表是否是最晚删除的表(是)<br>+------+<br>| i    |<br>+------+<br>|    1 |<br>+------+<br>1 row in set (0.01 sec)<br>MySQL [oceanbase]> purge recyclebin ;                -- 清理回收站<br>Query OK, 0 rows affected (0.02 sec)<br>

    3. 关闭回收站后,是否能看到回收站中的对象?

    MySQL [oceanbase]> create table test.a(i int) ;      -- 在test库中创建表a<br>Query OK, 0 rows affected (0.05 sec)<br>MySQL [oceanbase]> set session recyclebin=1 ;        -- 开启回收站<br>Query OK, 0 rows affected (0.00 sec)<br>MySQL [oceanbase]> drop table test.a ;               -- 删除test.a表<br>Query OK, 0 rows affected (0.02 sec)<br>MySQL [oceanbase]> set session recyclebin=0 ;        -- 关闭回收站<br>Query OK, 0 rows affected (0.00 sec)<br>MySQL [oceanbase]> show recyclebin ;                 -- 确认是否能查看回收站中的对象(能)<br>+-----------------------------------------+---------------+-------+----------------------------+<br>| OBJECT_NAME                             | ORIGINAL_NAME | TYPE  | CREATETIME                 |<br>+-----------------------------------------+---------------+-------+----------------------------+<br>| __recycle_$_1677212890_1680259040929280 | a             | TABLE | 2023-03-31 18:37:20.928638 |<br>+-----------------------------------------+---------------+-------+----------------------------+<br>1 row in set (0.00 sec)<br>

    4. 回收站是全租户可⻅,还是只有当前租户可⻅?

    [root@ob-70 ~]# mysql -h10.186.63.134 -uroot@t1#oceanb_test_zhn  -P2883 -c -A -e "create table test.tb1(i int);set session<br>recyclebin=1;drop table test.tb1;show recyclebin;purge recyclebin ;"<br>+-----------------------------------------+---------------+-------+----------------------------+<br>| OBJECT_NAME                             | ORIGINAL_NAME | TYPE  | CREATETIME                 |<br>+-----------------------------------------+---------------+-------+----------------------------+<br>| __recycle_$_1677212890_1680259840925720 | tb1           | TABLE | 2023-03-31 18:50:40.924748 |<br>+-----------------------------------------+---------------+-------+----------------------------+<br>[root@ob-70 ~]# mysql -h10.186.63.134 -uroot@sys#'oceanb_test_zhn' -P2883 -c -p'aaAA__12' -A  -e "show recyclebin;"<br>+-----------------------------------------+---------------+-------+----------------------------+<br>| OBJECT_NAME                             | ORIGINAL_NAME | TYPE  | CREATETIME                 |<br>+-----------------------------------------+---------------+-------+----------------------------+<br>| __recycle_$_1677212890_1680259040929280 | a             | TABLE | 2023-03-31 18:37:20.928638 |<br>+-----------------------------------------+---------------+-------+----------------------------+<br>

    5. 关闭回收站后,是否能闪回表?

    MySQL [oceanbase]>  -- 获取回收站中表所在database的名称<br>    ->         select rb.tenant_id, rb.database_id, db.database_name, rb.table_id,<br>    ->        rb.tablegroup_id, rb.original_name from __all_recyclebin rb<br>    ->  inner join __all_virtual_database db<br>    ->          on rb.database_id=db.database_id;<br>+-----------+---------------+---------------+---------------+---------------+---------------+<br>| tenant_id | database_id   | database_name | table_id      | tablegroup_id | original_name |<br>+-----------+---------------+---------------+---------------+---------------+---------------+<br>|         1 | 1099511628776 | test          | 1099511677792 |            -1 | a             |<br>+-----------+---------------+---------------+---------------+---------------+---------------+<br>1 row in set (0.01 sec)<br>MySQL [oceanbase]> set session recyclebin=0;<br>Query OK, 0 rows affected (0.01 sec)<br>MySQL [oceanbase]> flashback table test.a to before drop ;<br>Query OK, 0 rows affected (0.02 sec)<br>MySQL [oceanbase]> desc test.a ;<br>+-------+---------+------+-----+---------+-------+<br>| Field | Type    | Null | Key | Default | Extra |<br>+-------+---------+------+-----+---------+-------+<br>| i     | int(11) | YES  |     | NULL    |       |<br>+-------+---------+------+-----+---------+-------+<br>1 row in set (0.00 sec)<br>
  7. 关闭回收站后,是否能闪回租户?

    MySQL [oceanbase]> set session recyclebin=1;    -- 开启回收站<br>Query OK, 0 rows affected (0.00 sec)<br>MySQL [oceanbase]> drop tenant t1 ;             -- 删除租户t1<br>Query OK, 0 rows affected (0.01 sec)<br>MySQL [oceanbase]> show recyclebin ;            -- 查看租户t1是否在回收站中(在)<br>+-----------------------------------------+---------------+--------+----------------------------+<br>| OBJECT_NAME                             | ORIGINAL_NAME | TYPE   | CREATETIME                 |<br>+-----------------------------------------+---------------+--------+----------------------------+<br>| __recycle_$_1677212890_1680256737738240 | t1            | TENANT | 2023-03-31 18:03:11.107511 |<br>+-----------------------------------------+---------------+--------+----------------------------+<br>1 row in set (0.00 sec)<br>MySQL [oceanbase]>  alter system change tenant t1 ;   -- 切换到租户t1(因租户不存在,所以会报错)<br>ERROR 5160 (HY000): invalid tenant name specified in connection string<br>MySQL [oceanbase]> set session recyclebin=0;    -- 关闭回收站<br>Query OK, 0 rows affected (0.00 sec)<br>MySQL [oceanbase]> flashback tenant t1 to before drop ;   -- 闪回租户t1<br>Query OK, 0 rows affected (0.02 sec)<br>MySQL [oceanbase]> alter system change tenant t1 ;   -- 切换到租户t1(成功)<br>Query OK, 0 rows affected (0.00 sec)<br>

    结论:

    1. 如何获取回收站中,表的 database ?

    -- 获取回收站中表所在 database 的名称

    select rb.tenant_id, rb.database_id, db.database_name, rb.table_id,<br> rb.tablegroup_id, rb.original_name from __all_recyclebin rb<br> inner join __all_virtual_database db<br> on rb.database_id=db.database_id;<br>

    2. 回收站中是否可以保存多个同名的表?闪回的时候是哪个?

    回收站中可以保存多个同名的表,闪回的是最晚删除的同名表;

    3. 关闭回收站后,是否能看到回收站中的对象?

    关闭回收站后,可以看到回收站中的对象;

    4. 回收站是全租户可⻅,还是只有当前租户可⻅?

    回收站中的对象,仅租户内可⻅,其他租户不可⻅;

    5. 关闭回收站后,是否能闪回表?

    关闭回收站后,可以闪回表;

    6. 关闭回收站后,是否能闪回租户?

    关闭回收站后,可以闪回租户

    总结:

    删除对象时,需要开启回收站,对象才会保存在回收站中;

    即使回收站关闭,我们也能看到回收站中的对象;

    即使回收站关闭,我们也能操作(闪回/清除)回收站中的对象;

    回收站中可以保存同名的对象,根据 ORIGINAL_NAME 闪回时,会闪回最新删除的对象,历史对象还会保存在回收站中;

    把对象从回收站中删除时,因为需要使⽤ OBJECT_NAME (唯⼀属性),所以只会命中⼀条记录;

    本文关键字:#回收站# #recyclebin#

    文章推荐:

    OB运维 | tenant--删除租户的流程设计

    OB运维 | 连接 kill 中的 session_id

    OB运维 | tenant--删除租户的命令

    关于SQLE

    爱可生开源社区的 SQLE 是一款面向数据库使用者和管理者,支持多场景审核,支持标准化上线流程,原生支持 MySQL 审核且数据库类型可扩展的 SQL 审核工具。

    SQLE 获取

    类型 地址
    版本库 https://github.com/actiontech/sqle
    文档 https://actiontech.github.io/sqle-docs-cn/
    发布信息 https://github.com/actiontech/sqle/releases
    数据审核插件开发文档 https://actiontech.github.io/sqle-docs-cn/3.modules/3.7_auditplugin/auditplugin_development.html

    更多关于 SQLE 的信息和交流,请加入官方QQ交流群:637150065...

本文分享自微信公众号 - 爱可生开源社区(ActiontechOSS)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。