一、informix数据库的启动及关闭

语法 oninit [-s] [-i] [-p] [-y] 

oninit        正常启动数据库

oninit -p    数据库不正常宕掉时,数据库中会留有临时表,这些表会占据一定的磁盘空间,一般我们重起数据库时,数据库会自动删除临时表,但我们也可以使用该命令保留这些临时表。
oninit -s    将数据库服务器启动到单用户模式,就同操作系统的单用户一样,这时你可以做一些维护工作,而不受其它想连上数据库的用户干扰。
oninit -v    正常启动数据库,并且显示启动的过程信息。

oninit -i     这个命令将初始化磁盘空间,是很危险的参数,在你使用数据库的过程中,只能在刚安装完做一次,否则。。。

 

onmode -ky      关闭数据库

onmode -s       从online模式转化为单用户模式

onmode -m      从单用户模式转为online模式

onmode -z  sessid     断开指定用户的连接 
 用onstat -u可以看到连接的用户,有一个sessid, 用onmode -z sessid 指定到这个id即可断开指定用户的连接。在informix刚启动时,onstat -u已经有了用户,但并不代表是外面的连接 。在onstat -u中有一列Flags,后面要去看一下什么意思

onmode -l        从当前日志切换到下一个日志 (onstat -l可以看出效果)

onmode -c       强制校验检查点。 onmode -l后,有可能上一个日志中包含检查点,onmode -c可以强制校验,把检查点转到当前日志
 如果一个日志文件中有检查点(标志中有L)那么这个日志不可以备份,不可以删除。所以要做上面的两个操作,就要先onmode -c

 

二、informix数据库的监控

onstat -        检查online的状态

onstat -d      检查各chunk的总共页数及空闲页数

onstat -u      检查连接数据库的用户

onstat -l       检查逻辑日志的使用情况,注意如日志满,应用onstat -a 清空日志

定期检查online.log文件,可以知道online是否正常工作,如果发现任何问题,应立即检查数据库。

onstat -g ses/sql 

onstat -r <value> 每隔<value>秒后重复选项 

onstat -g act   显示系统中所有的活动线索 

举例:

偶尔发生prpdcompany表被长期占用,导致系统无响应,排查原因:

1、$ onstat -g act

IBM Informix Dynamic Server Version 11.50.FC7     -- On-Line -- Up 7 days 06:42s

Running threads:

tid     tcb              rstcb            prty status                vp-class e

9       c000000b05618cc0 0                1    running                15soc*  l

10      c000000b0561ad70 0                1    running                16soc*  l

11      c000000b05676cc0 0                1    running                17soc*  l

12      c000000b05678cc0 0                1    running                18soc*  l

13      c000000b056a4d70 0                1    running                19soc*  l14      c000000b05703cc0 0                1    running                20soc*  l

15      c000000b05705cc0 0                1    running                21soc*  l

31310   c000000b32c97d00 c000000b08a72a68 1    running                 4cpu   c

31321   c000000b3af5b9e0 c000000b04a46988 1    running                 5cpu   c

31326   c000000b09b3bd80 c000000b08a91f08 1    running                 7cpu   c

31383   c000000b39a5c0e0 c000000b1228d550 1    running                 8cpu   c

31385   c000000b39a8a3d0 c000000b3bce5d10 1    running                 3cpu   c

31386   c000000b43673d80 c000000b3bceeae8 1    running                 1cpu   c

31399   c000000b07722030 c000000b3bcf5fb8 1    running                 6cpu   c

2、根据 rstcb 列(不要包括前面的 c000000 等,仅要后面部分)获取sid。

$ onstat -u|grep b08a72a68

c000000b08a72a68 ---PR-- 19795    car3g    -        0                0    2    0

3、根据第二步获取的sid(第三列)查看SQL语句的详细内容

$ onstat -g sql 19795

IBM Informix Dynamic Server Version 11.50.FC7     -- On-Line -- Up 7 days 06:43s

Sess       SQL            Current            Iso Lock       SQL  ISAM F.E.

Id         Stmt type      Database           Lvl Mode       ERR  ERR  Vers  Exp

19795      SELECT         car3200db          CR  Not Wait   0    0    9.28  Off

Current statement name : _ifxc0000000000005

