删除oracle bin$开头的表

Oracle回收站操作指南
本文介绍了Oracle数据库中如何使用回收站进行表的管理和恢复。包括查看已删除表、恢复表到删除前状态、彻底清除回收站中的表以及禁用回收站功能的方法。

ORACLE删除的表系统会自动给他重命名就是大家看到的【BIN$】开头的名字。
通过show recyclebin命令可以查看被删掉的表的详细信息,或者查询:
select * from recyclebin;
收回表的命令:
flashback table 原表名 to before drop;
清空回收站的命令:
purge recyclebin;
如果想直接删除表而不经过回收站:
drop table 表名 purge;
或者停用数据库的回收站功能:
10.1版本中,修改隐藏参数:_recyclebin
alter system set “_recyclebin” = false;
10.2版本中:
alter system set recyclebin = off;

转载于:https://www.cnblogs.com/dba_xiaoqi/archive/2011/04/10/2011692.html

<think>嗯,用户询问的是PostgreSQL中名变成BIN$开头的问题。这个问题在引用资料里没有直接提到,但根据我对PostgreSQL的了解,这通常与Oracle风格的回收站机制有关。 用户可能遇到了名被意外修改的情况,显得很困惑。ta的真实需求应该是想恢复这些或清理空间。考虑到BIN$前缀的特殊性,需要从几个角度分析: 首先想到的是Oracle的FLASHBACK TABLE特性。PostgreSQL虽然不原生支持,但有些第三方插件如orafce会模拟这个功能。当用户执行DROP TABLE时,插件可能不会真正删除,而是重命名成BIN$开头的名称并放入回收站。这能解释名变化的原因。 其次要确认用户环境。如果安装了oraface扩展,回收站功能默认是关闭的。用户可能在某个会话中执行了"ALTER SYSTEM SET recyclebin = on"才激活了它。需要提醒用户检查postgresql.conf文件里是否有相关配置。 解决方法方面,核心是两种途径:恢复或彻底删除。恢复可以用RECYCLEBIN TO BEFORE DROP命令,这需要原名未被占用。删除则用PURGE命令,但要注意这是不可逆操作。用户若想完全禁用该功能,可以设置recyclebin=off并清理所有BIN$对象。 最后要提醒用户谨慎操作。特别是生产环境,建议先备份再处理。如果用户实际没有使用orafce插件,那可能需要考虑其他可能性,比如恶意篡改或异常升级残留,不过这种情况比较罕见。 相关问题设计要围绕回收站机制展开,包括管理命令、空间影响、功能禁用方法等,这样能帮助用户全面掌握这个特性。</think>PostgreSQL 中名变成 `BIN$` 开头,**主要原因通常是启用了 Oracle 兼容的回收站功能(`orafce` 扩展提供)**。当用户执行 `DROP TABLE` 时,并未被立即删除,而是被重命名(通常为 `BIN$...` 格式)并移入“回收站”,以便后续恢复。 --- ### 原因分析 1. **启用了 `orafce` 扩展的回收站功能 (Recycle Bin)**: * `orafce` 是一个提供 Oracle 兼容功能的 PostgreSQL 扩展,其中包含模拟 Oracle 回收站的功能。 * 当此功能启用(`recyclebin = on`)时,执行 `DROP TABLE` 命令**不会立即删除**。 * 相反,会被**重命名**。新名称通常遵循 `BIN$<全局唯一标识符>$<版本号>` 的格式(例如 `BIN$JDBvu7sRTgGfgBgAB/AQ==$0`),这就是你看到的 `BIN$` 开头的对象。 * 这些被重命名的(及其相关对象,如索引、约束)仍然存在于原来的模式中,占用存储空间,但普通查询不可见。 2. **`recyclebin` 参数设置为 `on`**: * 该参数控制 `orafce` 回收站功能的开关。可以通过以下方式查看: ```sql SHOW recyclebin; -- 查看当前会话设置 SELECT name, setting FROM pg_settings WHERE name = 'recyclebin'; -- 查看系统设置 ``` * 如果设置为 `on`,则 `DROP TABLE` 会触发回收站行为。 --- ### 解决方法 #### 方法一:从回收站恢复 如果是被误删的,需要恢复: 1. **查看回收站内容**: ```sql SELECT * FROM RECYCLEBIN; -- 列出所有可恢复对象 SELECT * FROM RECYCLEBIN WHERE original_name = '你的名'; -- 查找特定 ``` 结果中 `object_name` 列就是 `BIN$...` 的名字,`original_name` 是原名。 2. **恢复**: ```sql FLASHBACK TABLE "BIN$JDBvu7sRTgGfgBgAB/AQ==$0" TO BEFORE DROP; -- 使用查到的完整回收站对象名 -- 或者恢复时重命名 FLASHBACK TABLE "BIN$JDBvu7sRTgGfgBgAB/AQ==$0" TO BEFORE DROP RENAME TO 新名; ``` * 恢复后,`BIN$...` 对象消失,原(或指定的新名)重新出现。 * 如果原名已被新占用,则必须使用 `RENAME TO` 子句。 #### 方法二:永久删除回收站中的(释放空间) 如果确认 `BIN$...` 开头不需要恢复,可以彻底清除: ```sql PURGE TABLE "BIN$JDBvu7sRTgGfgBgAB/AQ==$0"; -- 删除单个回收站对象 PURGE RECYCLEBIN; -- 清空当前用户的所有回收站对象 PURGE DBA_RECYCLEBIN; -- (需要超级用户权限) 清空整个数据库的所有回收站对象 ``` * **`PURGE` 操作是永久性的,不可恢复!** #### 方法三:禁用回收站功能(防止未来出现) 如果不希望 `DROP TABLE` 产生 `BIN$...` 对象: 1. **会话级别禁用** (仅影响当前连接): ```sql SET recyclebin = off; ``` 2. **数据库级别永久禁用** (需超级用户): ```sql ALTER SYSTEM SET recyclebin = off; SELECT pg_reload_conf(); -- 重新加载配置使更改生效 ``` * 或者直接修改 `postgresql.conf` 文件,添加 `recyclebin = off`,然后重启 PostgreSQL 或执行 `pg_reload_conf()`。 3. **移除 `orafce` 扩展** (如果完全不需要其功能): ```sql DROP EXTENSION orafce; -- 需要先清理所有依赖该扩展的对象或禁用回收站 ``` * 移除扩展前,确保回收站为空或已禁用,否则可能出错。 --- ### 关键点总结 | **操作** | **命令示例** | **效果** | |--------------------------|-----------------------------------------------------------------------------|---------------------------------------------| | **查看回收站** | `SELECT * FROM RECYCLEBIN;` | 列出所有可恢复的 `BIN$` 对象 | | **恢复** | `FLASHBACK TABLE "BIN$..." TO BEFORE DROP;` | 恢复至原名称 | | **恢复并重命名** | `FLASHBACK TABLE "BIN$..." TO BEFORE DROP RENAME TO new_name;` | 恢复并指定新名称 | | **删除单个对象** | `PURGE TABLE "BIN$...";` | 永久删除指定 `BIN$` 对象 | | **清空用户回收站** | `PURGE RECYCLEBIN;` | 清除当前用户的所有 `BIN$` 对象 | | **清空整个回收站** | `PURGE DBA_RECYCLEBIN;` (需超级用户) | 清除数据库中所有 `BIN$` 对象 | | **禁用回收站(会话)** | `SET recyclebin = off;` | 当前会话不再产生新 `BIN$` 对象 | | **禁用回收站(永久)** | `ALTER SYSTEM SET recyclebin = off;` + `SELECT pg_reload_conf();` | 数据库全局不再产生新 `BIN$` 对象 | > **重要提示**:在执行 `PURGE` 或 `FLASHBACK ... RENAME TO` 前务必确认对象信息,误操作可能导致数据永久丢失或命名冲突[^3]。 --- ### 相关问题 1. **如何检查我的 PostgreSQL 是否安装了 `orafce` 扩展并启用了回收站功能?** 2. **`PURGE RECYCLEBIN` 和 `PURGE DBA_RECYCLEBIN` 命令有什么区别?分别需要什么权限?** 3. **禁用回收站功能 (`recyclebin = off`) 后,之前已经存在的 `BIN$` 开头会被自动删除吗?** 4. **除了 `orafce` 的回收站,还有哪些 PostgreSQL 扩展或方法可以实现类似“回收站”或“软删除”的功能?** 5. **如果我不小心 `PURGE` 了回收站里还需要的重要,有没有办法恢复?**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值