linux下配置裸设备

检查在机器中是否可以看到刚刚添加的虚拟盘:

[root@jyrac1 ~]# fdisk -l

Disk /dev/sda: 21.4 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          13      104391   83  Linux
/dev/sda2              14        2610    20860402+  8e  Linux LVM

Disk /dev/sdb: 1073 MB, 1073741824 bytes
255 heads, 63 sectors/track, 130 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System

Disk /dev/sdc: 1073 MB, 1073741824 bytes
255 heads, 63 sectors/track, 130 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System

Disk /dev/sdd: 32.2 GB, 32212254720 bytes
255 heads, 63 sectors/track, 3916 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System

Disk /dev/sde: 32.2 GB, 32212254720 bytes
255 heads, 63 sectors/track, 3916 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System

通过fdisk -l可以看看所有磁盘的状态,如果前期裸设备规划正确的话,在诸如/dev/sdb、/dev/sdc、/dev/sdd、/dev/sde下面是看不到任何分区信息的,这也表明这些磁盘都是干净的磁盘,不像/dev/sda那样不干净(有了文件系统)。下面我们要对/dev/sdb到/dev/sde的四块磁盘进行分区,分区过程如下图所示(这里以/dev/sdb为例,其他磁盘操作类似):

磁盘分区
需要你输入的依次是”n/p/1/回车/回车/w”。

[root@jyrac1 ~]# fdisk /dev/sdb

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-130, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-130, default 130):
Using default value 130

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
[root@jyrac1 ~]#

所有磁盘分区完后

[root@jyrac1 ~]# fdisk -l

Disk /dev/sda: 21.4 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          13      104391   83  Linux
/dev/sda2              14        2610    20860402+  8e  Linux LVM

Disk /dev/sdb: 1073 MB, 1073741824 bytes
255 heads, 63 sectors/track, 130 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         130     1044193+  83  Linux

Disk /dev/sdc: 1073 MB, 1073741824 bytes
255 heads, 63 sectors/track, 130 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1               1         130     1044193+  83  Linux

Disk /dev/sdd: 32.2 GB, 32212254720 bytes
255 heads, 63 sectors/track, 3916 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sdd1               1        3916    31455238+  83  Linux

Disk /dev/sde: 32.2 GB, 32212254720 bytes
255 heads, 63 sectors/track, 3916 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sde1               1        3916    31455238+  83  Linux
[root@jyrac1 ~]#

检查分区的结果:

[root@jyrac1 linux_5.4_asmlib]# cat /proc/partitions
major minor  #blocks  name

   8     0   20971520 sda
   8     1     104391 sda1
   8     2   20860402 sda2
   8    16    1048576 sdb
   8    17    1044193 sdb1
   8    32    1048576 sdc
   8    33    1044193 sdc1
   8    48   31457280 sdd
   8    49   31455238 sdd1
   8    64   31457280 sde
   8    65   31455238 sde1
 253     0   18743296 dm-0
 253     1    2097152 dm-10
[root@racnode1 root]#

编辑/etc/udev/rules.d/60-raw.rules配置文件
#vi /etc/udev/rules.d/60-raw.rules
加载裸设备,添加以下内容
1)设置分区与RAW对应关系

ACTION=="add", KERNEL=="/dev/sdb1",RUN+="/bin/raw /dev/raw/raw1 %N"
ACTION=="add", ENV{MAJOR}=="8",ENV{MINOR}=="17",RUN+="/bin/raw /dev/raw/raw1 %M %m"
ACTION=="add", KERNEL=="/dev/sdc1",RUN+="/bin/raw /dev/raw/raw2 %N"
ACTION=="add", ENV{MAJOR}=="8",ENV{MINOR}=="33",RUN+="/bin/raw /dev/raw/raw2 %M %m"
ACTION=="add", KERNEL=="/dev/sdd1",RUN+="/bin/raw /dev/raw/raw3 %N"
ACTION=="add", ENV{MAJOR}=="8",ENV{MINOR}=="49",RUN+="/bin/raw /dev/raw/raw3 %M %m"
ACTION=="add", KERNEL=="/dev/sde1",RUN+="/bin/raw /dev/raw/raw4 %N"
ACTION=="add", ENV{MAJOR}=="8",ENV{MINOR}=="65",RUN+="/bin/raw /dev/raw/raw4 %M %m"
KERNEL=="raw[1-4]", WNER="oracle", GROUP="oinstall", MODE="640"

2)设置RAW的权限

ACTION=="add", KERNEL=="raw1", WNER="root", GROUP="oinstall", MODE="640"
ACTION=="add", KERNEL=="raw2", WNER="oracle", GROUP="oinstall", MODE="660"

如果多个RAW的权限相同可以做以下设置,如raw1,raw2权限相同:

ACTION=="add", KERNEL=="raw[1-2]", WNER="oracle", GROUP="oinstall", MODE="660"

3.重启服务
#start_udev

[root@jyrac1 ~]# start_udev
Starting udev:   [  OK  ]

4.查看raw设备
ls /dev/raw/ -l

#ls -lrt /dev/raw 或者
#raw -aq

[root@jyrac1 ~]# ls /dev/raw/ -l
total 0
crw-r----- 1 oracle oinstall 162, 1 Nov  8 15:41 raw1
crw-r----- 1 oracle oinstall 162, 2 Nov  8 15:41 raw2
crw-r----- 1 oracle oinstall 162, 3 Nov  8 15:41 raw3
crw-r----- 1 oracle oinstall 162, 4 Nov  8 15:41 raw4
[root@jyrac1 ~]# ls -lrt /dev/raw
total 0
crw-r----- 1 oracle oinstall 162, 4 Nov  8 15:41 raw4
crw-r----- 1 oracle oinstall 162, 3 Nov  8 15:41 raw3
crw-r----- 1 oracle oinstall 162, 1 Nov  8 15:41 raw1
crw-r----- 1 oracle oinstall 162, 2 Nov  8 15:41 raw2
[root@jyrac1 ~]# raw -aq
/dev/raw/raw1:  bound to major 8, minor 17
/dev/raw/raw2:  bound to major 8, minor 33
/dev/raw/raw3:  bound to major 8, minor 49
/dev/raw/raw4:  bound to major 8, minor 65
[root@jyrac1 ~]#

exp和imp的详细操作

