您的位置:首页 > 数据库

Informix11.70培训笔记(2)

2016-07-22 15:46 357 查看
数据库全备,把本机的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 onsoctcpifx2
ifx1

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*';
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息