分类目录归档:转载文章(档)

oracle数据库报错:ORA-01555: 快照过旧: 回退段号 10 (名称为 “_SYSSMU10_3550978943$”) 过小

前缀:

比较奇怪的是,请求爆这个错误后,我在程序里面加了个when others的异常,然后就正常了。

oracle undo表空间

undo表空间用于存放undo数据,当执行DML操作(insert、update、delete)时,oracle会将这些操作的旧数据写入到undo段。

undo数据的作用

1.回退事务

当执行DML操作修改数据后,旧数据被存放在undo段中。只要数据为提交、回滚段未写满或者回滚段为超时的情况下,旧数据都能被回滚回来。

2.读一致性

通过DML操作后的数据没有提交之前,其他用户读取的数据都是回滚段里面的旧数据。

使用undo参数

1.undo_management

该初始化参数用于指定undo数据的管理方式。如果要使用自动管理模式,必须设置为auto,如果使用手工管理模式必须设置该参数为manual,使用自动管理模式时,oracle会使用undo表空间管理,使用手工管理模式时,oracle会使用回滚段管理undo数据。需要注意,使用自动管理模式时,如果没有配置初始化参数UNDO_TABLESPACE,oracle会自动选择第一个可用的UNDO表空间存放UNDO数据,如果没有可用的UNDO表空间,oracle会使用SYSTEM回滚段存放UNDO记录,并在ALTER文件中记载警告。

2,UNDO_TABLESPACE

该初始化参数用于指定例程所要使用的UNDO表空间,使用自动UNDO管理模式时,通过配置该参数可以指定例程所要使用的UNDO表空间.

在RAC(Real Application Cluster)结构中,因为一个UNDO表空间不能由多个例程同时使用,所有必须为每个例程配置一个独立的UNDO表空间.

3,UNDO_RETENTION

该初始化参数用于控制UNDO数据的最大保留时间,其默认值为900秒,从9i开始,通过配置该初始化参数,可以指定undo数据的保留时间,从而确定倒叙查询特征(Flashback Query)可以查看到的最早时间点.

手工管理回滚段的规划:

SQL> show parameter  undo;

NAME                                 TYPE        VALUE

———————————— ———– ——————————

undo_management                string      AUTO

undo_retention                       integer    900

undo_tablespace                    string      UNDOTBS1

SQL> show parameter  transactions;

NAME                                 TYPE        VALUE

———————————— ———– ——————————

transactions                         integer     187             ———-系统准备支持的事务连接数量。

transactions_per_rollback_segment    integer     5       ————–每个回滚段支持的事务连接数量。回滚段数=187/5

SQL> show  parameter rollback;

NAME                                 TYPE        VALUE

———————————— ———– ———-

fast_start_parallel_rollback         string      LOW

rollback_segments                      string ———————-设置回滚段的数量

transactions_per_rollback_segment    integer     5

错误原因:

SQL语句执行时间太长,或者UNDO表空间过小,或者事务量过大,或者过于频繁的提交,导致执行SQL过程中进行一致性读时,SQL执行后修改的 前镜像(即UNDO数据)在UNDO表空间中已经被覆盖,不能构造一致性读块(CR blocks)。  这种情况最多。

解决办法:

第1种情况解决的办法:

(1)增加UNDO表空间大小

(2)增加undo_retention 时间,默认只有15分钟

alter  system set undo_retention=14400 ;

undo_retention这个值可以根据情况调大一些。

(3)优化出错的SQL,减少查询的时间,首选方法

(4)避免频繁的提交

还有一种情况,可能是oracle BUG,官网说法ORA-01555BUG比较多,

其他参考:

https://www.cnblogs.com/Richardzhu/archive/2013/03/25/2981610.html

