📄 dbautoback.ec
字号:
/* dbautoback.ec 利用SMI表实现INFORMIX数据库大批量自动备份 */
/* 编译方法:esql -o dbautoback dbautoback.ec */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
EXEC SQL include sqlca;
char *str_repl_char(char *,char,char);
main()
{
FILE *dbfile;
char dbname[19],shellCmd[250],pathStr[80];
EXEC SQL begin declare section;
char queryStr[250];
int mySID;
EXEC SQL end declare section;
sprintf(pathStr,"%s","/databk");
if ( (dbfile = fopen("/databk/backdbname.list","r")) == NULL)
{
printf("错误:您尚未定义需要备份的数据库清单文件(/databk/backdbname.list).\n");
exit(1);
}
EXEC SQL DataBase sysmaster;
while (fgets(dbname,sizeof(dbname),dbfile))
{
if (dbname[0] != '#') /* 若该行不是注释行,则继续 */
{
str_repl_char(dbname,'\n',0); /* 将换行符去除 */
/* 检查ONLINE中有否该名称的数据库存在 */
sprintf(queryStr,"%s%s%s","select * from sysdbspartn where name='",dbname,"'");
EXEC SQL Prepare pre_name From $queryStr;
EXEC SQL execute pre_name;
if (SQLCODE == SQLNOTFOUND)
printf("%s,没有该数据库\n",dbname);
else
{
/* 查询打开该数据库的会话(session)情况, 并取得相应的SID号 */
sprintf(queryStr,"%s%s%s","select odb_sessionid From sysopendb where odb_dbname='",dbname,"'");
EXEC SQL Prepare pre_sid From $queryStr;
EXEC SQL Declare cur_sid Cursor For pre_sid;
EXEC SQL Open cur_sid;
for (;;) /* 逐个终止查询出来的会话 */
{
EXEC SQL Fetch cur_sid Into $mySID;
if (SQLCODE == SQLNOTFOUND) break;
sprintf(shellCmd,"onmode -z %d",mySID);
system(shellCmd); /* 终止指定SID的会话 */
} /* end of get mySID Loop */
EXEC SQL Close cur_sid;
/* 先删除该数据库旧的dbexport目录 */
sprintf(shellCmd,"rm -fr %s/%s.exp",pathStr,dbname);
system(shellCmd);
/* 将该数据库dbexport到指定目录下 */
sprintf(shellCmd,"dbexport %s -q -ss -o %s",dbname,pathStr);
system(shellCmd);
}
} /* 备份一个数据库结束 */
} /* 逐条读取需要备份的数据库清单 */
fclose(dbfile);
return(0);
}
/* 如果在字串mystr中存在字符mych1, 则第一个mych1被mych2取代 */
char *str_repl_char(char *mystr,char mych1,char mych2)
{
char *p;
if ( ( p = strchr(mystr,mych1) ) == NULL )
return(NULL);
*p = mych2;
return(p);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -