与@astentx 的评论相反,数据库只是几个文本文件。我不会每天都这样做,但您可以使用 grep 搜索数据文件。这个答案显然是半开玩笑的,但无论如何,寻找“复活节彩蛋”的价值:
SELECT * FROM dba_data_files;
FILE_NAME FILE_ID RELATIVE_FNO
/opt/oracle/oradata/ORA112E/users01.dbf 4 4
cd /opt/oracle/oradata/ORA112E/
grep -abo 'Easter egg' users01.dbf
10216453:Easter egg
所以我们在数据文件中的位置 10216453 找到它。我们需要将这个数字除以 8K 的块大小,10216453/8192 = 1247,12。这意味着,我们的行在 file=4,block=1247 中。我们可以通过查找范围找到该表:
SELECT *
FROM dba_extents
WHERE file_id=4
AND 1247 BETWEEN block_id AND block_id + blocks;
ONWER SEGMENT_NAME SEGMENT_TYPE RELATIVE_FNO
SO MYTABLE TABLE 4
所以它在模式SO 中的表MYTABLE 中。我们需要它的 dataobject_id:
SELECT data_object_id FROM DBA_OBJECTS WHERE object_name='MYTABLE';
100296
并且可以从data_object_id、相对文件号和blockid构造一个rowid:
SELECT DBMS_ROWID.ROWID_CREATE (1, 100296, 4, 1247, 0) FROM DUAL;
AAAYfIAAEAAAATfAAA
有了这个rowid,我们可以很快找到1247块中的所有行,并检查这68行:
SELECT t.*
FROM so.mytable t
WHERE rowid LIKE 'AAAYfIAAEAAAATf%';
...
PUBLIC /f5ed94fb_Base64Data1
SYS /c609bc17_Base64Encoder
PUBLIC Easter egg
SYS /2dda5449_ByteArrayOutputStrea
...