Informix11.70培训笔记(2)

来源:互联网 发布:数据审计追踪 编辑:程序博客网 时间:2024/05/17 04:58
数据库全备,把本机的informix完全还原到一台新机器中(不需要安装informix),两台机器间不同实例的访问。
1、解开新的linux,配置环境(ip,hostname, hosts)
2、用户和组,gid,uid最好和第一台机器相同
3、环境变量 sqlhosts(里面的IP地址)
4、复制源系统:informix的相关文件  /opt/IBM/informix
打包:tar.gz tar.bz2  -v -f -c -p(保留权限) -j
tar -pcjvf dbs.tar.bz2 /dbs
tar -pcjvf ifx.tar.bz2 /opt/IBM/informix
传到目标系统解压:
tar -ptjvf dbs.tar.bz2--查看命令
tar -pxjvf dbs.tar.bz2


tar -ptjvf ifx.tar.bz2--查看命令
tar -pxjvf ifx.tar.bz2


使用主机名和服务名(在ifx2机器上测试,修改sqlhosts建议先备份):
hostname
vi /etc/hosts
vi /etc/services
ifx1 40000/tcp
ifx2  41000/tcp


vi sqlhosts
inst1 onsoctcpifx2ifx1
inst2 onsoctcp ifx2ifx2


onmode -ky
oninit -vy


修改数据库实例名:inst1 --- inst3(修改前做好备份)
修改环境变量vi .bash_profile


修改sqlhosts文件
修改onconfig.inst1文件为onconfig.inst2,修改里面的DBSERVERNAME
onmode -ky
oninit -vy




监控优化:
1、数据库的日志:(没有日志的数据库,不支持事务)
dbaccess sysmaster -
info tables;
select tabname from systables where tabid > 99 and tabname like "%database%";
info columns for sysdatabases;(is_logging:是否记录日志)
select name from sysdatabases;
select * from sysdatabases where name='test1';(查看数据库的状态)


name            test1
partnum         1048916
owner           informix
created         11/18/2013
is_logging      0 (0:数据库不记录日志,故障时可能丢失数据,除非是只读用途的数据库)
is_buff_log     0 (缓冲日志)
is_ansi         0 (ansi模式的日志)
is_nls          0
is_case_insens  0
flags           -12288


数据库日志状态:4种
(1)不记录日志
(2)普通日志:在执行commit操作后,会写日志
(3)缓冲日志:先把日志写到缓冲区,再往日志文件中写
(4)ansi模式日志:一般不使用
前三种可以直接转换,如果是第4中就不能再转换成其他模式。




事务处理:
启动事务处理:begin work;
结束事务:提交:commit work; 回滚:rollback work;


database test1;
begin work;----报错(数据库如果不记录日志,不允许事务处理)


创建数据库,支持事务处理:
create database java1;
create database java2 with log;---记录日志的数据库
select * from sysmaster:sysdatabases where name like 'java%';--标准sql语句 %:匹配任意
select * from sysmaster:sysdatabases where name matches 'java*';--informix中的关键字 *:任意


database java2;
create table t1
(
id int
);
create table t2
(
id int
);
insert into t1 values(1);
insert into t2 values(2);


dml语句在informix中是自动提交。(dml语句,select insert update delete)
begin work;
insert into t1 values(10);
insert into t2 values(20);
--事务未提交前,在其他命令行进行查询,会遇到锁表错误(107错误)
rollback work;


begin work;
insert into t1 values(10);
insert into t2 values(20);
commit work;


begin work;
insert into t1 values(1000);
insert into t2 values(2000,'abc');
select * from t1;
select * from t2;
commit work;


查看错误代码的详细信息:finderr 错误代码
查看锁的信息:
onstat -u  输出用户线程信息
onstat -k  输出锁信息 查看type列,包含HDR+X:X排他锁,互斥锁 exclusive
onstat -k |grep HDR+X  :显示的第三列(owner)是onstat -u的address列,通过比较可以找到会话id


onstat -u | grep 4af27004(onstat -k |grep HDR+X目录的owner值)
查看informix的会话信息:onstat -g ses  (能查到pid:进程号)
onstat -g ses 25 查看进程在做什么(可以查看到最后执行语句)
查看数据库sql语句的执行情况:onstat -g sql 25


处理有问题的会话:
(1)停止相应的进程 kill -9 pid(kill -9 3843) 操作系统级别,最后一招
(2)停止会话 onmode -z sid(onmode -z 28)--建议使用该方法(dbaccess的界面(进程)还在,但连接(session)已经断掉,需要重新连接:connect to ’@inst3‘;database java2;)


设置隔离级别为脏读:
脏数据:指内存中的数据和硬盘中的数据库不一致
第一个用户执行第一次查询:
select * from t1;
(1)从磁盘读数据库,不是直接返回给客户端,读到内存中(缓冲区)
(2)从缓冲区读数据返回给客户端
第二个用户执行第二次相同查询:
select * from t1;
直接从缓冲区读数据


