所有由小潘发布的文章

喜欢分享的小潘.

Oracle增加表空间步骤

本文只介绍新增文件的方式(其他方式类似可自行研究):

1、通过命令:show parameter db_block_size,来查询当前数据库单个文件的最大size,如果是8192(8K),最大单个文件为32G,如果是16384(16K),最大单个文件为64G。

2、通过以下命令查询当前系统对应需要增加数据文件的表空间信息。

SELECT Upper(F.TABLESPACE_NAME) “表空间名”,
D.TOT_GROOTTE_MB “表空间大小(M)”,
D.TOT_GROOTTE_MB – F.TOTAL_BYTES “已使用空间(M)”,
To_char(Round((D.TOT_GROOTTE_MB – F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,
2),
‘990.99’) || ‘%’ “使用比”,
F.TOTAL_BYTES “空闲空间(M)”,
F.MAX_BYTES “最大块(M)”
FROM (SELECT TABLESPACE_NAME,
Round(Sum(BYTES) / (1024 * 1024), 2) TOTAL_BYTES,
Round(Max(BYTES) / (1024 * 1024), 2) MAX_BYTES
FROM SYS.DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) F,
(SELECT DD.TABLESPACE_NAME,
Round(Sum(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB
FROM SYS.DBA_DATA_FILES DD
GROUP BY DD.TABLESPACE_NAME) D
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME
ORDER BY 1;

3、通过以下命令查询表空间对应单个文件的信息(主要是保证新增的数据文件跟原有文件保存信息一致,如保证单个文件一致)。

SELECT “File Name”, “Tablespace”, “Status”, “Size (MB)”, “Used (MB)”, “Used (Proportion)”, “Used (%)”, “Auto Extend” FROM(
select * from (
SELECT /*+ all_rows use_concat */
‘SQLDEV:LINK{#;#}’||USER||’#;#DATAFILE#;#’||ddf.file_name||’#;#oracle.dbtools.raptor.dba.navigator.Drill.DBADrillLink’ as “File Name”,
ddf.tablespace_name as “Tablespace”,
ddf.online_status as “Status”,
TO_CHAR(NVL(ddf.bytes / 1024 / 1024, 0), ‘99999990.000’) as “Size (MB)”,
TO_CHAR(DECODE(NVL(u.bytes/1024/1024, 0), 0, NVL((ddf.bytes – NVL(s.bytes, 0))/1024/1024, 0), NVL(u.bytes/1024/1024, 0)), ‘99999999.999’) as “Used (MB)”,
CASE
when ddf.online_status = ‘OFFLINE’ then
‘OFFLINE’
when ddf.online_status = ‘RECOVER’ then
‘RECOVER’
else
‘SQLDEV:GAUGE:0:100:0:0:’|| TRIM(TO_CHAR(DECODE((NVL(u.bytes, 0) / ddf.bytes * 100), 0, NVL((ddf.bytes – NVL(s.bytes, 0)) / ddf.bytes * 100, 0), (NVL(u.bytes, 0) / ddf.bytes * 100)), ‘990’))
end as “Used (Proportion)”,
TO_CHAR(DECODE((NVL(u.bytes, 0) / ddf.bytes * 100), 0, NVL((ddf.bytes – NVL(s.bytes, 0)) / ddf.bytes * 100, 0), (NVL(u.bytes, 0) / ddf.bytes * 100)), ‘990.99’) as “Used (%)”,
ddf.autoextensible as “Auto Extend”
FROM
sys.dba_data_files ddf,
(
SELECT
file_id,
SUM(bytes) bytes
FROM
sys.dba_free_space GROUP BY file_id
) s,
(
SELECT
file_id,
SUM(bytes) bytes
FROM
sys.dba_undo_extents
WHERE
status <> ‘EXPIRED’
GROUP BY file_id
) u
WHERE
(ddf.file_id = s.file_id(+) and ddf.file_id=u.file_id(+))
UNION
SELECT
‘SQLDEV:LINK{#;#}’||USER||’#;#DATAFILE#;#’||v.name||’#;#oracle.dbtools.raptor.dba.navigator.Drill.DBADrillLink’ as “File Name”,
dtf.tablespace_name as “Tablespace”,
dtf.status as “Status”,
TO_CHAR(NVL(dtf.bytes / 1024 / 1024, 0), ‘99999990.000’) as “Size (MB)”,
TO_CHAR(NVL(t.bytes_used/1024/1024, 0), ‘99999990.000’) as “Used (MB)”,
CASE
when dtf.status = ‘OFFLINE’ then
‘OFFLINE’
else
‘SQLDEV:GAUGE:0:100:0:0:’|| TRIM(TO_CHAR(NVL(t.bytes_used / dtf.bytes * 100, 0), ‘990.99’))
end as “Used (Proportion)”,
TO_CHAR(NVL(t.bytes_used / dtf.bytes * 100, 0), ‘990’) as “Used (%)”,
dtf.autoextensible as “Auto Extend”
FROM
sys.dba_temp_files dtf,
sys.v_$tempfile v,
v$temp_extent_pool t
WHERE
(dtf.file_name = v.name or dtf.file_id = v.file#)
and dtf.file_id = t.file_id(+)
ORDER BY 1
) sub1 order by 2 asc
)

4、新增文件命令。

alter tablespace APPS_TS_TX_DATA add datafile ‘/u01/DEV/db/data/a_txn_data07.dbf’ size 10000m;

cpu load过高问题排查(转载)

load average的概念

top命令中load average显示的是最近1分钟、5分钟和15分钟的系统平均负载。

系统平均负载被定义为在特定时间间隔内运行队列中(在CPU上运行或者等待运行多少进程)的平均进程数。如果一个进程满足以下条件则其就会位于运行队列中:

  • 它没有在等待I/O操作的结果
  • 它没有主动进入等待状态(也就是没有调用’wait’)
  • 没有被停止(例如:等待终止)

在Linux中,进程分为三种状态,一种是阻塞的进程blocked process,一种是可运行的进程runnable process,另外就是正在运行的进程running process。

进程可运行状态时,它处在一个运行队列run queue中,与其他可运行进程争夺CPU时间。 系统的load是指正在运行和准备好运行的进程的总数。比如现在系统有2个正在运行的进程,3个可运行进程,那么系统的load就是5。load average就是一定时间内的load数量。

一般来说只要每个CPU的当前活动进程数不大于3那么系统的性能就是良好的,如果每个CPU的任务数大于5,那么就表示这台机器的性能有严重问题。

CPU使用率高并不总是意味着CPU工作繁忙,它有可能是正在等待其他子系统。在进行性能分析时,将所有子系统当做一个整体来看是非常重要的,因为在子系统中可能会出现瀑布效应。衡量CPU 系统负载的指标是load,load 就是对计算机系统能够承担的多少负载的度量,简单的说是进程队列的长度。简单的例子比如食堂有五个窗口,当有小于五个学生来打饭,五个窗口都能及时处理,但是当学生个数超过5个,必然会出现等待的学生。请求大于当前的处理能力,会出现等待,引起load升高。
Load Average 就是一段时间(1min,5min,15min)内平均Load。平均负载的最佳值是1,这意味着每个进程都可以在一个完整的CPU 周期内完成。

cpu load高的排查思路

1. 首先排查哪些进程cpu占用率高。 通过命令 ps ux
2.  查看对应java进程的每个线程的CPU占用率。通过命令:ps -Lp 15047  cu

 

3.  追踪线程内部,查看load过高原因。通过命令:jstack 15047。或者打印线程 jstack pidof java > stack.out查找到对应的threadid, 再反查代码。

一般经验cpu load的飙升,一方面可能和full gc的次数增大有关,一方面可能和死循环有关系

数据库系统load高的一般原因

 

    1 业务并发调用全表扫描/带有order by 排序的SQL语句.
2 SQL语句没有合适索引/执行计划出错/update/delete where扫描全表,阻塞其他访问相同表的sql执行.
3 存在秒杀类似的业务比如聚划算10点开团或者双十一秒杀,瞬时海量访问给数据库带来冲击。
4 数据库做逻辑备份(需要全表扫描)或者多实例的压缩备份(压缩时需要大量的cpu计算,会导致系统服务器load飙高)
5 磁盘写入方式改变 比如有writeback 变为 write through
RAID卡都有写cache(Battery Backed Write Cache),写cache对IO性能的提升非常明显,因为掉电会丢失数据,所以必须由电池提供支持。
电池会定期充放电,一般为90天左右,当发现电量低于某个阀值时,会将写cache策略从writeback置为writethrough,相当于写cache会失效,这时如果系统有大量的IO操作,可能会明显感觉到IO响应速度变慢,cpu 队列堆积系统load 飙高。

判别和处理load高问题

一般根据cpu数量去判断,也就是Load平均要小于CPU的数量,负载的正常值在不同的系统中有着很大的差别。在单核处理器的工作站中,1或2都是可以接受的。多核处理器的服务器(比如24核)上,load 会到达20 ,甚至更高。

a) 数据库层面
1 top -u mysql -c 检查当前占用cpu资源最多的进程命令。-c 是为了显示出进程对应的执行命令语句,方便查看是什么操作导致系统load飙高。
2 根据不同的情况获取pid 或者MySQL的端口号
3 如果是MySQL 数据库服务导致laod 飙高,则可以使用如下命令
show processlist;
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND <> ‘sleep’ AND TIME>100;

orzdba 工具检查逻辑读/thread active的值。用法orzdba –help
orztop 工具检查当前正在执行的慢sql,用法orztop -P $port
4 获取异常的sql之后,剩下的比较好解决了。结合第一部分中的几条原因
a 选择合适的索引
b 调整sql 语句 比如对应order by 分页采用延迟关联
c 业务层面增加缓存,减少对数据库的直接访问等
b) OS 系统层面 检查系统IO

使用iostat 命令查看r/s(读请求),w/s(写请求),avgrq-sz(平均请求大小),await(IO等待), svctm(IO响应时间)

r/s ,w/s是每秒读/写请求的次数。

util是设备的利用率。如果它接近100%,通常说明设备能力趋于饱和(并不绝对,比如设备有写缓存)。有时候可能会出现大于100%的情况,这多半是计算时四舍五入引起的。
svctm是平均每次请求的服务时间。这里有一个公式:(r/s+w/s)*(svctm/1000)=util。举例子:如果util达到100%,那么此时  svctm=1000/(r/s+w/s),假设IOPS是1000,则svctm大概在1毫秒左右,如果长时间大于这个数值,说明系统出了问题。
await是平均每次请求的等待时间。这个时间包括了队列时间和服务时间,也就是说,一般情况下,await大于svctm,它们的差值越小,队列时间越短,反之差值越大,队列时间越长,说明系统出了问题。
avgqu-sz是平均请求队列的长度。毫无疑问,队列长度越短越好。

转自:https://www.cnblogs.com/lddbupt/p/5779655.html

参考资料

http://blog.csdn.net/u011183653/article/details/19489603

http://blog.itpub.net/22664653/viewspace-1262635/

财务会计基础复式记账法

一、账户
账户(acount)是会计记账的基础,它揭示了交易或事项对一项具体资产或权益影响的系统安排。用户对于每项资产、负债、权益、收入及费用应该设立不同的账户。账户有实账户(realacount)与虚账户(nominalacount)之分。

实账户也称永久账户,是指资产、负债、权益账户,这些账户期末都有结余,并体现于资产负债表上。虚账户也称暂时账户,是指收入、费用账户,体现于收益表上。虚账户必须在期末结平,而实账户则无此要求。

为了全面、分类地反映经济业务的发生对会计要素产生的数量上的影响,会计准则规定了账户的结构。由于约定成俗的原因,每一个账户,左方都是借方,右方都是贷方,用来记录数量上的变动。至于到底账户的哪方登记增加数抑或是减少数,取决于账户的性质及经济业务的内容。为与对会计要素的划分相一致,我们也将账户从总体上划分为资产类、负债类、所有者权益类、收入类、费用类来进行解释。

由于会计分期的基本假设,所以在账户中会有本期发生额和余额之分。本期发生额是指在账户中计入借方或贷方的增加数或者减少数,可分为借方发生额和贷方发生额。余额是指在一个特定的期末,将期初余额(若不存在,就不需考虑)、借方发生额、贷方发生额进行比较以后得到的结果,本期的期末余额则是下期的期初余额。但并不是所有的账户都存在余额。回忆前面所提的两个等式:

(1)资产=负债+所有者权益;

(2)收入-费用=利润。

等式(1)反映的是企业在特定时点上的财务状况,也就是一个企业的资产、负债、所有者权益的结存情况(包括数量和金额),是存量,因此它们都存在余额;

等式(2)反映的是企业在一定期间的经营活动,是流量。鉴于此,为了计算经营成果,在期末计算利润时,必须将收入和费用账户予以结平,因此收入、费用账户没有余额。

表表明了各个账户的登记规则。

值得注意的是在会计实务中,对某些账户如应收账款、应付账款、存货、固定资产、短期借款等账户,仅仅有总括的信息是不够的。为了更好地了解情况,就必须对账户进行分级,因此有一级账户(也称总分类账)和二级账户之分。例如,对于“存货”这个一级账户而言,为了更详细地反映其构成,可以设置“原材料”、“在产品”、“产成品”这些二级账户。如果必要,还可以设置三级账户(明细账户),如在“产成品”这个二级账户下再根据本企业所生产的产品种类设置“产品A”、“产品B”等三级账户。

二、复式记账规则
复式记账是会计核算的一种重要的方法。它针对每一笔经济业务在两个或两个以上相互联系的账户中以相等的金额进行记录。借贷记账法属于复式记账法的一种,它把相互联系的账户计入一些特定账户的借方或贷方,记账规则是有借必有贷,借贷必相等。

这个记账规则包含着两个层次的意思:第一,经济业务发生以后,所计入的账户必须至少包含一个借方账户和一个贷方账户。当然,可以是一个借方账户同时对应两个或多个贷方账户,也可以是多个借方账户同时对应一个贷方账户。在经济业务较为复杂时,可能会出现多个借方账户对应多个贷方账户。第二,不管借方、贷方各自涉及多少个账户,借方的合计金额与贷方的合计金额必然相等。

另外值得注意的是,总分类账户和明细分类账户之间是一种统驭与被统驭的关系,但是两者反映的是同一笔经济业务,区别只是在于反映的详尽程度不同,所以两者应该采用平行登记原则。此原则可以概括为:

(1)对于企业发生的每一笔经济业务,一方面需要在总分类账户中进行登记,另一方面要在其所属的明细账户中登记;

(2)在进行总分类账和明细账户的登记时,方向必须相同,同为借记或贷记,而且所涉及的金额必须相等;

(3)总分类账和明细账户对同一笔经济业务的登记应该在同一个会计期间内完成。

三、基本平衡与交易分类
在复式记账中,有借必有贷,借贷必相等。这条规则向我们揭示了会计记录中的基本平衡关系:资产=负债+所有者权益。根据这个基本平衡关系,我们可以将企业发生的形形色色的经济业务概括为以下几类,见表

表各类型的含义如下:

类型一:会计等式两边同时增加,并保持平衡。类型一可以是资产和负债同时增加,例如通过借款获得现金,则资产方现金增加,负债方银行借款也增加;也可是资产和所有者权益同时增加,如某投资者以设备入股,则资产方固定资产增加,所有者权益中的实收资本也增加。

类型二:会计等式两边同时减少,并保持平衡,类型二可以是资产和负债同时减少,也可以是资产和所有者权益同时减少。例如,用现金支付职工的应付工资,则资产方现金减少,同时负债方应付工资也减少。

类型三:会计等式左边即资产内部一增一减,会计等式保持平衡。例如,用现金购买原材料,则在资产方内部,现金减少,而存货增加。

类型四:会计等式右边即负债与所有者权益一增一减、负债内部一增一减以及所有者权益内部项目之间一增一减总共三种情况,但会计等式仍然保持平衡。例如,公司通过银行借款来支付到期的应付票据,则负债内部银行借款增加而应付票据减少。

一个企业存在的前提是经营活动能正常开展,因此经营活动事项是企业业务的最主要组成部分。但是,作为企业由于各种原因几乎都需要向外借款周转资金,如生产的扩大等,筹资活动是必不可少的。当企业有闲置资金时,考虑到现金的收益率是众多资产中最低的,所以企业一般也会将暂时不用的现金用来投资以期望获得较高的回报,于是又出现了投资活动。

企业的经济业务无不是围绕经营、筹资、投资而展开的,这些业务交易也大致为经营活动、筹资活动和投资活动。筹资活动是指导致企业资本及债务规模和构成发生变化的活动,如吸收投资、借款、发行股票、分配股利、偿还债务等;投资活动是指企业长期资产的购建和不包括现金等价物范围内的投资及处置活动,如购买设备、取得投资收益等;经营活动是指企业筹资活动和投资活动以外的所有交易和事项。

ORACLE-insert /*+append*/提高性能

在非归档模式下表设置为nologging用insert /*+append*/速度最快。那为什么快呢,原理是什么?下面我们来一起做一个实验:

SQL> create or replace view m_undo_redo as
select v$statname.name,value
from v$mystat, v$statname
where v$mystat.statistic# =v$statname.statistic#
and (v$statname.name =’redo size’
or v$statname.name = ‘undo change vector size’);

视图已创建。

SQL> create table t (x int);

表已创建。

SQL> set timing on
SQL> select * from m_undo_redo;
NAME VALUE
—————————————————————- ———-
redo size 22644
undo change vector size 7484
SQL> insert into t select rownum from dual connect by level <=1000000;

已创建1000000行。

已用时间:  00: 00: 01.03

SQL> commit;

提交完成。

SQL> select * from m_undo_redo;
NAME VALUE
—————————————————————- ———-
redo size 15722456
undo change vector size 2380000
SQL> select (2380000-7484) undo,(15722456-22644) redo from dual;
UNDO REDO
———- ———-
2372516 15699812
SQL> truncate table t;

表被截断。

SQL> select * from m_undo_redo;
NAME VALUE
—————————————————————- ———-
redo size 15781532
undo change vector size 2396672
SQL> insert /*+append*/ into t select rownum from dual connect by level <=1000000;

已创建1000000行。

已用时间:  00: 00: 00.96

SQL> commit;

提交完成。

SQL> select * from m_undo_redo;
NAME VALUE
—————————————————————- ———-
redo size 15871640
undo change vector size 2419196
SQL> select (2419196-2396672) undo,(15871640-15781532) redo from dual;
UNDO REDO
———- ———-
22524 90108

两次的对比:

模式
生成undo

生成redo

普通insert  2372516  15699812
insert /*+append*/ 22524 90108
分析结论:两次对比的结果表示用insert /*+append*/后,数据的undo和redo没有生成。因为HWM 在移动的过程中,这些block是不能被其他process使用的,那么意味着,只要记录下该次direct insert所涉及到的空间的redo 和 undo  ,在失败回滚的时候,只需要把这些空间修改为原来的状态就可以,而不用逐个记录去delete。

原文:https://blog.csdn.net/lee_sire/article/details/54098275

ORA-20100 文件 通过 FND_FILE 创建失败解决方案

克隆了一个EBS 11i的环境,提交客户同步请求的时候出现了错误提示是:
原因:由于 ORA-20100: 为 FND_FILE 创建文件 10034190.tmp 失败。
我的服务器中有2个ERP环境,参数APPSLPTMP指定为默认的/usr/tmp。然后, 在网上找了一些相关资料,说不同的环境APPSLPTMP和数据库的utl_file_dir参数不能指定相同的目录,于是做了修改,修改命令如下:
# mkdir -p /usr/opt/tmp       创建目录
# chmod -R a+rw /usr/opt  赋予该目录读写权限
# su – orauat                               切换致数据库用户
$ export APPSLPTMP=/usr/opt/tmp   修改环境变量
$ cd $ORACLE_HOME/dbs
$ vi init<SID>.ora                   编辑数据库初始化文件,修改参数:utl_file_dir
utl_file_dir = /usr/opt/tmp,……..<SID>_prod
并且重新启动的环境。在数据库执行函数:FND_FILE_OUT_LINE()提示成功。
这个错误很常见:

1.查看$APPLPTMP系统环境变量的值,一般是/usr/tmp,需要保证该文件夹是存在的;

2.查看utl_file_dir数据库参数,其第一个值也应该为/usr/tmp;
select* from v$parameter t whee t.name=’utl_file_dir’
3.查看该文件夹的权限,该文件夹必须为应用用户和数据库用户都具有读写权限;
4.通过exec FND_FILE.PUT_LINE(FND_FILE.LOG, ‘THIS IS A TEST’);进行测试;
5.如果仍然还有问题,请查看你的服务器上面是不是有多套ERP环境,如果有多个的话两个$APPLPTMP文件同时写会冲突当一台服务器上运行了多套环境时,不能使用/usr/tmp作为$APPLPTMP,须定义成各自的目录。且该目录须在数据库参数utl_file_dir中。