Current SQL statement :

  select first 50 prpdcompan0_.COMCODE as col_0_0_, prpdcompan0_.COMCNAME as

    col_1_0_, prpdcompan0_.UPPERCOMCODE as col_2_0_, prpdcompan0_.FAXNUMBER as

    col_3_0_, '' as col_4_0_ from PRPDCOMPANY prpdcompan0_ where

    prpdcompan0_.VALIDSTATUS='1' and (prpdcompan0_.COMCODE like '%' or

    prpdcompan0_.COMCNAME like '%') and (prpdcompan0_.COMCODE in (select

    prpdcompan1_.COMCODE from PRPDCOMPANY prpdcompan1_ where

    prpdcompan1_.UPPERPATH like '00000000,32000000,32040000%')) and

    (prpdcompan0_.CENTERFLAG='1' or prpdcompan0_.CENTERFLAG='0' and (exists

    (select 1 from PRPDCOMPANY prpdcompan2_ where (prpdcompan2_.COMCODE in

    (substr(prpdcompan0_.UPPERPATH,

    length(prpdcompan0_.UPPERPATH)-(length(prpdcompan0_.COMCODE)*2),

    length(prpdcompan0_.COMCODE)) , SUBSTR(prpdcompan0_.UPPERPATH,

    length(prpdcompan0_.UPPERPATH)-(length(prpdcompan0_.COMCODE)*3)-1,

    length(prpdcompan0_.COMCODE)))) and prpdcompan2_.CENTERFLAG='1'))) order

    by prpdcompan0_.UPPERCOMCODE, prpdcompan0_.COMCODE asc

Last parsed SQL statement :

  select first 50 prpdcompan0_.COMCODE as col_0_0_, prpdcompan0_.COMCNAME as

    col_1_0_, prpdcompan0_.UPPERCOMCODE as col_2_0_, prpdcompan0_.FAXNUMBER as

    col_3_0_, '' as col_4_0_ from PRPDCOMPANY prpdcompan0_ where

    prpdcompan0_.VALIDSTATUS='1' and (prpdcompan0_.COMCODE like '%' or

    prpdcompan0_.COMCNAME like '%') and (prpdcompan0_.COMCODE in (select

    prpdcompan1_.COMCODE from PRPDCOMPANY prpdcompan1_ where

    prpdcompan1_.UPPERPATH like '00000000,32000000,32040000%')) and

    (prpdcompan0_.CENTERFLAG='1' or prpdcompan0_.CENTERFLAG='0' and (exists

    (select 1 from PRPDCOMPANY prpdcompan2_ where (prpdcompan2_.COMCODE in

    (substr(prpdcompan0_.UPPERPATH,

    length(prpdcompan0_.UPPERPATH)-(length(prpdcompan0_.COMCODE)*2),

    length(prpdcompan0_.COMCODE)) , SUBSTR(prpdcompan0_.UPPERPATH,

    length(prpdcompan0_.UPPERPATH)-(length(prpdcompan0_.COMCODE)*3)-1,

    length(prpdcompan0_.COMCODE)))) and prpdcompan2_.CENTERFLAG='1'))) order

    by prpdcompan0_.UPPERCOMCODE, prpdcompan0_.COMCODE asc

4关闭锁表SQL连接

$ onmode -z 19795

5、分析该语句,找出锁表的原因是缺少索引。

 

三、 informix数据库的备份及恢复

informix提供多种备份手段,常用有两种方法:通过dbexport将某一数据库内容备份成ASCLL文件,dbimport能将备份内容恢复;通过ontape转储数据库(ontape -s)和转储事务(ontape -a 或ontape -c)来完成,恢复数据库则用ontape -r来进行

1、dbexport/dbimport

dbexport 命令语法如下 
dbexport [-X] [-c] [-q] [-d] [-ss] [{-o -t -b -s [-f ]}] 
以上命令中参数的意义如下: 
-c:指示如果没有错误,则输出全部信息。 
-q:在标准输出设备上不显示错误信息、警告和所生成的SQL数据定义语句。 
-d:仅输出blob描述符,不输出blob数据。 
-ss:在模式文件中输出特定于服务器的用于创建数据库和表的信息,比如: 
初始的extent和附加的extent的大小、上锁方式、表所驻留的 dbspace等信息。 
-o:指定数据输出文件的磁盘目录。 
-t:指定数据输出文件的备份介质名称。 
-b:指定备份介质块大小。 
-s:指定备份介质的最大存储量。 
-f:用于指定存储在备份介质上的模式文件名。 

dbexport导出的是一个“DBNAME.exp”的文件。导入时如果希望换一个数据库名,则进行如下修改即可。

修改.exp文件夹的名称

修改.exp文件夹下的sql名称

修改.exp文件夹下的sql中的第一行的数据库名称

④以上三处的名称必须保持一致

