Linux系统Oracle常见操作
一、 登录
1.1 登录默认数据库
首先切换到oracle用户,用数据库默认管理员登录。
[root@tsm-zh01 ~]# su – oracle
[oracle@redhat ~]$ lsnrctl start #开启监听
[oracle@tsm-zh01 ~]$ sqlplus / as sysdba #sqlplus 用户名/密码
SQL> startup; #打开数据库
1.2数据库切换
1.2.1 Oracle实例进程显示
[oracle@tsm-zh01 ~]$ ps -ef | grep ora_dbw0_$ORACLE_SID
oracle 5956 1 0 Sep21 ? 00:16:18 ora_dbw0_tsmdb1
oracle 5958 1 0 Sep21 ? 00:18:05 ora_dbw0_tsmcnnt1
oracle 5972 1 0 Sep21 ? 00:22:59 ora_dbw0_tsmcity1
1.2.2进行数据库实例切换
在oracle用户下输入
export ORACLE_SID=实例名
1.2.3查看当前数据库实例
SQL> select instance_name from v$instance;
INSTANCE_NAME
--------------------------------
tsmcity1
1.2.4查看所有启动实例
[oracle@tsm-zh01 ~]$ ps -ef|grep smon #smon : system monitor
R1.2.5查看所有实例
未启动的可以
ps -elf | grep ora_ ( 对比其后接的SID)
lsnrctl status
1.3开启和关闭归档
1.3.1 查看当前归档模式
SQL> archive log list;Database log mode No Archive ModeAutomatic archival DisabledArchive destination USE_DB_RECOVERY_FILE_DESTOldest online log sequence 228Current log sequence 230
1.3.2 关闭数据库到mount
注意:
如果是数据库集群,不能单独用shutdown immediate;关闭数据库,必须进入到grid用户模式下用srvctl stop database -d 实例名 统一关闭实例;
另外startup mount和alterdatabase archivelog;操作,每台集群都要操作,重启数据库的时候,直接在oracle用sqlplus按顺序启动。
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;ORACLE instance started. Total System Global Area 3423965184 bytesFixed Size 2180544 bytesVariable Size 2013268544 bytesDatabase Buffers 1392508928 bytesRedo Buffers 16007168 bytesDatabase mounted.
1.3.3 启动或关闭归档
- 启动归档
如果数据库一开始没有设置日志模式,需要先设置日志模式
Alter system set log_archive_start=true scope=spfile; 设置归档日志方式为归档模式
SQL> alter database archivelog; Database altered.
- 设置归档路径
alter system set log_archive_dest_1='location=/ora_arch';
- 关闭归档
SQL> alter database noarchivelog;Database altered.
- 关闭归档的时候可能会报闪回报错,可以查一下闪回的状态,关闭后可以正常关闭归档
ERROR at line 1:
ORA-38774: cannot disable media recovery - flashback database is enabled
- 关闭闪回
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
YES
SQL> alter database flashback off;
Database altered.
1.3.4 重新启动数据库
查看数据库实例状态
select instance_name,status from v$instance;
INSTANCE_NAME STATUS
------------------------------------------------
linuxidc MOUNTED
SQL> alter database open;Database altered.
2.2 rman管理数据库
2.2.1 在oracle下直接链接库
[oracle@tsm-zh01 ~]$ export ORACLE_SID=orcl #如果本机有多个数据库,先操作这个
[oracle@tsm-zh01 ~]$ rman target /
Recovery Manager: Release 11.2.0.4.0 - Production on Wed Dec 12 10:53:08 2018
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
connected to target database: TSMCITY (DBID=2201482424)
RMAN>
2.2.2 进入rman后再连接库
[oracle@tsm-zh01 ~]$ rman
Recovery Manager: Release 11.2.0.4.0 - Production on Wed Dec 12 10:53:25 2018
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
RMAN> connect target /
connected to target database: TSMCITY (DBID=2201482424)
RMAN>
2.3 rman删除归档日志
公司所有的归档(tsmcnnt、tsmdb、tsmcity)都在tsmcity的归档文件夹黎。
2.3.1操作系统删除(需要和数据库同步)
在controlfile中记录着每一个archivelog的相关信息当我们在OS下把这些物理文件delete掉或异常变动后,在controlfile中仍然记录着这些archivelog的信息,当我们手工清除archive目录下的文件后,这些记录并没有被我们从controlfile中清除掉,也就是oracle并不知道这些文件已经不存在了!这时候我们要做手工的清除。
1、物理删除archivelog。在系统里面找到归档日志文件删除。如果是阵列用grid用户asmcmd命令进入到阵列删除。
2、进入RMAN 。connect target / 没有分号
3、crosscheck archivelog all; #查看归档日志路径检查控制文件和实际物理文件的差别
4、delete expired archivelog all; 检查控制文件和实际物理文件的差别
2.3.2 rman命令删除
1、DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-30'; 删除30天以前的所有归档,时间戳是以归档结束计算
2、delete force noprompt archivelog until time 'sysdate-2' ; 删除2天前的归档(强制),force可选项;时间戳是以归档开始计算
在正常情况才用第一种情况进行删除,如果采用第二种进行删除可能会导致部分操作归档丢失。
3、其他删除命令
RMAN>delete archivelog until sequence 123;
RMAN>delete archivelog all completed before 'sysdate - 7';
RMAN>delete archivelog all completed before 'sysdate - 1';
RMAN>delete archivelog from time 'sysdate-1';
2.4 集群管理
集群默认用grid 账户管理
lsnrctl status (在grid下使用,可以检测oracle侦听端口是否打开。)
[root@tsm-zh01 ~]# su - grid
[grid@tsm-zh01 ~]$ asmcmd
ASMCMD>
2.4.1单点集群停机:
有时候我们需要单独关闭一个节点做维护, 那么单独关闭
在需要维护的节点Server 上,用root登录:
输入crsctl stop crs 或者 /etc/init.d/init.crs stop
[root@tsm-zh02 ~]# crsctl stop crs
…
CRS-2677: Stop of 'ora.gpnpd' on 'tsm-zh02' succeeded
CRS-2793: Shutdown of Oracle High Availability Services-managed resources on 'tsm-zh02' has completed
CRS-4133: Oracle High Availability Services has been stopped.
[root@tsm-zh02 ~]crsctl start crs 重启即可
2.4.2 RAC 数据迁移(ASM 磁盘组)
- 查看系统表状态
SQL> select file_name,online_status,tablespace_name from dba_data_files;
FILE_NAME
--------------------------------------------------------------------------------
ONLINE_STATUS TABLESPACE_NAME
-------------- ------------------------------------------------------------
+TSMCITY/tsmcity/datafile/users.290.855748279
ONLINE USERS
+TSMCITY/tsmcity/datafile/undotbs1.292.855748279
ONLINE UNDOTBS1
+TSMCITY/tsmcity/datafile/sysaux.272.855748279
ONLINE SYSAUX
- 关闭RAC上涉及的数据库
srvctl stop database -d XXX
- 将RAC1启动到mount状态
如果用户将原来的表空间建立在RAC1上,则在RAC1上进行操作;如果是RAC2,就到RAC2上进行操作
SQL>startup mount;
这一步非常重要,否则会提示找不到之前的数据表文件
- 通过rman 拷贝文件到磁盘组
如果用户将原来的表空间建立在RAC1上,则在RAC1上进行操作;如果是RAC2,就到RAC2上进行操作
RMAN> connect target /
connected to target database: TSMCITY (DBID=2201482424)
RMAN> copy datafile '/home/oracle/test.dbf' to '+data';
Starting backup at 2017/09/17 02:13:03
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=36 instance=devdb1 device type=DISK
channel ORA_DISK_1: starting datafile copy
input datafile file number=00006 name=/home/oracle/test.dbf
output file name=+DATA/devdb/datafile/users.273.954900787 tag=TAG20170917T021305 RECID=3 STAMP=954900786
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01
Finished backup at 2017/09/17 02:13:07
Starting Control File and SPFILE Autobackup at 2017/09/17 02:13:07
piece handle=+FLASH/devdb/autobackup/2017_09_17/s_954900552.304.954900789 comment=NONE
Finished Control File and SPFILE Autobackup at 2017/09/17 02:13:10
- 拷贝完毕后更改文件名
SQL>alter database rename file '/home/oracle/test.dbf' to '+DATA/devdb/datafile/USERS.273.954900787';
- 启动数据库集群
srvctl start database -d XXX
如果是数据库集群建议采用如上操作,在grid里面启动数据库,采用如下单点操作也可以进行
#RAC1
SQL> alter database open;
Database altered.
SQL>
#RAC2
SQL> startup;
二、 用户管理、表空间和授权
2.1 用户管理
2.1.1 创建用户
CREATE USER 用户名 IDENTIFIED BY 密码 PROFILE DEFAULT DEFAUL T TABLESPACE 表空间 ACCOUNT UNLOCK;
PROFILE DEFAULT:默认的用户口令限制,比如密码错误次数、密码锁定时间。
ACCOUNT UNLOCK:账户是否启用或者锁定,默认是启用。
2.1.2 删除用户
DROP USER 用户名 CASCADE;
若用户拥有对象,则不能直接删除,否则将返回一个错误值。指定关键字cascade,可删除用户所有的对象,然后再删除用户。
2.1.3 更改口令
ALTER USER 用户名 IDENTIFIED BY 改变的口令;
2.1.4 查询所有用户
SELECT * FROM ALL_USERS;
2.2 表空间管理
2.2.1 创建表空间
CREATE TABLESPACE 表空间名DATAFILE '/路径/文件名.dbf' SIZE 50M
AUTOEXTEND ON NEXT 50M MAXSIZE 2048M
[PERMANENT | TEMPORARY] [EXTENT MANAGEMENT LOCAL | DICTIONARY];
AUTOEXTEND:自动增长,默认关闭 ;
NEXT:下次增长的空间;
MAXSIZE:最大增长空间;
[PERMANENT | TEMPORARY]:永久或者临时表空间,一般先创建临时表空间再创建永久表空间
[EXTENT MANAGEMENT LOCAL | DICTIONARY]:管理方式,默认是本地管理;
2.2.2 指定用户表空间
1、创建用户并指定表空间:
CREATE USER 用户名 IDENTIFIED BY 密码 DEFAULT TABLESPACE 永久表空间名 TEMPORARY TABLESPACE 临时表空间;
2、更改用户表空间:
ALTER USER 用户名 DEFAULT TABLESPACE 表空间名;
2.2.3 删除表空间、数据文件
删除表空间(先脱机)
DROP TABLESPACE 表空间名字 INCLUDING CONTENTS AND DATAFILES;
删除单个数据文件
ALTER TABLESPACE TEST_SPACE DROP
DATAFILE '/DATA/ORACLE/ORADATA/ORCL/TEST2.DBF'; #删除文件
2.2.4修改表空间
1、增加文件:
ALTER TABLESPACE 表空间名ADD DATAFILE '/路径/aaa.dbf' SIZE 1000M;
2、修改表空间数据文件尺寸
ALTER DATABASE 数据库名 DATAFILE ‘/路径/AA.DBF’ RESIZE 2048M;
3、表空间属性
使表空间联机|脱机
ALTER TABLESPACE game ONLINE|OFFLINE;
使数据文件脱机|连接
ALTER DATABASE DATAFILE ‘ssss’ OFFLINE|ONLINE;
使表空间只读|读写
ALTER TABLESPACE game READ ONLY|WRITE;
2.2.5 表空间查询
1、看表空间名称和状态
select tablespace_name,status from user_tablespaces;
2、查询表空间使用情况
SET lines 2000
SET pagesize 2000
SELECT total.tablespace_name,
Round(total.mb, 2) AS total_mb,
Round(total.mb - free.mb, 2) AS used_mb,
Round(free.mb, 2) AS free_mb,
Round(( 1 - free.mb / total.mb ) * 100, 2)
|| '%' AS used_pct
FROM (SELECT tablespace_name,
Sum(bytes) / 1024 / 1024 AS mb
FROM dba_free_space
GROUP BY tablespace_name) free,
(SELECT tablespace_name,
Sum(user_bytes) / 1024 / 1024 AS mb
FROM dba_data_files
GROUP BY tablespace_name) total
WHERE free.tablespace_name = total.tablespace_name
ORDER BY tablespace_name;
3、查询表空间的free space
select tablespace_name, count(*) AS extends,round(sum(bytes) / 1024 / 1024, 2) AS MB,sum(blocks) AS blocks from dba_free_space group BY tablespace_name;
4、查询表空间的总容量
select tablespace_name, sum(bytes) / 1024 / 1024 as MB from dba_data_files group by tablespace_name;
5、查询表空间使用率
SELECT total.tablespace_name,
Round(total.MB, 2) AS Total_MB,
Round(total.MB - free.MB, 2) AS Used_MB,
Round(( 1 - free.MB / total.MB ) * 100, 2)
|| '%' AS Used_Pct
FROM (SELECT tablespace_name,
Sum(bytes) / 1024 / 1024 AS MB
FROM dba_free_space
GROUP BY tablespace_name) free,
(SELECT tablespace_name,
Sum(bytes) / 1024 / 1024 AS MB
FROM dba_data_files
GROUP BY tablespace_name) total
WHERE free.tablespace_name = total.tablespace_name;
6、表空间数据文件
SELECT TABLESPACE_NAME, FILE_ID, FILE_NAME,ROUND(BYTES/(1024*1024),0) TOTAL_SPACE FROM DBA_DATA_FILES ORDER BY TABLESPACE_NAME;
2.2.6 用户授权
GRANT CONNECT,RESOURCE,DBA TO 用户名;
REVOKE CONNECT,RESOURCE,DBA FROM 用户名; #收回权限
2.27 表空间备份和恢复
1、脱机备份和恢复(冷备份)
Shutdown 数据库后直接复制相关文件即可,如果需要恢复,停机后再复制到原来的路径,然后开启数据库。
2、联机备份和恢复(热备份)
热备份的前提是数据库必须运行在归档模式下,而且必须备份的只有数据文件,控制文件、重做日志文件、归档日志文件都是靠物理冗余来保护的。
由于数据文件处于备份状态时重做日志后台进程要将这些文件的所有的变化数据块写到重做日志文件中,这对重做日志缓冲区和重做日志文件的压力都增大了,所以需要注意几下加点:
- 重做日志缓冲区和重做日志文件适当增大
- 在联机备份时,每次只备份一个表空间
- 在DML最少的时候做备份
- 设置数据库日志模式为归档模式
Alter system set log_archive _start=true scope=spfile;
上述参数在oracle 10g已经废弃
Shutdown immediate;
Startup mount;
Alter database archive;
- 开启数据库
既然是联机备份,数据库肯定是要保持正常开启状态的。
Alter database open;
- 备份表空间
Alter tablespace 空间名 begin backup; 执行此命令后,用cp命令复制表空间文件即可(用oracle用户拷贝,否则文件权限不对,无法恢复)。
Alter tablespace 空间名 end backup;
select * from v$backup; 查看是否备份成功
- 重做日志写入
select group#,sequence#,status,archived from v$log; 查看当前重做日志:
Alter system archive log current;
Alter system switch logfile;
重做日志文件一般有3个,切换3次。
- 如果数据库某个表空间出现问题,无法正常启动数据库,操作如下;
先将表空间提示的数据文件切换到脱机状态
Alter database datafile 10 offline drop; 数字10为系统提示的文件编号;
Select * from v$recover_file; 查询是否为编号为10的文件报错。
删除并复制之前备份的文件到表空间文件位置。
Alter database open;
- 恢复
Recover datafile 10;
Alter datafile 10 online;
完毕。
三、 备份和恢复
3.1 热备份
3.2 逻辑备份
- EXP和IMP是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用。
- EXPDP和IMPDP是服务端的工具程序,他们只能在ORACLE服务端使用,不能在客户端使用。即EXPDP导出的数据只能在服务端。
- IMP只适用于EXP导出的文件,不适用于EXPDP导出文件;IMPDP只适用于EXPDP导出的文件,而不适用于EXP导出文件
3.2.1 exp 和imp
3.2.2 expdp 和impdp
3.2.2.1 expdp 导出
expdp或impdp命令时,可暂不指出用户名/密码@实例名 as 身份,然后根据提示再输入,如:
expdp schemas=scott dumpfile=expdp.dmp DIRECTORY=dpdata1;
1、创建逻辑目录.
该命令不会在操作系统创建真正的目录,最好以oracle等管理员创建。
sql>create directory dpdata1 as '/test/dump';
查看管理理员目录(同时查看操作系统是否存在,因为Oracle并不关心该目录是否存在,如果不存在,则出错)
sql>select * from dba_directories;
2、授权数据库用户权限
给scott用户赋予在指定目录的操作权限,最好以system等管理员赋予。
sql>grant read,write on directory dpdata1 to scott;
#Scott是数据库用户,如果用管理sys去操作,可以不用授权操作,以 \’sys/密码@实例名 as sysdba\’ 的形式登录即可。比如\’sys / as sysdba \’
3、导出数据
1)按用户导
expdp scott/tiger@orcl schemas=scott dumpfile=expdp.dmp DIRECTORY=dpdata1 logfile=expdpd.log version=10.2.0.4
#Schemas=用户名,Logfile可以不指定,系统会自动生成
#version如果指定版本号:则可以再低版本中进行恢复保证兼容性
2)并行进程parallel
expdp scott/tiger@orcl directory=dpdata1 dumpfile=scott_%U.dmp parallel=4 job_name=scott3
#注意:dumpfile 参数拥有一个通配符 %U,它指示文件将按需要创建,格式为scott_nn.dmp,其中nn 从 01 开始,然后按需要向上增加,上限为最大线程数。
Sql>show parameters cpu #查看cpu支持的线程数。
3)按表名导
expdp scott/tiger@orcl TABLES=emp,dept dumpfile=expdp.dmp DIRECTORY=dpdata1
#默认导出的该用户名下面的表,如果需要导出其他用户的表 tables=用户名.表名
4)按查询条件导
expdp scott/tiger@orcl directory=dpdata1 dumpfile=expdp.dmp Tables=emp query='WHERE deptno=20'
5)按表空间导
expdp system/manager DIRECTORY=dpdata1 DUMPFILE=tablespace.dmp TABLESPACES=temp,example
6)导整个数据库
expdp system/manager DIRECTORY=dpdata1 DUMPFILE=full.dmp FULL=y
7)partfile
expdp partfile=expdp.txt
文本文件里面可以写脚本,命令
3.2.2.2 impdp 恢复
- 导到指定用户下
impdp scott/tiger DIRECTORY=dpdata1 DUMPFILE=expdp.dmp SCHEMAS=scott
#即使用户不存在也可以导入数据,建议先建立用户在导入数据。
2)改变表的owner
impdp system/manager DIRECTORY=dpdata1 DUMPFILE=expdp.dmp TABLES=scott.dept REMAP_SCHEMA=scott:system
#将表的所有者从scott变为system
3)导入表空间
impdp system/manager DIRECTORY=dpdata1 DUMPFILE=tablespace.dmp TABLESPACES=example
4)导入数据库
impdb system/manager DIRECTORY=dump_dir DUMPFILE=full.dmp FULL=y
5)追加数据
impdp system/manager DIRECTORY=dpdata1 DUMPFILE=expdp.dmp SCHEMAS=system TABLE_EXISTS_ACTION
3.2.2.3并行操作(PARALLEL) 说明
您可以通过 PARALLEL 参数为导出使用一个以上的线程来显著地加速作业。每个线程创建一个单独的转储文件,因此参数 dumpfile 应当拥有和并行度一样多的项目。您可以指定通配符作为文件名,而不是显式地输入各个文件名,例如:
expdp ananda/abc123 tables=CASES directory=DPDATA1 dumpfile=expCASES_%U.dmp parallel=4 job_name=Cases_Export
注意:dumpfile 参数拥有一个通配符 %U,它指示文件将按需要创建,格式将为expCASES_nn.dmp,其中nn 从 01 开始,然后按需要向上增加。
在并行模式下,状态屏幕将显示四个工作进程。(在默认模式下,只有一个进程是可见的)所有的工作进程同步取出数据,并在状态屏幕上显示它们的进度。
分离访问数据文件和转储目录文件系统的输入/输出通道是很重要的。否则,与维护 Data Pump 作业相关的开销可能超过并行线程的效益,并因此而降低性能。并行方式只有在表的数量多于并行值并且表很大时才是有效的。
3.3 冷备份(非归档模式)
拷贝相关的数据文件、归档日志、重做日志、控制文件即可,可以保持文件一致性。
connect tigger/sccot as sysdba;
shutdown immediate; #先关闭数据库
cp d:/test*.dbf d:export #--cp 文件 目标文件夹 数据文件
cp d:/test*.ctl d:export #--控制文件
cp d:/test*.log d:export #--日志文件
startup;
查看控制文件路径
select status,name from v$controlfile;
查看数据文件路径
select status,file_name from dba_data_files;
查看日志文件
select group#,status,member from v$logfile;
3.4 RMAN备份和恢复
3.4.1联机备份
1、开启归档
Sql> alter database archivelog; #开启归档
Sql>archive log list; #查看归档状态
2、创建恢复目录
一般情况恢复目录是用另外一台服务器的数据库来创建的,以保证当前服务器宕机后,恢复目录仍然可以使用。
2.1创建恢复用表空间
#Sqlplus 远程用户名/密码@远程数据库名 ;
Sql>create tablespace 表空间名 datafile ‘路径’ size 200m autoextend on next 50m maxsize 500m;
Sql>create user 用户名 idendified by 密码 default tablespace 表空间名; #创建用于管理恢复目录表空间的用户
Sql>grant connect,resource,recovery_catalog_owner to 用户名; #授予用户管理表空间的权限
在恢复用表空间中创建恢复目录
2.2创建远程恢复目录
rman
Rman>connect catalog 远程用户/密码@远程数据库名; #用rman 连接到远程数据库
Rman>create catalog; #创建恢复目录
#创建完恢复目录后,在远程数据库中登录用户,可以查到多了很多数据表信息。
2.3 注册需要备份的数据库
#Rman target /; #用rman连接需要备份的数据库
Rman >connect catalog 用户名/密码@远程数据库名;
Rman>register database; #注册需要备份的数据库到恢复目录
注册完毕后可以在恢复目录看到数据库的注册信息
3、备份
3.1 rman参数说明
https://www.cnblogs.com/-abm/p/9261034.html
%c 备份片的拷贝数
%d 数据库名称
%D 位于该月中的第几天 (DD)
%M 位于该年中的第几月 (MM)
%F 一个基于DBID唯一的名称,这个格式的形式为c-IIIIIIIIII-YYYYMMDD-QQ,其中IIIIIIIIII为该数据库的DBID,YYYYMMDD为
日期,QQ是一个1-256的序列
%n 数据库名称,向右填补到最大八个字符
%u 一个八个字符的名称代表备份集与创建时间
%p 该备份集中的备份片号,从1开始到创建的文件数
%U 一个唯一的文件名,代表%u_%p_%c
%s 备份集的号
%t 备份集时间戳
%T 年月日格式(YYYYMMDD)
3.2 连接远程恢复目录
在rman连接到本地数据库之后,必须再远程连接恢复目录,这样才会将备份信息写入到恢复目录,否则仍然是nocatlog模式,所有信息值存入到控制文件中。
#rman target / catalog 用户名/密码@远程数据库名 #前半部分是登录到本地,后半部分连接到远程
#rman target /
Rman> connect catalog 远程用户名/密码@远程数据库名;
3.3备份
Rman>backup as compressed backupset database plus archivelog delete all input;
#plus archivelog 备份的同时备份归档日志,包括刚刚运行backup所生成的日志
#delet all input 删除所有已备份的的归档日志
RMAN>configure channel device type disk format '/home/oracle/oradata/backup/data_%d_%M_%U';
#设置数据文件备份路径
RMAN>configure controlfile autobackup format for device type disk to '/home/oracle/oradata/backup/ctl_%d_%M_%F';
#设置控制文件备份路径
通道备份
run
{
allocate channel ch1 device type disk;
allocate channel ch2 device type disk;
backup database format '/home/oracle/oradata/backup/Data_%d_%M_%U'
plus archivelog format '/home/oracle/oradata/backup/log_%d_%M_%U';
sql ‘alter system archive log current’; #备份所有的归档日志
release channel ch1;
release channel ch2;
}
报错 operation disallowed: snapshot control file enqueue unavailable
错误信息
RMAN> backup current controlfile format '/tmp/xifenfei.ctl';
Starting backup at 10-JUN-15
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=628 instance=orcl1 devtype=DISK
channel ORA_DISK_1: starting full datafile backupset
channel ORA_DISK_1: specifying datafile(s) in backupset
waiting for snapshot control file enqueue
waiting for snapshot control file enqueue
waiting for snapshot control file enqueue
waiting for snapshot control file enqueue
waiting for snapshot control file enqueue
cannot make a snapshot control file
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03009: failure of backup command on ORA_DISK_1 channel at 06/10/2015 16:03:10
ORA-00230: operation disallowed: snapshot control file enqueue unavailable
查看会话
SQL> SELECT s.SID, USERNAME AS "User", PROGRAM, MODULE,
2 ACTION, LOGON_TIME "Logon"
3 FROM V$SESSION s, V$ENQUEUE_LOCK l
4 WHERE l.SID = s.SID
5 AND l.TYPE = 'CF'
6 AND l.ID1 = 0
7 AND l.ID2 = 2;
SID User
---------- ------------------------------
PROGRAM
------------------------------------------------
MODULE
------------------------------------------------
ACTION Logon
-------------------------------- ------------
648 SYS
rman@db1 (TNS V1-V3)
backup full datafile
0000152 STARTED111 03-JUN-15
查询并kill相关session
查询数据库SID
Sql>select saddr,sid,serial#,paddr,username,status from v$session where sid = 648 ;SADDR SID SERIAL# PADDR USERNAME STATUS---------------- ---------- ---------- ---------------- ------------------------------------------------------------ ----------------00000000849D3D48 648 319 000000008488C070 SYS ACTIVE
查询系统SPID
SQL> select spid from v$process where addr in(select paddr from v$session where sid=648);
SPID
------------
40108238 #这个SPID对应的就是操作系统的进程号
杀死session
alter system kill session ‘648,319'; #两个数字代表SID和SERIAL
杀死spid
SQL> !ps -ef|grep 40108238
oracle 39125244 65011720 0 15:59:27 pts/0 0:00 grep 40108238
oracle 40108238 1 0 Jun 03 - 1:18 oracleorcl1 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
$kill -9 40108238
或者直接一步
sql>ALTER SYSTEM DISCONNECT SESSION 'sid,serial#' IMMEDIATE/POST_TRANSACTION;
POST_TRANSACTION表示等待事务完成后断开会话,IMMEDIATE表示中断会话,
3.4.2恢复
1、查看备份信息
恢复的时候一定要先检查备份文件,删除失效(expired)备份,否则恢复会报错。
Rman>Report obsolete ; #查看冗余无效备份
Rman>Delete noprompt obsolete;
Rman>Crosscheck backup; #检查备份信息
Rman>Delete noprompt expired backup; #删除过期备份
Rman>delete noprompt backupset 41 #(BS Key的值) 删除指定备份
Rman>delete noprompt backup; #删除所有备份
2、非系统表空间dbf文件丢失
SQL> startup
…
Database mounted.
ORA-01157: cannot identify/lock data file 4 - see DBWR trace file
ORA-01110: data file 4: '/usr/oracle/app/oradata/orcl/users01.dbf' #提示data file 4不能识别。
SQL> alter database datafile 4 offline;
SQL> alter database open;
RMAN> restore datafile 4; #恢复数据文件4
RMAN> recover datafile 4; #还原数据文件 4
SQL> alter database datafile 4 online;
3、系统表空间dbf文件丢失
系统表空间文件丢失时,无法启动数据库,不能够到open状态,所以跳过SQL> alter database open; 命令直接恢复数据块最后再执行SQL> alter database open;
SQL> alter database datafile 4 offline;
Database altered.
Database altered.
RMAN> restore datafile 4; #恢复数据文件4
RMAN> recover datafile 4; #还原数据文件 4
SQL> alter database datafile 4 online;
Database altered.
SQL> alter database open; #open在最后执行
4、控制文件丢失,数据文件丢失
控制文件丢失后,数据库只能启动到nomount状态
启动数据库到nomount状态
SQL> startup nomount;
SQL> alter database mount;
alter database mount
*
ERROR at line 1:
ORA-00205: error in identifying control file, check alert log for more info
在rman中恢复控制文件
[oracle@oracledb ~]$ rman target/
Recovery Manager: Release 11.2.0.1.0 - Production on Thu Jun 15 15:01:13 2017
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
connected to target database: ORCL (not mounted)
RMAN> restore controlfile from '/home/oracle/oradata/backup/control/ctl_ORCL_06_15_c-1452257309-20170615-05'; #恢复控制文件
Starting restore at 15-JUN-17
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=20 device type=DISK
channel ORA_DISK_1: restoring control file
channel ORA_DISK_1: restore complete, elapsed time: 00:00:16
output file name=/usr/oracle/app/oradata/orcl/control01.ctl
output file name=/usr/oracle/app/flash_recovery_area/orcl/control02.ctl
Finished restore at 15-JUN-17
启动数据库到mount状态下
SQL> alter database mount;
恢复数据文件
RMAN> restore database;
RMAN> recover database;
SQL> alter database open resetlogs; #控制文件丢失后需要执行重设日志文件
再进行一次全备份!!!
四、 日志管理
4.1错误日志查询
1 通过命令查看错误日志目录:show parameter background_dump_dest
/usr/oracle/app/diag/rdbms/orcl/orcl/trace
col * format a20 设置每一列的宽度为20个字符; *也可以用具体的列名来代替
五、 常见错误
5.1 sysaux 表空间SM/AWR占用过大
1、首先查看sysaux中各个项目占的比重。
SM/AWR占据了23GB的空间。
SELECT occupant_name"Item",
round(space_usage_kbytes/1024/1024,3)"Space Used (GB)",
schema_name "Schema",
move_procedure "MoveProcedure"
FROM v$sysaux_occupants
ORDER BY 2 Desc;
2、查看快照,快照是存储到sysaux表空间的
select snap_id, begin_interval_time from sys.dba_hist_snapshot order by snap_id;
select min(snap_id),max(snap_id) from dba_hist_snapshot;
3、删除快照信息
exec dbms_workload_repository.drop_snapshot_range(49303,49323 );
4、查看快照保存时间和间隔
SELECT * FROM DBA_HIST_WR_CONTROL;
5、修改快照保存时间和间隔
修改为每隔1小时搜集一次,保存时间为7*24*60分钟)
EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(INTERVAL=>60, RETENTION=>7*24*60);6、回收空间
由于存在高水位线,dbms_workload_repository.drop_snapshot_range 操作实际上是执行delete操作,所在删除完毕快照后,空间没有被回收。回收表空间,降低HWM(high water mark)。
1、查看sysaux表和索引的前10占用情况,后缀为PK的表示索引表
SELECT *
FROM (SELECT SEGMENT_NAME, SUM(BYTES) / 1024 / 1024 MB
FROM DBA_SEGMENTS
WHERE TABLESPACE_NAME = 'SYSAUX'
GROUP BY SEGMENT_NAME
ORDER BY 2 DESC)
WHERE ROWNUM < 10;
可以看到目前表空间还是很大的。
2、选择shrink逐一释放表空间 ,move也可以释放表空间,但是要重建索引。可以在线操作
#开启行转移,在释放空间的时候将行向表的前面移动,以便释放空间
alter table WRH$_SEG_STAT enable row movement;
#shrink用于释放空间,cascade表示将表的索引的空间一起释放,以后缀PK结尾的表示索引,释放的时候去掉PK即可。
ALTER TABLE test SHRINK SPACE compact
alter table WRH$_SEG_STAT shrink space cascade;
#关闭行转移
alter table WRH$_SEG_STAT disable row movement;
3、或者选择move释放空间,需要停机操作,因为此时是锁表的,不能够进行DML操作
alter table ** move partition **;
#如果是分区表的话,需要先查看分区,按照分区操作
select segment_name,partition_name,bytes/1024/1024/1024 gb from dba_segments where segment_name='WRH$_ACTIVE_SESSION_HISTORY';
#重建索引
alter index **_PK partion ** rebuild
此时再去查看总利用率,发现SM/AWR已经降低到5G了。
7、注意事项
由于快照删除实际上是对表进行delete操作,因此会产生大量的归档,如果磁盘空间不足,将会导致问题。