第三个用户:update t1 更新操作(直接修改缓冲区中的数据(脏数据)
第四个用户:select × from t1;如果可以读内存中的数据,读到的是脏数据(默认不允许)


可以手动修改隔离级别,允许读脏数据。
窗口1:
begin work;
select * from t1;---id=1000
update t1 set id=100 where id=1000;
窗口2:
select * from t1;--报锁错误
设置隔离级别为脏读:set isolation to dirty read; --只针对当前的会话生效,新开一个窗口查询t1(echo " select * from t1 " | dbaccess java2;),还是报锁错误。
在窗口1中执行:rollback work:---查询看结果,还是1000的id;


锁表操作:两种模式(share/exclusive)
非日志数据库可以直接锁表:
database java1;--非日志数据库;
create table t2
(
id int
);
insert into t2 values (11);
begin work;----报错,不允许事务
lock table t2 in exclusive mode;
第二个窗口中(新开):
select * from  t2;--可以执行
delete from t2;--提示不可以
解锁:unlock table t2;


日志数据库需要在事务中锁表:
database java2;
begin work;
lock table t1 in exclusive mode;
--do something you want
unlock table t1;
commit work;




create database java3 with buffered log;  --创建缓冲日志数据库
select * from sysmaster:sysdatabases where name like 'java_';--匹配单字符
select * from sysmaster:sysdatabases where name like 'java%';--匹配任意字符
select * from sysmaster:sysdatabases where name matches 'java?';--匹配单字符
select * from sysmaster:sysdatabases where name matches 'java*';--匹配任意


更改日志模式:ontape
ontape 


onconfig.inst3:
LTAPEDEV /dev/null --循环日志,不归档日志
该为归档日志:修改归档日志的位置
root:
mkdir -p /backup/arclog
chown informix:informix /backup/arclog
chmod 770 /backup/arclog


informix;
cd $INFORMIXDIR/etc
vi config.inst3
改TAPDEV为:TAPEDEV /backup/arclog
改LTAPDEV为:LTAPEDEV /backup/arclog


重启实例:
onmode -ky
oninit -vy
查看实例的配置文件:
onstat -c|grep LTAPEDEV


ontape -s
0:全备 (ontape -s -L 0)
1:备份0级后的变化 (ontape -s -L 1)
2:备份1级后的变化 (ontape -s -L 2)
ontape -s -L 0 (直接做某个级别的备份)


修改数据库的日志类型,需要对数据库做0级备份:
命令行执行(注意实例为inst3):ontape -s -L 0 -U java1;---U:非缓冲日志
select * from sysmaster:sysdatabases where name matches 'java1';--is_logging被设置为1
命令行执行(注意实例为inst3):ontape -s -L 0 -B java1;---B:缓冲日志
select * from sysmaster:sysdatabases where name matches 'java1';--is_logging和is_buff_log被设置为1
命令行执行(注意实例为inst3):ontape -s -L 0 -N java1;---N:不记录日志
select * from sysmaster:sysdatabases where name matches 'java1';--is_logging和is_buff_log被设置为0


修改数据库的日志模式,不需要重启实例,立即生效。UBN三种日志模式可以任意切换。


ontape -s -L 0 -A java1;更改为ansi模式日志,不能再切换为其他日志模式。
ontape -s -L 0 -N java1;---切换出错




JDK环境准备:
root:
/soft/jdk1.7.0_45
cd /soft
mv jdk1.7.0_45 jdk1.7
vi /etc/profile.d/jdk.sh
在文件里面添加:
export JAVA_HOME=/soft/jdk1.7
export CLASSPATH=$JAVA_HOME/lib:.
export PATH=$JAVA_HOME/bin:.:$PATH


source /etc/profile


java
javac
java -version


su - informix
java
javac
java -version


查看sql语句的执行计划:
dbaccess java2 -
select * from t1;
set explain on; --会把执行计划写入到文件中,当前目录下的文件:spexplain.out,如果文件存在则是追加。
select * from t1;


set explain off; --关闭执行计划


set explain on avoid_execute; --显示计划本身,但不执行相应的语句


select first 1 * from t1;
update t1 set id=123 where id=1; --显示计划本身,但不执行相应的语句


后台动态显示sqexplain.out的内容
tail -f sqexplain.out &


指定新的执行计划文件:
dbaccess java2 -
set explain file to '/home/informix/explain.out';


存储过程:
info tables; --显示用户信息
select tabname from systables where tabname matches "*procedure*";--查看数据库中的存储过程
info columns for sysprocedures;
select procname from sysprocedures;


创建存储过程:spl语言
create procedure proc1()
returning int;
return 100;
end procedure;


select procname from sysprocedures where procname matches 'proc*';


create procedure proc2()
returning int;
begin
return 1;
end;
end procedure;


返回值不是必须的
create procedure proc3()
begin
insert into t1 values(55);
end;
end procedure;


调用存储过程:
execute procedure proc1();
execute procedure proc2();
execute procedure proc3();
select * from t1 where id = proc2();
select first 10 * from t1;




存储过程可以重载:重名,但参数不同
create procedure proc1(tid int)
begin
insert into t1 values(tid);
end;
end procedure;


create procedure proc1(tid int ,tname varchar(20))
begin
insert into t1 values(500);
end;
end procedure;




select procname from sysprocedures where procname matches 'proc*';
0 0
原创粉丝点击