Skip to content

MDATA - 5. page

MDATA命令使用手册

MDATA的命令可以通过-help获取,参考如下:

MDATA>help

help ---- get command list
exit ---- exit from minidul
desc ---- display table structure
unload ---- unload data
unload table ---- unload data
unload table all
unload user
list ---- list schema object,partition,datafile
list users
list

<user_name>

命令介绍:
1.reload dict
重新加载数据字典,该作用为测试时候新建完对象使得数据库checkpoint一次后执行,主要是同步数据库数据字典,使用如下:

MDATA>reload dict
Start reload dict,Thu Aug 14 22:39:19 CST 2014
SQLException: State:   X0X95Severity: 30000
Operation 'TRUNCATE TABLE' cannot be performed on object 'IDUL_OBJ' because there is an open ResultSet dependent on that object.
load BOOTSTRAP$ success!
load TAB$ success!
load COL$ success!
load OBJ$ success!
load USER$ success!
load PROPS$ success!
load TABPART$ success!
load TABSUBPART$ success!
End reload dict,Thu Aug 14 22:39:26 CST 2014,reload success!

2.list命令
list命令可以列出当前数据库的用户,表等,使用如下:

MDATA>list table luda
OWNER                         TABLE
---------------               --------------
LUDA                          LUDA
LUDA                          LUDA
LUDA                          LUDA
LUDA                          LUDA
MDATA>list index scott
OWNER                         INDEX
---------------               --------------
SCOTT                         PK_DEPT
SCOTT                         PK_EMP
SCOTT                         PK_DEPT
SCOTT                         PK_EMP
MDATA>list users
USER#                         USER_NAME
---------------               --------------
43                            XDBWEBSERVICES
44                            ORDSYS
45                            ORDPLUGINS
46                            SI_INFORMTN_SCHEMA
47                            MDSYS
48                            OLAPI_TRACE_USER
50                            OLAP_DBA
......

3.desc 命令
该命令与sqlplus下的desc命令完全一致,列出表结构使用如下:

MDATA>desc luda.luda
Name                          Null?               Type
ID                                                NUMBER
NAME                                              NVARCHAR2(100)

4.unload命令
默认情况下unload是不会删除delete的数据的,要恢复delete的数据需要在unloadl table/unload user username 后面加上contain delete data(1.8版本更新)
unload命令为恢复导出数据使用,可以针对以某张表,也可以针对某个用户下的所有对象(用户级别的恢复),使用如下:

MDATA>unload user luda
unload user:LUDA
file_id:4,segment_id:51879
file_id:4,segment_id:51880
file_id:4,segment_id:51878
MDATA>unload table luda.luda
schema:LUDA;tab:LUDA
file_id:4,segment_id:51879
file_id:4,segment_id:51880
file_id:4,segment_id:51878
MDATA>

恢复出来的数据会存放在程序根目录的data文件夹中,恢复使用sqlload工具,此恢复参考http://www.ludatou.com/?p=1531

还有一篇场景恢复,目前MDATA支持delete,truncate的恢复,暂不支持drop的恢复,drop的恢复会在fk(扫描数据文件)功能开发完成后分享出来。

MDATA部署配置手册

配置MDATA

在一个环境中,需要配置的地方主要是4个,在内存上需预留空闲内存至少512M。

1. JDK配置

在MDATA1.1版本以来JDK版本要求为1.5以上版本,而在Oracle10g(包含10g)之前,包括Linux系统本身5.2之前都为1.4版本,在配置时候首先检测下JDK的版本:

系统自带的JDK版本检测

[root@ludatou ~]# java -version
java version "1.4.2"
gij (GNU libgcj) version 4.1.2 20071124 (Red Hat 4.1.2-42)

10g自带java版本

[ora10g@ludatou ~]$ $ORACLE_HOME/jdk/bin/java -version
java version "1.4.2_14"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_14-b05)
Java HotSpot(TM) Client VM (build 1.4.2_14-b05, mixed mode)

11gr1自带的java版本

[ora10g@ludatou ~]$ /u01/oracle/product/11.1.7/jdk/bin/java -version
java version "1.5.0_11"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_11-b03)
Java HotSpot(TM) Client VM (build 1.5.0_11-b03, mixed mode)

如果jdk版本低于1.5则无法正常使用MDATA,这里就需要指定1.5以上版本的JDK来执行MDATA程序,通过修改MDATA.SH(linux平台)或者MDATA.BAT(WIN平台)实现。

以linux为例

修改前:
[ora10g@ludatou MDATA155]$ cat MDATA.sh
java -Xms1024M -server -jar MDATA.jar
修改后:
[ora10g@ludatou MDATA155]$ cat MDATA.sh
/u01/oracle/product/11.1.7/jdk/bin/java -Xms512M -server -jar MDATA.jar

JDK下载地址:

JDK DOWNLOAD

2. 根目录下的config.txt

config.txt主要配置参数,字符集,块大小,版本,实例名。
具体配置参考如下:

[ora10g@ludatou MDATA155]$ cat config.txt
format=Oracle
block=8192
os=LITTLE
field=|
delete=false
charset_name=GBK
ncharset_name=AL16UTF16
db_name=lu10g
config=control.txt
output=output.log
#version 10g,11g,9i
version=10g

3. 根目录下的control.txt

control.txt主要配置需要恢复数据库的数据文件设置,配置数据文件的TS#,FILE#,NAME。
具体配置参考如下:

[ora10g@ludatou MDATA155]$ cat control.txt
# ts# file# name
[DATAFILE]
0 1 /oradata/lu10g/system01.dbf
1 2 /oradata/lu10g/undotbs01.dbf
2 3 /oradata/lu10g/sysaux01.dbf
4 4 /oradata/lu10g/users01.dbf

此信息的获取

set linesize 200
set pagesize 1024
col name for a100
select ts#,file#,name from v$datafile;

4. 根目录下的asmdisk.txt

手上暂时没有asm环境,不过配置直接从asm视图中可以查询。

[ora10g@ludatou MDATA155]$ cat asmdisk.txt
#disk_no disk_path group_name meta_block_size ausize disk_size header_offset
0  /dev/sdb1
1 /dev/sdc1

MDATA恢复场景1:在数据库不能打开,SYSTEM表空间还完整的时候

版本v1.2
该功能点使用介绍:

  • 列出用户: list user
  • 列出用户下的所有表: list table username
  • 恢复表: unload table username.tablename
  • 也可以按用户恢复: unload user username

具体操作如下:

MDATA>list table luda
OWNER                         TABLE
---------------               --------------
LUDA                          T1
MDATA>list view luda
OWNER                         VIEW
---------------               --------------
LUDA                          V$T1
MDATA>list index luda
OWNER                         INDEX
---------------               --------------
LUDA                          IDX_ID_T1
MDATA>unload dict
MDATA>list table luda
OWNER                         TABLE
---------------               --------------
LUDA                          T1

MDATA>help

help      ----   get command list
exit      ----   exit from minidul
unload    ----   unload data
  unload table <schema .tablename>    ----   unload data
  unload table all
  unload user </schema><schema name>
list      ----   list schema object,partition,datafile
  list user
  list <table | view | procedure | function | index | package | sequence> <user_ name>

MDATA>unload table luda.t1
schema:LUDA;tab:T1
tabName:LUDA.T1,dic_obj:com.olm.dic.Dict@79e2bf04,getFileid:4,getBlockid:59

导出的数据放置在MDATA目录下的data文件夹中,在该例子中生成了表luda.t1的LUDA.T1.ctl(sqlload 控制文件)以及LUDA.T1.DAT(实际的文本格式数据)

导入方法:
切换到data目录,执行如下命令
sqlldr userid=test/test@luda control=C:\Users\ludatou\Desktop\MDATA01\data\LUDA.T1.ctl

将该表数据导入到test用户中.如果以用户的方式导出,则导入整个用户数据到test用户.

_disable_logging对数据库产生的影响

测试下_disable_logging将对数据库产生的影响,由于是隐含参数,所以通过如下方法获取对这个参数的描述:

SQL> select ksppinm,ksppdesc from x$ksppi where ksppinm like '%logging';

KSPPINM              KSPPDESC
------------------------------------
_disable_logging     Disable logging
 

将其改为ture,也就是启用了不记录日志的方式:

SQL> alter system set "_disable_logging"=true scope=both;
System altered.
 

创建一个,并模拟事务运行,生成大量的redo,

SQL> create table mm tablespace marvener as select * from dba_objects;
Table created.

SQL> insert into mm  select * from dba_objects;
45167 rows created.

SQL> /
 45167 rows created.

此时模拟掉电,shutdown abort关闭数据库:

SQL> shutdown abort
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area 1610612736 bytes
Fixed Size                  2084296 bytes
Variable Size             385876536 bytes
Database Buffers         1207959552 bytes
Redo Buffers               14692352 bytes
Database mounted.
ORA-00354: corrupt redo log block header
ORA-00353: log corruption near block 81435 change 856029 time 01/30/2012
15:50:39
ORA-00312: online log 1 thread 1: '/u01/app/oracle/oradata/marven/redo01.log'
 

如上。可以发现数据库无法正常打开,并提示重做日志块头损坏,在告警中可见大量的告警,
即使通过Resetlogs方式打开数据库:

alter system set "_allow_resetlogs_corruption"=true scope=spfile;
shutdown abort
startup
 

数据库仍然会显然如下告警,并强制关闭实例:

SMON: enabling cache recovery
Mon Jan 30 16:15:41 2012
Errors in file /u01/app/oracle/admin/marven/udump/marven_ora_2900.trc:
ORA-00600: internal error code, arguments: [2662], [0], [855728], [0], [855937], [8388649], [], []
Mon Jan 30 16:15:42 2012
Errors in file /u01/app/oracle/admin/marven/udump/marven_ora_2900.trc:
ORA-00600: internal error code, arguments: [2662], [0], [855728], [0], [855937], [8388649], [], []
Mon Jan 30 16:15:42 2012
Error 600 happened during db open, shutting down database
USER: terminating instance due to error 600
Instance terminated by USER, pid = 2900
ORA-1092 signalled during: alter database open resetlogs...
Mon Jan 30 16:16:34 2012
  

然而可以通过推进Oracle的SCN来解决此类问题:

增进SCN有几种常用方法,这里介绍其中2种:
1.通过immediate trace name方式(在数据库Open状态下)
alter session set events ‘IMMEDIATE trace name ADJUST_SCN level x’;
2.通过10015事件(在数据库无法打开,mount状态下)
alter session set events ‘10015 trace name adjust_scn level x’;
注:10015的推进级别有个计算算法,具体可以参考adjust的官方说明。

alter session set events '10015 trace name adjust_scn level 10';

SQL> alter database open;

Database altered.