文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

oracle的控制文件深入理解(一)

2024-04-02 19:55

关注

Oracle的control文件

这里我们要实验的是数据库在open的状态下,破快控制文件,数据库会不会down

 

查看controlfiles的路径

SQL> show parameter control_files

 

NAME                          TYPE                  VALUE

------------------------------------ ----------- ------------------------------

control_files               string                   /u01/app/oracle/oradata/orcl/control01.ctl, /u01/app/oracle/fast_recovery_area/orcl/control02.ctl

 

破坏控制文件

[oracle@togogo ~]$ cat /dev/null > /u01/app/oracle/oradata/orcl/control01.ctl

[oracle@togogo ~]$ cat /dev/null > /u01/app/oracle/fast_recovery_area/orcl/control02.ctl

 

验证数据库的状态

SQL> select * from dual;

 

D

-

X

 

#### 做检查点,切换redo log

 SQL> alter system checkpoint;

 System altered.

 

 SQL> alter system switch logfile;

 System altered.

 

 SQL> alter system switch logfile;

 System altered.

 

  #### check alert log

 

Sat Feb 10 20:09:55 2018

Thread 1 cannot allocate new log, sequence 8

Private strand flush not complete

  Current log# 1 seq# 7 mem# 0: /u01/app/oracle/oradata/orcl/redo01.log

Thread 1 advanced to log sequence 8 (LGWR switch)

  Current log# 2 seq# 8 mem# 0: /u01/app/oracle/oradata/orcl/redo02.log

Sat Feb 10 20:10:19 2018

Thread 1 cannot allocate new log, sequence 9

Private strand flush not complete

  Current log# 2 seq# 8 mem# 0: /u01/app/oracle/oradata/orcl/redo02.log

Thread 1 advanced to log sequence 9 (LGWR switch)

  Current log# 3 seq# 9 mem# 0: /u01/app/oracle/oradata/orcl/redo03.log

Thread 1 cannot allocate new log, sequence 10

Checkpoint not complete

  Current log# 3 seq# 9 mem# 0: /u01/app/oracle/oradata/orcl/redo03.log

Thread 1 cannot allocate new log, sequence 10

Private strand flush not complete

  Current log# 3 seq# 9 mem# 0: /u01/app/oracle/oradata/orcl/redo03.log

Thread 1 advanced to log sequence 10 (LGWR switch)

  Current log# 1 seq# 10 mem# 0: /u01/app/oracle/oradata/orcl/redo01.log

 

 

这是为什么呢?那是因为其进程持有的句柄并有释放,如下

[oracle@togogo ~]$ ps -ef|grep ckpt|grep -v grep

oracle    8427     1  0 19:47 ?        00:00:00 ora_ckpt_orcl

[oracle@togogo ~]$ cd /proc/8427/fd

[oracle@togogo fd]$  ls -ltr |grep control

lrwx------ 1 oracle oinstall 64 Feb 10 20:09 257 -> /u01/app/oracle/fast_recovery_area/orcl/control02.ctl

lrwx------ 1 oracle oinstall 64 Feb 10 20:09 256 -> /u01/app/oracle/oradata/orcl/control01.ctl

 

#### session 1 trace跟踪

 

这里说一个命令 strace

 

举一个例子

strace -o output.txt -T -tt -e trace=all -p 28979

上面的含义是 跟踪28979进程的所有系统调用(-e trace=all),并统计系统调用的花费时间,以及开始时间(并以可视化的时分秒格式显示),最后将记录结果存在output.txt文件里面

 

[oracle@togogo fd]$ strace -fr -o /tmp/8427.log -p 8427

Process 8427 attached - interrupt to quit

 

####观察trace.log

 

8427       0.000156 gettimeofday({1518265363, 443228}, NULL) = 0

8427       0.000176 gettimeofday({1518265543, 106769}, NULL) = 0

8427       0.000077 gettimeofday({1518265543, 106845}, NULL) = 0

8427       0.000072 gettimeofday({1518265543, 106917}, NULL) = 0

8427       0.000077 pwrite64(256, "\25\302\0\0\3\0\0\0\0\0\0\0\0\0\1\4\312T\0\0\2\0\0\0\0\0\0\0Q\0\0\0"..., 16384, 49152) = 16384

8427       0.006462 gettimeofday({1518265543, 113463}, NULL) = 0

8427       0.000089 gettimeofday({1518265543, 113548}, NULL) = 0

8427       0.000080 pwrite64(257, "\25\302\0\0\3\0\0\0\0\0\0\0\0\0\1\4\312T\0\0\2\0\0\0\0\0\0\0Q\0\0\0"..., 16384, 49152) = 16384

8427       0.000734 gettimeofday({1518265543, 114364}, NULL) = 0

8427       0.000081 gettimeofday({1518265543, 114443}, NULL) = 0

8427       0.000081 gettimeofday({1518265543, 114525}, NULL) = 0

8427       0.000078 gettimeofday({1518265543, 114603}, NULL) = 0

8427       0.000211 gettimeofday({1518265543, 114816}, NULL) = 0

8427       0.000080 gettimeofday({1518265543, 114891}, NULL) = 0

8427       0.000081 pread64(256, "\25\302\0\0\1\0\0\0\0\0\0\0\0\0\1\4r\t\0\0\0\0\0\0\0\0 \v\373M\21Y"..., 16384, 16384) = 16384

这的 256 257 是表示的是文件描述符 FD file discription

16384是表示一个块的大小

49152是表示偏移量

 

通过以上可以得到结论

1. 进程信息可以在/proc下看到,例如: /proc/8427/stat

2. 对于linux,对于文件的读写,是通过调用函数read,pwrite64 来实现的。

3. 我们可以发现检查点进程ckpt 3s触发一次的机制。

4. 对于pwrite64的操作,是通过写fd (256.257)2个文件来完成的,其中对应的offset都是49152,且我们知道这3个被写入的文件      (我们知道是controlfile) 的block大小是16384.

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