扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
两种方法:
创新互联专注于网站建设,为客户提供成都网站设计、做网站、网页设计开发服务,多年建网站服务经验,各类网站都可以开发,品牌网站制作,公司官网,公司展示网站,网站设计,建网站费用,建网站多少钱,价格优惠,收费合理。
1、插入之前,把档案盒这个表格生成datatable,然后就可以用C#对datatable里面的ARCHIVES_ID,FILE_ID值进行调整,生成最终的datatable之后用SqlBulkCopy批量处理插入oracle
2、在oracle里面写存储过程,对每一行插入的数据的ARCHIVES_ID,FILE_ID进行处理,得到你想要的值
首先不知道你的数据库在什么系统下:
window:
找到数据文件存放的位置,比如D:\存放的是oracle的数据文件,如果表空间采用的是自动管理方式,考虑将一些数据文件移到其他盘符下,比如:e:\等
linux/unix
du -sk * 查看oracle数据库相关文件夹下每个文件的空间使用情况,删除垃圾文件
如果没有垃圾文件,尝试整理表空间,可以释放一些空间,只是暂时解决文件
增加裸设备
如果使用asm的方式管理的,考虑将asm里增加pv。
以上,希望能帮助你!
归档日志(ArchiveLog)是非活动的重做日志备份.通过使用归档日志,可以保留所有重做历史记录,当数据库处于ARCHIVELOG模式并进行日志切换式,后台进程ARCH会将重做日志的内容保存到归档日志中.当数据库出现介质失败时,使用数据文件备份,归档日志和重做日志可以完全恢复数据库.
日志操作模式:ARCHIVELOGNOARCHIVELOG
1,改变日志操作模式:
检查当前日志操作模式
SELECTlog_modefromv$database;
关闭数据库,然后装载数据库
SHUTDOWNIMMEDIATE
STARTUPMOUNT
改变日志操作模式,然后打开数据库
ALTERDATABASEARCHIVELOG;
ALTERDATABASEOPEN;
2,执行手工归档
从oracledatabase10g开始,当将日志操作模式转变未ARCHIVELOG模式时,oracle会自动启动ARCH进程.如果要使用手工归档.那么在改变日志操作模式时必须使用命令ALTERDATABASEARCHIVELOGMANUAL.
需要注意,使用手工归档方式,数据库管理员必须手工执行归档命令.如果没有执行手工归档命令,日志组的原有内容将不能被覆盖.ALTERDATABASEARCHIVELOGMANUAL命令是为了与先前的版本兼容而保留的,.将来的oracle版本会淘汰该命令,使用手工归档方式是,数据库管理员可以执行以下命令归档重做日志:
SLTERSYSTEMARCHIVELOGALL;
3,配置归档进程
初始化参数LOG_ARCHIVE_MAX_PROCESSES用于指定例程初始启动的最大归档进程个数,当将数据库转变为ARCHIVELOG模式时,默认情况下oracle会自动启动两个归档进程.通过改变初始化参数LOG_ARCHIVE_MAX_PROCESS的值,可以动态地增加或降低归档进程的个数:
ALTERSYSTEMSETLOG_ARCHIVE_MAX_PROCESSES=3;
配置归档位置和文件格式
当数据库处于ARCHIVELOG模式时,如果进行日志切换,后台进程将自动生成归档日志,归档日志的默认位置为%oracle_home%rdbms,在oracledatabase10g中,归档日志的默认文件格式为ARC%S_%R.%T.为了改变归档日志的位置和名称格式,必须改变相应的初始化参数,
1,初始化参数LOG_ARCHIVE_FORMAT用于指定归档日志的文件名格式,设置该初始化参数时,可以指定以下匹配符:
%s:日志序列号:
%S:日志序列号(带有前导0)
%t:重做线程编号.
%T:重做线程编号(带有前导0)
%a:活动ID号
%d:数据库ID号
%rRESETLOGS的ID值.
从10g开始,配置归档日志文件格式时,必须带有%s,%t和%r匹配符,配置了归档文件格式后,必须重启数据库.
2,使用LOG_ARCHIVE_DEST配置归档位置
如果不使用备用数据库,只需要将归档日志存放到本地目录.配置本地归档位置可以使用初始化参数LOG_ARCHIVE_DEST和LOG_ARCHIVE_DUPLEX_DEST,其中,第一个参数用于设置第一个归档位置,第二个参数用于指定第二个归档位置.
ALTERSYSTEMSETlog_archive_dest=’d:demoarchive1’;
ALTERSYSTEMSETlog_archive_duplex_dest=’d:demoarchive2’;
3,使用LOG_ARCHIVE_DEST_n配置多个归档位置.
初始化参数LOG_ARCHIVE_DEST_n用于指定多个归档位置,该参数最多可以指定10个归档位置.通过使用初始化参数LOG_ARCHIVE_DEST_n,不仅可以配置本地归档位置,还可以配置远程归档位置.
如果既要在主节点上生成归档日志,又要将归档日志传递到备用节点,那么必须使用参数LOG_ARCHIVE_DEST_n.该参数与LOG_ARCHIVE_DEST具有如下区别;
初始化参数LOG_ARCHIVE_DEST_n可以配置本地归档位置和远程归档位置,而初始化参数LOG_ARCHIVE_DEST和LOG_ARCHIVE_DUPLEX_DEST只能配置本地归档位置.
初始化参数LOG_ARCHIVE_DEST_n可以配置多达10个归档位置,而初始化参数LOG_ARCHIVE_DEST和LOG_ARCHIVE_DUPLEX_DEST最多只能配置两个归档位置.
初始化参数LOG_ARCHIVE_DEST_n不能与初始化参数LOG_ARCHIVE_DEST和LOG_ARCHIVE_DUPLEX_DEST同时使用.
因为初始化参数LOG_ARCHIVE_DEST_n不能与初始化参数LOG_ARCHIVE_DEST和LOG_ARCHIVE_DUPLEX_DEST同时使用,所以必须禁用初始化参数LOG_ARCHVE_DEST和LOG_ARCHIVE_DUPLEX_DEST.当使用初始化参数LOG_ARCHIVE_DEST_n配置本地归档位置时,需要指定LOCALTION选项.当配置远程归档位置时,需要指定SERVICE选项.
示例如下:
ALTERSYSTEMSETlog_archive_duplex_dest=’’;
ALTERSYSTEMSETlog_archive_dest=’’;
ALTERSYSTEMSETlog_archive_dest_1=’location=d:demoarchive1’;
ALTERSYSTEMSETlog_archive_dest_2=’location=d:demoarchive2’;
ALTERSYSTEMSETlog_archive_dest_3=’location=d:demoarchive3’;
ALTERSYSTEMSETlog_archive_dest_4=’service=standby’;
配置远程归档位置时,SERVICE选项需要指定远程数据库的网络服务名(在tnsnames.ora文件中配置)
4,使用LOG_ARCHIVE_DEST_n选项
使用初始化参数LOG_ARCHIVE_DEST_n配置归档位置时,可以在归档位置上指定OPTIONAL或MANDATORY选项.指定MANDATORY选项时,可以设置REOPEN属性.
OPTIONAL:该选项是默认选项.使用该选项时,无论归档是否成功,都可以覆盖重做日志.
MANDATORY:强制归档.使用该选项时,只有在归档成功之后,重做日志才能被覆盖.
REOPEN:该属性用于指定重新归档的时间间隔,默认值为300秒,必须跟在MANDATORY后.
例:
Altersystemsetlog_archive_dest_1=’location=d:demoarchive1mandatory’;
Altersystemsetlog_archive_dest_2=’location=d:demoarchive2mandatoryreopen=500’;
Altersystemsetlog_archive_dest_3=’location=d:demoarchive3optional’;
5,控制本地归档成功的最小个数.
使用初始化参数LOG_ARCHIVE_MIN_SUCCEED_DEST控制本地归档的最小成功个数
Altersystemsetlog_archive_min_succeed_dest=2;
6,使用初始化参数LOG_ARCHIVE_DEST_STATE_n控制归档位置的可用性.设置该参数为ENABLE(默认值),表示会激活相应的归档位置;设置该参数为DEFER,表示禁用相应归档位置.当归档日志所在磁盘损坏或填满时,DBA需要暂时禁用该归档位置.
Altersystemsetlog_archive_dest_state_3=defer;(禁用)
Altersystemsetlog_archive_dest_state_3=enable;(启用)
显示归档日志信息
1,使用ARCHIVELOGLIST命令可以显示日志操作模式,归档位置,自动归档机器要归档的日志序列号等信息.
2显示日志操作模式
SELECTname,log_modeFROMv$database;
3,显示归档日志信息.
Colnameformata40
Selectname,swquence#,first_change#FROMv$archived_log;
Name用于表示归档日志文件名,sequence#用于表示归档日志对应的日志序列号,firs_change#用于标识归档日志的起始SCN值.
4执行介质恢复时,需要使用归档日志文件,此四必须准确定位归档日志的存放位置.通过查询动态性能视图v$archive_dest可以取得归档日志所在目录.
SELECTdestinationFROMv$archivedest;
5,显示日志历史信息
SELECT*FROMv$loghist;
THREAD#用于标识重做线程号,SEQUNCE#用于标识日志序列号,FIRST_CHANGE#用于标识日志序列号对应的起始SCN值,FIRST_TIME用于标识起始SCN的发生时间.SWICTH_CHANGE#用于标识日志切换的SCN值.
6.显示归档进程信息.
进行日志切换时,ARCH进程会自动将重做日志内容复制到归档日志中,为了加快归档速度,应该启用多个ARCH进程.通过查询动态性能视图V$ARCHIVE_PROCESSES可以显示所有归档进程的信息!
SELECT*FROMv$archive_processes;
Porcess用于标识ARCH进程的编号,status用于标识ARCH进程的状态(ACTIVE:活动,STOPPED:未启动),log_sequence用于标识正在进行归档的日志序列号,state用于标识ARCH进程的工作状态
online redo log file:
查看redo日志组:
select * from v$log;
查看redo日志文件:
select * from v$logfile;
/app/oracle/oradata/orcl/redo01.log
/app/oracle/oradata/orcl/redo02.log
/app/oracle/oradata/orcl/redo03.log
修改:
shutdown immediate
startup mount
mv /app/oracle/oradata/orcl/redo01.log /home/oradata/orcl/redo01.log
mv /app/oracle/oradata/orcl/redo02.log /home/oradata/orcl/redo02.log
mv /app/oracle/oradata/orcl/redo03.log /home/oradata/orcl/redo03.log
alter database rename file '/app/oracle/oradata/orcl/redo01.log' to '/home/oradata/orcl/redo01.log';
alter database rename file '/app/oracle/oradata/orcl/redo02.log' to '/home/oradata/orcl/redo02.log';
alter database rename file '/app/oracle/oradata/orcl/redo03.log' to '/home/oradata/orcl/redo03.log';
alter database open;
验证redo日志文件:
select * from v$logfile;
====================================
data file:
查看
select file_name from dba_data_files;
select file_name from dba_temp_files;
修改:
shutdown immediate
startup mount
mv /app/oracle/oradata/orcl/users01.dbf
mv /app/oracle/oradata/orcl/undotbs01.dbf
mv /app/oracle/oradata/orcl/sysaux01.dbf
mv /app/oracle/oradata/orcl/system01.dbf
mv /app/oracle/oradata/orcl/temp01.dbf
alter database rename file '/app/oracle/oradata/orcl/users01.dbf' to '/home/oradata/orcl/users01.dbf' ;
alter database rename file '/app/oracle/oradata/orcl/undotbs01.dbf' to '/home/oradata/orcl/undotbs01.dbf' ;
alter database rename file '/app/oracle/oradata/orcl/sysaux01.dbf'
alter database rename file '/app/oracle/oradata/orcl/system01.dbf'
alter database rename file '/app/oracle/oradata/orcl/temp01.dbf'
alter database open;
验证:
select file_name from dba_data_files;
select file_name from dba_temp_files;
===========================
control file:
查看:
show parameter control_files
shutdown immediate
create pfile from spfile;
修改initorcl.ora里面的control_files='/home/oradata/control01.ctl'
mv /app/oracle/oradata/orcl/control01.ctl /home/oradata/control01.ctl
rm -f /app/oracle/fast_recovery_area/orcl/control02.ctl
create spfile from pfile;
alter database mount;
alter database open;
验证:
show parameter control_files
一. 碎片是如何产生的
当创建一个数据库实例时,会分成称为表空间(tablespace)的多个逻辑段(segment),如系统(system)表空间,临时(temporary)表空间等。一个表空间可以包含多个数据范围(extent)和一个或多个自由范围块,即自由空间(free space)。
表空间、段、范围、自由空间的逻辑关系如下:
当表空间中生成一个段时,将从表空间有效自由空间中为这个段的初始范围分配空间。在这些初始范围充满数据时,段会请求增加另一个范围。这样的扩展过程会一直继续下去,直到达到最大的范围值,或者在表空间中已经没有自由空间用于下一个范围。
最理想的状态就是一个段的数据可被存在单一的一个范围中。这样,所有的数据存储时靠近段内其它数据,并且寻找数据可少用一些指针。但是一个段包含多个范围的情况是大量存在的,没有任何措施可以保证这些范围是相邻存储的。 当要满足一个空间要求时,数据库不再合并相邻的自由范围(除非别无选择), 而是寻找表空间中最大的自由范围来使用。这样将逐渐形成越来越多的离散的、分隔的、较小的自由空间,即碎片。
表空间(tableSpace) 段(segment) 盘区(extent) 块(block) 关系
二. 碎片对系统的影响
2.1 导致系统性能减弱
如上所述,当要满足一个空间要求时,数据库将首先查找当前最大的自由范围,而"最大"自由范围逐渐变小,要找到一个足够大的自由范围已变得越来越困难,从而导致表空间中的速度障碍,使数据库的空间分配愈发远离理想状态;
2.2 浪费大量的表空间
部分extent无法得以自动合并,浪费了大量的表空间。
三. 自由范围的碎片计算
由于自由空间碎片是由几部分组成,如范围数量、最大范围尺寸等,我们可用FSFI(free space fragmentation index:自由空间碎片索引)值来直观体现:
FSFI=100*sqrt(max(extent)/sum(extents))*1/sqrt(sqrt(count(extents)))
可以看出,FSFI的最大可能值为100(一个理想的单文件表空间)。随着范围的增加,FSFI值缓慢下降,而随着最大范围尺寸的减少,FSFI值会迅速下降。
可以使用如下SQL可以用来计算FSFI值:
/* Formatted on 2011/01/27 14:12:43 (QP5 v5.115.810.9015) */
SELECT tablespace_name,
SQRT (MAX (blocks) / SUM (blocks))
* (100 / SQRT (SQRT (COUNT (blocks))))
FSFI
FROM dba_free_space
GROUP BY tablespace_name
ORDER BY 1;
比如,在某数据库运行上面SQL,得到以下FSFI值:
TABLESPACE_NAME FSFI
------------------------------ ----------
QS_OA 54.3794714
RBS 59.4603558
SYSAUX 84.0138802
SYSTEM 70.5946502
UNDOTBS1 20.0110492
USERS 100
XEZF 6.52482383 --碎片较多
XEZF_INDEX 32.1055286
8 rows selected.
四. 碎片整理
4.1 盘区(extent)的碎片整理
使用命令: alter tablespace temp coalesce;
/* Formatted on 2011/01/27 14:23:46 (QP5 v5.115.810.9015) */
SELECT 'alter tablespace ' || TABLESPACE_NAME || ' coalesce ;'
FROM DBA_FREE_SPACE_COALESCED
WHERE PERCENT_EXTENTS_COALESCED 100 OR PERCENT_BLOCKS_COALESCED 100;
4.2 段(segment)的碎片整理
段由extent组成。在有些情况下,有必要对段的碎片进行整理。要查看段的有关信息,可查看数据字典dba_segments,segment的信息可查看数据字典dba_extents。
段可以有表段,索引段等。 每种段都可以碎片的整理。
(1)表段碎片整理
如果段的碎片过多, 将其数据压缩到一个范围的最简单方法便是用正确的存储参数将这个段重建,然后将旧表中的数据插入到新表,同时删除旧表。这个过程可以用import/export工具来完成。
export命令有一个(压缩)标志,这个标志在读表时会引发export确定该表所分配的物理空间量,它会向输出转储文件写入一个新的初始化存储参数--等于全部所分配空间。若这个表关闭, 则使用import命令重新生成。这样,它的数据会放入一个新的、较大的初始段中。例如:
exp user/password file=exp.dmp compress=y
grants=y indexes=y tables=(table1,table2);
导出成功后,在库中删除这两张表,在导入数据:
imp user/password file=exp.dmp commit=y buffer=64000 tables=(table1,table2);
除了用exp/imp,还可以使用shrink table 或者alter table tbname move 来实现。
具体参考:
Oracle 10g Shrink Table 详解
一个小脚本:
--1.整理空间碎片;
tmp_val VARCHAR2 (500);
BEGIN
FOR REC IN (SELECT TABLE_NAME FROM USER_TABLES )
LOOP
tmp_val:='ALTER TABLE '||user.TABLE_NAME ||' MOVE';
BEGIN
EXECUTE IMMEDIATE tmp_val;
DBMS_OUTPUT.put_line (tmp_val);
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.put_line ('Error: ' || tmp_val || '!');
END;
END LOOP;
(2). 索引段碎片整理
把索引重建(碎片整理后,很多索引会变成UNUSABLE状态,必须重建后,让它变成void状态)
FOR REC IN (SELECT INDEX_NAME FROM USER_INDEXES ) --WHERE STATUS='UNUSABLE'
LOOP
tmp_val:='ALTER INDEX '||REC.INDEX_NAME ||' REBUILD';
BEGIN
EXECUTE IMMEDIATE tmp_val;
DBMS_OUTPUT.put_line (tmp_val);
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.put_line ('Error: ' || tmp_val || '!');
END;
END LOOP;
END;
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流