优点:a. 使用dbexport/dbimport命令备份/恢复数据,可以起到消除数据分配空间碎块的作用,提高数据库整体运行效率。 
b. 用户可以使用dbexport/dbimport命令,将Informix-online和Informix-SE下的数据进行相互转换;也可以将数据在Informix-online的不同版本之间转换,这种转换对数据库服务器的结构和online的配置没有特别要求。 
缺点:a. dbexport以独占方式(exclusive mode)占用数据库,备份期间其他用户不能对数据库进行查询和修改及插入操作对于7*24时的数据库来说,此方法不可取。 
b. 模式文件不保留数据库的日志文件,用户使用dbimport命令建立数据库时必须为新建数据库选择一种日志方式(ANSI、buffered、nobuffered类型,无法达到实时备份。 

使用dbexport功能及需注意的问题:
a. 执行dbexport命令必须是Informix用户或具有DBA访问权限的用户 。 
b. 用dbexport备份的数据必须用dbimport命令恢复。 
c. 用户可以通过编辑模式文件来改变dbimport生成的数据库,如改变数据库名称或相关的表信息。 

使用dbimport命令进行数据恢复 
(1) 语法 
dbimport  db_name  -I  /informix/import_db  -d  datadbs
注:-I   /informix/import_db  为数据存放目录

-d   datadbs 为数据库存放的dbspace

(2) 使用方法 
通过dbimport命令,指定到用来恢复的备份文件,然后进行恢复动作

 

2、ontape

ontape备份语法为: 
ontape -s -L 备份级别(0、1、2) 
在online处于联机或静止方式时, Informix用户或具有DBA权限的用户可以通过 
执行上面的命令进行备份。根据备份方案安排进行0级、1级、2级备份。 
a. 0级备份是对整个数据库的所有数据进行完整备份; 
b. 1级备份是只对0级备份以后修改过的数据进行备份; 
c. 2级备份只是对1级备份以后修改过的数据进行备份。 
具体的备份可以根据实际情况来决定备份级别。 
优点: a. 可在线进行备份,无需停机,非常适合用于7*24小时的工作机制。 
b. 备份方式简单 
c. 可以备份到磁带或者磁盘上,只要在参数中设置相应的路径。 
缺点: a. 在低版本中(IDS低于9.4)版本中进行备份时,当备份的路径为磁盘上,数据达到2G时,需手工交付式进行备份,负责备份将不成功。 
b. 不能使用后台方式执行备份命令(UNIX下的&&),因为备份采用交互方式进行 
 使用ontape工具进行数据备份需要注意的问题 
a. 在执行ontape备份前要对Onconfig文件中的TAPEDEV、TAPEBLK、TAPESIZE参数进行正确的设置 
b. 为了缩短数据恢复时间,应以进行0级为主,尽量减少1级和2级备份。对银行等重要部门数据,应每天进行0级备份。 
c. 如果需要将ontape备份的数据恢复到另一台服务器上时,要求两台服务器机型、操作系统、Onconfig配置文件及非临时分配的Dbspace磁盘空间数量和大小必须一致,否则数据不能正常恢复。 
d. 必须保证有足够可用的逻辑日志文件。如果剩余的逻辑日志空间小于单个逻辑日志的50%,Informix-online将拒绝执行备份操作。必须先备份已使用过的逻辑日志,然后才能进行数据备份。 
e. 保留Onconfig文件副本。在进行0级备份后,应备份Onconfig文件,因为在恢复0级备份时需要读Onconfig文件信息,如果online配置被修改,数据恢复将失败,如果恢复此0级备份,必须恢复当时的配置。 
f. 备份可以在online联机或静止方式下进行,在备份过程中不能改变online运行方式,否则备份会被中断

使用ontape工具进行数据恢复 
(1) 语法 
ontape -r 
(2) 使用方法 
这里以0级备份为例 
a. onmode -ky 数据库 
b. /informix/etc>ontape –r 
c. 根据提示,来恢复数据库 
(3) 注意事项 
如果需要将ontape备份的数据恢复到另一台服务器上时,要求两台服务器机型、操作系统、Onconfig配置文件及非临时分配的Dbspace磁盘空间数量和大小必须一致,否则数据不能正常恢复。 

修改数据库日志模式

$>ontape -s -B db_name   修改为buffer_log   即缓冲日志模式

$>ontape -s -U db_name   修改为unbuffer_log 即非缓冲日志模式

$>ontape -s -N db_name   修改为无日志模式   数据库不含日志,即不支持事务,对数据库的任何修改都不会记录到逻辑日志中去

 

 四、informix的dbschema工具

1)导出数据库中所有的表结构到文件db.sql 
$>dbschema -d your_database -t all db.sql

2)导出数据库中所有的存储过程到文件db.sql 
$>dbschema -d your_database -f all db.sql
3)导出数据库中的所有对象(包含表,存储过程,触发器。。。)到文件db.sql
$>dbschema -d your_database db.sql

4)导出数据库中一个表的结构到文件db.sql 
$>dbschema -d your_database_name -t your_table_name db.sql

5)导出一个存储过程定义到文件db.sql 
$>dbschema -d your_database_name -f your_procedure_name db.sql

6)如果导出更多的表的信息(EXTENT...) 
$>dbschema -d your_database_name -ss db.sql

7)导出数据库中对用户或角色的授权信息 
$>dbschema -d your_database_name -p all 
$>dbschema -d your_database_name -r all

8)导出数据库中的同义词 
$>dbschema -d your_database_name -s all
9)导出表数据到temp.unl文件

$>unload to filename.unl select * from tabname;

10)将temp.unl文件的内容导入表:

$>load from filename.unl insert into tabname;