查看表空间使用情况
SELECT a.tablespace_name,
ROUND (a.total_size) “total_size(MB)”,
ROUND (a.total_size) – ROUND (b.free_size, 3) “used_size(MB)”,
ROUND (b.free_size, 3) “free_size(MB)”,
ROUND (b.free_size / total_size * 100, 2) || ‘%’ free_rate
FROM ( SELECT tablespace_name, SUM (bytes) / 1024 / 1024 total_size
FROM dba_data_files
GROUP BY tablespace_name) a,
( SELECT tablespace_name, SUM (bytes) / 1024 / 1024 free_size
FROM dba_free_space
GROUP BY tablespace_name) b
WHERE a.tablespace_name = b.tablespace_name(+);

TABLESPACE_NAME                total_size(MB) used_size(MB) free_size(MB) FREE_RATE
—————————— ————– ————- ————- —————————————–
SYSAUX                                    900       835.687        64.313 7.15%
UNDOTBS1                                24576        53.875     24522.125 99.78%
USERS                                       5         1.312         3.688 73.75%
SYSTEM                                   4170      4160.687         9.313 .22%
USER_DATA                                 150       105.062        44.938 29.96%

计算所需undo表空间的大小:

1.计算业务高峰期每秒产生undo数据块的个数
SQL> select max(undoblks / ((end_time – begin_time)*24*3600)) from v$undostat;

