sql server 与 informix的区别
Informix环境
数据库对象
Informix |
|
列数 |
2,767 |
行数 |
32,767字节 |
最大行数 |
不限(只要表容量保持在64 GB以内) |
二进制大对象(Blob)型存储 |
无法存储在表或二进制大对象空间内 |
群集化表索引 |
每表1个(按索引组织的表) |
非群集化表索引 |
77个(假设表内存在一个范围,每个键只有一个组成部分) |
单个索引中的最大列数 |
16 |
索引中的最大列值长度 |
255字节 |
表命名规则 |
[[database.]owner.]table_name[@Server] |
视图命名规则 |
[[database.]owner.]table_name[@Server] |
索引命名规则 |
[[database.]owner.]table_name[@Server] |
数据库对象标识符
Informix |
标识符名称最长可达128字节。 |
标识符名称可以字母字符或下划线开始,并包含文字数字式字符、下划线(_)或美元符号($)。 |
数据库名称必须在Informix实例中具备唯一性(除在ANSI模式下为owner.database之外) |
标识符名称必须在用户账户(数据库)范围内具备唯一性。 |
列名必须在表和视图范围内具备唯一性。 |
索引名称必须在数据库范围内具备唯一性。 |
限定表名称
当您对存在于Informix用户账户中的表进行访问时,只需利用不受限制的名称即可将表选中。对其它Informix数据库中的表进行访问需要为表名冠以数据库名,并在两者之间用圆点(.)分隔。Informix的相似限定方法提供了更大的位置透明度。Informix还允许利用表所有者对表加以识别。
访问存在于…之中的表 |
Informix |
用户账户 |
SELECT * FROM STUDENT |
其它架构 |
SELECT * FROM STUDENT_ADMIN.STUDENT |
数据类型
1.与sql server的比较
Informix |
Microsoft SQL Server |
CHAR |
建议使用char型变量。由于char型数据列使用固定存储长度,因此,它们接受访问的速度在某种意义上高于varchar型数据列。 |
VARCHAR 与TEXT, NTEXT与 IMAGE |
varchar或text。(如果Informix列中的数据值长度小于等于8000字节,就应使用varchar型变量;否则,必须使用text型变量。) NTEXT、TEXT和IMAGE可在单个赋值内最多保存2 GB数据。 而NTEXT则是TEXT类型的Unicode版本 |
NCHAR NVARCHAR |
CHAR和VARCHAR的Unicode字符数据版本 |
BLOB |
varbinary或image型变量。(如果Informix列中的数据值长度小于等于8000字节,就应使用varbinary型变量;否则,必须使用image型变量。) |
INTEGER SMALLINT TINYINT BIGINT FLOAT SMALLFLOAT MONEY SMALLMONEY DECIMAL NUMERIC |
如果整数值域在1到255之间,应使用tinyint型变量。 如果整数值域在-32768到32767之间,应使用smallint型变量。 如果整数值域在-2,147,483,647到2,147,483,647之间,应使用int型变量。 如果您需要使用浮点型数字,请使用numeric型变量(具有精度和刻度)。 说明:不要使用float或real型变量,因为可能出现四舍五入的情况(Informix的INTEGER型变量和SQL Server的numeric型变量均不执行四舍五入运算)。 money型变量值域在-922,337,203,685,477.5808到+922,337,203,685,477.5807之间。 而smallmoney型变量值域则在-214,748.3648到+214,748.3647之间。 |
BINARY, VARBINARY |
二进制数据既可具有固定长度(binary),又能具有可变长度(varbinary) binary型变量值域为1到8000,存储容量为n+4字节 varBinary为可变长度二进制变量,存储容量为数据长度+4字节。 |
DATE DATETIME SMALLDATETIME |
datetime. smalldatetime型变量可显示的日期范围在1900年1月1日到2079年6月6日之间 |
BIT |
取值为1、0或NULL的整数型变量 |
ROWID SERIAL |
使用标识列数据类型。 |
USER |
USER |
常用语气
1生成表
CREATE TABLE table_name ( {col_name column_properties [default_expression] [constraint [constraint [...constraint]]]| [[,] constraint]} [[,] {next_col_name | next_constraint}...] ) [Informix Specific Data Storage Parameters]
Informix数据库对象名既可区分大小写,又可不区分大小写(设定DELIMIDENT环境变量,并用双引号将对象名括起来)。
2生成临时表
SELECT * INTO TEMP STUDENTBACKUP FROM STUDENT [WITH NO LOG]
3创建视图
CREATE VIEW view_name [(column_name [, column_name]...)] AS select_statement [WITH CHECK OPTION]
4索引
CREATE [UNIQUE | DISTINCT] [CLUSTER] INDEX index_name ON table_name (column_name [, column_name]...) [ASC | DESC] [FILLFACTOR n] [IN tablespace_name] DROP INDEX ABC;
5对象级权限
GRANT {ALL [PRIVILEGES][column_list] | permission_list [column_list]} ON {table_name [(column_list)] | view_name [(column_list)] | synonym name [(column_list)] | stored_procedure_name} TO {PUBLIC | name_list | role_name } [WITH GRANT OPTION] [AS grantor] REVOKE {ALL [PRIVLEGES]} ON {table | view | synonym } FROM { user | user list | role } [CASCADE | RESTRICT]
6主键与唯一列
CREATE TABLE DEPT (DEPT VARCHAR(4) NOT NULL, DNAME VARCHAR(30) NOT NULL, PRIMARY KEY (DEPT) CONSTRAINT DEPT_DEPT_PK, UNIQUE (DNAME) CONSTRAINT DEPT_DNAME_UNIQUE) ) EXTENT SIZE 32 NEXT SIZE 32
7存储过程
CREATE PROCEDURE procedure [(argument datatype [, argument datatype)] block END PROCEDURE OR CREATE FUNCTION function [(argument datatype [, argument datatype)] RETURNING datatype; block END FUNCTION
8触发器
描述 |
Informix |
每个表的触发器数量 |
不限 |
是否在INSERT、UPDATE和DELETE语句前执行触发器 |
是 |
是否在INSERT、UPDATE和DELETE语句后执行触发器 |
是 |
是否不执行INSERT、UPDATE和DELETE语句而执行触发器 |
否 |
是否允许嵌套触发器 |
否 |
是否存在语句级触发器 |
是 |
是否存在行级触发器 |
是 |
是否在执行前检查约束 |
在日志功能被激活的情况下,约束条件将延迟到触发器执行完毕 在日志功能未被激活的情况下,约束将不会延迟 |
引用UPDATE或DELETE触发器中的原有或先前值 |
用户定义 |
引用INSERT触发器中的新数值 |
用户定义 |
禁用触发器 |
SET TRIGGER trigger DISABLED |
CREATE TRIGGER TRACK_GRADES [UPDATE OF SSN ON GRADE | UPDATE OF CCODE ON GRADE | UPDATE OF GRADE ON GRADE | INSERT ON GRADE | DELETE ON GRADE] REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW (INSERT INTO GRADE_HISTORY( TABLE_USER, ACTION_DATE, OLD_SSN, OLD_CCODE, OLD_GRADE, NEW_SSN, NEW_CCODE, NEW_GRADE) VALUES (USER, CURRENT, OLD.SSN, OLD.CCODE, OLD.GRADE, NEW.SSN, NEW.CCODE, NEW.GRADE), );
1. 以显性方式请求表级锁定
功能 |
Informix |
锁定整个表——允许其他人对表进行读取,但防止他们对其进行更新。锁定状态将缺省持续到语句执行完毕。 |
LOCK TABLE…IN SHARE MODE |
将表锁定至事务处理完成 |
? |
排它锁——防止其他人对表执行读取或更新操作,并将这种状态保持到指令或事务处理完成 |
LOCK TABLE…IN EXCLUSIVE MODE |
设定语句等待解锁的毫秒数。 |
SET LOCK MODE TO [WAIT seconds | NOT WAIT] |
SQL语言支持
1 SELECT语句
Informix |
SELECT [ALL | DISTINCT] [optimizer directives] select_list [FROM {table_name | view_name | select_statement}] [WHERE clause] [GROUP BY group_by_expression] [HAVING search_condition] [{UNION | UNION ALL } SELECT …] [ORDER BY clause] [FOR UPDATE { OF column } | FOR READ ONLY] [INTO {TEMP | SCRATCH} table_name] |
2 INSERT语句
Informix |
INSERT INTO {table_name | view_name } [(column_list)] VALUES {values_list | select_statement} |
3 UPDAYTE语气
UPDATE [optimizer directives] {table_name | view_name | synonym_name } SET [column_name(s) = {constant_value | expression | select_statement | column_list | variable_list] [ {where_statement} | {WHERE CURRENT OF cursor_id}] |
UPDATE语句中使用子查询
UPDATE STUDENT_ADMIN.STUDENT S SET TUITION_TOTAL = 1500 WHERE SSN IN (SELECT SSN FROM GRADE G WHERE G.SSN = S.SSN AND G.CCODE = '1234')
4 DELETE语句
Informix |
DELETE [optimizer directives] [FROM] {table_name | view_name | synonym_name} [ {WHERE clause} | { WHERE CURRENT OF cursor_id} ] |
5 联接子句
Informix |
SELECT S.SSN AS SSN, FNAME, LNAME FROM STUDENT S, OUTER CLASS C, OUTER GRADE G WHERE S.SSN = G.SSN AND G.CCODE = C.CCODE |
6 将SELECT语句用作表名
Informix |
SELECT SSN, LNAME, FNAME, TUITION_PAID, SUM_PAID FROM STUDENT, (SELECT SUM(TUITION_PAID) SUM_PAID FROM STUDENT) |
函数
1数字/数学函数
函数 |
Informix |
绝对值 |
ABS |
反余弦 |
ACOS |
反正弦 |
ASIN |
n的反正切 |
ATAN |
n和m的反正切 |
ATAN2 |
余弦 |
COS |
指数值 |
EXP |
十六进制值 |
HEX |
自然对数 |
LOGN |
10的对数 |
LOG10 |
取模(余数) |
MOD |
求幂 |
POW |
求根 |
ROOT |
四舍五入 |
ROUND |
数字符号 |
无 |
正弦 |
SIN |
平方根 |
SQRT |
正切 |
TAN |
舍位 |
TRUNC |
2字符函数
数 |
Informix |
将字符转换成小写形式(LOWER) |
LOWER |
将字符转换成大写形式(LOWER) |
UPPER |
填充字符串左侧 |
LPAD |
删除前导空格 |
TRIM |
删除尾部空格 |
TRIM |
多次重复字符串 |
RPAD |
重复空格的字符串 |
RPAD |
取子串 |
SUBSTR SUBSTRING |
字符替换 |
REPLACE |
将字串中每个单词的首写字母转换成大写形式 |
INITCAP |
字符串长度 |
LENGTH CHAR_LENGTH CHARACTER_LENGTH |
包括空格在内的字符列字节数 |
OCTET_LENGTH |
3日期函数
函数 |
Informix |
日期添加 |
date column +/- INTERVAL(value) 或 date column +/- DATETIME(value) 或 date column +/- value UNITS datetime unit |
日期差距 |
date column +/- DATETIME(value) 或 date column +/- DATE(value) |
当前日期和时间 |
CURRENT TODAY |
日期的字符串表示形式 |
DATETIME(value) |
日期的整数表示形式 |
无 |
日期的四舍五入 |
DATETIME(value) datetime unit TO datetime unit |
日期截断 |
DATETIME(value) datetime unit TO datetime unit |
将字符串转变为日期 |
DATETIME(value) 或 DATE(value) |
将空值转换成日期 |
无 |
4转换函数
函数 |
Informix |
其他 |
从数字型到字符型 |
隐含 |
CONVERT |
从字符型到数字型 |
隐含(在未执行计算的情况下报错) |
CONVERT |
从日期型到字符型 |
隐含 |
CONVERT |
从字符型到日期型 |
隐含(在未执行计算的情况下报错) |
CONVERT |
从十六进制到二进制 |
无 |
CONVERT |
从二进制到十六进制 |
无 |
CONVERT |
5其它行级函数
函数 |
Informix |
返回第一个非空表达式 |
DECODE |
如果exp1 = exp2,则返回空值 |
DECODE |
用户登录ID编号 |
无 |
用户登录名 |
USER |
用户数据库ID编号 |
无 |
用户数据库名 |
USER |
当前用户 |
USER |
6聚合函数
函数 |
Informix |
平均值 |
AVG |
计数 |
COUNT |
最大值 |
MAX |
最小值 |
MIN |
标准差 |
STDDEV |
求和 |
SUM |
方差 |
VARIANCE |
全距 |
RANGE |
7条件检验
Informix |
DECODE (test_value, expression1, value1 [[,expression2, value2] […]] [,default_value] ) CASE test_value WHEN expression1 THEN value1 [[WHEN expression2 THEN value2] [...]] [ELSE default_value] END CREATE VIEW STUDENT_GPA (SSN, GPA) AS SELECT SSN, ROUND(AVG(DECODE(grade ,'A', 4 ,'A+', 4.3 ,'A-', 3.7 ,'B', 3 ,'B+', 3.3 ,'B-', 2.7 ,'C', 2 ,'C+', 2.3 ,'C-', 1.7 ,'D', 1 ,'D+', 1.3 ,'D-', 0.7 ,0)),2) FROM GRADE GROUP BY SSN 或 CREATE VIEW STUDENT_GPA (SSN, GPA) AS SELECT SSN, ROUND(AVG(CASE grade WHEN 'A' THEN 4 WHEN 'A+' THEN 4.3 WHEN 'A-' THEN 3.7 WHEN 'B' THEN 3 WHEN 'B+' THEN 3.3 WHEN 'B-' THEN 2.7 WHEN 'C' THEN 2 WHEN 'C+' THEN 2.3 WHEN 'C-' THEN 1.7 WHEN 'D' THEN 1 WHEN 'D+' THEN 1.3 WHEN 'D-' THEN 0.7 ELSE 0 END),2) FROM GRADE GROUP BY SSN |
8将数值转换为不同数据类型
转换方式 |
Informix |
从字符型到数字型 |
CAST('10' AS number) '10'::number |
从数字型到字符型 |
CAST(10 as char) 10::char |
从字符型到日期型 |
CAST('97-JUL-04' AS datetime) '97-JUL-04'::datetime CASE('07-04-97' AS date) '07-04-97'::date |
从日期型到字符型 |
CAST(CURRENT AS char) CURRENT::char |
从十六进制到二进制 |
无 |
从二进制到十六进制 |
无 |
9用户定义函数
Informix |
SELECT ssn, fname, lname, tuition_paid, tuition_paid/get_sum_major(major) as percent_major FROM student |
CREATE FUNCTION get_sum_major (inmajor varchar) RETURN NUMBER AS sum_paid number; BEGIN SELECT sum(tuition_paid) into sum_paid FROM student WHERE major = inmajor; RETURN(sum_paid); END get_sum_major; |
10比较运算符
Operator |
Informix |
等于 |
(=) |
大于 |
(>) |
小于 |
(<) |
大于等于 |
(>=) |
小于等于 |
(<=) |
不等于 |
(!=,<>,^=) |
不大于,不小于 |
无 |
属于集合成员 |
IN |
不属于集合成员 |
NOT IN |
集合中的任意值 |
ANY,SOME |
引用集合中的所有值 |
!= ALL,<> ALL,< ALL,> ALL,<= ALL,>= ALL |
样式相似 |
LIKE |
样式不相似 |
NOT LIKE |
x和y之间的值 |
BETWEEN x AND y |
x和y之间的值 |
NOT BETWEEN |
数值存在 |
EXISTS |
数值不存在 |
NOT EXISTS |
数值为空或非空 |
IS NULL, IS NOT NULL |
11模式匹配
Informix |
其它 |
SELECT * FROM STUDENT WHERE LNAME MATCHES '[ABC]?' |
SELECT * FROM STUDENT_ADMIN.STUDENT WHERE LNAME LIKE '[ABC]%' |
12字符串连接
Informix |
其它 |
SELECT FNAME||' '||LNAME AS NAME FROM STUDENT |
SELECT FNAME +' '+ LNAME AS NAME FROM STUDENT_ADMIN.STUDENT |
13关键字
语句 |
Informix SPL |
声明变量 |
DEFINE DEFINE GLOBAL <variable> DEFINE GLOBAL <variable> DEFAULT <value> |
语句块 |
BEGIN...END; |
有条件的处理 |
IF…THEN, ELIF…THEN, ELSE END IF; |
无条件退出 |
RETURN |
无条件退出到紧随当前程序块的语句 |
EXIT FOR EXIT FOREACH EXIT WHILE |
重新开始WHILE循环 |
CONTINUE |
等候指定间隔 |
无(dbms_lock.sleep) |
循环控制 |
WHILE <condition> END WHILE FOR <condition> … END FOR; |
程序注释 |
, -- |
打印输出 |
无 |
报告程序错误 |
RAISE EXCEPTION |
执行程序 |
EXECUTE |
语句终止符 |
分号(;) |
14声明变量
Informix |
DEFINE VSSN CHAR(9); VFNAME VARCHAR(12); VLNAME VARCHAR(20); VBIRTH_DATE DATE; VLOAN_AMOUNT NUMBER(12,2); |
15为变量赋值
Informix |
其它 |
LET variable = value |
SET @variable = value |
从单一行中选取列数值的SELECT...INTO语法 |
指派文字值、涉及其它本地变量之表达式或单一行中列数值的SELECT @var=<expression> [FROM…]语法 |
无 |
FETCH…INTO语法 |
下面提供一些语法示例。
DECLARE VSSN CHAR(9); DEFINE VFNAME VARCHAR(12); DEFINE VLNAME VARCHAR(20); BEGIN LET VSSN = '123448887'; SELECT FNAME, LNAME INTO VFNAME, VLNAME FROM STUDENTS WHERE SSN=VSSN; END;
16数据类型映射
Informix数据类型 |
ODBC SQL数据类型 |
BYTE |
SQL_LONGVARBINARY |
CHAR |
SQL_CHAR |
DATE |
SQL_TIMESTAMP |
DATETIME YEAR TO FRACTION(F) |
SQL_TYPE_TIMESTAMP |
DATETIME YEAR TO DAY |
SQL_TYPE_DATE |
DATETIME HOUR TO SECOND |
SQL_TYPE_TIME |
DECIMAL |
SQL_DECIMAL |
FLOAT |
SQL_DOUBLE |
INTERVAL YEAR(P) TO YEAR |
SQL_INTERVAL_YEAR |
INTERVAL YEAR(P) TO MONTH |
SQL_INTERVAL_YEAR_TO_MONTH |
INTERVAL MONTH(P) TO MONTH |
SQL_INTERVAL_MONTH |
INTERVAL DAY(P) TO DAY |
SQL_INTERVAL_DAY |
INTERVAL DAY(P) TO HOUR |
SQL_INTERVAL_DAY_TO_HOUR |
INTERVAL DAY(P) TO MINUTE |
SQL_INTERVAL_DAY_TO_MINUTE |
INTERVAL DAY(P) TO SECOND |
SQL_INTERVAL_DAY_TO_SECOND |
INTERVAL DAY(P) TO FRACTION(F) |
SQL_INTERVAL_DAY_TO_SECOND |
INTERVAL HOUR(P) TO HOUR |
SQL_INTERVAL_HOUR |
INTERVAL HOUR(P) TO MINUTE |
SQL_INTERVAL_HOUR_TO_MINUTE |
INTERVAL HOUR(P) TO SECOND |
SQL_INTERVAL_HOUR_TO_SECOND |
INTERVAL HOUR(P) TO FRACTION(F) |
SQL_INTERVAL_HOUR_TO_SECOND |
INTERVAL MINUTE(P) TO MINUTE |
SQL_INTERVAL_MINUTE |
INTERVAL MINUTE(P) TO SECOND |
SQL_INTERVAL_MINUTE_TO_SECOND |
INTERVAL MINUTE(P) TO FRACTION(F) |
SQL_INTERVAL_MINUTE_TO_SECOND |
INTERVAL SECOND(P) TO SECOND |
SQL_INTERVAL_SECOND |
INTERVAL SECOND(P) TO FRACTION(F) |
SQL_INTERVAL_SECOND |
INTERVAL FRACTION TO FRACTION(F) |
SQL_VARCHAR |
MONEY |
SQL_DECIMAL |
SERIAL |
SQL_INTEGER |
SMALLFLOAT |
SQL_REAL |
SMALLINT |
SQL_SMALLINT |
TEXT |
SQL_LONGVARCHAR |
VARCHAR |
SQL_VARCHAR |
17外部联接
ODBC Extended SQL and SQL-92 |
Informix |
Microsoft SQL Server |
SELECT STUDENT.SSN, FNAME, LNAME, CCODE, GRADE FROM {oj STUDENT LEFT OUTER JOIN GRADE ON STUDENT.SSN = GRADE.SSN} |
SELECT STUDENT.SSN, FNAME, LNAME, CCODE, GRADE FROM STUDENT, OUTER GRADE WHERE STUDENT.SSN = GRADE.SSN |
SELECT STUDENT.SSN, FNAME, LNAME, CCODE, GRADE FROM STUDENT LEFT OUTER JOIN GRADE ON STUDENT |
18日期、时间与时间戳数值
SQL |
Informix |
Microsoft SQL Server |
SELECT SSN, FNAME, LNAME, BIRTH_DATE FROM STUDENT WHERE BIRTH_DATE < {D '1970-07-04'} |
SELECT SSN, FNAME, LNAME, BIRTH_DATE FROM STUDENT WHERE BIRTH_DATE < '1970-07-04' |
SELECT SSN, FNAME, LNAME, BIRTH_DATE FROM STUDENT WHERE BIRTH_DATE < '1970 |
19调用存储过程
Generic ODBC Extended SQL |
Informix |
Microsoft SQL Server |
{?=} call procedure_name[(parameter(s))]} SQLExecDirect(hstmt1,(SQLCHAR *)"{? = call owner.procedure(?)}", SQL_NTS); |
SQLExecDirect(hstmt1, (SQLCHAR*)"{? = call STUDENT_ADMIN.P1. SHOW_RELUCTANT _STUDENTS(?)}", SQL_NTS); |
SQLExecDirect(hstmt1, (SQLCHAR*)"{? = call STUDENT_ADMIN. SHOW_RELUCTANT _STUDENTS}", SQL_NTS); |
数据库维护
1数据库查询用户的建立
银行Informix_on_line数据库由于存储了储户的大量重要信息,为了数据库的安全性必需要对数据的操作有严格的规定,如进入on_line数据库要履行严格的手续,这在某些时候又给查找问题带来不便,因此有必要专门建立一个动态查询用户,该用户仅有对数据库的可读权限。
具体做法是:
1.建立查询用户,该查询用户应具有数据库使用的环境
2.将查询用户与数据库作连接(work用户为例)
ln-s/homel/work/homel/read(将查询用户read与数据库用户作连接);
3.由work用户使用数据库,将connect权限赋予read用户
grant connect to read;
4.对数据库中每一张表放select权给read用户
grant select on abc to read.(将select权限赋给read用户)
这样,以read用户注册,对数据库拥有了可读操作,给查找问题等带来方便。
2数据库一致性检查
a.以informix登录
b.将数据库状态置为off_line
onmode-ky
用onstat-检查数据库状态为off_line
c.将数据库状态置为单用户模式
onmode -s
用onstat-检查数据库状态为quiesent
d.检查数据库保留页状态
oncheck-cr 1>/tmp/oncheck.cr 2>&1
e.检查数据库目录页一致性
oncheck-cc 1 >/tmp/oncheck.cc 2>&1
f.检查数据库数据的一致性
oncheck-cD workdb 1>/tmp/oncheck.cd 2>&1
g.检查数据库索引的一致性
oncheck-cI workdb 1>/tmp/oncheck.ci 2>&1
h.检查/tmp下oncheck.cr,oncheck.cc,oncheck.cd,oncheck.ci文件,查看有无错误信息,如没有,则数据库状态正常,反之亦然。
i.将数据库状态置为online
onmode-m
用onstat-检查数据库状态为online
3数据库的备份与恢复
1.dbexport备份与dbexport恢复
dbexport备份是一文体文件备份,该备份将数据库中信息以文本文件方式保存,要注意的是,在备份时必须保证没有对数据库有访问者,否则做dbexport不会成功,dbexport备份的一般格式为(以数据库workdb为例)
dbexport workdb-d -s workdbs /path
2.dbimport恢复是将用dbexport备份的文件恢复到数据库中
a.停止一切数据库操作→删除数据库;
b.$dbimport workdb-d workdbs -i/path;
c.用工具onmonitor将参数TAPEDEV改为/dev/null;
d.ontap -s -u workdb.
e.检查workdb是否改为U状态.
f.将TAPEDEV值改回原先的值.
需要指出的是在dbimport恢复过程中,有大量的信息要写在逻辑日志文件中,采用上述方式,可避免写逻辑日志文件,加快dbimport的速度。
3.数据库的零级备份
数据库零级备份是重要的备份手段,日常一般用磁带备份,经常用于做重大操作之前的备份,数据往往需要恢复,而磁带上的零级备份数据由于数据量大,恢复起来花费时间较长,因此,可采用在硬盘上做零级备份的办法。
a.在硬盘上划一个足够大的空间,用于备份文件的存放。
b.用onmonitor将参数TAPEDEV改定指向零级备份文件。
如把/cs2000在作为零级备份文件oback的存放空间,可将参数改为TAPEDEV=/cs2000/oback,这样可做硬盘零级备份,备份恢复时间只是磁带机的1/6。在恢复过程中应该用tail -f online.log监控。恢复过程,一直到数据库状态变为online..
c.将参数TAPEDEV=/cs2000/oback改为TAREDEV=/dev/rmt/0m;
4数据库常见故障处理
1.检查:用onstat_-1检查逻辑日志的使用情况,是否中止进程,根据finder col.数据库故障的一般检查,首先要检查数据库状态,经常用onstat_de查找可能出现的错误,同时检查online.log是否报错。
2.数据库表的跟踪:遇到在对数据库表作大规模操作时,有时我们不知道对该表的操作是否得以在继续进行,因为isql进入,操作该表,数据库报“该表已被锁”信息,这时可用查询语句:
首先:set retrieved to drity read
然后:select count(*)from abc,
通过不断对abc表进入统计,如统计数在不断增加,则对该表的操作仍在进行,否则,以停止了对该表的操作。还有,当批量执行SQL命令,如update,……insert等时如不能成功执行,可采用增加判断条件,缩小范围的方法去执行,往往可以获得成功,遇有些语句涉及的记录在处理过程中被锁定,直到处理过程结束可能超过系统关于同时锁定界限,遇这种错误,可以在开始处理时锁定该表。
3.故障排除举例:
故障现象:在银行批量结息向结息数据表插入记录时出现informix sqlcode错误号为-239。
故障检查:经查,从现象看,似乎有重复记录插入表中,但经核查数据,可以肯定数据绝无重复记录,考虑到表文件长期使用,表文件的相关信息受到某种破坏,为此,做以下操作:
a.unload to “/tmp/abc.txt”select*from abc.卸出abc中全部数据;
b.drop table abc.(删除表文件abc);
c.create tabk abc
(abc_swo mteger;
abc_ano smallint)
…
);建立数据库表文件abc.
d.load form“tmp/abc.txt”insert into abc.
(将原数据装入表文件abc中)。
e.重新执行结息操作,新产生的结息数据顺利装入表文件abc中,故障得以排除。