使用导出(exp)和导入(imp)移动数据

导出和导入实用程序
导出和导入实用程序使管理员能够在 Oracle 数据库之间和 Oracle 数据库内部
将数据移动到不同的表空间或用户或重新组织数据以获得高效的存储和性
导出实用程序
导出实用程序可用于制作操作系统二进制文件的对象定义和数据的逻辑副本
导出可写入磁盘或磁带上的文件导出实用程序在每个表中提取一致的数据视
导入实用程序
导入实用程序可以读取由导出实用程序创建的操作系统文件并将对象定义和
数据复制到 Oracle 数据库中导入实用程序不能读取文本文件或用任何其它格
式创建的文件
导出和导入的用途
 重新编排表
 将一个用户所拥有的数据移至另一用户
 在两个数据库之间移动数据:
– 从开发到生产
– 从 OLTP 系统到数据仓库
 将数据库移植到另外的:
– 操作系统平台
– Oracle 数据库发行版
 开发或升级期间重复测试运行
 执行逻辑备份
使用导出和导入
导出和导入可用于下列情况
 重新组织表很多情况都需要重新组织表
– 可能需要将数据从一个表空间移动到另一个表空间以使争用减到最
少减少空闲空间碎片或为了易于备份
– 表可能包含很多移植的行
– 表可能包含很多有大量空闲空间的块
– 表可能包含很多位于高水位标记以下的空块
 将一个用户拥有的数据移动到另一个用户当需要从数据库中删除某个方案
或需要重新分发对象所有权时可能必须进行上述操作从一个用户导出的
数据可以导入到不同用户的方案中
 在数据库之间移动数据通过只提取定义而忽略数据可将对象定义从开发
数据库移动到生产数据库导出和导入还可用于将数据从 OLTP 应用程序提
取到数据仓库中
 移植到不同的操作系统平台或 Oracle 版本在一台计算机上导出的数据可
以导入到不同计算机上的数据库中该计算机可能使用不同的字符集
 移植到不同版本的 Oracle 数据库升级到新版本的 Oracle 服务器时可以
从旧版本中导出数据并导入到新版本中注意不能使用该方法将数据从新
版本移至旧版本中
 在开发或升级过程中重复运行测试在开发或测试数据库中应用程序可
能需要先进行多次测试后才能被充分调试和接受可以将测试数据导出到外
部文件并在每次运行前导入以确保在同一数据集上执行测试该方法还可
用于在升级生产数据库之前测试新版本的 Oracle 服务器
 执行逻辑备份可导出数据库中的所有或部分对象并且导出文件可用作逻
辑备份
三种导出模式
导出实用程序提供三种导出模式
 表
 用户
 数据库
表模式
所有用户都可以使用表模式导出自己的表特权用户可以导出任何用户所拥有
的表使用表模式导出
 表定义
 表中的数据如果要求
 若由特权用户执行导出则将导出表上的所有索引否则只能导出该用
户所拥有表上的索引
 仅当特权用户运行该实用程序时才可导出表上的所有触发器否则只
能导出该用户所拥有表上的触发器
 表上的约束
 在表上进行的所有授权
 在导入时使用的分析方法定义
用户模式
用户模式导出的工作方式随运行导出的用户是否有特权而异
 特权用户可以导出任何用户所拥有的对象在这种情况下导出的对象是
– 用户拥有的所有对象除了该用户拥有的但位于其他用户所拥有表上
的索引和触发器
– 其他用户在该用户的表上创建的触发器和索引
 非特权用户只能导出自己拥有的对象且该模式不包括其他用户在该用户所
拥有表上创建的索引或触发器
完全数据库模式
使用该模式时除了用户 SYS 所拥有的对象以外将导出数据库中的所有对
象该模式要求特殊权限且只能由部分用户使用
常规路径
该术语指格式化数据库数据并将其写入导出文件的缺省方法常规路径导出使
用 SQL SELECT 语句从表中提取数据数据从磁盘读入缓冲区高速缓存行则
传送到求值
缓冲区传递了表达式求值后数据传送到导出客户端后者随后
将数据写入导出文件
直接路径
直接路径导出直接读取数据并绕过 SQL 命令处理层因此提取数据的速度比常
规路径导出快得多在直接路径导出中数据从磁盘读入缓冲区高速缓存行
则直接传送到导出进程这种导出方式绕过了求值缓冲区即不重新组织块中
的数据以使行块组合在一起数据已经是导出所期望的格式因此避免了不必
要的数据转换数据传送到导出进程然后该进程将数据写入导出文件
导入实用程序能够使用由任何路径创建的导出文件使用的导出路径对执行导
入所花的时间不会有太大影响
使用导出
$exp scott/tiger tables=(dept,emp) \
> file=emp.dmp log=exp.log \
> compress=n direct=y
使用导出
可通过以下方式调用导出
 命令行
 交互模式
 图形界面若有
提供交互模式主要是为了向后兼容它只提供命令行提供的部分选项因此
建议使用命令行模式
命令行
在 UNIX 或 Windows NT 上使用以下命令执行导出
$exp [keyword=]{value|(value, value …)}
[ [ [,] keyword ]{value|(value, value …)} ] …
此处关键字是下一节所讨论的关键字之一
值是指定给关键字的值
命令行参数
以下显示了一些常用的参数
关键字         缺省值              含义
USERID                             Oracle 用户名和口令若未指定口令则用户将被提示输入口令
BUFFER        操作系统特有的       用于在行写入导出文件之前存储提取行的缓冲区
大小
COMPRESS      Y                    Y 值指定导入时初始区大小值将设置为等于段的当前大小
                                   N 值将导致保留当前区的大小导出时必须进行选择
                                   因为选择的信息要写入导出文件不收缩 LOB 段
CONSISTENT    N                    Y 值指定在一个只读事务中执行整个导出操作
                                   导出将尝试获取所有导出对象的读一致性图像
                                   N 值指定只需维护表级一致性
CONSTRAINTS   Y                    Y 值指定连同约束一起导出表N 值导致不导出约束
DIRECT        N                    Y 值指定导出使用直接路径N 值使用常规路径
FEEDBACK                           0 将该参数指定为整数 n 以请求在导出 n 行时显示
                                   句点 (.) 零缺省值表示不显示句点