MAX(UNDOBLKS/((END_TIME-BEGIN_
——————————
11.305

2.得到undo数据块在undo表空间中可以保留的最长时间
SQL> show parameter undo_retention;

NAME                                 TYPE        VALUE
———————————— ———– ——————————
undo_retention                       integer     86400

3.得到数据块大小
SQL> show parameter db_blo

NAME                                 TYPE        VALUE
———————————— ———– ——————————
db_block_buffers                     integer     0
db_block_checking                    string      FALSE
db_block_checksum                    string      TYPICAL
db_block_size                        integer     8192

4.将以上三者的数据相乘就是所需undo表空间的大小数
SQL> select (11.305*86400*8192)/1024/1024/1024 undoTablespace_GB from dual;

UNDOTABLESPACE_GB
—————–
7.4520263671875

发现undo表空间不够的时候,赶紧增加undo表空间的大小,执行语句如下:
alter tablespace undotbs1 add datafile ‘/u01/database/instance_name/undotbs02.dbf’ size 100M autoextend on next 128M maxsize 24G;
alter tablespace undotbs1 add datafile ‘/u01/database/instance_name/undotbs03.dbf’ size 100M autoextend on next 128M maxsize 24G;
alter tablespace undotbs1 add datafile ‘/u01/database/instance_name/undotbs04.dbf’ size 100M autoextend on next 128M maxsize 24G;

–查看会话数
select count(*) from v$session;

–查看进程数
select count(*) from v$process;

–查看数据库的并发连接数
select * from v$session where status=’ACTIVE’;

–查看当前数据库建立的会话
SELECT SID,SERIAL#,USERNAME,PROGRAM,MACHINE,STATUS FROM V$SESSION;

–查看数据库允许的最大连接数
SELECT value FROM V$PARAMETER WHERE NAME=’processes’

–查看数据库允许的最大会话数
SELECT value FROM V$PARAMETER WHERE NAME=’sessions’
–查看后台正在运行着的sql语句
select a.program,b.spid,c.sql_text from v$session a,v$process b,v$sqlarea c where a.paddr=b.addr and a.sql_hashvalue=c.hash_value and a.username is not null;

查询所有数据库的连接数
select schemaname,count(*)from v$session group by schemaname;

查询终端用户使用数据库的连接情况。
select osuser,schemaname,count(*) fromv $session group by schemaname,osuser;

查看当前不为空的连接
select * from v$session where username is not null

查看不同用户的连接数
select username,count(username) from v$session where username is not null group by username

转自:https://blog.csdn.net/qiuzhi__ke/article/details/78937078

 

Oracle数据库评估undo 表空间大小

如何估算Oracle数据库所需的UNDO表空间的大小:

How To Size UNDO Tablespace For Automatic Undo Management (文档 ID 262066.1)

要确定Oracle需要的UNDO 表空间的大小,需要以下三条信息:

UR 以秒为单位的UNDO_RETENTION

UPS 每秒生成的还原数据块的数量

DBS db_block_size

UndoSpace = [UR * (UPS * DBS)] + (DBS * 24)

UNDO_RETENTION是一个参数,此参数控制为提供读一致性而保留的还原数据量,以秒为单位定义,可以在初始化文件中设置,或使用 ALTER SYSTEM 命令来动态修改。

SQL>ALTER SYSTEM SET UNDO_RETENTION=900;

SQL> show parameter undo_retention

NAME TYPE VALUE

———————————— ———– ——————————

undo_retention integer 900

如果值为900,则可以使还原数据保留 15 分钟,当然需要足够的存储空间才行。

那么如何计算每秒生成的还原数据块的数量呢,可以通过v$undostat视图的begin_time、end_time和undoblks三个字段的值查询出来,计算的SQL语句如下:

SQL> SELECT (UR * (UPS * DBS)) + (DBS * 24) AS “Bytes” FROM (SELECT value AS UR  FROM v$parameter WHERE name = ‘undo_retention’),(SELECT (SUM(undoblks)/SUM(((end_time -begin_time)*86400))) AS UPS  FROM v$undostat),  (SELECT value AS DBS FROM v$parameter  WHERE name = ‘db_block_size’);

Bytes

———-

445814.844

详解:

一般应该在一天中数据库负载最繁重的时候进行计算。

对于UNDO表空间大小的定义需要考虑UNDO_RETNETION参数、产生的UNDO BLOCKS/秒、UNDO BLOCK的大小。undo_retention:对于UNDO表空间的数据文件属性为autoextensible,则undo_retenion参数必须设置,UNDO信息将至少保留至undo_retention 参数设定的值内,但UNDO表空间将会自动扩展。对于固定UNDO表空间,将会通过表空间的剩余空间来最大限度保留UNDO信息。如果FIXED UNDO表空间没有对保留时间作GUARANTEE(alter tablespace xxx retention guarantee;),则undo_retention参数将不会起作用。(警告:如果设置UNDO表空间为retention guarantee,则未过期的数据不会被复写,如果表空间不够则会导致DML操作失败或者transation挂起)

Oracle 10g 有自动Automatic Undo Retention Tuning 这个特性。设置的 undo_retention 参数只是一个指导值,,Oracle 会自动调整 Undo (会跨过 undo_retention 设定的时间) 来保证不会出现 Ora-1555 错误.。通过查询V$UNDOSTAT(该视图记录4天以内的UNDO表空间使用情况,超过4天可以查询DBA_HIST_UNDOSTAT视图) 的 tuned_undoretention (该字段在10G版本才有,9I是没有的)字段可以得到Oracle 根据事务量(如果是文件不可扩展,则会考虑剩余空间)采样后的自动计算出最佳的 retenton 时间.。这样对于一个事务量分布不均匀的数据库来说,,就会引发潜在的问题–在批处理的时候可能 Undo 会用光, 而且这个状态将一直持续, 不会释放。

SQL查询tuned_undoretention:

select to_char(begin_time,’DD-MON-RR HH24:MI’) begin_time,to_char(end_time,’DD-MON-RR HH24:MI’) end_time,tuned_undoretention from v$undostat order by end_time;

检查一天平均每秒产生的UNDO BLOCK

select (sum(undoblks)/sum((end_time-begin_time)*86400) from v$undostat;

生成的结果是UNDO BLOCK,如果需要计算出实际大小,则需要乘以db_block_size(通过show parameter db_block_size查出来)

如何计算合适的UNDO表空间大小:

select (UR*(UPS*DBS))+(DBS*24) as “bytes” from (select value as UR from v$parameter where name=’undo_retention’),(select (sum(undoblks)/sum(((end_time-begin_time)*86400))) as ups from v$undostat),(select value as DBS from v$parameter where name=’db_block_size’);

转自:http://blog.itpub.net/31397003/viewspace-2147515/

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)总分类账和明细账户对同一笔经济业务的登记应该在同一个会计期间内完成。

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

表各类型的含义如下:

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

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

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

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

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

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

ntp服务器同步时间详细配置(转载)

NTP服务端:linl_S    IP:10.0.0.15
NTP客户端:lin_C    IP:10.0.0.16

NTP服务概述

1、原理

NTP(Network TimeProtocol,网络时间协议)是用来使计算机时间同步的一种协议。它可以使计算机对其服务器或时钟源做同步化,它可以提供高精准度的时间校正(LAN上与标准间差小于1毫秒,WAN上几十毫秒),切可介由加密确认的方式来防止恶意的协议攻击。
模式:C/S模式
运行模式:

2、端口(123)

1 [root@linl_S ~]# vim /etc/services 
2 nntp            119/tcp         readnews untp   # USENET News Transfer Protocol
3 nntp            119/udp         readnews untp   # USENET News Transfer Protocol
4 ntp             123/tcp
5 ntp             123/udp                         # Network Time Protocol
拓展:
NNTP(Network News Transport Protocol),中文释义:(RFC-977)网络新闻传输协议。这是一个主要用于阅读和发布新闻文章(俗称为“帖子”,比较正式的名字是“新闻组邮件”)到Usenet 上的Internet应用协议,也负责新闻在服务器间的传送。
安装NTP
默认是已安装,如果是最小化安装系统,则需要手动安装。
1)NTP相关软件包
1 [root@linl_S ~]# ls /mnt/Packages/ntp*
2 /mnt/Packages/ntp-4.2.6p5-1.el6.x86_64.rpm         #NTP服务端软件包
3 /mnt/Packages/ntpdate-4.2.6p5-1.el6.x86_64.rpm     #NTP客户端软件包
2)安装NTP服务端软件包:
1 [root@linl_S ~]# yum -y install ntp         #NTP两个软件包都会安装上
2 ...
3 Installed:
4   ntp.x86_64 0:4.2.6p5-1.el6                                      
5 Dependency Installed:
6   ntpdate.x86_64 0:4.2.6p5-1.el6                                  
7 Complete!
    安装客户端:
1 [root@linl_C ~]# rpm -ivh /mnt/Packages/ntpdate-4.2.6p5-1.el6.x86_64.rpm     #只安装ntpdate安装包
2 warning: /mnt/Packages/ntpdate-4.2.6p5-1.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
3 Preparing...                ########################################### [100%]
4     package ntpdate-4.2.6p5-1.el6.x86_64 is already installed
    NTP配置文件所在位置
1 [root@linl_S ~]# ls /etc/ntp.conf 
2 /etc/ntp.conf
3)启动NTP服务
 1 [root@linl_S ~]# service ntpd start          #启动ntp服务
 2 Starting ntpd:                                             [  OK  ]
 3 [root@linl_S ~]# netstat -anptu |grep 123    #查看端口123是否开放
 4 udp        0      0 10.0.0.15:123               0.0.0.0:*                               5846/ntpd           
 5 udp        0      0 127.0.0.1:123               0.0.0.0:*                               5846/ntpd           
 6 udp        0      0 0.0.0.0:123                 0.0.0.0:*                               5846/ntpd           
 7 udp        0      0 fe80::20c:29ff:fea9:c1ae:123 :::*                                    5846/ntpd           
 8 udp        0      0 ::1:123                     :::*                                    5846/ntpd           
 9 udp        0      0 :::123                      :::*                                    5846/ntpd           
