Chinaunix

标题: oracle表移动表空间之后primary key仍然有效??? [打印本页]

作者: 蓦然princes    时间: 2014-05-28 23:29
标题: oracle表移动表空间之后primary key仍然有效???
本帖最后由 蓦然princes 于 2014-05-28 23:29 编辑

今天做实验遇到个问题想请教一下老鸟。

实验环境:oracle11g R2.

问题: 我将表t(id int primary key)从example表空间移到users表空间。发现primary key居然能用,没有失效, 按道理说,创建主键约束时会创建一个唯一索引(通过use_objects 可以查到),那表从一个表空间移到另一个表空间索引就失效了啊,怎么primary key还能有效呢???
求老鸟指点~~
作者: jackson198574    时间: 2014-05-29 08:45
你是通过什么方式移动的?
作者: 蓦然princes    时间: 2014-05-29 09:51
用alter table t move。。 我又做了一次实验。对不起,不是主键仍然可用,提示信息是所操作的index处于不可用状态。。这下对了。回复 2# jackson198574


   
作者: jackson198574    时间: 2014-05-29 13:46
回复 3# 蓦然princes


    加油!保持精益求精的态度和实验验证的风格!~~~
作者: www_xylove    时间: 2014-05-29 20:49
学习。

作者: 蓦然princes    时间: 2014-05-30 23:03
谢谢鼓励!!! 我最近有个关于scn号的问题,老是想不明白,网上的也说的不全。想请问下一下您:

问题:
有没有这样一种情况: 一个事务很大,从事务发生到最后提交 没有发生日志切换。此时在log buffer中产生了很多的log,当然lgwr会不停的向log file中写,并且不断的增加scn号。
在这个过程中checkpoint事件发生,此时DBWn进程会将已近写入到log file中的日志对应的data buffer中的block 写入到data file中。写完之后ckpt进程会在控制文件和数据文件头部增加scn号(记为1001)。(这些数据只是整个事务产生的一部分)

此时,整个事务还没有commit。 这时instance垮掉了。重启instance 进行recovery。

按照recovery机制。控制文件中的scn会和数据文件头部的start scn号进行对比,由于不是正常关机,所以,控制文件中的last scn会无穷大,和数据文件头部的start scn(1001)不一致。然后在log file中将scn (1001)之后的所有日志恢复(roll forward)。

疑问:这里将scn(1001)之后的日志文件roll forward, 但是scn(1001)之前的那些日志对应的数据虽然写入到了数据文件,但是那些是这个事务没有提交的部分啊? 恢复的log file中scn(1001)以后的日志不包含1001之前的数据对应的日志,怎么进行 rollback啊????

回复 4# jackson198574


   
作者: jackson198574    时间: 2014-06-04 16:48
回复 6# 蓦然princes


    Undo表空间存有之前的信息副本呀。
作者: jackson198574    时间: 2014-06-04 16:48
回复 6# 蓦然princes


    最近工作特别忙,没及时回复,抱歉啊兄弟。
作者: 蓦然princes    时间: 2014-06-07 00:01
工作重要啊,回帖抽空就行了,不用打扰工作的。 回帖本来就是一种无偿回报社会帮助他人的行为,所以很谢谢你的帮助。回复 8# jackson198574


   
作者: jackson198574    时间: 2014-06-07 11:44
回复 9# 蓦然princes


谢谢理解!

   




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2