oracle命令2 和一致性关闭、非一致性关闭

启动SQL*Plus语法
sqlplus [username/password][@server] [as sysdba|sysoper] ,其中username/password如果不输人,SQL*Plus会在后续提示输入
[oracle@localhost ~]$ sqlplus "as sysdba"

SQL*Plus: Release 11.2.0.1.0 Production on Wed Nov 15 18:11:47 2017

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

Enter user-name: sys
Enter password:

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL>

更换用户的语法是
SQL>CONN[ECT] [username/password][@server] [as sysdba|sysoper]

SQL> conn sys/oracle as sysdba
Connected.
SQL> show user # 查看当前用户
USER is "SYS"
SQL>

设置显示参数:
SQL> show pagesize
pagesize 14 # 从顶部标题只页结束之间的行数
SQL> set pagesize 18
SQL> show newpage
newpage 1 # 设置一页的空行的数量
SQL> set newpage 2
SQL> show line # 设置一行中个,所显示的最多的字符总数
linesize 80
SQL> set linesize 100
SQL>
SQL> col file_name for a50 #指定列的输出格式: 50个固定字符长度,如果字段的实际长度超过50个字符,那么会换下一行显示


查看SCN:
查看当前SCN:
SQL> select current_scn from V$database; # 查看当前SCN
CURRENT_SCN
-----------
1005440

日志中SCN信息:
SQL> select * from V$log; # 查看日志中SCN信息,
GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARCHIV STATUS FIRST_CHANGE# FIRST_TIME NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- ------ -------------------------------- ------------- ------------ ------------ ------------
1 1 4 52428800 512 1 NO CURRENT 994343 15-NOV-17 2.8147E+14
2 1 2 52428800 512 1 NO INACTIVE 977891 15-NOV-17 981630 15-NOV-17
3 1 3 52428800 512 1 NO INACTIVE 981630 15-NOV-17 994343 15-NOV-17
SQL>
SQL> select group#,SEQUENCE#,FIRST_CHANGE# FIRST_TIME,NEXT_CHANGE# NEXT_TIME from V$log order by 2; # 查看日志中SCN,只查看主要部分。
GROUP# SEQUENCE# FIRST_TIME NEXT_TIME
---------- ---------- ---------- ----------
2 2 977891 981630
3 3 981630 994343
1 4 994343 2.8147E+14
SQL>
GROUP#, 日志组编号
SEQUENCE# ,重做日志的序列号,不能重复,永远向前。
FIRST_TIME,该日志组,记录的第一条重做日志SCN
NEXT_TIME,该日志组,记录的最后一条重装日志信息的SCN。2.8147E+14表示还在写入过程,现在不确定终点在哪。
STATUS , 当前日志状态,CURRENT表示正在写。

控制文件中的SCN:
这个SCN是执行检查点的SCN,夜间检查点SCN。代表这个SCN的时刻,内存和硬盘数据是同步的。
SQL> select a.file#,b.file_name,a.checkpoint_change#
from V$datafile a ,dba_data_files b
where a.file#=b.file_id
order by 1; # 查看控制文件中的SCN
FILE# FILE_NAME CHECKPOINT_CHANGE#
---------- -------------------------------------------------- ------------------
1 /data/oracle/oradata/orcl/system01.dbf 1007735
2 /data/oracle/oradata/orcl/sysaux01.dbf 1007735
3 /data/oracle/oradata/orcl/undotbs01.dbf 1007735
4 /data/oracle/oradata/orcl/users01.dbf 1007735
5 /data/oracle/oradata/orcl/example01.dbf 1007735
SQL>
查看checkpoint:
SQL> select checkpoint_change# from v$datafile where rownum=1;
CHECKPOINT_CHANGE#
------------------
1007735
SQL>
SQL> alter system checkpoint; # 手动执行检查点
System altered.
在查看控制控制文件中SCN,发现已变化,(与内存中SCN同步)。

DBW进程只有在checkpoint进程调用时,才会执行,commint命令,不会同步内存与硬盘中的数据。
3s写操作或写满1/3日志,是写日志缓冲区数据的日志写进程操作, 所以只用commint了(写到了redo log file),用户数据就一定不会丢失。

数据文件SCN:
数据文件很大,文件头部就记录了SCN,不用查找整个数据文件。
SQL> select a.file#,b.file_name,a.checkpoint_change#
from V$datafile_header a ,dba_data_files b
where a.file#=b.file_id
order by 1;
FILE# FILE_NAME CHECKPOINT_CHANGE#
---------- -------------------------------------------------- ------------------
1 /data/oracle/oradata/orcl/system01.dbf 1007018
2 /data/oracle/oradata/orcl/sysaux01.dbf 1007018
3 /data/oracle/oradata/orcl/undotbs01.dbf 1007018
4 /data/oracle/oradata/orcl/users01.dbf 1007018
5 /data/oracle/oradata/orcl/example01.dbf 1007018
SQL>
查看数据文件SCN,简单点:
SQL> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
1007735
1007735
1007735
1007735
1007735
SQL>

一致性关闭: 关闭时执行了检查点,内存和硬盘数据同步,下一次开启,不需要使用联机重做日志文件对数据库进行恢复。
非一致性关闭: 无论什么原因,关闭时,内存中脏块没有写入数据文件,内存和硬盘数据不一致,下一次开启数据库,需要通过联机重做日志文件对数据进行恢复。
判断是否一致,就是通过上述三个SCN,日志SCN,数据文件SCN,控制文件SCN。

 


模拟非一致性关闭:
1、shutdown abort
2、kill 进程
3、直接关电源
当前SCN:1008098
checkpoint SCN:1007735 , 说明存在脏块,
SQL> shutdown abort; # 模拟非一致性关闭:
ORACLE instance shut down.
SQL> startup mount; # 启动到mount:
ORACLE instance started.
Total System Global Area 764121088 bytes
Fixed Size 2217264 bytes
Variable Size 478153424 bytes
Database Buffers 281018368 bytes
Redo Buffers 2732032 bytes
Database mounted.
SQL>
SQL> select checkpoint_change# from v$datafile where rownum=1; #查看控制文件中SCN
CHECKPOINT_CHANGE#
------------------
1007735
SQL> select checkpoint_change# from v$datafile_header; # 查看数据文件中SCN
CHECKPOINT_CHANGE#
------------------
1007735
1007735
1007735
1007735
1007735
SQL>
SQL> select group#,SEQUENCE#,FIRST_CHANGE# FIRST_TIME,NEXT_CHANGE# NEXT_TIME from V$log order by 2; # 查看日志文件中SCN
GROUP# SEQUENCE# FIRST_TIME NEXT_TIME
---------- ---------- ---------- ----------
2 2 977891 981630
3 3 981630 994343
1 4 994343 2.8147E+14
SQL>
日志SCN中看不到最后具体SCN,关闭前当前SCN为1008098,远大与994343,说明还是存在脏块,当然这个判断比较牵强,还有一个判断机制:
SQL> select file#,checkpoint_change#,last_change# from v$datafile;
FILE# CHECKPOINT_CHANGE# LAST_CHANGE#
---------- ------------------ ------------
1 1007735
2 1007735
3 1007735
4 1007735
5 1007735
SQL>
若一直性关闭,会在控制文件中,会在LAST_CHANGE# 记录下关闭SCN的信息; 若非一致性关闭,会在LAST_CHANGE#记录为空。
说明此时数据库为非一致性关闭:
打开数据库,查看日志:
SQL> select * from v$diag_info; # 查看alert log位置
[oracle@localhost ~]$ tail -f /data/oracle/diag/rdbms/orcl/orcl/trace/alert_orcl.log
然后再开启数据库:
SQL> alter database open;
Database altered.
SQL>
[oracle@localhost ~]$ tail -f /data/oracle/diag/rdbms/orcl/orcl/trace/alert_orcl.log
Beginning crash recovery of 1 threads # 需要执行恢复
Started redo scan # 扫描日志
Completed redo scan
。。。。
Thread 1: logseq 4, block 30986, scn 1028106 # 最后一条日志记录SCN为1028106,而检查点是1007735,所以就都redo log进行恢复。


一致性关闭:
SQL> select current_scn from V$database; #当前SCN
CURRENT_SCN
-----------
1028689
SQL>
SQL> select checkpoint_change# from v$datafile_header; # 数据文件SCN
CHECKPOINT_CHANGE#
------------------
1028109
1028109
1028109
1028109
1028109
SQL> select checkpoint_change# from v$datafile where rownum=1; #控制文件SCN
CHECKPOINT_CHANGE#
------------------
1028109
SQL>
说明存在脏块;
SQL> shutdown immediate # 一致性关闭数据库,会自动执行检查点
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL>
SQL> startup mount
SQL> select file#,checkpoint_change#,last_change# from v$datafile;
FILE# CHECKPOINT_CHANGE# LAST_CHANGE#
---------- ------------------ ------------
1 1029044 1029044
2 1029044 1029044
3 1029044 1029044
4 1029044 1029044
5 1029044 1029044
LAST_CHANGE#,有SCN显示,表示为一致性关闭,且记录下了关闭的时间点SCN。
SQL> select checkpoint_change# from v$datafile where rownum=1; #数据文件SCN
CHECKPOINT_CHANGE#
------------------
1029044
SQL> alter database open;
Database altered.
SQL>

日志显示:
[oracle@localhost ~]$ tail -f /data/oracle/diag/rdbms/orcl/orcl/trace/alert_orcl.log
Thread 1 opened at log sequence 5
Current log# 2 seq# 5 mem# 0: /data/oracle/oradata/orcl/redo02.log
Successful open of redo thread 1
没有恢复操作;


恢复:
restore ,是转储,把复制的文件存储会原来的位置
recover ,是恢复,恢复redo日志里的记录,把丢失的操作再redo一遍。通过内存和硬盘的SCN比较,来判断数据之间是否同步。

SCN变化:
1、时间变化,SCN就变化
2、变化,数据库的任何一个数据变化,SCN就会变化,往上增长。
SCN只会往前,不会往后,只会越来越大。

每执行CKPT那一刻,内存和硬盘数据同步,这一刻一定有一个时钟对应的SCN。这个时间点,数据库是一致的。 所以,当内存和硬盘上的文件比较时,就是比较SCN,内存中SCN比较新,就认为内存和硬盘的数据不一致。

转载于:https://www.cnblogs.com/lei2017/p/7840640.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值