本文在windows系统从十六进制文件查看器初步解析Oracle的dmp文件。
你是一个Oracle的dba,手上有一个Oracle的dmp文件,或者你甚至不知道它是Oracle的备份文件。同时你手边没有linux环境,无法用string的方式解析,于是你希望通过阅读十六进制文件最大程度的获取该文件的相关信息。
我们先在Oracle中新建一个数据库并备份,再尝试用文本编辑器打开它。
RESPONSEFILE_VERSION =\"11.2.0\" #不能更改
OPERATION_TYPE =\"createDatabase\"
GDBNAME =\"TEST\" #数据库的名字
SID =\"TEST\" #对应的实例名字
TEMPLATENAME =\"General_Purpose.dbc\" #建库用的模板文件
CHARACTERSET =\"ZHS16GBK\"
#字符集,重要!!!建库后一般不能更改,所以建库前要确定清楚。
TOTALMEMORY =\"800\" #800MB,物理内存\*80%
dbca -silent -createDatabase -templateName General_Purpose.dbc -gdbName
TEST -sysPassword test -systemPassword test -responseFile
/data/database/response/dbca.rsp
sqlplus / as sysdba \<\<EOF
SELECT name, open_mode FROM v\\\$database;
SELECT instance_name, status FROM v\\\$instance;
EXIT;
EOF
expdp system/test DIRECTORY=dmp_dir DUMPFILE=test_demo_export.dmp
LOGFILE=expdp.log SCHEMAS=system
我们在win系统上可以使用HexEd.it —
免费基于浏览器的十六进制编辑器打开dmp文件。
我们看看能获取到什么信息。
DMP文件开头通常包含ASCII可读的头部信息,如:
EXPORT:V11.02.00(传统exp工具)或 Dump
file(数据泵expdp)等标识。通过搜索数据泵标识,我们可以确定该dmp由expdp的方式导出。
查找 CHARACTER_SET 字段(如
ZHS16GBK/AL32UTF8),位于文件前2KB内的可读字符串中。查找相关字符集,确定是ZHS16GBK
EXPORT:YYYY-MM-DD HH:MI:SS 格式的日期时间信息。
USERNAME 字段(如 USERNAME=“SCOTT”)。
所有对象名称均以明文存储。搜索关键词:
CREATE TABLE “表名”、 CREATE VIEW “视图名”。
在 CREATE TABLE 语句中可解析列定义(需熟悉Oracle语法),例如:
“EMPLOYEE_ID” NUMBER(6), “NAME” VARCHAR2(50)。
可发现 ALTER TABLE … ADD CONSTRAINT 或 CREATE INDEX 语句片段。
在二进制流中可直接识别ASCII或UTF8编码的可读字符串(如姓名/地址)。
当我们有linux环境时,使用 strings 命令提取所有可读文本(Linux:strings
-e l file.dmp > out.txt)。本文中假定只能使用windows。
数字类型(NUMBER)通常为二进制存储,难以直接解读;日期(DATE)可能以YYYYMMDDHH24MISS格式存储为16进制值。
BLOB/CLOB可能被分段存储,部分文本内容可识别,但二进制内容无法解读。
查找 TABLESPACE “表空间名” 片段。
如触发器的 CREATE TRIGGER
代码、存储过程的PL/SQL逻辑(可能包含部分可读SQL)。
通过上述方法,我们至少可提取dmp文件中元数据、对象名、部分字符数据,而无需linux环境。这对于突发情况有一定程度的帮助。
文章
阅读量
获赞