[20160302]关于bootstrap$的替换3.txt

[20160302]关于bootstrap$的替换3.txt

--前几天写了关于启动时读取bootstrap$的内容。链接如下:http://blog.itpub.net/267265/viewspace-2016219/
--理论将可以自己建立一个新的bootstrap$替换它。自己测试看看。

1.环境:
--安全起见,先做一个冷备份。

SYS@book> @ &r/ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

create table bootstrap1 as select * from bootstrap$ ;

SYS@book> delete from bootstrap1 where LINE#=59;
1 row deleted.

SYS@book> commit ;
Commit complete.

SYS@book> select object_id,data_object_id,object_name from dba_objects where object_name='BOOTSTRAP1';
OBJECT_ID DATA_OBJECT_ID OBJECT_NAME
---------- -------------- --------------------
     91230          91230 BOOTSTRAP1

SYS@book> select owner,segment_name,header_file,header_block from dba_segments where segment_name='BOOTSTRAP1';
OWNER  SEGMENT_NAME         HEADER_FILE HEADER_BLOCK
------ -------------------- ----------- ------------
SYS    BOOTSTRAP1                     1        94712

SYS@book> select * from dba_extents where segment_name='BOOTSTRAP1';
OWNER  SEGMENT_NAME          SEGMENT_TYPE       TABLESPACE_NAME  EXTENT_ID    FILE_ID   BLOCK_ID      BYTES     BLOCKS RELATIVE_FNO
------ --------------------  ------------------ --------------- ---------- ---------- ---------- ---------- ---------- ------------
SYS    BOOTSTRAP1            TABLE              SYSTEM                   0          1      94712      65536          8            1

SYS@book> @ &r/convrdba 1 94712
old   2:  TO_CHAR (dbms_utility.make_data_block_address(&1,&2), 'xxxxxxxxxxxxx') rdba16,
new   2:  TO_CHAR (dbms_utility.make_data_block_address(1,94712), 'xxxxxxxxxxxxx') rdba16,
old   3: dbms_utility.make_data_block_address(&&1,&&2) rdba
new   3: dbms_utility.make_data_block_address(1,94712) rdba
RDBA16               RDBA
-------------- ----------
        4171f8    4289016

BBED> set dba 1,94712
        DBA             0x004171f8 (4289016 1,94712)

SYS@book> @ &r/bbvi 1 1
BVI_COMMAND
-----------------------------------------------------
bvi -b 8192 -s 8192 /mnt/ramdisk/book/system01.dbf

SYS@book> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.

2.修改:

$ bvi -b 8192 -s 8192 /mnt/ramdisk/book/system01.dbf

--反转一下就是修改偏移量96处为 f8714100

BBED> set dba 1,1
        DBA             0x00400001 (4194305 1,1)

BBED> p kcvfhrdb
ub4 kcvfhrdb                                @96       0x004171f8

BBED> sum
Check value for File 1, Block 1:
current = 0x1f28, required = 0x6cd9

BBED> sum apply
Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y
Check value for File 1, Block 1:
current = 0x6cd9, required = 0x6cd9

3.启动测试:
SYS@book> startup
ORACLE instance started.

Total System Global Area  634679296 bytes
Fixed Size                  2255912 bytes
Variable Size             264242136 bytes
Database Buffers          360710144 bytes
Redo Buffers                7471104 bytes
Database mounted.
Database opened.

--OK!但是这样存在一个问题:

SYS@book> select rowid,a.* from bootstrap1 a where line#=2;
ROWID                   LINE#       OBJ# SQL_TEXT
------------------ ---------- ---------- ------------------------------------------------------------
AAAWReAABAAAXH7AAG          2          2 CREATE CLUSTER C_OBJ#("OBJ#" NUMBER) PCTFREE 5 PCTUSED 40 IN
                                         ITRANS 2 MAXTRANS 255 STORAGE (  INITIAL 136K NEXT 200K MINE
                                         XTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 OBJNO 2 EXTENTS
                                          (FILE 1 BLOCK 144)) SIZE 800

