一、配置数据库
1、服务器端监听配置
Oracle中,监听程序用于接收远程客户端发送的连接请求,然后转交给数据库。数据库若想对外提供服务,监听程序必不可少。
1、启动关闭监听进程
当Oracle实例启动完成后,为了使客户端用户能够连接到Oracle实例,数据库管理员还要在Oracle所在的服务器上使用Isnrctl命令来管理和维护监听。如果数据库实例关闭,一般也要关闭监听进程。
lsnrctl命令的格式如下。
lsnrctl { start | stop | status | reload | set | show | help | version | change_password )
- start:启动监听进程。
- stop:停止监听进程。
- status:查看监听进程状态。
- reload:重新加载监听进程。
- set:设置相应参数。
- show:查看当前参数的取值。
- help:显示帮助信息。
- version:显示当前监听进程版本。
- change_password:改变口令。
$ lsnrctl start
LSNRCTL for Linux: Version 12.2.0.1.0 - Production on 01-3月 -2024 20:15:34
Copyright (c) 1991, 2016, Oracle. All rights reserved.
启动/u01/app/oracle/product/12.2.0/dbhome_1//bin/tnslsnr: 请稍候...
TNSLSNR for Linux: Version 12.2.0.1.0 - Production
系统参数文件为/u01/app/oracle/product/12.2.0/dbhome_1/network/admin/listener.ora
写入/u01/app/oracle/diag/tnslsnr/oracle/listener/alert/log.xml的日志信息
监听: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle)(PORT=1521)))
监听: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oracle)(PORT=1521)))
LISTENER 的 STATUS
------------------------
别名 LISTENER
版本 TNSLSNR for Linux: Version 12.2.0.1.0 - Production
启动日期 01-3月 -2024 20:15:36
正常运行时间 0 天 0 小时 0 分 0 秒
跟踪级别 off
安全性 ON: Local OS Authentication
SNMP OFF
监听程序参数文件 /u01/app/oracle/product/12.2.0/dbhome_1/network/admin/listener.ora
监听程序日志文件 /u01/app/oracle/diag/tnslsnr/oracle/listener/alert/log.xml
监听端点概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
监听程序不支持服务
命令执行成功
2、增加新的监听器
# xhost +
# su - oracle
$ export DISPLAY=:0.0
$ SORACLE_HOME/bin/netmgr
查看配置文件
$ vim /u01/app/oracle/product/12.2.0/dbhome_1/network/admin/listener.ora
# listener.ora Network Configuration File: /u01/app/oracle/product/12.2.0/dbhome_1//network/admin/listener.ora
# Generated by Oracle configuration tools.
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
上面代码中描述了监听器侦听的主机、端口,协议。其中,主机为Oracle,端口为1521。该监听器为默认监听器,即如果不具体指定启动哪个监听器,则默认启动名为LISTENER的监听器。也可以增加新的监听器,具体操作如下:
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
LISTENER1 =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle)(PORT = 1521))
)
)
LISTENER1的端口为1522。LISTENER1配置完成后,使用lsnrctl命令启动监听,并查看监听状态。启动LISTENER1监听器的操作如下:
lsnrctl start listener1
查看监听器LISTENER的状态信息的代码如下
$ lsnrctl status listener
LSNRCTL for Linux: Version 12.2.0.1.0 - Production on 01-3月 -2024 20:21:30
Copyright (c) 1991, 2016, Oracle. All rights reserved.
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oracle)(PORT=1521)))
LISTENER 的 STATUS
------------------------
别名 LISTENER
版本 TNSLSNR for Linux: Version 12.2.0.1.0 - Production
启动日期 01-3月 -2024 20:15:36
正常运行时间 0 天 0 小时 5 分 53 秒
跟踪级别 off
安全性 ON: Local OS Authentication
SNMP OFF
监听程序参数文件 /u01/app/oracle/product/12.2.0/dbhome_1/network/admin/listener.ora
监听程序日志文件 /u01/app/oracle/diag/tnslsnr/oracle/listener/alert/log.xml
监听端点概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=oracle)(PORT=5500))(Security=(my_wallet_directory=/u01/app/oracle/admin/orcl/xdb_wallet))(Presentation=HTTP)(Session=RAW))
服务摘要..
服务 "128501eabf704d0fe0630a01a8c0c718" 包含 1 个实例。
实例 "orcl", 状态 READY, 包含此服务的 1 个处理程序...
服务 "orcl" 包含 1 个实例。
实例 "orcl", 状态 READY, 包含此服务的 1 个处理程序...
服务 "orclXDB" 包含 1 个实例。
实例 "orcl", 状态 READY, 包含此服务的 1 个处理程序...
服务 "orclpdb" 包含 1 个实例。
实例 "orcl", 状态 READY, 包含此服务的 1 个处理程序...
命令执行成功
3、监听启动和数据库实例启动的顺序
1、先启动监听,后启动实例。
此时远程客户端连接实例是正常的,不会有问题。因为启动监听后再启动实例时后台进程PMON会向监听注册服务,所以当用户请求服务时,两者的协调工作已准备就绪。
2、先启动实例,后启动监听。
如果监听刚启动用户马上连接实例,就可能会报“监听程序当前无法识别连接描述符中请求的服务”的错误,原因在于PMON还没来得及向监听注册实例服务。但是这个问题只会存在很短的一段时间,时间过后再连接就不会有问题了。为什么等一会儿就好了呢?因为PMON每隔一段时间都会判断有无服务需要向监听注册,此时若监听已启动,PMON就能注册成功,二者的协调工作就准备就绪了。
# 修改前
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
# 修改后
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
SID LIST LISTENER = # SID LIST 监听名
(SID_LIST =
(SID_DESC =
(SID_NAME = Orc1) # 实例名
(ORACLE_HOME = /u01/app/oracle/product/12.2.0/dbhome_1) # 标识服务主目录位置
(GLOBAL_DBNAME = orcl) # 全局数据库名称
)
)
以上将数据库orcl注册到了监听器LISTENER,此时使用静态注册就可以直接在listener.ora文件中注册该数据库实例。
- SID_LIST_LISTENER:格式为SID_LIST_监听名,此处配置的监听为LISTENER。如果配置的监听为LISTENER1,则写成SID_LIST_LISTENER1。
- SID_NAME:数据库运行的实例名,此处实例名为orcl。
- DRACLE_HOME:标识服务的Oracle主目录位置。
- GLOBAL_DBNAME:全局数据库名称。这里表示对外的网络连接名称。
查询GLOBAL_DBNAME的代码如下:
SQL> select global name from global name;
2、客户端配置
客户端要连接到数据库服务器必须知道一些信息,如数据库服务器的主机名或IP地址、使用的通信协议、端口号,以及对应的数据库服务名,这些需要在客户端设置,存储在tnsnames.ora文件中。下面是tnsnames.ora文件的内容(默认存储位置为SORACLE_HOME/network/admin)。
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = Oracle)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
- ORCL:包含了要连接的Oracle服务的协议、主机、端口及服务名。其中,
- ORCL:网络服务名,可以自己定义,如可以修改为NEWORCL。
- PROTOCOL=TCP:协议为TCP。
- HOST=Oracle:主机名为Oracle,也可以写IP地址。
- PORT=1521:端口号为1521。
- SERVER=DEDICATED:使用专用服务器模式连接,需要和服务器的模式匹配,可以没有。如果没有这句话,就根据服务器的模式自动调节。
- SERVICE_NAME:服务名。可以与listener.ora文件中的全局数据库名称(GLOBAL_DBNAME)一致,本示例中为orcl。
- SID:实例名。如果没有写SERVICE_NAME这个参数选项,也可以写SID参数,代码如下:
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = Oracle)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SID = orcl)
)
)
查询SID的代码如下:
SQL> select instance_name from v$instance;
二、管理控制文件
控制文件在Oracle数据库中有非常重要的作用,若控制文件损坏、丢失,将导致数据库无法启动,所以合理地管理维护控制文件,对于DBA来说至关重要。
1、控制文件在数据库启动中的作用
对于DBA来讲,Oracle数据库控制文件是非常重要的文件。它是在数据库创建时自动生成的二进制文件,其中记录了数据库的状态信息,主要包括以下内容:
数据库的名称,一个控制文件只能属于一个数据库。
- 数据库的创建时间。
- 数据文件的名称、位置、联机、脱机状态信息。
- 重做日志文件的名称,位置及归档信息。
- 所有表空间信息。
- 当前日志序列号。
- 最近检查点信息。
在数据库启动时首先使用默认规则找到并打开参数文件,在参数文件中含有控制文件的位置信息,打开控制文件后,会通过控制文件中记录的各种数据库文件的位置打开数据库,从而启动数据库到可用状态。成功启动数据库后,在数据库的运行过程中,数据库服务器可以不断地修改控制文件中的内容,所以在数据库被打开的阶段,控制文件必须是可读写的。但是其他任何用户都无法修改控制文件,只有数据库实例可以修改控制文件中的信息。
2、获得控制文件信息
SQL> select name from v$controlfile;
NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/orcl/control01.ctl
/u01/app/oracle/oradata/orcl/control02.ctl
当前数据库实例控制文件的物理位置
SQL> select name,value from v$parameter where name='control_files';
NAME
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
control_files
/u01/app/oracle/oradata/orcl/control01.ctl, /u01/app/oracle/oradata/orcl/control
02.ctl
3、查看控制文件中所存内容的信息
控制文件中存放了创建数据库的信息、重做日志信息、数据文件及归档日志文件记录等信息。这些有价值的信息可用于数据维护和管理,很多数据字典视图就是从控制文件中获得数据的。
SQL> select type,record_size,records_total,records_used from v$controlfile_record_section;
4、存储多重控制文件
由于控制文件非常重要,所以要求控制文件不能只有一个。通常生产数据库中的控制文件要多于两个,并且存放在不同的磁盘上,这种同时使用多个控制文件的方式也称为控制文件的多路复用。实现多路复用的一个方法是通过复制控制文件到多个位置并修改初始化参数文件中的control_files参数,使之包含所有控制文件名称。需要注意,当存在多个控制文件时,Oracle会同时更新所有的控制文件,但是仅对control_files中所列举的第一个控制文件进行读取操作。
# mkdir /backup # 创建备份文件目录
# chown -R oracle /backup/ # 赋予权限
SQL> alter system set
2 control_files=
3 '/u01/app/oracle/oradata/orcl/control01.ctl', # 控制文件指定路径1
4 '/backup/control02.ctl' scope=spfile; # 控制文件指定路径2(可增加)
系统已更改。
SQL> HUTDOWN IMMEDIATE # 关闭数据库
[oracle@oracle ~]$ cp /u01/app/oracle/oradata/orcl/control02.ctl /backup/control02.ctl # 将文件复制到新的位置/backup目录
5、备份和恢复控制文件
1、备份控制文件
备份为二进制文件
# mkdir /u01/app/oracle/oradata/orcl/backup
# chown -R oracle /u01/app/oracle/oradata/orcl/backup/
# su - oracle
[oracle@oracle ~]$ sqlplus / as sysdba
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 1593835520 bytes
Fixed Size 8793256 bytes
Variable Size 1023411032 bytes
Database Buffers 553648128 bytes
Redo Buffers 7983104 bytes
数据库装载完毕。
数据库已经打开。
SQL> alter database backup controlfile to '/u01/app/oracle/oradata/orcl/backup/control.bkp'; # 备份到/backup中,文件名为control.bkp
数据库已更改。
2、恢复控制文件
假定CONTROL_FILES参数所指定的控制文件有一个已经损坏,但在数据字典中还能访问控制文件,则可采用下面的步骤进行恢复。
- 关闭数据库实例。
- 用操作系统命令将完好的控制文件覆盖损坏的控制文件。
- 重新启动数据库实例。
[oracle@oracle ~]$ sqlplus / as sysdba
SQL> startup # 数据库发生错误
ORACLE 例程已经启动。
Total System Global Area 1593835520 bytes
Fixed Size 8793256 bytes
Variable Size 1023411032 bytes
Database Buffers 553648128 bytes
Redo Buffers 7983104 bytes
ORA-00205: ?????????, ??????, ???????
SQL> quit
从 Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production 断开
[oracle@oracle ~]$ cp /u01/app/oracle/oradata/orcl/backup/control.bkp /u01/app/oracle/oradata/orcl/control01.ctl # 复制备份文件到原来的路径
[oracle@oracle ~]$ cp /u01/app/oracle/oradata/orcl/backup/control.bkp /u01/app/oracle/oradata/orcl/control02.ctl # 为了保持一致,将所有控制文件也恢复一份
[oracle@oracle ~]$ sqlplus / as sysdba
SQL> alter database mount; # 数据库挂载
数据库已更改。
SQL> select group#,sequence#,archived,status from v$log; # 查看当前活动的日志文件
GROUP# SEQUENCE# ARCHIVED STATUS
---------- ---------- --------- ------------------------------------------------
1 4 NO INACTIVE
3 3 NO INACTIVE
2 5 NO CURRENT # 当前正在使用的日志
SQL> select group#,status,type,member from v$logfile; # 查找日志目录
GROUP# STATUS TYPE
---------- --------------------- ---------------------
MEMBER
--------------------------------------------------------------------------------
3 ONLINE
/u01/app/oracle/oradata/orcl/redo03.log
2 ONLINE
/u01/app/oracle/oradata/orcl/redo02.log # 对应上面命令查到的活动日志文件
1 ONLINE
/u01/app/oracle/oradata/orcl/redo01.log
SQL> recover database using backup controlfile; # 使用备份控制文件恢复数据库
ORA-00279: ?? 1752953 (? 05/13/2020 21:31:17 ??) ???? 1 ????
ORA-00289: ??:
/u01/app/oracle/product/12.2.0/dbhome_1/dbs/arch1_5_975664254.dbf
ORA-00280: ?? 1752953 (???? 1) ??? #5 ?
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
/u01/app/oracle/oradata/orcl/redo02.log # 查找到的日志目录
已应用的日志。
完成介质恢复。
SQL> alter database open resetlogs; # 要打开数据时,重置重做日志
数据库已更改。
SQL> shutdown immediate # 关闭数据库
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup # 启动数据库,恢复完成
ORACLE 例程已经启动。
Total System Global Area 1593835520 bytes
Fixed Size 8793256 bytes
Variable Size 1023411032 bytes
Database Buffers 553648128 bytes
Redo Buffers 7983104 bytes
数据库装载完毕。
数据库已经打开。
三、管理重做日志文件
Oracle中的日志不同于传统日志,传统的日志记录重要事件信息,管理员通过它可以知道别人做了什么事情。但是Oracle中的日志更多情况下用于数据的恢复操作。
1、重做日志介绍
重做日志也称联机重做日志,引入重做日志的目的是数据恢复。在数据库运行过程中,用户更改的数据会暂时存放在数据库的高速缓冲区中。为了提高写数据库的速度,并不是一旦有数据变化,就把变化的数据写到数据文件中。频繁地读写磁盘文件会使数据库系统效率降低,因此,要等到数据库高速缓冲区中的数据达到一定的量或者满足一定条件时,DBWR进程才会将变化了的数据写到数据文件中。这种情况下,如果在DBWR进程将变化了的更改写到数据文件之前发生了启机,那么数据库高速缓冲区中的数据就全部丢失。如果在数据库重新启动后无法恢复这部分用户更改的数据,显然是不可以的。
重做日志就是把变化了的数据首先保存起来,其中,LGWR进程负责把用户更改的数据优先写到重做日志文件中。当数据库重新启动时,数据库系统会从重做日志文件中读取这些变化了的数据,然后将用户更改的数据提交到数据库中,写入数据文件。
2、读取重做日志文件信息
1、使用v$log查看重做曰志信息
SQL> col status for a10 # 设置格式化字符,a1O代表status列显示10字符宽度
SQL> select group#,sequence#,bytes,members,archived,status from v$log;
GROUP# SEQUENCE# BYTES MEMBERS ARCHIVED STATUS
---------- ---------- ---------- ---------- --------- ----------
1 4 209715200 1 NO INACTIVE
2 5 209715200 1 NO CURRENT # 当前曰志组
3 3 209715200 1 NO INACTIVE
2、查看重做日志组信息
SQL> set line 120; # 设置显示宽度为120
SQL> col member for a50; # member列的输出格式为50个固定字符长度
SQL> select group#,status,type,member from v$logfile;
GROUP# STATUS TYPE MEMBER
---------- ---------- --------------------- --------------------------------------------------
3 ONLINE /u01/app/oracle/oradata/orcl/redo03.log
2 ONLINE /u01/app/oracle/oradata/orcl/redo02.log
1 ONLINE /u01/app/oracle/oradata/orcl/redo01.log
STATUS参数
- 空白:此文件正在使用。
- stale:该文件内容是不完整的。
- invalid:该文件不可以被访问 , 如刚建立。
- deleted:该文件已不再有用。
SQL> alter system switch logfile;
系统已更改。
SQL> select group#,sequence#,bytes,members,archived,status from v$log;
SQL> alter system checkpoint;
系统已更改。
2、重做日志组及其成员管理
1、创建重做日志组
# mkdir -p /backup/orcl/log # 创建重做日志组备份文件夹
# chown -R oracle /backup/
# su - oracle
Last login: Wed May 13 22:57:23 CST 2020 on pts/0
[oracle@oracle ~]$ sqlplus / as sysdba
SQL> alter database add logfile group 4 # alter database:数据库实例名;group:日志组编号,不添加组号在原有日志组号的基础上加1
2 ('/u01/app/oracle/oradata/orcl/redo04a.log', # 曰志文件路径及名称
3 '/backup/orcl/log/redo04b.log') size 10m; # size:日志文件大小
数据库已更改。
SQL> select group#,status,type,member from v$logfile; # 查看重做日志组信息
GROUP# STATUS TYPE MEMBER
---------- ---------- --------------------- --------------------------------------------------
3 ONLINE /u01/app/oracle/oradata/orcl/redo03.log
2 ONLINE /u01/app/oracle/oradata/orcl/redo02.log
1 ONLINE /u01/app/oracle/oradata/orcl/redo01.log
4 ONLINE /u01/app/oracle/oradata/orcl/redo04a.log # 新添加日志1
4 ONLINE /backup/orcl/log/redo04b.log # 新添加日志2,日志1和日志2是同一组
在一般的应用系统中,日志文件大小在10~50MB比较合适。每个组中的多个日志文件分别放在不同的磁盘或分区中。
2、删除重做日志组
SQL> select group#,sequence#,bytes,members,archived,status from v$log; # 查看重做曰志信息
GROUP# SEQUENCE# BYTES MEMBERS ARCHIVED STATUS
---------- ---------- ---------- ---------- --------- ----------
1 4 209715200 1 NO INACTIVE
2 5 209715200 1 NO CURRENT
3 3 209715200 1 NO INACTIVE
4 0 10485760 2 YES UNUSED
SQL> alter database drop logfile group 4; # 删除重做日志组第4组
数据库已更改。
SQL> select group#,sequence#,bytes,members,archived,status from v$log; # 查看重做曰志信息
GROUP# SEQUENCE# BYTES MEMBERS ARCHIVED STATUS
---------- ---------- ---------- ---------- --------- ----------
1 4 209715200 1 NO INACTIVE
2 5 209715200 1 NO CURRENT
3 3 209715200 1 NO INACTIVE
如果无法删除,强制切换一下日志
SQL>alter system switch logfile;
- 当前的日志组不能删除,要删除当前日志组需要先对当前日志组进行切换,使用命令为
alter system switch logfile
- 活动的日志组不可以删除
- 没有归档的日志组不可以删除(前提是已经运行在归档模式)
3、添加/删除重做日志文件
SQL> alter database add logfile member # 添加重做日志文件
2 '/backup/orcl/log/redo01b.log' to group 1,
3 '/backup/orcl/log/redo02b.log' to group 2;
数据库已更改。
SQL> select group#,status,type,member from v$logfile; # 查看重做日志组信息
GROUP# STATUS TYPE MEMBER
---------- ---------- --------------------- -----------------------------------------
3 ONLINE /u01/app/oracle/oradata/orcl/redo03.log
2 ONLINE /u01/app/oracle/oradata/orcl/redo02.log
1 ONLINE /u01/app/oracle/oradata/orcl/redo01.log
1 INVALID ONLINE /backup/orcl/log/redo01b.log
2 INVALID ONLINE /backup/orcl/log/redo02b.log
SQL> alter database drop logfile member # 删除重做日志文件
2 '/backup/orcl/log/redo02b.log';
alter database drop logfile member
*
第 1 行出现错误:
ORA-01609: 日志 2 是线程 1 的当前日志 - 无法删除成员 ORA-00312:
联机日志 2 线程 1: '/u01/app/oracle/oradata/orcl/redo02.log'
ORA-00312: 联机日志 2 线程 1: '/backup/orcl/log/redo02b.log'
SQL> alter system switch logfile; # 出现错误提示,强制切换重做日志
系统已更改。
SQL> alter database drop logfile member
2 '/backup/orcl/log/redo02b.log';
数据库已更改。
SQL> select group#,status,type,member from v$logfile;
GROUP# STATUS TYPE MEMBER
---------- ---------- --------------------- --------------------------------------
3 ONLINE /u01/app/oracle/oradata/orcl/redo03.log
2 ONLINE /u01/app/oracle/oradata/orcl/redo02.log
1 ONLINE /u01/app/oracle/oradata/orcl/redo01.log
1 INVALID ONLINE /backup/orcl/log/redo01b.log
- 不能删除当前组的成员,若要删除则先执行强制性切换重做日志的命令
- 活动的日志成员不可以删除
- 没有归档的日志文件不能删除(前提是已运行在归档模式下)
- 当日志组只有一个成员
3、日志切换和检查点事件
检查点事件越频繁,一旦数据库发生故障,需要数据库恢复的重做曰志中的数据就越少。
SQL> ALTER SYSTEM SWITCH LOGFILE; # 强制日志切换
系统已更改。
SQL> ALTER SYSTEM CHECKPOINT; # 强制产生检查点事件
系统已更改。
四、管理归档日志文件
归档日志是对重做日志的归档,重做日志组只能保存最近的日志信息,而归档日志可以保存所有的重做日志。
1、归档日志介绍
Oracle数据库有两种运行模式:归档(Archivelog)方式和非归档(Noarchivelog)方式。在非归档方式下,日志切换时直接覆盖以前的重做日志文件,不产生归档日志。数据库在归档方式下运行,在日志切换后,ARCn进程会对已写满的重做日志文件进行存档,如图3.5所示,默认情况下,Oracle采用非归档的运行模式,主要因为归档方式会给系统带来一定的性能问题。只有当数据库运行在归档方式下,ARCn进程才存在。ARCn进程是Oracle的可选后台进程,其目的是将日志存档,以便保存对数据库做的所有更改。这样,即使在数据文件磁盘损坏的情况下,数据库管理员也能将数据库恢复至故障发生时的状态。
2、配置数据库归档日志
SQL> archive log list; # 查询数据库归档模式,确认非存档
数据库日志模式 非存档模式
自动存档 禁用
存档终点 /u01/app/oracle/product/12.2.0/dbhome_1/dbs/arch
最早的联机日志序列 5
当前日志序列 7
SQL> shutdown immediate # 关闭数据库
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount; # 动数据库到mount状态
ORACLE 例程已经启动。
Total System Global Area 1593835520 bytes
Fixed Size 8793256 bytes
Variable Size 1023411032 bytes
Database Buffers 553648128 bytes
Redo Buffers 7983104 bytes
数据库装载完毕。
SQL> alter database archivelog; # 将数据库设置为归档方式
数据库已更改。
SQL> archive log list; # 查询数据库归档模式
数据库日志模式 存档模式
自动存档 启用
存档终点 /u01/app/oracle/product/12.2.0/dbhome_1/dbs/arch
最早的联机日志序列 5
下一个存档日志序列 7
当前日志序列 7
SQL> alter database open; # 打开数据库
数据库已更改。
SQL> alter system switch logfile; # 强制日志切换
系统已更改。
SQL> select dest_id,name,archived from v$archived_log; # 查看归档日志文件的路径
DEST_ID NAME ARCHIVED
---------- ---------------------------------------------------------------------
1 /u01/app/oracle/product/12.2.0/dbhome_1/dbs/arch1_7_975664254.dbf YES
3、获取归档日志信息
视图 | 说明 |
---|---|
VSARCHIVE_DEST | 显示当前所有归档日志的存储位置及其状态 |
VSARCHIVED_LOG | 显示历史归档日志信息 |
SQL> select dest_id,dest_name,status,destination from vsarchive dest where status='valid'; # 查看所有有效的归档日志文件存储目录
SQL> select dest_id,name,archived from v$archived_log; # 获取已归档的日志文件的信息
DEST_ID NAME ARCHIVED
---------- ---------------------------------------------------------------------- ----
1 /u01/app/oracle/product/12.2.0/dbhome_1/dbs/arch1_7_975664254.dbf YES
五、数据字典管理
数据字典保存了数据库的运行信息,通过数据字典的查询可以让DBA对当前数据库的运行状态更加了解。
1、数据字典的含义
数据字典是Oracle存储关键信息的表和视图的集合。Oracle进程会在SYS模式中维护这些表和视图,也就是说数据字典的所有者为SYS用户,数据存放在SYSTEM表空间中。数据字典描述了实际数据是如何组织的,如一个表的创建者信息、创建时间信息,所属表空间信息、用户访问权限信息等。对它们可以像其他数据库表或视图一样进行查询,但不能进行任何修改。
Oracle数据字典通常是在创建和安装数据库时被创建的。Oracle数据字典是Oracle数据库系统工作的基础。没有数据字典的支持,Oracle数据库系统就不能进行任何工作。
2、数据字典的构成
数据字典分为数据字典表和数据字典视图。数据字典中的表不可以直接被访问,但是可以访问数据字典中的视图。数据字典视图分为两类:静态数据字典视图(静态性能视图)和动态数据字典视图(动态性能视图)。
1、数据字典表
数据字典表中的数据是Oracle系统存放的系统数据,而普通表存放的是用户的数据。为了方便地区别这些表,这些表的名称都是用“$”结尾。这些表都属于SYS用户。
为方便用户对数据字典表的查询,Oracle对这些数据字典分别建立了用户视图,这样既容易记住,又隐藏了数据字典表之间的关系。
2、静态数据字典视图
静态数据字典视图分为三类,分别由三种前缀区分:USER_*
、ALL_*
、DBA_*
。
USER_*
:该视图存储了当前用户所拥有的对象的信息(即所有在该用户模式下的对象)。ALL_*
:该视图存储了当前用户能够访问的对象的信息(与USER_*
相比,ALL-*
并不需要拥有该对象,只需要具有访问该对象的权限即可)。DBA_*
:该视图存储了数据库中所有对象的信息(前提是当前用户具有访问权限,一般来说必须具有管理员权限)。
3、静态数据字典使用
1、查看当前用户拥有的所有表的信息
SQL> select * from user_tables;
2、查询该用户拥有哪些索引
SQL> select index_name from user_indexes;
3、查询该用户拥有哪些视图
SQL> select view_name from user_views;
4、查询该用户拥有哪些数据库对象
SQL> select object_name from user_objects;
5、描述当前用户的信息
SQL> select * from user_users;
6、查询当前用户能够访间的所有表、过程、函数等信息
SQL> select owner,object_name,object_type from all_objects;
7、查看所有的视图及其描述
SQL> desc dictionary
8、查询USER开头的视图
SQL> select table_name from dictionary where table_name like 'USER%';
4、动态数据字典使用
除了静态数据字典中的三类视图,其他的字典视图中主要是VS视图,之所以这样命名是因为他们都是以Vs或GVS开头的。这些视图会不断地进行更新,可以反映出当前实例和数据库的运行状况。动态视图用于记录当前数据库的活动,只存在于数据库运行期间,实际的信息都取自内存和控制文件。DBA可以使用动态数据字典视图来监视和维护数据库。
1、查询和曰志文件相关的信息
SQL> col name for a25
SQL> col object_id for 999999999
SQL> select * from v$fixed_table where name like 'V$LOG%';
NAME OBJECT_ID TYPE TABLE_NUM CON_ID
------------------------- ---------- --------------- ---------- ----------
V$LOGFILE ########## VIEW 65537 0
V$LOG ########## VIEW 65537 0
V$LOGHIST ########## VIEW 65537 0
V$LOG_HISTORY ########## VIEW 65537 0
V$LOGMNR_CONTENTS ########## VIEW 65537 0
V$LOGMNR_LOGS ########## VIEW 65537 0
V$LOGMNR_DICTIONARY ########## VIEW 65537 0
V$LOGMNR_PARAMETERS ########## VIEW 65537 0
V$LOGMNR_LOGFILE ########## VIEW 65537 0
V$LOGMNR_PROCESS ########## VIEW 65537 0
V$LOGMNR_TRANSACTION ########## VIEW 65537 0
......
2、查看重做日志组状态信息
SQL> select group#,members,archived,status from v$log;
GROUP# MEMBERS ARCHIVED STATUS
---------- ---------- --------- ------------------------------------------------
1 1 NO INACTIVE
2 1 NO CURRENT
3 1 NO INACTIVE
3、查看重做曰志文件信息
SQL> col group# for 9
SQL> col type for a7
SQL> col member for a40
SQL> set line 120;
SQL> select* from v$logfile;
GROUP# STATUS TYPE MEMBER IS_RECOVE CON_ID
------ ------- ------- ---------------------------------------- --------- ----------
3 ONLINE /u01/app/oracle/oradata/orcl/redo03.log NO 0
2 ONLINE /u01/app/oracle/oradata/orcl/redo02.log NO 0
1 ONLINE /u01/app/oracle/oradata/orcl/redo01.log NO 0
4、查询当前正在使用的重做日志文件的信息
SQL> col STATUS for a20
SQL> select l.group#,l.archived,l.status,lf.type,lf.member from v$log l, v$logfile lf where l.group#=lf.group#;
GROUP# ARCHIVED STATUS TYPE MEMBER
------ --------- -------------------- ------- ----------------------------------------
3 NO INACTIVE ONLINE /u01/app/oracle/oradata/orcl/redo03.log
2 NO CURRENT ONLINE /u01/app/oracle/oradata/orcl/redo02.log
1 NO INACTIVE ONLINE /u01/app/oracle/oradata/orcl/redo01.log
5、查看实例信息
SQL> col host_name for a10
SQL> col instance_name for a10
SQL> col version for a15
SQL> select instance_name,host_name,version,startup_time,logins from v$instance;
INSTANCE_N HOST_NAME VERSION STARTUP_TIME LOGINS
---------- ---------- --------------- ------------ ------------------------------
orcl oracle 12.2.0.1.0 14-5月 -20 ALLOWED
6、查看当前数据库的信息
SQL> col name for a10;
SQL> select name,created,log_mode from v$database;
NAME CREATED LOG_MODE
---------- ------------ ------------------------------------
ORCL 09-5月 -18 NOARCHIVELOG
评论区