验证数据库状态:
SQL> connect / as sysdba;
已连接。
SQL> select status from v$instance;
STATUS
------------
OPEN
使用ORACLE关闭命令:
在SQL模式下,使用命令:HELP SHUTDOWN查看:
SQL> help shutdown
SHUTDOWN
--------
Shuts down a currently running Oracle Database instance, optionally
closing and dismounting a database.
SHUTDOWN [ABORT|IMMEDIATE|NORMAL|TRANSACTIONAL [LOCAL]]
这里顺便介绍一下,ORACLE的HELP其实是一张表,这个表是在SYSTEM用户下,上述命令的结果类似于查询SQL语句:
SELECT * FROM SYSTEM.HELP t
WHERE t.topic='SHUTDOWN';
一样的结果
说明其四种方式,默认为NORMAL,四种方式的区别分别介绍一下:
SHUTDOWN NORMAL
四种方式中若不指定关键字,直接使用SHUTDOWN关闭数据库,则认为是SHUTDOWN NORMAL关键字。该默认状况下,会有以下特点:
1、所有会话信息必须全部退出,包括外部程序连接和第三方工具以及sqlplus等连接须全部关闭,不然不能关闭数据库。
2、若会话没有关闭,这个命令将不会影响会话进行,即SQL可以继续运行,程序可以继续跑。
3、此时无法建立新的会话,可以使用操作系统认证 as sysdba连接到空闲进程,但是做不了任何事情。
查看控制文件的位置:
SQL> SELECT VALUE FROM V$SPPARAMETER
2 WHERE NAME ='control_files';
VALUE
----------------------------------------
D:/oracle/oradata/orcl102/control01.ctl
D:/oracle/oradata/orcl102/control02.ctl
D:/oracle/oradata/orcl102/control03.ctl
查看内存中所使用的控制文件:
SQL> SELECT NAME FROM V$CONTROLFILE;
NAME
---------------------------------------
D:/ORACLE/ORADATA/ORCL102/CONTROL01.CTL
D:/ORACLE/ORADATA/ORCL102/CONTROL02.CTL
D:/ORACLE/ORADATA/ORCL102/CONTROL03.CTL
实现内存信息和磁盘信息不一样的情况:
alter system set control_files=
'D:/ORACLE/ORADATA/ORA9/CONTROL01.CTL',
'D:/ORACLE/ORADATA/ORA9/CONTROL02.CTL'
SCOPE=spfile;
此时再次查询上述两个SQL:
SQL> SELECT VALUE FROM V$SPPARAMETER
2 WHERE NAME ='control_files';
VALUE
------------------------------------------------------------
D:/ORACLE/ORADATA/ORA9/CONTROL01.CTL
D:/ORACLE/ORADATA/ORA9/CONTROL02.CTL
SQL> SELECT NAME FROM V$CONTROLFILE;
NAME
---------------------------------------------------
D:/ORACLE/ORADATA/ORA9/CONTROL01.CTL
D:/ORACLE/ORADATA/ORA9/CONTROL02.CTL
D:/ORACLE/ORADATA/ORA9/CONTROL03.CTL
重启数据库后再次查询:
SQL> SELECT VALUE FROM V$SPPARAMETER
2 WHERE NAME ='control_files';
VALUE
------------------------------------------------------------
D:/ORACLE/ORADATA/ORA9/CONTROL01.CTL
D:/ORACLE/ORADATA/ORA9/CONTROL02.CTL
SQL> SELECT NAME FROM V$CONTROLFILE;
NAME
---------------------------------------------------
D:/ORACLE/ORADATA/ORA9/CONTROL01.CTL
D:/ORACLE/ORADATA/ORA9/CONTROL02.CTL
重启前数据不一致,重启后数据保持一致了。
1、ALTER SYSTE就是修改参数信息,修改INSTANCE内部的信息,对应ALTER DATABASE是修改数据库的信息。
如:
ALTER SYSTEM SWITCH LOGFILE;--切换在线日志文件组
ALTER SYSTEM checkpoint; --手工存盘
ALTER SYSTEM register;--手工注册
ALTER SYSTEM ARCHIVE LOG CURRENT;--归档日志
ALTER SYSTEM的SCOPE一般有几类参数:
1、memory 仅仅针对内存有效。
2、spfile 重启时针对数据库文件和内存才有效果
3、both 修改内存和文件。
恢复控制文件3后重启的效果:
上述已经闲置了控制文件3,此时将3恢复:
alter system set control_files=
'D:/ORACLE/ORADATA/ORA9/CONTROL01.CTL',
'D:/ORACLE/ORADATA/ORA9/CONTROL02.CTL',
'D:/ORACLE/ORADATA/ORA9/CONTROL03.CTL'
SCOPE=spfile;
再次启动时报错:
SQL> startup force;
ORACLE 例程已经启动。
Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
ORA-00214: ???? 'D:/ORACLE/ORADATA/ORA9/CONTROL01.CTL' ?? 257 ???
'D:/ORACLE/ORADATA/ORA9/CONTROL03.CTL' ?? 251 ???
内容看不懂是因为数据库安装使用了中文字符集,这里将其修改为英文字符集:
SQL>alter session set nls_language=american;
SQL> ALTER DATABASE MOUNT;
alter database mount
*
ERROR at line 1:
ORA-00214: controlfile 'D:/ORACLE/ORADATA/ORA9/CONTROL01.CTL' version 257
inconsistent with file 'D:/ORACLE/ORADATA/ORA9/CONTROL03.CTL' version 251
GROUP# STATUS TYPE MEMBER IS_RECOVERY_DEST_FILE ---------- ------- ------- ------------------------------------------------ --------------------- 1 STALE ONLINE D:/ORACLE/ORADATA/ORCL10/REDO01.LOG NO 3 STALE ONLINE D:/ORACLE/ORADATA/ORCL10/REDO03.LOG NO 2 ONLINE D:/ORACLE/ORADATA/ORCL10/REDO02.LOG NO
SQL> alter database add logfile member
2 'D:/ORACLE/ORADATA/ORCL102/REDO0702.LOG' to group 7;
数据库已更改。
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- -----------
1 1 3213 52428800 1 NO INACTIVE 289588737 24-6月 -10
2 1 3214 52428800 1 NO ACTIVE 289595339 24-6月 -10
3 1 3215 52428800 1 NO CURRENT 289609376 24-6月 -10
7 1 3212 5242880 2 NO INACTIVE 289587946 24-6月 -10
发现GROUP#=7的行字段MEMBERS=2,说明这个组内有两个日志成员了。
查看文件信息:
SQL> SELECT * FROM V$LOGFILE;
GROUP# STATUS TYPE MEMBER IS_RECOVERY_DEST_FILE
---------- ------- ------- ----------------------------------------
3 ONLINE D:/ORACLE/ORADATA/ORCL102/REDO03.LOG NO
2 ONLINE D:/ORACLE/ORADATA/ORCL102/REDO02.LOG NO
1 ONLINE D:/ORACLE/ORADATA/ORCL102/REDO01.LOG NO
7 ONLINE D:/ORACLE/ORADATA/ORCL102/REDO07.LOG NO
7 INVALID ONLINE D:/ORACLE/ORADATA/ORCL102/REDO0702.LOG NO
说明刚田间的文件还处于INVALID状态,如果当前正好是这个组在运行,此时需要等待第二次切换到这个日志组才能启动。
SQL> alter system switch logfile;
系统已更改。
SQL> SELECT * FROM V$LOGFILE;
GROUP# STATUS TYPE MEMBER IS_RECOVERY_DEST_FILE
---------- ------- ------- ---------------------------------------- ----------------------
3 ONLINE D:/ORACLE/ORADATA/ORCL102/REDO03.LOG NO
2 ONLINE D:/ORACLE/ORADATA/ORCL102/REDO02.LOG NO
1 ONLINE D:/ORACLE/ORADATA/ORCL102/REDO01.LOG NO
7 ONLINE D:/ORACLE/ORADATA/ORCL102/REDO07.LOG NO
7 ONLINE D:/ORACLE/ORADATA/ORCL102/REDO0702.LOG NO
删除某组内一个成员:
SQL> alter database drop logfile member
2 'D:/ORACLE/ORADATA/ORCL102/REDO0702.LOG';
SQL> alter database rename file
2 'D:/ORACLE/ORADATA/ORCL102/REDO07.LOG' to 'D:/ORACLE/ORADATA/ORCL102/REDO071.LOG';
数据库已更改。
SQL> select * from v$logfile;
GROUP# STATUS TYPE MEMBER IS_RECOVERY_DEST_FILE
---------- ------- ------- ---------------------------------------- ---------------------
3 ONLINE D:/ORACLE/ORADATA/ORCL102/REDO03.LOG NO
2 ONLINE D:/ORACLE/ORADATA/ORCL102/REDO02.LOG NO
1 ONLINE D:/ORACLE/ORADATA/ORCL102/REDO01.LOG NO
7 ONLINE D:/ORACLE/ORADATA/ORCL102/REDO071.LOG NO
清理日志组:
SQL> alter database clear logfile group 2;
数据库已更改。
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ----------
1 1 3217 52428800 1 NO ACTIVE 289619976 24-6月 -10
2 1 3218 52428800 1 NO CURRENT 289633784 24-6月 -10
3 1 3215 52428800 1 NO INACTIVE 289609376 24-6月 -10
7 1 0 5242880 1 NO UNUSED 289619137 24-6月 -10
状态变化为:UNUSED的信息。
删除一个日志组信息:
SQL> ALTER DATABASE DROP LOGFILE GROUP 7;
数据库已更改。
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- -----------
1 1 3217 52428800 1 NO ACTIVE 289619976 24-6月 -10
2 1 3218 52428800 1 NO CURRENT 289633784 24-6月 -10
3 1 3215 52428800 1 NO INACTIVE 289609376 24-6月 -10
此时说明可以自动增长,并最大值为4194302-2个块,每块8K,那么这个大小为32G的大小,那么ORACLE一个数据文件的理论最大值为32G。
默认情况下,每次增长8K,即一个BLOCK,这时指定其最大值,让其每次增长64K。
SQL> ALTER DATABASE DATAFILE 'D:/ORACLE/ORADATA/ORCL10/ORA10TEST1.DBF'
2 AUTOEXTEND ON NEXT 64M MAXSIZE 128M;
如果新创建的表空间通过下面查询语句:
SELECT CHECKPOINT_CHANGE#,NAME FROM V$DATAFILE;
查询出的CHECKPOINT_CHANGE#和其它表空间不一样,那么就进行一次手工存盘操作(存盘的基本概念,上面以及提及,有关细节存盘说明,在后面要阐述的后台进程的相关文章中会进行说明):
SQL> alter system checkpoint;
系统已更改。
付:将表空间设置为只读后,CHECKPOINT_CHANGE#是不会发生变化的,只读恢复后需要独立存盘操作。
SQL> ALTER TABLESPACE ORA10TEST READ ONLY;
表空间已更改。
SQL> SELECT CHECKPOINT_CHANGE#,name FROM v$datafile;
NAME FUZ
------------------------------------------------------------ ---
D:/ORACLE/ORADATA/ORCL102/SYSTEM03.DBF YES
D:/ORACLE/ORADATA/ORCL102/ORA10TEST1.DBF NO
看一下TABLESPACE的基本状态:
SQL> SELECT TABLESPACE_NAME,STATUS FROM DBA_TABLESPACES;
TABLESPACE_NAME STATUS
------------------------------ ---------
SYSTEM ONLINE
UNDOTBS1 ONLINE
SYSAUX ONLINE
TEMP ONLINE
USERS ONLINE
TS_ISM ONLINE
TS_TIF ONLINE
TABLESPACE_NAME STATUS
------------------------------ ---------
ORA10TEST READ ONLY