SYS@book> select rowid,a.* from bootstrap$ a where line#=2;
ROWID                   LINE#       OBJ# SQL_TEXT
------------------ ---------- ---------- ------------------------------------------------------------
AAAWReAABAAAXH7AAG          2          2 CREATE CLUSTER C_OBJ#("OBJ#" NUMBER) PCTFREE 5 PCTUSED 40 IN
                                         ITRANS 2 MAXTRANS 255 STORAGE (  INITIAL 136K NEXT 200K MINE
                                         XTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 OBJNO 2 EXTENTS
                                          (FILE 1 BLOCK 144)) SIZE 800

SYS@book> @ &r/rowid AAAWReAABAAAXH7AAG
    OBJECT       FILE      BLOCK        ROW DBA                  TEXT
---------- ---------- ---------- ---------- -------------------- ----------------------------------------
     91230          1      94715          6 1,94715              alter system dump datafile 1 block 94715
 
--可以发现现在bootstrap1与bootstrap$指向相同的位置。而实际的情况是:

SYS@book> select owner,segment_name,header_file,header_block from dba_segments where segment_name='BOOTSTRAP1';
OWNER  SEGMENT_NAME         HEADER_FILE HEADER_BLOCK
------ -------------------- ----------- ------------
SYS    BOOTSTRAP1                     1        94712

SYS@book> select owner,segment_name,header_file,header_block from dba_segments where segment_name='BOOTSTRAP$';
OWNER  SEGMENT_NAME         HEADER_FILE HEADER_BLOCK
------ -------------------- ----------- ------------
SYS    BOOTSTRAP$                     1          520

4.继续测试:
--实际上现在bootstrap$实际上读的是HEADER_BLOCK=94712,也就是BOOTSTRAP1.不建议做这样的修改,仅仅为了学习。
--千万不要在生产系统做这样的测试。

SYS@book> alter system flush shared_pool;
System altered.

SYS@book> select rowid,a.* from bootstrap$ a where line#=2;
ROWID                   LINE#       OBJ# SQL_TEXT
------------------ ---------- ---------- ------------------------------------------------------------
AAAWReAABAAAXH7AAG          2          2 CREATE CLUSTER C_OBJ#("OBJ#" NUMBER) PCTFREE 5 PCTUSED 40 IN
                                         ITRANS 2 MAXTRANS 255 STORAGE (  INITIAL 136K NEXT 200K MINE
                                         XTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 OBJNO 2 EXTENTS
                                          (FILE 1 BLOCK 144)) SIZE 800

--感觉有点怪怪的。最好的方式是改名看看。

SYS@book> rename bootstrap$ to bootstrapx;
rename bootstrap$ to bootstrapx
*
ERROR at line 1:
ORA-00701: object necessary for warmstarting database cannot be altered

$ oerr ora 701
00701, 00000, "object necessary for warmstarting database cannot be altered"
// *Cause:  Attempt to alter or drop a database object (table, cluster, or
//          index) which are needed for warmstarting the database.
// *Action: None.

--实际上可以参考链接http://www.xifenfei.com/5021.html,使用exec DBMS_DDL_INTERNAL.SWAP_BOOTSTRAP('BOOTSTRAP1').而不是手工操作,
--大家可以参考链接再测试,不再测试。

SYS@book> startup upgrade;
ORACLE instance started.

Total System Global Area  634679296 bytes
Fixed Size                  2255912 bytes
Variable Size             264242136 bytes
Database Buffers          360710144 bytes
Redo Buffers                7471104 bytes
Database mounted.
Database opened.

SYS@book> rename bootstrap$ to bootstrapx;
rename bootstrap$ to bootstrapx
*
ERROR at line 1:
ORA-00701: object necessary for warmstarting database cannot be altered

SYS@book> drop table  bootstrap$ ;
drop table  bootstrap$
            *
ERROR at line 1:
ORA-00701: object necessary for warmstarting database cannot be altered

--我的这个版本根本不能改名与删除。也许要通过直接修改内部表obj$,对换名字。

SYS@book> select obj#,owner#,name,namespace from obj$ where  obj# in (59,91230);
      OBJ#     OWNER# NAME                  NAMESPACE
---------- ---------- -------------------- ----------
        59          0 BOOTSTRAP$                    1
     91230          0 BOOTSTRAP1                    1

SYS@book> update obj$ set name='BOOTSTRAPX' where obj#=59;
1 row updated.

SYS@book> update obj$ set name='BOOTSTRAP$' where obj#=91230;
1 row updated.

SYS@book> select obj#,owner#,name,namespace from obj$ where  obj# in (59,91230);
      OBJ#     OWNER# NAME                  NAMESPACE
---------- ---------- -------------------- ----------
        59          0 BOOTSTRAPX                    1
     91230          0 BOOTSTRAP$                    1

SYS@book> commit ;
Commit complete.

--重新启动再测试:
SYS@book> startup
ORACLE instance started.
Total System Global Area  634679296 bytes
Fixed Size                  2255912 bytes
Variable Size             264242136 bytes
Database Buffers          360710144 bytes
Redo Buffers                7471104 bytes
Database mounted.
Database opened.
--OK!

SYS@book> select rowid,a.* from bootstrap$ a where line#=2;
ROWID                   LINE#       OBJ# SQL_TEXT
------------------ ---------- ---------- ------------------------------------------------------------
AAAWReAABAAAXH7AAG          2          2 CREATE CLUSTER C_OBJ#("OBJ#" NUMBER) PCTFREE 5 PCTUSED 40 IN
                                         ITRANS 2 MAXTRANS 255 STORAGE (  INITIAL 136K NEXT 200K MINE
                                         XTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 OBJNO 2 EXTENTS
                                          (FILE 1 BLOCK 144)) SIZE 800

SYS@book> select rowid,a.* from bootstrapx a where line#=2;
ROWID                   LINE#       OBJ# SQL_TEXT
------------------ ---------- ---------- ------------------------------------------------------------
AAAAA7AABAAAAILAAG          2          2 CREATE CLUSTER C_OBJ#("OBJ#" NUMBER) PCTFREE 5 PCTUSED 40 IN
                                         ITRANS 2 MAXTRANS 255 STORAGE (  INITIAL 136K NEXT 200K MINE
                                         XTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 OBJNO 2 EXTENTS
                                          (FILE 1 BLOCK 144)) SIZE 800
--rowid 不一样了。

SYS@book> select owner,segment_name,header_file,header_block from dba_segments where segment_name='BOOTSTRAPX';
OWNER  SEGMENT_NAME         HEADER_FILE HEADER_BLOCK
------ -------------------- ----------- ------------
SYS    BOOTSTRAPX                     1          520

SYS@book> select owner,segment_name,header_file,header_block from dba_segments where segment_name='BOOTSTRAP$';
OWNER  SEGMENT_NAME         HEADER_FILE HEADER_BLOCK
------ -------------------- ----------- ------------
SYS    BOOTSTRAP$                     1        94712

总结:
1.实际上测试测试仅仅加强理解,不要在生产系统做这样的测试!!!
2.而且如果出现损坏坏块,仅仅损坏这个区域的概率很小,要破坏也是一片区域。另外其他的区域如果破坏,你可以发现
  CREATE CLUSTER C_OBJ# 建立在FILE 1 BLOCK 144,如果损坏,数据库也无法启动。

时间: 2024-09-20 20:51:12

[20160302]关于bootstrap$的替换3.txt的相关文章

[20160302]奇怪的回滚段.txt

[20160302]奇怪的回滚段.txt --昨天在探究oracle的启动时,无意中发现我安装这个版本,在安装的测试样例表空间example出现回滚段. --自己今天仔细看看: 1.环境: SYS@book> @ &r/ver1 PORT_STRING                    VERSION        BANNER ------------------------------ -------------- ----------------------------------

指令-linux 批量替换带有空格的字符串

问题描述 linux 批量替换带有空格的字符串 将多个文件中的 //#define LOG 0 批量替换成 #define LOG 0 求linux指令,或者是一个脚本 重复写一遍: 将多个文件中的 //#define LOG 0 批量替换成 #define LOG 0 求linux指令,或者是一个脚本 解决方案 替换a.txt中的 sed -i "s@//#define LOG 0@#define LOG 0@" a.txt 解决方案二: 直接字符串匹配 用python的string

用某行内容替换特定字符_DOS/BAT

复制代码 代码如下: @echo off :: 用A.TXT中的第一行字符,替换B.TXT中的###字符. :: 再用A.TXT中的第二行字符,替换B.TXT中的@@@字符. :: -- :: 如果A.txt第M行中含有在第N行中要替换的内容S(M<N),则会用S来替换B.txt中含有第M行中的匹配内容 :: 例如:假设A.txt中第1行含有在第二行中要替换的@@@,则会用@@@替换B.txt中含有第一行的@@@. :: 使用格式:要用第M行的内容替换S,就在第M行的位置上加一句 call :_

php遍历目录与文件夹的几种方法

 遍历目录或遍历目录下指定类型的文件,这是每一个童鞋在写程序的时候难免会用到的.PHP本身也提供了很多灰常有用的函数,正确地使用它们,不会有错滴. 下面就我个人学习过程中的一些总结,希望对想学PHP的童鞋有所帮助. //本函数可以列出指定目录下所有的文件(包括子目录下的) 代码如下 function getfiles($path){ foreach(scandir($path) as $afile) { if($afile=='.'||$afile=='..') continue; if(is_

基于SCIM输入法自己配置一个“万能五笔”

在WINXP中常用万能五笔的我,现在到了linux却不知道怎么办,之前我在用ubuntu的一些时候都不知道linux也有可以用万能五笔的可能,不过现在知道了有一些高手却实能办到在linux用上万能五笔了,首先我还是要非常感谢他们的智慧咯-谁叫自己不会呢- 在一次无意中发现了有一个基于SCIM 搞了个"万能五笔"(ubuntu)的方法,这使我马上激动起来.哈哈----不过我还不是非常的确定这个所谓的五笔真的是不是像在WINXP中用的五笔一样好使,然后看看他做的一些解释,才把心放下来. 资

百度之星试题每周一练

百度之星,是全球最大的中文搜索引擎,百度公司面向中国高校学生和编程爱好者所举办的高水平的程序设计大赛.他所考试的题目,全部都是算法的题目. 鄙人虽然是一个.net程序员,在工作之余,喜爱算法. 这个问题非常的巧,故而分享给大家,我想到一种超简单方法,提供大家,希望对大家起了一个开阔思路的作用. 首先,题意是这样的: 八方块移动游戏要求从一个含 8 个数字 (用 1-8 表示) 的方块以及一个空格方块 (用 0 表示) 的 3x3 矩阵的起始状态开始,不断移动该空格方块以使其和相邻的方块互换,直至

LFCS 系列第十二讲:如何使用 Linux 的帮助文档和工具

由于 2016 年 2 月 2 号开始启用了新的 LFCS 考试要求, 我们在 LFCS 系列系列添加了一些必要的内容.为了考试的需要,我们强烈建议你看一下LFCE 系列. LFCS: 了解 Linux 的帮助文档和工具 当你习惯了在命令行下进行工作,你会发现 Linux 已经有了许多使用和配置 Linux 系统所需要的文档. 另一个你必须熟悉命令行帮助工具的理由是,在LFCS 和 LFCE 考试中,它们是你唯一能够使用的信息来源,没有互联网也没有百度.你只能依靠你自己和命令行. 基于上面的理由

用C#写一个程序

问题描述 使用c#语言完成题目:遍历指定目录并用指定字符串替换目录中指定类型文件中某一字符.比如,遍历d:中所有.txt文件,并用"new"字符串替换所有.txt文件中"old"字符串. 解决方案 解决方案二:作业啊?string[]files=Directory.GetFiles(path,"*.txt",SearchOption.AllDirectories);foreach(stringfileinfiles){//在这里根据File名操作

php遍历目录与文件夹的多种方法详解_php实例

遍历目录或遍历目录下指定类型的文件,这是每一个童鞋在写程序的时候难免会用到的.PHP本身也提供了很多灰常有用的函数,正确地使用它们,不会有错滴.下面就我个人学习过程中的一些总结,希望对想学PHP的童鞋有所帮助.本函数可以列出指定目录下所有的文件(包括子目录下的) 复制代码 代码如下: function getfiles($path){ foreach(scandir($path) as $afile){if($afile=='.'||$afile=='..') continue; if(is_d