FILE          expdat.dmp           输出文件名
FULL          N                    Y 值指定完全数据库导出
GRANTS        Y                    Y 值指定导入时还必须保留所有导出对象上的权限
HELP          N                    Y 值显示有关参数及其含义的列表此参数不与其它参数合用
INDEXES       Y                    Y 值使索引导出
LOG           NULL                 用于存储所有导出消息的文件名缺省情况下只在屏幕上显示消息
OWNER                              进行用户级导出的用户名
PARFILE                            指定包含导出参数列表的文件名
RECORDLENGTH 操作系统特有的        输出记录的大小
ROWS         Y                     Y 值指定将导出数据
STATISTICS   ESTIMATE              指定导入时使用的分析方法
TABLES                             方案表用于表模式导出
注释
 只可以定义下列参数之一FULL=Y WNER=user 或
TABLES=schema.table
 如果指定直接路径 (DIRECT=Y) 则 CONSISTENT 参数不能设置为 Y
使用导入
导入emp.dmp
$imp scott/tiger tables=(dept,emp) \
> file=emp.dmp log=imp.log ignore=y
使用导入
可通过以下方式调用导入
 命令行
 交互模式
 图形界面若有
提供交互模式主要是为了向后兼容它只提供命令行提供的部分选项因此
建议使用命令行模式
命令行
在 UNIX 或 Windows NT 上使用以下命令执行导出
$imp [keyword=]{value|(value, value …)}
[ [ [,] keyword ]{value|(value, value …)} ] …
此处关键字是下一节将讨论的关键字之一
值是指定给关键字的值
命令行参数
以下显示了一些常用的参数
关键字            缺省值                           含义
USERID                                             Oracle 用户名和口令如果未指定口令则将提示
                                                   用户输入口令
BUFFER            操作系统特有的                   传送数据行的缓冲区大小以字节为单位
COMMIT            N                                Y 值指定导入应在每个数组插入后提交缺省情况
                                                   下只在装载每个表后提交导入在继续下一个对
                                                   象前若发生错误则导入执行回退指定
                                                   COMMIT=Y 以防止回退段无限增大
FEEDBACK          0                                将该参数指定为整数 n 以请求在导入 n 行时显示句
                                                   点 (.) 缺省值禁止显示
FILE              expdat.dmp                       输入文件名
FROMUSER          NULL                             导入对象所属的用户列表
FULL              N                                Y 值指定完全数据库导入
GRANTS            Y                                Y 值指定还必须导入所有导入对象上的权限
HELP              N                                Y 值显示有关参数及其含义的列表此参数不与其它参数合用
IGNORE            N                                如果值为 Y 则导入在尝试创建数据库对象时将忽
                                                   略对象创建错误在这种情况下导入不报告错
                                                   误继续进行对于表IGNORE=Y 使行导入现有
                                                   表不显示任何消息IGNORE=N 导致报告错误
                                                   如果表已存在则跳过表
                                                   注意只忽略对象创建错误不忽略其它错误如
                                                   操作系统错误数据库错误和 SQL 错误并可能导
                                                   致处理停止
INDEXES           Y                                Y 值导致索引导入
INDEXFILE         NULL                             指定文件接收索引创建命令若指定了该参数则
                                                   请求模式的索引创建命令将被提取并写入指定文
                                                   件而不用于在数据库中创建索引不导入表和其
                                                   它数据库对象
                                                   然后可以编辑文件例如更改存储参数并将
                                                   其用作创建索引的 SQL 脚本
LOG               NULL                             用于存储所有导入消息的文件名缺省情况下只在屏幕上显示消息
PARFILE                                            指定包含导入参数列表的文件名
RECORDLENGTH      操作系统特有的                   输入记录的大小仅当在记录大小不同的操作系统
                                                   上导出数据时才需要此参数
ROWS              Y                                Y 值指定导入数据
SHOW              N                                如果值为 Y 则只显示而不导入列出的导出文件内
                                                   容导出中包含的 SQL 语句按导入时 SQL 语句的
                                                   执行顺序显示如果 SHOW=Y 则唯一可以设置
                                                   的其它参数为 FROMUSER TOUSER FULL 和TABLES
TABLES            NULL                             要导入的表名
TOUSER            NULL                             要导入表的用户名列表只有具有
                                                   IMP_FULL_DATABASE 角色的用户才可以使用
                                                   该参数将对象导入其他用户的帐户
注释
 只可以定义下列参数之一FULL=Y WNER=user 或
TABLES=schema.table
导入行为
 导入顺序:
表->数据->B 树索引->约束, 触发器, 位图索引
 对象使用的表空间:
– 源数据库中的相同表空间 (如果有)
– 用户的缺省表空间
导入顺序
表对象按照从导出文件读取的顺序导入导出文件按下列顺序包含对象
1 类型定义
2 表定义
3 表数据
4 表索引
5 完整性约束视图过程和触发器
6 位图函数和域索引
该顺序防止因导入表的顺序而拒绝数据该顺序还可防止在同一数据上两次触
发冗余触发器一次在初始插入时一次在导入时
但是某些对象如过程在导入时可能因为是在它们所引用对象之前导入的
而无效使用 STATUS=INVALID 检查对象并重新编译它们
导入现有表的注意事项
将数据导入现有表时导入顺序仍然会产生引用完整性失败如果表上的引用
完整性约束在导入结束时引用自身则也会发生类似的情况
出于上述原因导入现有表时禁用引用约束是一个好办法导入结束后可以
重新启用约束
用于对象的表空间
如果用户有必需的限额则将表导入它们导出时所在的同一表空间但是如
果这样的表空间已不存在或者用户没有必需的限额则导入将在该用户的缺省
表空间内创建表如果用户无法访问缺省表空间则无法导入表
只能将 LOB 段导入它导出时所在的同一表空间因此如果表所有者不能在导
出 LOB 段的表空间内创建对象则将无法创建包含 LOB 的表
导出和导入原则
 使用参数文件指定常用命令行选项
 仅在导出少量数据时使用 CONSISTENT=Y
 如果存在许多已删除的行, 请勿使用 COMPRESS=Y
 通过以下操作提高性能:
– 分配大容量缓冲区
– 若使用 7.3.3 或更高版本, 则使用直接路径
导出和导入原则
使用参数文件存储常用的命令行参数这可使错误减到最少并使命令行保持较
如果正导出的表上存在大量的更新操作使用 CONSISTENT=Y 很可能会产生
SNAPSHOT TOO OLD 错误通常在操作低峰时期运行较大的输出会更好
或者创建一个较大的回退段使所有其它的回退段脱机然后执行导入
导出选项 COMPRESS=Y 将生成创建初始区的代码初始区的大小等于当前分
配给对象的所有区的总大小如果对象上有很多已删除的行或者如果上一个
区有很多未使用的块这将不必要地分配给对象很多空间
分配计算机上的操作系统和资源所允许的缓冲区大小如果将数据导入运行
7.3.3 版或更高版本的数据库则使用直接路径导出
经过测试在exp命令中使用driect=y采用直接路径导出比常规路径要快2-3倍
常规路径
该术语指格式化数据库数据并将其写入导出文件的缺省方法常规路径导出使
用 SQL SELECT 语句从表中提取数据数据从磁盘读入缓冲区高速缓存行则
传送到求值
缓冲区传递了表达式求值后数据传送到导出客户端后者随后
将数据写入导出文件
直接路径
直接路径导出直接读取数据并绕过 SQL 命令处理层因此提取数据的速度比常
规路径导出快得多在直接路径导出中数据从磁盘读入缓冲区高速缓存行
则直接传送到导出进程这种导出方式绕过了求值缓冲区即不重新组织块中
的数据以使行块组合在一起数据已经是导出所期望的格式因此避免了不必
要的数据转换数据传送到导出进程然后该进程将数据写入导出文件
导入实用程序能够使用由任何路径创建的导出文件使用的导出路径对执行导
入所花的时间不会有太大影响
导出和字符集转换
常规路径导出在写入导出文件时使用为用户会话指定的字符集如 7 位 ASCII
或 IBM 代码页 500 (EBCDIC)
直接路径导出只使用数据库字符集导出启动导出时如果导出会话的字符集
和数据库字符集不同则导出显示警告并中止在重新尝试导出前将会话字
符集指定为与数据库字符集相同
导出文件包含一个标识用于显示其字符数据所使用的字符编码方案
导入和字符集转换
导入会话和目标数据库字符集可以不同于源数据库字符集这种情况要求一个
或多个字符集转换操作
如有必要在导入时首先将导出文件数据转换到为用户会话指定的字符编码方
案然后转换到数据库字符集
转换期间导出文件中所有在目标字符集中无等效字符的字符都用缺省字符代
替这些缺省字符由目标字符集定义若要保证 100% 转换目标字符集必须
是源字符集的超集或等效于源字符集
原则
因为字符集转换延长了导入所需的处理时间所以应尽可能地限制字符集转换
次数最理想的情形是导入会话和目标数据库字符集与源数据库字符集相
同不要求转换

ORA-12537错误的解决

SQL> conn sys/system@jytest as sysdba

ERROR:
ORA-12537: TNS:connection closed

1.processes参数设置太小。
进入设置processes方法:
Oracle的sessions和processes的关系是
sessions=1.1*processes + 5
使用sys,以sysdba权限登录:

SQL> show parameter processes;
NAME TYPE VALUE
———————————— ———– —————————————
aq_tm_processes integer 1
db_writer_processes integer 1
job_queue_processes integer 10
log_archive_max_processes integer 1
processes integer 150
SQL> alter system set processes=400 scope = spfile;
系统已更改。
SQL> show parameter processes;
NAME TYPE VALUE
———————————— ———– —————————————–
aq_tm_processes integer 1
db_writer_processes integer 1
job_queue_processes integer 10
log_archive_max_processes integer 1
processes integer 150
SQL> create pfile from spfile;

而我出现这个故障不是processes参数设置太小造成的
2内存使用完了
当OS的内存使用率达到90%以上时,既使是还可以再建立100个进程,但此时由于OS再也分配不出更多的内存来给ORACLE的服务进程了,所以监听器就没办法给进来和客户端连接启动一个专用的ORACLE SERVER PROCESS(我们知道,在DEDICATED SERVER模式,一个客户端连接的建立,ORACLE就会启动一个专用的SERVER PROCESS来服务这个客户端连接)。我们来检查一下OS的内存状况:

[oracle@weblogic28 ~]$ free
             total       used       free     shared    buffers     cached
Mem:      32949872   32709700     240172          0     213204   22118944
-/+ buffers/cache:   10377552   22572320
Swap:     32764556     600696   32163860

果然,OS的内存使用率已达99%了。
解决方法:
增加ORACLE服务器的物理内存或减少其它软件所用内存

ORA-00265错误的处理

ORACLE10G修改成为ARCHIVELOG模式时报错:

SQL> alter database archivelog;
alter database archivelog
*
ERROR at line 1:
ORA-00265: instance recovery required, cannot set ARCHIVELOG mode

ORA-00265: instance recovery required, cannot set ARCHIVELOG mode
Cause: The database either crashed or was shutdown with the ABORT option.
Media recovery cannot be enabled because the online logs may not be sufficient to
recover the current datafiles.
Action: Open the database and then enter the SHUTDOWN command with the
NORMAL or IMMEDIATE option.

问题是实例可能是出现故障或是在关闭数据库的时候使用了AROBT选项。
处理方法是打开数据库后然后使用normal或immediate选项来关闭数据库
后再重启数据库

SQL> shutdown abort;
ORACLE instance shut down.

重新OPEN开数据库后,正常关闭数据库。然后执行ARCHIVELOG模式修改,一切顺利执行。

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.

Total System Global Area  205520896 bytes
Fixed Size                  1218532 bytes
Variable Size              71305244 bytes
Database Buffers          130023424 bytes
Redo Buffers                2973696 bytes
Database mounted.
SQL> alter database archivelog;

Database altered.

SQL> alter database open;

Database altered.

rman在归档与非归档时备份数据库的简单示例

oracle10g

如果数据库是非归档模式只有数据库在mount状态下才能进行备份

SQL> startup nomount;
ORACLE instance started.

Total System Global Area 6442450944 bytes
Fixed Size                  2030368 bytes
Variable Size            1090520288 bytes
Database Buffers         5335154688 bytes
Redo Buffers               14745600 bytes

在nomount状态下是不能备份的

RMAN> backup database;

Starting backup at 31-OCT-12
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=154 devtype=DISK
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of backup command at 10/31/2012 14:22:22
ORA-01507: database not mounted

在mount状态下能进行备份

SQL> alter database mount;

Database altered.

RMAN> backup database;

Starting backup at 31-OCT-12
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=156 devtype=DISK
channel ORA_DISK_1: starting full datafile backupset
channel ORA_DISK_1: specifying datafile(s) in backupset
input datafile fno=00005 name=/u01/app/oracle/oradata/jytest/hygeia.dbf
input datafile fno=00003 name=/u01/app/oracle/oradata/jytest/sysaux01.dbf
input datafile fno=00002 name=/u01/app/oracle/oradata/jytest/undotbs01.dbf
input datafile fno=00001 name=/u01/app/oracle/oradata/jytest/system01.dbf
input datafile fno=00004 name=/u01/app/oracle/oradata/jytest/users01.dbf
channel ORA_DISK_1: starting piece 1 at 31-OCT-12
channel ORA_DISK_1: finished piece 1 at 31-OCT-12
piece handle=/u01/app/oracle/flash_recovery_area/JYTEST/backupset/2012_10_31/o1_mf_nnndf_TAG20121031T142300_891jy4yv_.bkp tag=TAG20121031T142300 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:05:25
channel ORA_DISK_1: starting full datafile backupset
channel ORA_DISK_1: specifying datafile(s) in backupset
including current control file in backupset
including current SPFILE in backupset
channel ORA_DISK_1: starting piece 1 at 31-OCT-12
channel ORA_DISK_1: finished piece 1 at 31-OCT-12
piece handle=/u01/app/oracle/flash_recovery_area/JYTEST/backupset/2012_10_31/o1_mf_ncsnf_TAG20121031T142300_891k8co4_.bkp tag=TAG20121031T142300 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:02
Finished backup at 31-OCT-12

如果数据库是归档模式数据库能在open和mount状态下能进行备份

SQL> startup
ORACLE instance started.

Total System Global Area 6442450944 bytes
Fixed Size                  2030368 bytes
Variable Size            1090520288 bytes
Database Buffers         5335154688 bytes
Redo Buffers               14745600 bytes
Database mounted.
Database opened.

RMAN> backup database;

Starting backup at 31-OCT-12
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=156 devtype=DISK
channel ORA_DISK_1: starting full datafile backupset
channel ORA_DISK_1: specifying datafile(s) in backupset
input datafile fno=00005 name=/u01/app/oracle/oradata/jytest/hygeia.dbf
input datafile fno=00003 name=/u01/app/oracle/oradata/jytest/sysaux01.dbf
input datafile fno=00002 name=/u01/app/oracle/oradata/jytest/undotbs01.dbf
input datafile fno=00001 name=/u01/app/oracle/oradata/jytest/system01.dbf
input datafile fno=00004 name=/u01/app/oracle/oradata/jytest/users01.dbf
channel ORA_DISK_1: starting piece 1 at 31-OCT-12
channel ORA_DISK_1: finished piece 1 at 31-OCT-12
piece handle=/u01/app/oracle/flash_recovery_area/JYTEST/backupset/2012_10_31/o1_mf_nnndf_TAG20121031T142300_892jy4yv_.bkp tag=TAG20121031T142301 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:05:25
channel ORA_DISK_1: starting full datafile backupset
channel ORA_DISK_1: specifying datafile(s) in backupset
including current control file in backupset
including current SPFILE in backupset
channel ORA_DISK_1: starting piece 1 at 31-OCT-12
channel ORA_DISK_1: finished piece 1 at 31-OCT-12
piece handle=/u01/app/oracle/flash_recovery_area/JYTEST/backupset/2012_10_31/o1_mf_ncsnf_TAG20121031T142300_891k8co4_.bkp tag=TAG20121031T142300 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:02
Finished backup at 31-OCT-12

SQL> startup mount
ORACLE instance started.

Total System Global Area 6442450944 bytes
Fixed Size                  2030368 bytes
Variable Size            1090520288 bytes
Database Buffers         5335154688 bytes
Redo Buffers               14745600 bytes
Database mounted.


RMAN> backup database;

Starting backup at 31-OCT-12
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=156 devtype=DISK
channel ORA_DISK_1: starting full datafile backupset
channel ORA_DISK_1: specifying datafile(s) in backupset
input datafile fno=00005 name=/u01/app/oracle/oradata/jytest/hygeia.dbf
input datafile fno=00003 name=/u01/app/oracle/oradata/jytest/sysaux01.dbf
input datafile fno=00002 name=/u01/app/oracle/oradata/jytest/undotbs01.dbf
input datafile fno=00001 name=/u01/app/oracle/oradata/jytest/system01.dbf
input datafile fno=00004 name=/u01/app/oracle/oradata/jytest/users01.dbf
channel ORA_DISK_1: starting piece 1 at 31-OCT-12
channel ORA_DISK_1: finished piece 1 at 31-OCT-12
piece handle=/u01/app/oracle/flash_recovery_area/JYTEST/backupset/2012_10_31/o1_mf_nnndf_TAG20121031T142300_893jy4yv_.bkp tag=TAG20121031T142302 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:05:25
channel ORA_DISK_1: starting full datafile backupset
channel ORA_DISK_1: specifying datafile(s) in backupset
including current control file in backupset
including current SPFILE in backupset
channel ORA_DISK_1: starting piece 1 at 31-OCT-12
channel ORA_DISK_1: finished piece 1 at 31-OCT-12
piece handle=/u01/app/oracle/flash_recovery_area/JYTEST/backupset/2012_10_31/o1_mf_ncsnf_TAG20121031T142300_891k8co4_.bkp tag=TAG20121031T142300 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:02
Finished backup at 31-OCT-12

oracle bbed修改数据块的例子

比如我要修改SQL_TEXT=’8.0.0.0.0’为’9.0.0.0.0′

SQL> select     rowid,
  2  dbms_rowid.rowid_relative_fno(rowid)rel_fno,
  3  dbms_rowid.rowid_block_number(rowid)blockno,
  4  dbms_rowid.rowid_row_number(rowid) rowno,
  5  a.*
  6  from bootstrap$ a where rownum<2;

ROWID              REL_FNO  BLOCKNO    ROWNO  LINE#     OBJ#  SQL_TEXT
------------------ -------  ---------- ------ --------- ----- -----------
AAAAA4AABAAAAF6AAA   1        378       0       -1       -1    8.0.0.0.0

一般使用bbed,都是将一些配置信息写入到一个参数文本里,在调用bbed时,指定该参数文件。如:
$bbed parfile=bbed.par
先获取datafile 的信息
将datafile 的信息写入一个文件,格式为:文件编号 文件名字 文件大小。可以通过如下SQL 获取:

SQL>select file#||' '||name||' '||bytes from v$datafile ;

FILE#||''||NAME||''||BYTES
------------------------------------------------------------------------------
1 /u01/app/oracle/oradata/jytest/system01.dbf 524288000
2 /u01/app/oracle/oradata/jytest/undotbs01.dbf 193986560
3 /u01/app/oracle/oradata/jytest/sysaux01.dbf 2149580800
4 /u01/app/oracle/oradata/jytest/users01.dbf 5242880
5 /u01/app/oracle/oradata/jytest/hygeia.dbf 21474836480

注意这里的file id。 我们这里的file id 和 oracle 系统内部的file id 相同。 当然这个id 我们也可以自己指定。 当我们在bbed 里设置file id 时,就是根据这个参数文件中的的设置来的。 最好设置为相同,不然以后可能会混淆。

将上面查询出来的datafile信息保存到文本里。

[oracle@weblogic28 lib]$ cat /u01/filelist.txt
1 /u01/app/oracle/oradata/jytest/system01.dbf 524288000
2 /u01/app/oracle/oradata/jytest/undotbs01.dbf 193986560
3 /u01/app/oracle/oradata/jytest/sysaux01.dbf 2149580800
4 /u01/app/oracle/oradata/jytest/users01.dbf 5242880
5 /u01/app/oracle/oradata/jytest/hygeia.dbf 21474836480

创建parameter file:

[oracle@weblogic28 lib]$ cat /u01/bbed.par
blocksize=8192
listfile=/u01/filelist.txt
mode=edit

使用parameter file 连接bbed:

[oracle@weblogic28 lib]$ ./bbed parfile=/u01/bbed.par
Password:

BBED: Release 2.0.0.0.0 - Limited Production on Wed Oct 31 14:39:28 2012

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

************* !!! For Oracle Internal Use only !!! ***************

BBED> set dba 1,378 offset 0
        DBA             0x0040017a (4194682 1,378)
        OFFSET          0

find 在指定的block中查找指定的字符串,结果是显示出字符串,及其偏移量–offset,偏移量就是在block中的字节数
查找关键字8.0.0.0.0,确定其在block中的偏移量offset。

BBED> find /c 8.0.0.0.0
 File: /u01/app/oracle/oradata/jytest/system01.dbf (1)
 Block: 378              Offsets: 8181 to 8191           Dba:0x0040017a
------------------------------------------------------------------------
 302e302e 302e3001 065d01

 <32 bytes per line>

dump 查看具体内容:

BBED> dump /v dba 1,378 offset 8181 count 11
 File: /u01/app/oracle/oradata/jytest/system01.dbf (1)
 Block: 378     Offsets: 8181 to 8191  Dba:0x0040017a
-------------------------------------------------------
 302e302e 302e3001 065d01            l 0.0.0.0..].

 <16 bytes per line>

从上面看到’8.’这两个字节没显示出来所示8.0.0.0.0的偏移量是从8179开始
count是指查看多少个字节的内容

BBED> dump /v dba 1,378 offset 8179 count 11
 File: /u01/app/oracle/oradata/jytest/system01.dbf (1)
 Block: 378     Offsets: 8179 to 8189  Dba:0x0040017a
-------------------------------------------------------
 382e302e 302e302e 300106            l 8.0.0.0.0..

 <16 bytes per line>

modify 修改指定block的指定偏移量的值,可以在线修改。
由上可知偏移量8179就是’8’现将8修改成9

BBED> modify /c '9' dba 1,378 offset 8179
 File: /u01/app/oracle/oradata/jytest/system01.dbf (1)
 Block: 378              Offsets: 8179 to 8189           Dba:0x0040017a
------------------------------------------------------------------------
 392e302e 302e302e 300106

 <32 bytes per line>

BBED> dump /v dba 1,378 offset 8179 count 11
 File: /u01/app/oracle/oradata/jytest/system01.dbf (1)
 Block: 378     Offsets: 8179 to 8189  Dba:0x0040017a
-------------------------------------------------------
 392e302e 302e302e 300106            l 9.0.0.0.0..

 <16 bytes per line>

应用变更

BBED> sum dba 1,378
Check value for File 1, Block 378:
current = 0x13d5, required = 0x12d5
此时 current checksum 是0x13d5,requiredchecksum 是0x12d5
BBED> sum dba 1,378 apply
Check value for File 1, Block 378:
current = 0x12d5, required = 0x12d5

加上apply参数,使checksum一致。即之前的修改生效。

这时关闭数据库后打开数据库报错

SQL> startup
ORACLE instance started.

Total System Global Area 6442450944 bytes
Fixed Size                  2030368 bytes
Variable Size            1090520288 bytes
Database Buffers         5335154688 bytes
Redo Buffers               14745600 bytes
Database mounted.
ORA-01092: ORACLE instance terminated. Disconnection forced

错误信息如下(alertsid.log)

Errors in file /u01/app/oracle/admin/jytest/udump/jytest_ora_6148.trc:
ORA-00704: bootstrap process failure
ORA-00702: bootstrap verison '9.0.0.0.0' inconsistent with version '8.0.0.0.0'
Wed Oct 31 14:46:52 2012
Error 704 happened during db open, shutting down database
USER: terminating instance due to error 704
Instance terminated by USER, pid = 6148
ORA-1092 signalled during: ALTER DATABASE OPEN...
 bootstrap verison '9.0.0.0.0' inconsistent with version '8.0.0.0.0'
 

说明原来的值是’8.0.0.0.0’现在却是’9.0.0.0.0’所以数据库打不开

现在又将8.0.0.0.0修改成9.0.0.0.0

BBED> modify /c '8' dba 1,378 offset 8179
 File: /u01/app/oracle/oradata/jytest/system01.dbf (1)
 Block: 378              Offsets: 8179 to 8189           Dba:0x0040017a
------------------------------------------------------------------------
 382e302e 302e302e 300106

 <32 bytes per line>

BBED> dump /v dba 1,378 offset 8179 count 11
 File: /u01/app/oracle/oradata/jytest/system01.dbf (1)
 Block: 378     Offsets: 8179 to 8189  Dba:0x0040017a
-------------------------------------------------------
 382e302e 302e302e 300106            l 8.0.0.0.0..

 <16 bytes per line>

BBED> sum dba 1,378
Check value for File 1, Block 378:
current = 0x12d5, required = 0x13d5

BBED> sum dba 1,378 apply
Check value for File 1, Block 378:
current = 0x13d5, required = 0x13d5
SQL> startup
ORACLE instance started.

Total System Global Area 6442450944 bytes
Fixed Size                  2030368 bytes
Variable Size            1090520288 bytes
Database Buffers         5335154688 bytes
Redo Buffers               14745600 bytes
Database mounted.
Database opened.

当把9.0.0.0.0修改成8.0.0.0.0时数据库就能正常打开了

Oracle dump函数的与utl_raw

函数式:

DUMP(expr[,return_fmt[,start_position][,length]])

基本参数时4个,最少可以填的参数是0个。当完全没有参数时,直接返回null。另外3个参数也都有各自的默认值:
expr:这个参数是要进行分析的表达式(数字或字符串等,可以是各个类型的值)
return_fmt:指返回参数的格式,有5种用法:
1)8:以8进制返回结果的值
2)10:以10进制返回结果的值(默认)
3)16:以16进制返回结果的值
4)17:以单字符的形式返回结果的值
5)1000:以上4种加上1000,表示在返回值中加上当前字符集
start_position:开始进行返回的字符位置
length:需要返回的字符长度

示例

sql> select dump('abc') from dual;

DUMP('ABC')
----------------------
Typ=96 Len=3: 97,98,99

sql> select dump('abc',16) from dual;

DUMP('ABC',16)
----------------------
Typ=96 Len=3: 61,62,63

sql> select dump('abc',1016) from dual;

DUMP('ABC',1016)
--------------------------------------------
Typ=96 Len=3 CharacterSet=ZHS16GBK: 61,62,63

sql> select dump('abc',17,2,2) from dual;

DUMP('ABC',17,2,2
-----------------
Typ=96 Len=3: b,c

结果的格式一般都是类似:Typ=96 Len=3 [CharacterSet=ZHS16GBK]: 61,62,63

type

typ表示当前的expr值的类型。如:2表示NUMBER,96表示CHAR。

CODE TYP
----- ------------------------------
1     VARCHAR2
2     NUMBER
8     LONG
12    DATE
23    RAW
24    LONG RAW
69    ROWID
96    CHAR
112   CLOB
113   BLOB
114   BFILE
180   TIMESTAMP
181   TIMESTAMP WITH TIMEZONE
182   INTERVAL YEAR TO MONTH
183   INTERVAL DAY TO SECOND
208   UROWID
231   TIMESTAMP WITH LOCAL TIMEZONE

len
len表示该值所占用的字节数。
对于汉字,ZHS16GBK编码一个汉字需要2个字节,UTF8需要3个字节。

Value
具体的存储值。返回的数值就是Oracle在自己内部对前面的这个expr值得存储形式。对于非汉字的普通字符串,可以理解为就是它的ASCII码。

SQL>  select to_number('3230','xxxx')from dual;

TO_NUMBER('3230','XXXX')
------------------------
                   12848
SQL>   select to_number('3430','xxxx')from dual;

TO_NUMBER('3430','XXXX')
------------------------
                   13360
SQL>      select to_number('3036','xxxx')from dual;

TO_NUMBER('3036','XXXX')
------------------------
                   12342

SQL>
SQL>      select chr(12848)from dual;

CHR(12848)
----------
20
SQL>       select chr(13360)from dual;

CHR(13360)
----------
40
SQL>      select chr(12342)from dual;

CHR(12342)
----------
06

将CHR(12848)+CHR(13360)+CHR(12342)=204006

utl_raw.cast_to_xxx()作为dump的逆函数

sql>select dump('201201',16) from dual;
dump('201201',16)
---------------------------------------------------------
Typ=96 Len=6: 32,30,31,32,30,31

sql>select utl_raw.cast_to_varchar2('323031323031') value from dual
201201

Oracle 数据类型CHAR, NCHAR, VARCHAR2, NVARCHAR2

CHAR与VARCHAR2

字符数据通常是以单字节存储在数据库字符集中:
CHAR
–固定长度的字符串最长可达2000个字节
–内部代码:96
VARCHAR@
–可变长的字符串最长可达4000个字节
–内部代码:1

CHAR
在一个类型为char的列中,所有空字节都会用空格来补充(字符32)
它的长度是固定的

SQL> select gr03,dump(gr03) from wb02 where gr03< '4307050000000097';

GR03             DUMP(GR03)
---------------- ---------------------------------------------------------------
4307050000000091 Typ=96 Len=16: 52,51,48,55,48,53,48,48,48,48,48,48,48,48,57,49
4307050000000092 Typ=96 Len=16: 52,51,48,55,48,53,48,48,48,48,48,48,48,48,57,50
430705000000093  Typ=96 Len=16: 52,51,48,55,48,53,48,48,48,48,48,48,48,48,57,51
4307050000000094 Typ=96 Len=16: 52,51,48,55,48,53,48,48,48,48,48,48,48,48,57,52
43070500000095   Typ=96 Len=16: 52,51,48,55,48,53,48,48,48,48,48,48,48,48,57,53

从上面的输出typ=96,len=16,可以看出char的内部代码是96,长度是16

varchar2
在一个类型为varchar2的列中,oracle不会使用空格来进行补位
它的长度是可变的

SQL> select dw02,dump(dw02) from wb01 where dw01< '0012';

DW02                       DUMP(DW02)
-------------------------- --------------------------------------------------------------------------------
灵活人员                   Typ=1 Len=8: 193,233,187,238,200,203,212,177
灵活就业人员               Typ=1 Len=12: 193,233,187,238,190,205,210,181,200,203,212,177
西湖区委、区管委           Typ=1 Len=16: 206,247,186,254,199,248,206,175,161,162,199,248,185,220,206,175
西湖区委、区管委办公室     Typ=1 Len=22: 206,247,186,254,199,248,206,175,161,162,199,248,185,220,206,175,17
西湖管理区政治部           Typ=1 Len=16: 206,247,186,254,185,220,192,237,199,248,213,254,214,206,178,191
西湖管理区监察局           Typ=1 Len=16: 206,247,186,254,185,220,192,237,199,248,188,224,178,236,190,214
西湖管理区财政局           Typ=1 Len=16: 206,247,186,254,185,220,192,237,199,248,178,198,213,254,190,214

从上面的输出typ=1可以看出varchar2的内部代码是1,它的长度不是固定的

nchar与nvarchar2
字符数据也可以存储在国际(多字节)字符集中
nchar
--固定长度的字符串最大可达2000个字节
--内部代码:96

nvarchar2
--可变长度的字符串最大可达4000个字节
--内部代码:1

nchar
在一个类型为nchar的列中,所有空字节都会用空格来补充(字符32)
它的长度是固定的

SQL> desc wb02_jy
Name Type      Nullable Default Comments
---- --------- -------- ------- --------
GR03 NCHAR(18) Y

SQL> select gr03,dump(gr03) from wb02_jy;

GR03                                 DUMP(GR03)
----------------------------- --------------------------------------------------------------------------------
4307050000000091              Typ=96 Len=36: 0,52,0,51,0,48,0,55,0,48,0,53,0,48,0,48,0,48,0,48,0,48,0,48,0,48,
4307050000000092              Typ=96 Len=36: 0,52,0,51,0,48,0,55,0,48,0,53,0,48,0,48,0,48,0,48,0,48,0,48,0,48,
4307050000000093              Typ=96 Len=36: 0,52,0,51,0,48,0,55,0,48,0,53,0,48,0,48,0,48,0,48,0,48,0,48,0,48,
4307050000000094              Typ=96 Len=36: 0,52,0,51,0,48,0,55,0,48,0,53,0,48,0,48,0,48,0,48,0,48,0,48,0,48,
4307050000000095              Typ=96 Len=36: 0,52,0,51,0,48,0,55,0,48,0,53,0,48,0,48,0,48,0,48,0,48,0,48,0,48,

如上输出一样gr03定义为nchar(18),但是它是双字节所以长度len=36是18的2倍,内部代码还是与char一样96

nvarchar2
在一个类型为nvarchar2的列中,oracle不会使用空格来进行补位
它的长度是可变的

SQL> select dw02,dump(dw02) from wb01_jy;

DW02                            DUMP(DW02)
----------------------------- --------------------------------------------------------------------------------
灵活人员                      Typ=1 Len=8: 112,117,109,59,78,186,84,88
灵活就业人员                  Typ=1 Len=12: 112,117,109,59,92,49,78,26,78,186,84,88
西湖区委、区管委              Typ=1 Len=16: 137,127,110,86,83,58,89,212,48,1,83,58,123,161,89,212
西湖区委、区管委办公室        Typ=1 Len=22: 137,127,110,86,83,58,89,212,48,1,83,58,123,161,89,212,82,158,81,10
西湖管理区政治部              Typ=1 Len=16: 137,127,110,86,123,161,116,6,83,58,101,63,108,187,144,232
西湖管理区监察局              Typ=1 Len=16: 137,127,110,86,123,161,116,6,83,58,118,209,91,223,92,64
西湖管理区财政局              Typ=1 Len=16: 137,127,110,86,123,161,116,6,83,58,141,34,101,63,92,64
西湖管理区劳动保障局          Typ=1 Len=20: 137,127,110,86,123,161,116,6,83,58,82,179,82,168,79,221,150,156,92
西湖管理区农村经济开发局      Typ=1 Len=24: 137,127,110,86,123,161,116,6,83,58,81,156,103,81,126,207,109,78,95
西湖管理区卫生局              Typ=1 Len=16: 137,127,110,86,123,161,116,6,83,58,83,107,117,31,92,64
西湖管理区国土局              Typ=1 Len=16: 137,127,110,86,123,161,116,6,83,58,86,253,87,31,92,64
西湖管理区移民开发局          Typ=1 Len=20: 137,127,110,86,123,161,116,6,83,58,121,251,108,17,95,0,83,209,92,6
西湖管理区经贸局              Typ=1 Len=16: 137,127,110,86,123,161,116,6,83,58,126,207,141,56,92,64

从上面的输出typ=1可以看出nvarchar2的内部代码是1,它的长度不是固定的

ora-02085

ra-02085:的注解是:

database link name connects to name
cause: The database link attempted to connect to a database with a different name.
The name of the database link must be the same name as the name of the database.
Action: Create a database link with same name as the database to which it connects.
意思是:If u set the parameter 'global_names' to true,the db link name connected to this server must equal db_name + db_domain.

很多时候我们只是让dblink的名字等于了db_name,所以创建出错
把服务器上的global_names修改了

索引的可选择性

索引的“可选择性”是指在该索引列里存储不同值的数目和记录数的比。比如某个表的记录数是

1000条,而该表的索引列的值只有900个不同的值(有100个是相同或是空)。这样索引的可选
择性为900/1000为0.9 。这样当然效果就不好,最好的索引可选择性(如主键索引)是1.0 。索
引的可选择性是衡量索引的利用率的方法,比如在极端的情况下,一个表记录数是1000,而
索引列的值只有5个不同的值,则索引的可选择性很差(只有0.005)。这样的情形使用全表扫
描要比采用索引还好。
测量索引的可选择性
方法1:
可以采用命令方式来测量某个索引的可选择性值,例如COMPAY表的city 列和state列是被建立
成索引,则:
COMPAY 表的city和state 列的不同值的数目为:

Select count( distinct ||%||state) from COMPAY;
用下面语句查出COMPAY表的记录数:
select count(*) from COMPAY;

按照前面的方法进行比可得到该索引的可选择性值。
方法2:
用analyze 对表进行统计,对表进行分析后,系统同样对索引进行了分析。在查询结果。

ANALYZE TABLE compay compute statistics;

一旦表及其索引被分析过,就可以查询USER_INDEXES数据字典中的数据:
查询不同索引的列值:

select distinct_keys from user_indexes where table_name=’COMPAY’;

查询表中的记录数:

select num_rows from user_tables where table_name =’COMPAY’;

索引可选择性= distinct_keys / num_rows