10 [root@linl_S ~]# chkconfig ntpd on           #开机自启动
实战1:手动同步NTP时间服务器

1)在lin_S服务器上查看可用的NTP时间服务器

1 [root@linl_S ~]# vi /etc/ntp.conf 
2 # Use public servers from the pool.ntp.org project.
3 # Please consider joining the pool (http://www.pool.ntp.org/join.html).
4 server 0.rhel.pool.ntp.org iburst       #找一个可以使用的NTP时间服务器
5 server 1.rhel.pool.ntp.org iburst
6 server 2.rhel.pool.ntp.org iburst
7 server 3.rhel.pool.ntp.org iburst

2)在lin_C客户端上与NTP时间服务器进行同步

1 [root@linl_C ~]# ntpdate 0.rhel.pool.ntp.org
2 22 May 22:04:41 ntpdate[5733]: adjust time server 202.118.1.130 offset 0.027428 sec
拓展:
在lin_S服务端(已启动NTP服务)与NTP时间服务器进行同步会报错。
1 [root@linl_S ~]# ntpdate 0.rhel.pool.ntp.org
2 22 May 22:06:17 ntpdate[2464]: the NTP socket is in use, exiting
问题分析:
出现该错误的原因是lin_S服务器正在运行ntpd服务,就不能用ntpdate来手动更新时间了。
解决方法:
关闭ntpd服务
1 [root@linl_S ~]# service ntpd stop
2 Shutting down ntpd:                                        [  OK  ]
3 [root@linl_S ~]# ntpdate 0.rhel.pool.ntp.org
4 22 May 22:13:27 ntpdate[2495]: adjust time server 202.118.1.130 offset -0.068183 sec

