oracle BBED 直接改动数据库block块
1.BBED配置
1)将相应文件放到$ORACLE_HOME/rdbms/mesg和$ORACLE_HOME/rdbms/lib中;
--将lib中bbedus.msb和bbedus.msg 放在$ORACLE_HOME/rdbms/mesg下
--将lib中sbbdpt.o和ssbbded.o 放在$ORACLE_HOME/rdbms/lib下
2)安装BBED
--在$ORACLE_HOME/rdbms/lib下运行:
[oracle@jibo lib]$ make -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed
--运行后会在lib下生成一个bbed可运行文件
默认password;
blockedit
3)配置參数文件和数据文件列表
--參数文件:
cd /home/oracle
vi bbed.par
blocksize=8192
listfile=/home/oracle/list.log
mode=edit
这个文件是bbed的配置文件,配置了blocksize,listfile,mode 三个參数,我们在启动的时候,使用这个文件把bbed拉起来。
SQL> show parameter db_block_size
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_block_size integer 8192
SQL>
[oracle@dell1 home]$ cat bbed.log
blocksize=8192
listfile=/home/oracle/list.log
mode=edit
mode=edit 默认是borwser 浏览模式
能够使用 set mode edit 来切换
--数据文件列表:
vi list.log
这个文件相应的3个列为。file_id,path,block_size,能够使用SQL生成:
select file#||' '||name||' '||bytes from v$datafile ;
1 /opt/oracle/oradata/ge01/system01.dbf 870318080
2 /opt/oracle/oradata/ge01/users_cms.dbf 524288000
3 /opt/oracle/oradata/ge01/sysaux01.dbf 1866465280
4 /opt/oracle/oradata/ge01/users01.dbf 18971361280
5 /opt/oracle/oradata/ge01/users02.dbf 1073741824
6 /opt/oracle/oradata/ge01/perstat.dbf 209715200
7 /opt/oracle/oradata/ge01/undotbs02.dbf 1073741824
8 /opt/oracle/oradata/ge01/ttuser.dbf 41943040
9 /opt/oracle/oradata/ge01/idx_2k 20971520
oracle BBED 直接改动数据库block块
bbed就是英文block browse block edit的缩写,用来直接查看和改动数据文件数据的一个工具。
4)进入BBED
在$ORACLE_HOME/rdbms/lib下
./bbed parfile=/home/oracle/bbed.par
2.构造測试数据:
新建一个表,插入5条測试数据:
create table chenlintest (id number(5) , name varchar(10)) tablespace users;
SQL> insert into chenlintest values(1,'aa');
1 row created.
SQL> insert into chenlintest values (888 ,'chenlin') ;
1 row created.
SQL> insert into chenlintest values (999 ,'china') ;
1 row created.
SQL> insert into chenlintest values (999 ,'usa') ;
1 row created.
SQL> insert into chenlintest values (1001 ,'sydney') ;
1 row created.
Commit complete.
SQL> select * from chenlintest ;
ID NAME
---------- ----------
1 aa
999 usa
1001 sydney
888 chenlin
999 china
SQL> SELECT
dbms_rowid.rowid_relative_fno(rowid) REL_FNO,
dbms_rowid.rowid_block_number(rowid) BLOCKNO,
dbms_rowid.rowid_row_number(rowid) ROWNO,
user_id,username from t
where rownum <6;
REL_FNO BLOCKNO ROWNO ID NAME
---------- ---------- ---------- ---------- ----------
4 234300 0 1 aa
4 234300 1 999 usa
4 234300 2 1001 sydney
4 234300 3 888 chenlin
4 234300 4 999 china
通过上面的sql语句能够看出,chenlintest这个表的全部数据都在第4号文件的第234300个block块上。
如今我们尝试去改动 aa ,也就是第一行。
3.备份数据文件
RMAN> backup datafile plus archivelog;
或者
RMAN> backup datafile 4;
4.直接改动数据库block块
1)bbed概览
-- 进入bbed
[oracle@dell1 home]$./bbed parfile=/home/oracle/bbed.par 或者直接是 ./bbed
[oracle@dell1 lib]$ pwd
/opt/oracle/product/10g/rdbms/lib
[oracle@dell1 lib]$ ll | grep bbed
-rwxr-xr-x 1 oracle oinstall 536154 May 14 14:47 bbed
[oracle@dell1 lib]$
[oracle@dell1 lib]$ ./bbed
Password: blockedit
BBED: Release 2.0.0.0.0 - Limited Production on Mon May 14 17:45:20 2012
Copyright (c) 1982, 2005, Oracle. All rights reserved.
************* !!! For Oracle Internal Use only !!! ***************
BBED> help all 查看全部命令帮助
最经常使用的有show , map , dump ,set dba , set file 。set block 等
以下是几个经常使用的:
set 设定当前的环境
show 查看当前的环境參数。跟sqlplus的同名命令类似。
dump 列出指定block的内容
find 在指定的block中查找指定的字符串,结果是显示出字符串,及其偏移量--offset,偏移量就是在block中的字节数
modify 改动指定block的指定偏移量的值。能够在线改动。
copy 把一个block的内容copy到还有一个block中
verify 检查当前环境是否有坏块
sum 计算block的checksum,modify之后block就被标识为坏块。current checksum与reqired checksum不一致,sum命令能够计算出新的checksum并应用到当前块。
undo 回滚当前的改动操作,假设手误做错了。undo一下就ok了,回到原来的状态。
revert 回滚全部之前的改动操作,意思就是 undo all
2)确定文件和块
BBED> show
FILE# 0
BLOCK# 1
OFFSET 0
DBA 0x00000000 (0 0,1)
FILENAME
BIFILE bifile.bbd
LISTFILE
BLOCKSIZE 8192
MODE Browse
EDIT Unrecoverable
IBASE Dec
OBASE Dec
WIDTH 80
COUNT 512
LOGFILE log.bbd
SPOOL No
BBED> set file 4
BBED-00312: no LISTFILE specified /* LISTFILE为空,说明我们刚刚新建的 file.txt未正确引入进来 */
BBED> set list '/home/oracle/file.txt'
LISTFILE /home/oracle/file.txt
BBED> info
File# Name Size(blks)
----- ---- ----------
1 /opt/oracle/oradata/ge01/system01.dbf 106240
2 /opt/oracle/oradata/ge01/users_cms.dbf 64000
3 /opt/oracle/oradata/ge01/sysaux01.dbf 227840
4 /opt/oracle/oradata/ge01/users01.dbf 524287
5 /opt/oracle/oradata/ge01/users02.dbf 131072
6 /opt/oracle/oradata/ge01/perstat.dbf 25600
7 /opt/oracle/oradata/ge01/undotbs02.dbf 131072
8 /opt/oracle/oradata/ge01/ttuser.dbf 5120
9 /opt/oracle/oradata/ge01/idx_2k 2560
BBED> set file 4
FILE# 4
--4号文件为 /opt/oracle/oradata/ge01/users01.dbf
BBED> set block 234300
BLOCK# 234300
BBED> set block +10
BLOCK# 234310
BBED> set block -10
BLOCK# 234300
--偏移量是相对某个block里的偏移量。能够用+和-进行操作
还有非常多种,不多写了。參见:http://blog.csdn.net/tianlesoftware/article/details/5006580
BBED> map
File: /opt/oracle/oradata/ge01/users01.dbf (4)
Block: 234300 Dba:0x0103933c
------------------------------------------------------------
KTB Data Block (Table/Cluster)
struct kcbh, 20 bytes @0
struct ktbbh, 72 bytes @20
struct kdbh, 14 bytes @100
struct kdbt[1], 4 bytes @114
sb2 kdbr[5] @118
ub1 freespace[7980] @128
ub1 rowdata[80] @8108
ub4 tailchk @8188
通过map之后,能够看出真正block的结构体系。 块中的存储是由下往上存储的,( @ 表示偏移量 ),
freespace 在真正的行数据 rowdata 之上,这个@8108開始,到@8188 ,后面放的是数据内容。
我们上面说过的。要改的aa数据就在这2个偏移量直接。
BBED> set offset 8108
OFFSET 8108
BBED> dump /v --查看offset 为8180 -8192的数据值
File: /opt/oracle/oradata/ge01/users01.dbf (4)
Block: 234300 Offsets: 8108 to 8191 Dba:0x0103933c
-------------------------------------------------------
2c020203 c20b0206 7379646e 65792c02 l ,.......sydney,.
0203c20a 64037573 612c0202 03c20a64 l ....d.usa,.....d
05636869 6e612c00 0203c209 59076368 l .china,.....Y.ch
656e6c69 6e3c0202 02c10402 63633c02 l enlin<......cc<.
0202c103 0262622c 000202c1 02026161 l .....bb,......aa
04066fe1 l ..o.
<16 bytes per line>
3)改动块
TEST_USER1@PROD> select dump('aa',1016) from dual;
DUMP('AA',1016)
----------------------------------------------------------------------------------
Typ=96 Len=2 CharacterSet=US7ASCII: 61,61
在find之前先设置想要查找的 file 和 block,默认是十进制的ascii编码,/x 表示16进制。find的结果显示出offset,即字符出现的位置。
通过find查找,“aa”的位置,我们发现6161就是 aa
假设还不确认,能够通过dump来实现
第一种find方法:
BBED> find /x 6161 curr
File: /opt/oracle/oradata/ge01/users01.dbf (4)
Block: 234300 Offsets: 8186 to 8191 Dba:0x0103933c
------------------------------------------------------------------------
61610406 6fe1
<32 bytes per line>
另外一种find方法:
BBED>
BBED> find /c aa
File: /opt/oracle/oradata/ge01/users01.dbf (4)
Block: 234300 Offsets: 8186 to 8191 Dba:0x0103933c
------------------------------------------------------------------------
61610406 6fe1
<32 bytes per line>
通过这2种方法。找到并确认 aa 在 8186 和 8191之间,以下试试改动他,把 aa 改成 bb
BBED> modify /c abcdefg
BBED-00215: editing not allowed in BROWSE mode
BBED> set mode edit
MODE Edit
BBED> modify /c bb (注意长度。不能超过建表时候设置的长度,否则会出错)
Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y
File: /opt/oracle/oradata/ge01/users01.dbf (4)
Block: 234300 Offsets: 8186 to 8191 Dba:0x0103933c
------------------------------------------------------------------------
61626364 6566
<32 bytes per line>
--让 oracle进行checksum操作
BBED> sum dba 4,234300
Check value for File 4, Block 234300:
current = 0xd268, required = 0x3405
--直接应用
BBED> sum dba 4,234300 apply ;
Check value for File 4, Block 234300:
current = 0x3405, required = 0x3405
--验证是否改动成功
BBED> verify
DBVERIFY - Verification starting
FILE = /opt/oracle/oradata/ge01/users01.dbf
BLOCK = 234300
--验证是否改动成功
DBVERIFY - Verification complete
Total Blocks Examined : 1
Total Blocks Processed (Data) : 1
Total Blocks Failing (Data) : 0
Total Blocks Processed (Index): 0
Total Blocks Failing (Index): 0
Total Blocks Empty : 0
Total Blocks Marked Corrupt : 0
Total Blocks Influx : 0
/*
Total Blocks Marked Corrupt : 0。表示木有错误
在实际工作其中,假设发现改动错误了,则能够通过undo。revert进行回滚操作。
在上面最经常使用的基本命令里面讲过了, 请注意undo和 revert的差别。
*/
4.在sqlplus中查看改动结果
SQL> select * from chenlintest ;
ID NAME
---------- ----------
1 aa
999 usa
1001 sydney
888 chenlin
999 china
--发现没有变化。考虑是否须要清空buffer cache
SQL> alter system flush buffer_cache;
System altered.
SQL> select * from chenlintest ;
ID NAME
---------- ----------
1 bb
999 usa
1001 sydney
888 chenlin
999 china
ok。下一次继续写当数据库,因为某个数据文件不一致。启动不来的时,改怎么样去改动datafile header的 SCN 号。
使其和控制文件的SCN号一致!
oracle BBED 直接改动数据库block块的更多相关文章
- 使用Oracle BBED修改Oracle11g数据库实例名称
by 蔡建良 2019-2-19 数据库名称存在SYSTEM01.DBF表空间,所以先查出你要修改的数据库的DBID和DBNAME. 一. 查询数据库实例名称 加载ORCL实例数据库的SYSTEM01 ...
- 对Oracle数据库坏块的理解
1.物理坏块和逻辑坏块 在数据库中有一个概念叫做数据块的一致性,Oracle的数据块的一致性包括了两个层次:物理一致性和逻辑一致性,如果一个数据块在这两个层次上存在不一致性,那就对应到了我们今天要要说 ...
- undo丢失恢复异常恢复,运维DBA反映Oracle数据库无法启动报错ORA-01157 ORA-01110,分析原因为Oracle数据库坏块导致
本文转自 惜纷飞 大师. 模拟基表事务未提交数据库crash,undo丢失恢复异常恢复,运维DBA反映Oracle数据库无法启动报错ORA-01157 ORA-01110,分析原因为Oracle数据库 ...
- 13 oracle数据库坏块-逻辑坏块(模拟/修复)
13 oracle数据库坏块-逻辑坏块 逻辑数据坏块的场景1)oracle bug也可能导致逻辑坏块的产生. 特别是parallel dml. 例如:Bug 5621677 Logical corru ...
- 12 oracle 数据库坏块--物理坏块-ORA-01578/ORA-01110
oracle 数据库坏块--物理坏块 数据坏块的类型物理坏块:通常是由于硬件损坏如磁盘异常导致.内存有问题.存储链有问题. IO有问题.文件系统有问题. Oracle本身的问题等逻辑坏块:可能都是软件 ...
- oracle 11g sql优化之行迁移处理(加大BLOCK块)
行链接 产生原因:当一行数据大于一个数据块,ORACLE会同时分配两个数据块,并在第一个块上登记第二个块的地址,从而形成行链接. 预防方法:针对表空间扩大数据块大小.检查:analyze table ...
- Oracle bbed 实用示例-----修改Data内容、恢复delete的rows
bbed 可以在db open 状态来进行修改,但是建议在做任何修改操作之前先shutdown db. 这样避免checkpoint 进程重写bbed 对block 的修改. 也避免oracle 在b ...
- Oracle bbed使用说明2---常用命令
一.BBED常用命令说明 先看帮助的说明 BBED> help all SET DBA [ dba | file#, block# ] SET FILENAME 'filename' SET F ...
- Oracle中HWM与数据库性能的探讨
Oracle中HWM与数据库性能的探讨 一.什么是高水位 HWM(high water mark),高水标记,这个概念在segment的存储内容中是比较重要的.简单来说,HWM就是一个segment中 ...
随机推荐
- bzoj 1503郁闷的出纳员(splay)
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 11759 Solved: 4163[Submit][Stat ...
- 【BZOJ4590】自动刷题机
[思路分析] 比赛的时候想到了用二分+贪心,二分的部分与贪心的部分也写对了,但是由于数据范围未看没有开long long,且二分左端点赋值过小导致WA掉 正解:二分+贪心 二分代码的长度,贪心判断能否 ...
- 带"签名"的请求接口实现
废话少说,直接上代码(⊙﹏⊙) class Program { //签名证书 public static X509Certificate2 cerSigneCert; private static c ...
- 2018年排名前20的数据科学Python库
Python 在解决数据科学任务和挑战方面继续处于领先地位.业已证明最有帮助的Python库,我们选择 20 多个库,因为其中一些库是相互替代的,可以解决相同的问题.因此,我们将它们放在同一个分组. ...
- python练习--1、简易登录接口
function:用于实现简单的用户登录接口. description:用户信息存储于字典中,增加用户需手动写入代码中.最多可以尝试登录9次,首次使用会先在程序目录下创建锁文件.若在用户栏输入quit ...
- Android开发笔记(10)——使用Fragment传递
转载请注明:http://www.cnblogs.com/igoslly/p/6911165.html 由于最近废寝忘食地在开发App,没来得及及时做总结,没有用很高级的部件,勉强也使用一些功能完成了 ...
- ROS:ubuntuKylin17.04-Ros使用OrbSLAM2
忙于图像处理和DCNN,很长时间不使用ROS,重新安装系统后,再次使用ORB-SLAM2(ROS)进行三维重建和实时追踪的演示. 参考以前的文章:ROS:ubuntu-Ros使用OrbSLAM ORB ...
- 读书笔记「Python编程:从入门到实践」_7.用户输入和while循环
7.1 函数input()的工作原理 函数input() 让程序暂停运行,等待用户输入一些文本.获取用户输入后,Python将其存储在一个变量中,以方便你使用. message = input(&qu ...
- C 语言复杂声明
int board [8] [8] ; //声明一个内含 int 数组的数组 int ** ptr ; //声明一个指向指针的指针,被指向的指针指向 int int * risks [10] ; // ...
- uni-app的专属强大自适应单位upx,但是这个这是一个大坑,不能动态赋值解决办法
uni-app 使用 upx 作为默认尺寸单位, upx 是相对于基准宽度的单位,可以根据屏幕宽度进行自适应.uni-app 规定屏幕基准宽度750upx. 开发者可以通过设计稿基准宽度计算页面元素 ...