-
[转]LR录制Oracle协议
2011-04-11 16:17:39
参考:http://www.51testing.com/?uid-14711-action-viewspace-itemid-111678
在用Loadrunner进行oracle数据库压力测试的时候,可以选择oracle 2tier协议进行录制。
(一)如果选择录制脚本的话
1、vugen会生成以下这些跟其他协议不同的文件
vdf.h
作用:定义各种变量
print.inl
作用:打印表格使用的函数。录制脚本时才有用,写脚本的话没有用
pre_cci.c
作用:整个录制脚本的程序全部写在这里,可以在这里查看完整的函数过程
2、录制脚本的好处需要的东西什么都有了。只要找到要执行的sql。然后将其中的sqltext部分参数化掉就可以了。
select时生成的几个表格不错。可以在上面完成参数的保存和将搜索的结果保存成dat文件。用起来还是比较直观的
3、录制脚本不好的地方
使用plsql或者toad这样的工具录制出来的脚本有很多的操作就是测试中不需要的。对于不了解lr脚本的用户来说这些东西会造成一些麻烦。了解的话把这些不需要的语句都去掉就行了。
(二)如果选择自己写脚本的话
需要用到以下这些语句
#include "lrd.h"
//定义各种变量。录制生成的脚本中,这些变量的定义在vdf.h中。
static LRD_INIT_INFO InitInfo = {LRD_INIT_INFO_EYECAT};
static LRD_DEFAULT_DB_VERSION DBTypeVersion[] =
{
{LRD_DBTYPE_NONE, LRD_DBVERSION_NONE}
};Action()
{
//变量定义
static void FAR * OraEnv1;
static void FAR * OraSvc1;
static void FAR * OraSes1;static void * OraDef12;
static void * OraDef13;
static void * OraDef14;static unsigned long uliRowsProcessed;
static unsigned long uliFetchedRows;
//LRD_VAR_DESC数据结构声明是很重要的,他是用来存储sql结果数据集的结构体
//第一个参数,头文件中就是这么写的
//第二个参数,设置结果集中最大行数,在lrd_ora8_fetch中的第二个参数如果大于该值,则会报错。
//第三个参数,设置结果集中每一行的最大长度,如果获得的查询结果比定义的长,运行时就会报错,提示列被截断
//最后一个参数是查询结果的类型,可以再帮助中的索引输入data types, database,列出的表格中是各种变量类型的名称
//常用的数据类型有DT_VARCHAR, DT_DECIMAL, DT_DATETIME, DT_SF, DT_SZ, DT_NUMERIC
static LRD_VAR_DESC NAME_D13 =
{"LVD", 15, 25, 0, {1, 1, 0}, DT_VARCHAR};
static LRD_VAR_DESC VAL2_D1 =
{"LVD", 15, 25, 0, {1, 1, 0}, DT_NUMERIC};
static LRD_VAR_DESC VAL1_D1 =
{"LVD", 15, 25, 0, {1, 1, 0}, DT_VARCHAR};//初始化数据库部分
lrd_init(&InitInfo, DBTypeVersion);
lrd_initialize_db(LRD_DBTYPE_ORACLE, 2, 0);
lrd_env_init(LRD_DBTYPE_ORACLE, &OraEnv1, 0, 0);
lrd_ora8_handle_alloc(OraEnv1, SERVER, &OraSrv1, 0);
lrd_ora8_handle_alloc(OraEnv1, SVCCTX, &OraSvc1, 0);
lrd_ora8_handle_alloc(OraEnv1, SESSION, &OraSes1, 0);//连接数据库
lrd_server_attach(OraSrv1, "1.155", 5, 0, 0);
lrd_ora8_attr_set_from_handle(OraSvc1, SERVER, OraSrv1, 0, 0);
//设定数据库密码
lrd_ora8_attr_set(OraSes1, USERNAME, "im", -1, 0);
lrd_ora8_attr_set(OraSes1, PASSWORD, lr_decrypt("4a90de5201be6597554e"), -1, 0);
//初始化连接session
lrd_ora8_attr_set_from_handle(OraSvc1, SESSION, OraSes1, 0, 0);
//开始执行事务
lrd_session_begin(OraSvc1, OraSes1, 1, 0, 0);
lrd_ora8_handle_alloc(OraEnv1, STMT, &OraStm7, 0);
//提交sql
lrd_ora8_stmt(OraStm7, "select userid, username, gender, name from userinfo where userid = 1", 1, 0, 0);
//执行sql
//第三个参数,执行次数
//第四个参数,跳过记录数
//第五个参数,返回执行影响的行数
//第九个参数,设置执行模式,0是默认值执行(不提交),16不执行,32代表执行且自动提交
//第十个参数,设置警告级别,0是默认值,代表错误,1代表警告
lrd_ora8_exec(OraSvc1, OraStm7, 1, 0, &uliRowsProcessed, 0, 0, 0, 32, 1);//列绑定,如果不进行列绑定,lrd_ord8_fetch 将不能用。
lrd_ora8_bind_col(OraStm7, &OraDef9, 1, &USERID_D10, 0, 0);
lrd_ora8_bind_col(OraStm7, &OraDef10, 2, &USERNAME_D11, 0, 0);
lrd_ora8_bind_col(OraStm7, &OraDef11, 3, &GENDER_D12, 0, 0);
lrd_ora8_bind_col(OraStm7, &OraDef12, 4, &NAME_D13, 0, 0);
//设置列属性
lrd_ora8_attr_set(OraDef10, CHARSET_FORM, "1", -1, 0);
lrd_ora8_attr_set(OraDef12, CHARSET_FORM, "1", -1, 0);//获取结果集
//第二参数,如果是0返回最后一行,如果是负数则返回全部结果集,如果是整数则返回该数目的结果集行数(该整数小于结果集中定义的行数)
//第三个参数,是控制RrintRow返回的结果集数。
//第四个参数,返回查询结果集行数
//第五个参数,是回调函数,用于打印返回的结果集
lrd_ora8_fetch(OraStm7, 0, 15, &uliFetchedRows, PrintRow8, 0, 0, 0);//释放连接
lrd_handle_free(&OraStm7, 0);//关闭连接session
lrd_session_end(OraSvc1, OraSes1, 0, 0);
//释放数据库资源
lrd_server_detach(OraSrv1, 0, 0);
//释放环境资源
lrd_handle_free(&OraEnv1, 0);
return 0;
}(三)Oracle中常用函数的用法
lrd_ora8_exec(OraSvc1, OraStm7, 3, 0, &uliRowsProcessed, 0, 0, 0, 32, 1);
//将返回结果中的某个单元格中的传入参数供使用,它的使用方式类似注册函数,需要在fetch前调用,fetch后才能看到结果,行和列都从1开始。这里返回第4列、第一行的值
lrd_ora8_save_col(OraStm7, 4, 1, 0, "value");
lrd_ora8_fetch(OraStm7, 0, 15, &uliFetchedRows, PrintRow8, 0, 0, 0);
lr_output_message("value is %s", lr_eval_string("{value}"));
-------------------------------------------------------//这里的倒数第二个参数如果设置为0,代表光执行不提交事务,那么我们可以配合使用lrd_ora8_commit提交事务
lrd_ora8_exec(OraSvc1, OraStm7, 3, 0, &uliRowsProcessed, 0, 0, 0, 0, 1);lrd_ora8_commit(OraSvc1, 0, 0);
-------------------------------------------------------
//要查看返回的结果集,必须设置log属性为extended log 且勾选data returened by server时,才能看到结果
lrd_ora8_print(OraStm7, PrintRow8);-------------------------------------------------------
//rowid这个函数不是随便用的,只有在进行了insert、update后才可以用,普通使用select查询后使用lrd_ora8_save_last_rowid是无效的
lrd_ora8_save_last_rowid(OraStm7, "rowid");
lr_output_message("rowid is %s", lr_eval_string("{rowid}"));-------------------------------------------------------
//变量绑定操作,如果绑定了多个变量,那么在调用exec的时候也需要指定执行多次,据说采用这种方式进行参数化的效率比直接sql进行参数化的效率高
lrd_ora8_stmt(OraStm7, "insert into testtable values(:V2, :V1)", 1, 0, 0);//变量绑定
lrd_assign(&VAL1_D1, "abc", "", 0, 0);
lrd_assign(&VAL1_D1, "def", "", 1, 0);
lrd_assign(&VAL1_D1, "ghi", "", 2, 0);
lrd_assign(&VAL2_D1, "123", "", 0, 0);
lrd_assign(&VAL2_D1, "456", "", 1, 0);
lrd_assign(&VAL2_D1, "789", "", 2, 0);
//绑定变量操作符
lrd_ora8_bind_placeholder(OraStm7, &OraDef13, "V1", &VAL1_D1, 0, 0, 0);
lrd_ora8_bind_placeholder(OraStm7, &OraDef14, "V2", &VAL2_D1, 0, 0, 0);
//由于变量绑定了3条记录,那么在执行的时候也需要执行三次
lrd_ora8_exec(OraSvc1, OraStm7, 3, 0, &uliRowsProcessed, 0, 0, 0, 32, 1); -
oracle中删除归档日志
2010-12-31 15:31:03
查看数据库是否是归档模式
SELECT log_mode FROM v$database
查看归档日志信息
select * from v$archived_log
status:D已删除,A正常查看归档日志使用大小
select sum(a.BLOCK_SIZE*a.BLOCKS)/1024/1024 from v$archived_log a where a.DELETED='NO'
正常来说,归档日志文件大小差不多数多少个归档,乘以每个的大小也行。删除归档日志并回收空间方法
controlfile中记录着每个archivelog的相关信息,我们在OS下把这些物理文件删掉后,controlfile中仍然记录着这些archivelog的信息,也就是oracle并不知道这些文件已经不存在了!删除归档日志时,操作如下:
1.进入rman
[root@linux150 ~]# su - oracle
[oracle@linux150 ~]$ rman target/2.DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';
说明:SYSDATA-7,表明当前系统时间7天前,before关键字表示在7天前的归档日志。3.list archivelog all;(查看归档日志,检验下就发现已删除了)
或者
1.先在linux下删除物理日志文件
find /u02/oradata/center/archive -mtime +7 -name '*.dbf' -exec rm {} \;
2.再进入rman后,执行:
crosscheck archivelog all;
delete expired archivelog all;(确认时键入"yes")
目的:校验归档日志,然后删除已不存在的归档日志。3.list archivelog all;(查看归档日志,检验下就发现已删除了)
4.退出rman:exit
标题搜索
我的存档
数据统计
- 访问量: 17915
- 日志数: 21
- 图片数: 1
- 建立时间: 2008-09-07
- 更新时间: 2011-06-01