实战2:搭建内网NTP服务器,内网服务器通过此NTP服务器进行时间同步

1)修改NTP配置文件

      蓝色底纹部分为增加项

 1 [root@linl_S ~]# vi /etc/ntp.conf 
 2 # Permit all access over the loopback interface.  This could
 3 # be tightened as well, but to do so would effect some of
 4 # the administrative functions.
 5 restrict 127.0.0.1
 6 restrict -6 ::1
 7 restrict 10.0.0.0 mask 255.255.255.0       #允许10.0.0.0 网段中的服务器访问本ntp服务器进行时间同步
 8 restrict 10.0.0.16                         #允许单个IP地址访问本ntp服务器
 9 # Use public servers from the pool.ntp.org project.
10 # Please consider joining the pool (http://www.pool.ntp.org/join.html).
11 server 210.72.145.44    #指定本ntp服务器的上游ntp服务器为210.72.145.44,并且设置为首先服务器。同步时间为:从上到下,写的越靠上,优先级越高。(此服务器同步不了时间,寻找下一个ntp服务器)。此IP地址是中国国家授时中心ntp服务器。                    
12 server 133.100.11.8     #当上面服务器同步不了,则寻找第二个。此IP地址是日本福冈大学ntp服务器。
13 server 0.rhel.pool.ntp.org iburst
14 server 1.rhel.pool.ntp.org iburst
15 server 2.rhel.pool.ntp.org iburst
16 server 3.rhel.pool.ntp.org iburst
17 server 127.127.1.0           #local clock 如果上面的服务器都无法同步时间,就和本地系统时间同步。127.127.1.0在这里是一个IP地址,不是网段。
18 fudge 127.127.1.0 stratum 10    #127.127.1.0 为第10层。ntp 和127.127.1.0同步完后,就变成了11层。  ntp是层次阶级的。同步上层服务器的stratum 大小不能超过或等于16。

2)启动ntpd服务

1 [root@linl_S ~]# /etc/init.d/ntpd start
2 Starting ntpd:                                             [  OK  ]
3 [root@linl_S ~]# netstat -ln |grep 123
4 udp        0      0 10.0.0.15:123               0.0.0.0:*                               
5 udp        0      0 127.0.0.1:123               0.0.0.0:*                               
6 udp        0      0 0.0.0.0:123                 0.0.0.0:*                               
7 udp        0      0 fe80::20c:29ff:fea9:c1ae:123 :::*                                    
8 udp        0      0 ::1:123                     :::*                                    
9 udp        0      0 :::123                      :::*
3)查看ntpd服务状态
指令“ntpq -p”可以列出目前我们的NTP与相关的上层NTP的状态,以上的几个字段的意义如下:
remote:即remote – 本机和上层ntp的ip或主机名,“+”表示优先,“*”表示次优先。
refid:参考的上一层NTP主机的地址
st:即stratum阶层
poll:下次更新在几秒之后

offset:时间补偿的结果

 1 [root@linl_S ~]# ntpq -p         #列出本NTP服务器与上游服务器的连接状态
 2      remote           refid      st t when poll reach   delay   offset  jitter
 3 ==============================================================================
 4  210.72.145.44   .INIT.          16 u    -   64    0    0.000    0.000   0.000
 5  133.100.11.8    .INIT.          16 u    -   64    0    0.000    0.000   0.000
 6 *dns1.synet.edu. 202.118.1.47     2 u   32   64    3   60.058    7.261   6.860
 7  news.neu.edu.cn .INIT.          16 u    -   64    0    0.000    0.000   0.000
 8  202.118.1.130   .INIT.          16 u    -   64    0    0.000    0.000   0.000
 9  42.96.167.209   .INIT.          16 u    -   64    0    0.000    0.000   0.000
10  LOCAL(0)        .LOCL.          10 l   96   64    2    0.000    0.000   0.000
11 [root@linl_S ~]# ntpstat         #列出是否与上游服务器连接。需要过5分钟
12 synchronised to NTP server (202.112.29.82) at stratum 3     #可以看到我们当前在3层
13    time correct to within 257 ms    #ms 毫秒是一种较为微小的时间单位,是一秒的千分之一。
14    polling server every 64 s

4)客户端同步时间

1 [root@linl_C ~]# date -s "2015-5-23 11:30"    #先设置一个错误的时间点
2 Sat May 23 11:30:00 CST 2015
3 [root@linl_C ~]# ntpdate lin_S    #进行ntp时间同步
4 23 May 11:34:10 ntpdate[6686]: step time server 10.0.0.15 offset 31622622.275270 sec
5 [root@linl_C ~]# date             
6 Mon May 23 11:34:16 CST 2016      #时间同步成功
常见错误:如下所示。
其实,这不是一个错误。而是由于每次重启NTP服务器之后大约要3-5分钟客户端才能与server建立正常的通讯连接。当此时用客户端连接服务端就会报这样的信息。一般等待几分钟就可以了。
1 [root@linl_C ~]# ntpdate lin_S
2 23 May 11:38:02 ntpdate[6694]: no server suitable for synchronization found
5)和NTP相关的配置文件
/etc/sysconfig/clock        #这个是linux 的主要时区设定文件。每次开机后,Linux会自动的读取这个文件来设定自己系统所默认要显示的时间。
1 [root@linl_S ~]# cat /etc/sysconfig/clock
2 # The time zone of the system is defined by the contents of /etc/localtime.
3 # This file is only for evaluation by system-config-date, do not rely on its
4 # contents elsewhere.
5 ZONE="Asia/Shanghai"
拓展1:linux系统时间和BIOS时间是不是一定一样?
查看硬件BIOS时间:
hwclock -r    读出BIOS的时间参数
hwclock -w    将当前系统时间写入BIOS中
1 [root@linl_C ~]# date -s "2016-5-22 13:50"
2 Sun May 22 13:50:00 CST 2016
3 [root@linl_C ~]# hwclock -r
4 Mon 23 May 2016 01:53:50 PM CST  -0.110948 seconds
5 [root@linl_C ~]# hwclock -w
6 [root@linl_C ~]# hwclock -r
7 Sun 22 May 2016 01:50:48 PM CST  -0.783098 seconds     #已将系统date时间写入到BIOS时间
拓展2:不同机器之间的时间同步
为了避免主机时间因为长期运作下所导致的时间偏差,进行时间同步(synchronize)的工作是非常必要的。
同步时间,可以使用ntpdate命令,也可以使用ntp服务。
方法一:使用ntpdate 比较简单。格式如下:
1 [root@linl_C ~]# ntpdate lin_S
2 23 May 19:50:44 ntpdate[7507]: step time server 10.0.0.15 offset 1.239826 sec
但这样的同步,只是强制性的将系统时间设置为ntp 服务器时间。只是治标不治本。所以,一般配合cron命令,来进行定期同步设置。比如,在crontab 中添加:
1 [root@linl_C ~]# crontab -e
2 0 12 * * * /usr/sbin/ntpdate lin_S
方法二:使用ntpd 服务进行同步。
要注意的是,ntpd 有一个自我保护设置:如果本机与上源时间相差太大,ntpd 不运行。所以新设置的时间服务器一定要先ntpdate 从上源取得时间初值。然后启动ntpd 服务。
转载自:https://www.cnblogs.com/shanhua-fu/p/9281040.html