备份数据库
备份整个数据库
(1) 创建一个备份命令文件,文件名为backup_db.cmd,
存放在/opt/oracle/archive/bin目录下,它将完成对目标数据库的全备份,并备份所有归档日志及删除已备份的归档日志。
backup_db.cmd备份脚本内容:
run {
#backup full database
backup skip inaccessible format '/opt/oracle/archive/bkup_%T_%s_%p.dat' (database);
#backup archive redolog include current
sql 'alter system archive log current';
backup skip inaccessible format '/opt/oracle/archive/bkup_%T_%s_%p.arc' (archivelog all delete input);
}
创建shell文件,文件名为backup_db.sh,存放在/opt/oracle/archive/bin目录下
backup_db.sh的内容如下:
rman target / cmdfile=/opt/oracle/archive/bin/backup_db.cmd 1>>/opt/oracle/archive/log/backup.log 2>&1
执行备份脚本backup_db.sh
检查全备份是否成功:
$Cd /opt/oracle/archive/log
用编辑器打开backup.log,看日志里是否报错;再到/tellinshare/sms/OracleBackup目录下看备份文件是否生成;如果备份成功,则可以进行全库恢复。
修改数据库
1)导出数据
导出该用户所有数据以及对象:
SQL>Exp username@ora11g owner=username file=’/root/chbsmp/dumpfile’
导出该用户的全部数据以及对象,分多个文件存放(这里用到参数文件):
(1)创建参数文件(就是将多个参数写到一个文件中)
file=’/root/chbsmp/dumpfile1’, ’/root/chbsmp/dumpfile2’, ’/root/chbsmp/dumpfile3’
fileSIZE=2000m
owner=test
rows=y
buffer=1024
compress=y
feedback=300
(2)执行命令,带上参数文件
SQL>exp username@ora11g parfile=ePFILE
导出单个表的全部数据:
2)增加字段
Alter table table_name Add
( colname1 coltype1,
Colname2 coltype2
);
3)修改字段
Alter table table_name Modify
( colname1 coltype1,
Colname2 coltype2
);
4)导入数据
导入该用户的全部数据:
SQL>imp username@ora11g file=’/root/chbsmp/dumpfile’
fromuser=username touser=username rows=y ignore=y;
导入单个表的全部数据:
(1)控制文件load.ctl:
Load data
Infile '数据文件名'
Append --往表中追加数据时有此项
Into table 表名
(
字段1 position(*) char(l1),
字段2 position(*) char(l2),
……
字段n position(*) char(ln)
)
(2)执行命令,带上控制文件:
sql> sqlldr scott/tiger control=load.ctl log=ulcase6.log direct=true
导不进去的时候,我们需要查表结构:SQL>desc表名
5)表存放空间整理
alter table Table_Name MOVE
6)创建索引
create index summit.item_quantity on summit.item(quantity-quantity_shipped);
7)重建索引
alter index idx_commoninfo rebuild
alter index idx_commoninfo rebuild online
启动数据库
读取参数文件,获得控制文件位置(nomount)
SQL>STARTUP MOUNT;
==》
读取控制文件,获得数据文件,日志位置(mount)
SQL>STARTUP MOUNT;
==》
读取数据(open)
恢复数据库
1) 将数据库停掉
SQL>shutdown immediate;
2) 将数据库以mount方式启动
SQL>STARTUP MOUNT;
3) 在主节点数据库运行以下恢复数据库语句
$rman target / nocatalog
rman>run{
restore database;
restore archivelog all;
recover database;
sql “alter database open”;
}
以上命令执行成功后,数据库就被成功恢复。
Oracle需要做的优化:
调整SGA大小
调整表空间
调整表结构
重建索引
问题答复:
1、如何判断checkpoint时间是否过长?有什么参数可调整?
Checkpoint时间在Oracle10g之后都会自动调整。
2、Oracle数据库是否存在某些进程占用CPU过高(类似于Informix的oninit)?有哪些参数可调整?
答复:存在某些进程占用CPU过高
查找导致此问题的SQL语句,做调整或者优化(语句本身优化和SQL索引优化):
1) 使用top命令检查系统的运行情况,
load averages: 0.38, 0.38, 0.38 20:33:27
198 processes: 197 sleeping, 1 on cpu
CPU states: 50.0% idle, 1.5% user, 52.5% kernel, 0.0% iowait, 0.0% swap
Memory: 16G real, 13G free, 12G swap free
PID USERNAME THR PRI NICE SIZE RES STATE TIME CPU COMMAND
9227 oracle 1 59 0 0K 0K sleep 2:11 50.02% oracle
5334 zhoubo 44 49 0 42M 39M sleep 16:23 0.61% wapgw_plat
24744 csp 18 59 0 37M 32M sleep 14:41 0.36% wapgw_wap
26350 zhoubo 21 59 0 41M 38M sleep 11:56 0.29% wapgw_radius
13044 lixiang 17 59 0 34M 31M sleep 44:56 0.27% wapgw_wap
593 oracle 1 29 0 0K 0K sleep 3:08 0.07% tnslsnr
8518 lixiang 31 59 0 270M 176M sleep 6:17 0.05% wapgw_http
23891 csp 28 59 0 265M 174M sleep 1:45 0.04% wapgw_http
20820 oracle 1 59 0 2512K 1928K cpu0 0:00 0.04% top
15047 zhoubo 20 59 0 190M 130M sleep 0:23 0.03% wapgw_http
9217 oracle 1 59 0 0K 0K sleep 2:11 0.02% oracle
9225 oracle 1 59 0 0K 0K sleep 2:13 0.02% oracle
9229 oracle 1 59 0 0K 0K sleep 2:13 0.02% oracle
9215 oracle 1 59 0 0K 0K sleep 2:12 0.02% oracle
9221 oracle 1 59 0 0K 0K sleep 2:05 0.02% oracle
2)通过如下getsql.sql脚本获得相关SQL语句
select sql_text from v$sqltext a
where (a.hash_value,a.address) in (
select decode(sql_hash_value,0,prev_hash_value,sql_hash_value),
decode(sql_hash_value,0,prev_sql_addr,sql_address)
from v$session b
where b.paddr=(select addr from v$process c where c.pid = '&pid'))
order by piece ASC
/
PID->SESSION->SQL(这里与informix是相同的)
蓝色确定了process与session的关系,并找到session
黑色确定了session与sql的关系,并找到sql
执行此脚本首先输入一个PID(Process ID)就是使用top或者ps看到的PID.通过PID和v$process.spid相关联,可以获得Process的相关信息,进而通过v$process.addr和v$session.paddr相关联,就可以获得session的相关的所有信息.再结合v$sqltext,就可以获得当前session正在执行的SQL语句.通过v$process视图,我们就可以把操作系统与数据库相关联起来
3)获取Sql的执行计划,看看是否用到索引
explain plan for select * from t_mytable where f1 = :1;
@?/rdbms/admin/utlxpls;
V$SQL_PLAN存储了实际执行计划
3、如何判断索引是否失效?恢复索引的步骤?
1)使用SQL获取执行计划,看看是否用到索引
explain plan for select * from t_mytable where f1 = :1;
@?/rdbms/admin/utlxpls;
在此总结一下Oracle数据库查询时索引没起作用的几点原因:
在Instance级别所用的是all_rows的方式;
表的统计信息没有更新(最可能的原因);
表很小,Oracle的优化器认为不值得走索引。
解决方法:
可以修改init.ora中的OPTIMIZER_MODE这个参数,把它改为Rule或Choose,重起数据库。也可以使用Hint(提示);
使用analyze table table_name delete statistics语句删除统计信息或及时更新统计信息;
表小不走索引是正确的。
2) 确定表的大小(Select Count (*) from表名)
如果表大,可能是长时间没有统计更新
可以drop索引,再重建此索引。
Hint(提示):
Oracle Hint是一种让DBA自行指定优化器的行为的方法,当优化器的优化结果不能满足我们的要求时我们可以通过Hint的方法人为地指定查询计划。理论上一个优秀的优化器是不用人去干预它的行为,但"智者千里必有一失",有时优化器也不是万能的,也需要人的智慧去补充其行为,Hint就是这个最后的银弹。
4、如何判断表的性能?以及表性能的恢复步骤?
1)使用SQL获取执行计划,看看是否用到索引
explain plan for select * from t_mytable where f1 = :1;
@?/rdbms/admin/utlxpls;
2)查看表定义语句是否合理
每个表创建时oracle都会自动为此表分配一个数据段,通过设置合理的PCTfree(空闲百分比)和PCTused参数控制表的可用空间
PctFree控制插入,PCTused控制更新。PCTused启作用是在达到PctFree之后
表性能的恢复步骤
高优
重建索引
重写SQL语句
重建表
5、如何判断数据库的IO性能?
数据库IO性能如果存在,应该表现在CPU占用高和磁盘IO高上面。
CPU占用高,我们根据问题2可以找出问题。
数据库空间所在的磁盘IO高,我们也是找SQL语句。
表的高水平位(High water mark)是表曾经最大的占用空间位的标记位。在表做全表扫描时会读到高水平位的位置(哪怕表中没有数据)。所以要消除高水平位让表扫描的速度更快。
SQL>truncate table Table_Name
6、如何判断内存性能?(是否存在内存泄露)
回到操作系统层次。
IBM svmon –P进程PID
7、数据库的锁性能有什么参数可调整?
???