-
日志文件的管理
-
联机日志文件的工作状态:
select * from v$log;
联机日志文件的物理存储信息
select * from v$logfile;
手工切换日志:
alter system switch logfile;
日志切换频率:
select to_char(first_time,'yyyy-mm-dd hh24') first_time,count(*)
from v$log_history
group by to_char(first_time,'yyyy-mm-dd hh24');
增加日志组(可以加快日志切换效率):为什么?
alter database add logfile group 3
'/u01/app/oracle/oradata/demo/redo03.log' size 50m;
增加成员(提高联机日志的安全性):
alter database add logfile member
'/u01/app/oracle/oradata/demo/redo01a.log' to group 1,
'/u01/app/oracle/oradata/demo/redo02a.log' to group 2,
'/u01/app/oracle/oradata/demo/redo03a.log' to group 3;
清空日志组( 可以解决INACTIVE组的成员丢失):
alter database clear logfile group 2;
ACTIVE组成员丢失的解决:
要将ACTIVE状态转变为INACTIVE状态!!要使数据写盘!!
alter system checkpoint; --触发完全检查点
CURRENT组成员丢失的解决:
使用基于cancel的不完全恢复(目的是为了使用 resetlogs选项):
recover database using backup controlfile until cancel;
cancel
Media recovery cancelled.
alter database open resetlogs;
日志文件的移动和改名:
1.正常停库
shutdown immediate
2.启动到mount
startup mount
3.使用主机命令移动文件
! mv /u01/app/oracle/oradata/demo/redo01a.log /home/oracle/redo01a.log
4.修改控制文件的指针
alter database rename file '/u01/app/oracle/oradata/demo/redo01a.log' to '/home/oracle/redo01a.log';
5.打开数据库
alter database open;
删除日志成员:
alter database drop logfile member '';
当前组的成员不能删除
每组中的最后一个成员不能删除
删除组:
alter database drop logfile group 4;
当前组不能删除
活动组不能删除
只剩两组,任何一组都不能删除
归档模式:
查看数据库的归档状态:
archive log list
或者:
select log_mode from v$database;
将数据库修改为归档模式:
1. 正常停库
shutdown immediate
2.启动到mount
startup mount
3.转换为归档
alter database archivelog;
4.打开数据库
alter database open;
将数据库修改为非归档模式:
1.正常停库
shutdown immediate
2.启动到mount
startup mount
3.转换为非归档
alter database noarchivelog;
4.打开数据库
alter database open;
修改存档终点:
log_archive_dest_n (n=1~10)
mkdir /u01/app/oracle/arclog
alter system set log_archive_dest_1='location=/u01/app/oracle/arclog';
归档模式下如果联机日志不能归档对数据库有什么影响?
mkdir /arc
chmod 777 /arc
alter system set log_archive_dest_1='location=/arc';
备用归档路径:
alter system set LOG_ARCHIVE_DEST_1='location=/arclog_huayd/ MANDATORY alternate=log_archive_dest_2 noreopen';
alter system set LOG_ARCHIVE_DEST_2='location=/arclog2/ optional';
alter system set LOG_ARCHIVE_DEST_STATE_1='enable';
alter system set LOG_ARCHIVE_DEST_STATE_2='alternate';
OPTIONAL:该选项是默认选项.使用该选项时,无论归档是否成功,都可以覆盖重做日志.
MANDATORY:强制归档.使用该选项时,只有在归档成功之后,重做日志才能被覆盖.
查看归档终点是否有效:
select dest_name,destination,status,error
from v$archive_dest
where dest_id in (1,2);
日志挖掘:
挖掘dml语句需要将数据库置为追加日志数据模式:
alter database add SUPPLEMENTAL LOG data;
做交易!挖掘!
conn / as sysdba
生成挖掘队列:
exec dbms_logmnr.add_logfile('/home/oracle/redo01a.log',dbms_logmnr.new);
exec dbms_logmnr.add_logfile('/home/oracle/redo02a.log',dbms_logmnr.addfile);
exec dbms_logmnr.add_logfile('/home/oracle/redo03a.log',dbms_logmnr.addfile);
开始挖掘:
exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);
查看挖掘结果:
select sql_redo
from v$logmnr_contents
where lower(sql_redo) like '%update%'
and seg_name='EMP'
and seg_owner='SCOTT';
select sql_undo
from v$logmnr_contents
where lower(sql_redo) like '%update%'
and seg_name='EMP'
and seg_owner='SCOTT';
-
练习
-
日志文件中存放的是什么内容?有什么用?
联机日志怎样工作?
怎样查看联机日志的工作状态?
怎样查看联机日志的物理信息?
联机日志何时会发生切换?
怎样手工切换日志?
active状态有何含义?
如何是active状态转变为inactive状态?
如何保证联机日志文件的安全性?
如何修改联机日志文件的大小?
如何移动联机日志文件?
如何修改联机日志文件的名称?
删除组和成员都有什么限制?
清空日志命令有什么作用?
如何做归档模式的转换?有什么注意事项?
如何修改存档终点?
如何挖掘日志中的内容?挖掘dml有什么前提条件?
-
表空间和数据文件的管理
-
select tablespace_name,contents from dba_tablespaces order by 2;
永久表空间的管理
创建小文件表空间(1023个文件,每个文件管理4M个oracle块)
create tablespace users datafile '/home/oracle/users01.dbf' size 5m;
create tablespace data01 datafile ' /dev/raw/raw1' size 4095m;
查看表空间信息:
select tablespace_name,file_name,bytes/1048576 mb
from dba_data_files;
修改表空间状态:
select tablespace_name,status from dba_tablespaces;
只读状态:只能查询,不能修改,但是 可以删除对象!
alter tablespace users read only;
alter tablespace users read write;
离线状态:可以删除对象
alter tablespace users offline;
alter tablespace users online;
表空间改名:
alter tablespace xxx rename to yyy;
不能offline的表空间:
system
default temporary
包含活动事务的undo
创建大文件表空间(只能包含1个文件,文件管理4G个oracle块)
select tablespace_name,bigfile from dba_tablespaces;
create bigfile tablespace test_big datafile '/home/oracle/bigfile01.dbf' size 5m;
数据文件的移动和改名:
1.使用 alter tablespace命令
a.表空间要offline
alter tablespace test_big offline;
b.目标文件要存在
! mv /home/oracle/bigfile01.dbf /u01/app/oracle/oradata/demo/bigfile01.dbf
alter tablespace test_big rename datafile '/home/oracle/bigfile01.dbf' to '/u01/app/oracle/oradata/demo/bigfile01.dbf';
alter tablespace test_big online;
2.使用alter database命令
a.数据库要mount
shutdown immediate
startup mount
b.目标文件要存在
! mv /home/oracle/bigfile01.dbf /u01/app/oracle/oradata/demo/bigfile01.dbf
alter database rename file '/home/oracle/bigfile01.dbf' to '/u01/app/oracle/oradata/demo/bigfile01.dbf';
alter database open;
表空间扩容:
select
a.tablespace_name,
a.curr_mb,
round((b.free_mb/a.curr_mb)*100,3)||'%' free_pct,
a.max_mb
from
( select tablespace_name,sum(bytes)/1048576 curr_mb,
sum(maxbytes)/1048576 max_mb
from dba_data_files group by tablespace_name) a,
( select tablespace_name,sum(BYTES)/1048576 free_mb
from dba_free_space group by tablespace_name) b
where a.tablespace_name=b.tablespace_name;
1.使用文件的自动增长属性:
alter database datafile '/u01/beijing/undotbs01.dbf' autoextend on next 10m maxsize 4g;
alter database datafile '/u01/beijing/undotbs01.dbf' autoextend off;
2.增加新文件
alter tablespace users add datafile '/u01/beijing/users02.dbf' size 5m;
oracle 10g,第一个文件和有数据的文件不能删除,
alter tablespace users drop datafile '/u01/beijing/users02.dbf';
3.修改现有文件的大小
alter database datafile '/u01/beijing/users02.dbf' resize 15m;
alter database datafile '/u01/beijing/users02.dbf' resize 10m;
临时表空间的管理:
存放排序的中间结果
存放临时表数据
alter system set pga_aggregate_target=10m;
select USERNAME,TABLESPACE,BLOCKS from v$sort_usage;
select * from database_properties
where rownum<4;
create user u1 identified by u1
default tablespace users --10g
temporary tablespace temp --9i
quota 10m on users
password expire;
create temporary tablespace temp02
tempfile '/u01/app/oracle/oradata/test/temp02.dbf'
size 10m;
select TEMPORARY_TABLESPACE
from dba_users where username='SCOTT';
修改数据库默认排序表空间
alter database default temporary tablespace temp;
修改用户默认排序表空间
ALTER USER SCOTT TEMPORARY TABLESPACE TEMP02;
oracle 10g 临时表空间组:
select * from DBA_TABLESPACE_GROUPS;
将临时表空间加入组
alter tablespace temp tablespace group tempgroup;
将临时表空间移出表空间组
alter tablespace temp02 tablespace group '';
删除临时表空间的文件:
alter database tempfile
'/u01/app/oracle/oradata/test/temp02.dbf' drop;
alter tablespace temp02 add tempfile '/home/oracle/temp02.dbf' size 20m;
回退表空间的管理:
创建undo表空间
create undo tablespace undo02 datafile
'/u01/app/oracle/oradata/test/undo02.dbf' size 4m;
回退表空间的作用:undo tablespace --> rollback segment --> 数据修改前的老镜像
1.为事务提供回退数据( rollback)
2.为事务提供恢复
3.提供读一致性
自动管理:只能使用一个undo表空间
相关参数
show parameter undo
undo_management = AUTO
undo_tablespace = UNDOTBS1
undo tablespace --> rollback segment
回滚段:
系统回滚段(系统创建)
为系统表空间的对象提供回退
非系统回滚段(用户创建)
为用户表空间的对象提供回退
延迟回滚段(系统创建)
表空间非正常离线时自动创建
select segment_name,tablespace_name,status
from dba_rollback_segs;
要保证UNDOTBS1表空间有足够的空间可用!
切换回滚表空间:
alter system set undo_tablespace = undo02;
跟踪回滚段使用情况:
select SES_ADDR,USED_UBLK from v$transaction;
select sid,serial#,username,machine
from v$session where saddr=SES_ADDR;
(v$transaction.SES_ADDR=v$session.saddr)
手工管理:
相关参数
show parameter undo_management
alter system set undo_management= manual scope=spfile;
show parameter rollback
transactions_per_rollback_segment=5
手工创建回滚段:
create rollback segment rbs1 tablespace undotbs1;
create rollback segment rbs2 tablespace undotbs1;
手工使回滚段online:
alter rollback segment rbs1 online;
使回滚段在数据库启动时自动online:
alter system set rollback_segments=rbs1,rbs2 scope=spfile;
回退保持力(oracle 9i):
事务内的老的镜像块commit后在回滚段还会保留15分钟
undo_retention=900
conn scott/tiger
update scott.emp set sal=100;
commit;
conn system/oracle
exec dbms_flashback.ENABLE_AT_TIME(sysdate-15/1440);
select empno,sal from scott.emp;
exec dbms_flashback.disable;
declare
cursor c is select empno,sal from scott.emp;
r c%rowtype;
begin
dbms_flashback.ENABLE_AT_TIME(sysdate-15/1440);
open c;
dbms_flashback.disable;
loop
fetch c into r;
exit when c%notfound;
update scott.emp set sal=r.sal where empno=r.empno;
end loop;
close c;
commit;
end;
/
-
练习
-
表空间的作用?
数据文件的作用?
按照存储的内容分类,表空间分为几种类型?
怎样创建不同类型的表空间?
表空间有几种状态?如何查看?如何修改?不同状态对数据操作有何影响?
是不是所有的表空间都可以offline ?
大文件表空间有什么特点?
数据文件有几种状态?如何修改?
临时表空间保存何种数据?有什么作用?
undo表空间保存何种数据?有什么作用?
如何查看表空间的空间使用率?
表空间扩容有几种手段?
如何移动数据文件?有几种办法?
-
移动数据库
-
select name from
(select name from v$controlfile
union
select name from v$datafile
union
select name from v$tempfile
union
select member from v$logfile);
将所有的数据库文件都移动到:/u01/beijing
正常停库
shutdown immediate
修改参数
control_files='/u01/beijing/control01.ctl'
移动所有数据文件到/u01/beijing/
cd /u01/app/oracle/oradata/demo
mv *.dbf /u01/beijing/
启动数据库到nomount
startup nomount
创建控制文件的同时修改文件指针
CREATE CONTROLFILE REUSE DATABASE "BEIJING" RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/u01/beijing/redo01.log' SIZE 50M,
GROUP 2 '/u01/beijing/redo02.log' SIZE 50M,
GROUP 3 '/u01/beijing/redo03.log' SIZE 50M
DATAFILE
'/u01/beijing/system01.dbf',
'/u01/beijing/undotbs01.dbf',
'/u01/beijing/sysaux01.dbf',
'/u01/beijing/users01.dbf',
'/u01/beijing/bigfile01.dbf'
CHARACTER SET WE8ISO8859P1
;
打开数据库:
alter database open resetlogs;
添加临时文件:
alter tablespace temp add tempfile '/u01/beijing/temp01.dbf' reuse;
--生成批量修改控制文件指针的脚本
select 'alter database rename file '||chr(39)||name||chr(39)||' to '||chr(39)||'/u01/app/oracle/oradata/bobo/'||substr(name,instr(name,'/',-1,1)+1)||chr(39)||';'
from
(select name from v$datafile
union all
select name from v$tempfile
union all
select member from v$logfile)
/
-
练习
- 将你的数据库的核心文件全部移动到 /oradb/