linux c数据库备份第三版
这个版本相对第一版更新了很多,其实我本地定义为第五版的。相对第一版主要更新内容:
1.增加了定时器
2.用户可以停止调备份程序
3.如果备份程序正在运行,那么尝试运行提示已经在运行
4.记录程序运行时的pid信息
5.支持** start;** restart;** stop等命令
还有其他细节的更新。
不足:restart的支持还不是很完美,因为没有考虑到服务器繁忙等情况。
运行示例:
编译:
gcc -o main main.c
运行:
./main
重启
./main restart
关闭
./main stop
#include<sys/types.h>
#include<sys/wait.h>
#include<ctype.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<signal.h>
#include<time.h>
#include<stdio.h> //备份程序的pid
#define PID_FILE "./pid.db"
//备份数据库信息文件
#define DB_FILE "./db_list"
//最多可以备份的数据库数量
#define NUM 20
//数据库名字最长字符数
#define LEN 128
//闹钟时间间隔
#define ALARM_TIME 10 //数据库名数组信息
char *db_list[NUM];
//当前备份数据库的数量
int read_num;
//用户是否停止备份
int isbreak = ; //申请内容
void malloc_dblist();
//释放申请的内存
void free_dblist();
//读取数据库信息
void readDbFile();
//型号处理函数
void signHandler(int sig);
//记录程序运行的pid信息
int recordPid(int pid);
//获取程序运行时的pid信息
int readPid(void);
//移除程序运行时的pid信息
void delPid(void); int main(int argc, char *argv[]) {
pid_t pid, old_pid;
int i, prs;
char buf[LEN];
time_t t;
struct tm *tm_ptr; struct sigaction act, oldact;
sigset_t newmask, suspmask, oldmask; if (argc >= ) {
old_pid = (pid_t)readPid();
//停止备份程序
if (strcmp(argv[], "stop") == ) {
kill(old_pid, SIGINT);
return ;
}
else if (strcmp(argv[], "restart") == ) {
kill(old_pid, SIGINT);
sleep();
}
}
old_pid = (pid_t)readPid();
//检测程序是否已经在运行
if (old_pid > ) {
fprintf(stderr, "Progress is running.\n");
return -;
} //记录程序运行的pid信息
prs = recordPid((int)getpid());
if (prs == -) {
fprintf(stderr, "Open pid.db file error.\n");
return -;
} readDbFile(); //注册信号处理
act.sa_handler = signHandler;
sigemptyset(&act.sa_mask);
act.sa_flags = ;
sigaction(SIGALRM, &act, );
sigaction(SIGINT, &act, ); while () {
time(&t);
tm_ptr = localtime(&t); for (i = ; i < read_num; i++) {
memset(buf, '\0', LEN);
sprintf(buf, "mysqldump -uroot %s > %s_%02d%02d%02d.sql",
db_list[i], db_list[i], tm_ptr->tm_year+, tm_ptr->tm_mon+, tm_ptr->tm_mday);
system(buf);
printf("%d,%s\n", i, buf);
} alarm(ALARM_TIME);
pause(); if (isbreak) {
fprintf(stderr, "User break progress.\n");
break;
}
} free_dblist(); delPid(); exit(); } void malloc_dblist()
{
int i = ;
for (i = ; i < NUM; i++) {
db_list[i] = malloc(LEN);
memset(db_list[i], '\0', LEN);
}
}
void free_dblist()
{
int i;
for (i = ; i < NUM; i++) {
free(db_list[i]);
}
} void readDbFile()
{
FILE *fp; fp = fopen(DB_FILE, "r");
if (!fp) {
fprintf(stderr, "%s not found\n", DB_FILE);
}
else {
malloc_dblist(); read_num = ;
while (fscanf(fp, "%127[^\r\n]\n", db_list[read_num]) == ) {
puts(db_list[read_num]);
read_num++;
} fclose(fp);
} } void signHandler(int sig)
{
switch (sig) {
case SIGALRM:
fprintf(stdout, "alarm signal comming:%d.\n", sig);
break;
case SIGINT:
fprintf(stdout, "sigint signal comming:%d.\n", sig);
isbreak = ;
break;
default:
fprintf(stdout, "uncatched signal comming:%d.\n", sig);
}
} int recordPid(int pid)
{
FILE *fp = NULL; if (!(fp = fopen(PID_FILE, "w")))
return -; pid = getpid();
fprintf(fp, "%d", (int)pid);
fclose(fp); return ;
} int readPid(void)
{
FILE *fp = NULL; if (!(fp = fopen(PID_FILE, "r")))
return -; int pid;
if (fscanf(fp, "%d", &pid) != ) {
fclose(fp);
return -;
} fclose(fp); return pid;
} void delPid(void)
{
unlink(PID_FILE);
}
main.c
mkbl
ck_book
linux c数据库备份第三版的更多相关文章
- linux c数据库备份第四版
该版本算是比较成熟的啦,欢迎大伙拿来试用!!!1.新增数据库连接和备份时间配置文件conf2.新增日志文件,程序运行的一些异常会记录在log文件下 后续的工作:1.将代码切割为多个文件,分类存放代码2 ...
- linux c数据库备份第五版
linux下c实现的数据库备份程序终于迎来第五版啦,这样改程序就暂告一段落啦,有点小激动呢...接下来的一周(可能两周)时间里,我会用一个小型的网络游戏(比拼99乘法)作为我学习linux c的毕业之 ...
- linux c数据库备份第二版
#想知道更多请查看第一版"linux c数据库备份第一版" #include<sys/types.h> #include<sys/wait.h> #incl ...
- linux c数据库备份第一版
使用linuxC实现的mysql数据库备份目标:通过alarm信号定时备份数据库备注:目前是第一个版,本身不能定时备份可以结合linux自动化实现定时备份.运行平台:Linux或类unix测试平台:u ...
- SQL SERVER 数据库备份的三种策略及语句
1.全量数据备份 备份整个数据库,恢复时恢复所有.优点是简单,缺点是数据量太大,非常耗时 全数据库备份因为容易实施,被许多系统优先采用.在一天或一周中预定的时间进行全数据库备份使你不用动什么脑筋 ...
- Linux下数据库备份
1.登录数据库服务器并切换到数据库用户下 [root@*** ~]# su - oracle 2.测试用户名密码是否能正确连接数据库 [oracle@*** ~]$ sqlplus username/ ...
- linux svn迁移备份的三种方法
原文:http://www.iitshare.com/linux-svn-migration.html svn备份方式对比分析 一般采用三种方式: 1.svnadmin dump 2.svnadmin ...
- Linux下数据库备份恢复过程
1. 远程进入Linux服务器. 2. 一般登录的是root用户, 第一步切换到Oracle用户, 命令: su - oracle 3. 查看服务器上面数据库的监听的状况 lsnrctl 之后输入命令 ...
- 《Linux设备驱动程序》第三版 scull编译 Ubuntu18.04
0 准备工作. 0.0 系统环境:Ubuntu18.04.1 amd64. 0.1 安装必要软件包 1 sudo apt install build-essential bison flex libs ...
随机推荐
- 使用Sublime Text搭建python调试环境
原文地址:http://blog.csdn.net/wenxuansoft/article/details/38559731 pycharmt等IDE虽然用着爽,但毕竟在速度.资源上还是比较让人不爽的 ...
- 《ACM国际大学生程序设计竞赛题解I》——6.10
Pku 1143: Description Christine and Matt are playing an exciting game they just invented: the Number ...
- 每一个web开发者都应该了解的HTTP/2
我认为每一个 web 开发者都应该对这个支撑了整个 Web 世界的 HTTP 协议有所了解,这样才能帮助你更好的完成开发任务.在这篇文章中,我将讨论什么是 HTTP,它是怎么产生的,它的地位,以及我们 ...
- java随机数与数组的使用。
java随机数与数组的使用. 一:题目 二 代码: public class Students { int number; // 学号 int State ; // 年级 ...
- JQuery中_Radio、DropDownList、Checkbox选择控件的处理
Radio 1.获取选中值,三种方法都可以: $('input:radio:checked').val(): $("input[type='radio']:checked").v ...
- Facebook Hacker Cup 2015 Round 1--Homework(筛选法求素数)
题意:给定A,B,K(A<=B)三个数,问在[A,B]范围内的数素数因子个数为K的个数. 题解:典型的筛选法求素数.首先建立一个保存素数因子个数的数组factorNum[],以及到n为止含有素数 ...
- @property的特性
@property还有一些关键字,它们都是有特殊作用的,比如上述代码中的nonatomic,strong: 1 2 @property(nonatomic,strong) NSString *carN ...
- Linux基本配置和管理 3 ---- Linux命令行文本处理工具
1 文件浏览(简单回顾) 1 cat 查看文件的内容 2 more 以翻页的形式查看,但是只能向下翻页 3 less 以翻页的形式查看,但是能够支持向上和向下翻页 4 head 默认是查看前10行,但 ...
- HTML中常见的各种位置距离以及dom中的坐标讨论
最近在学习JavaScript,特意买了一本犀牛角书来看看,尼玛一千多页,看的我头昏脑涨,翻到DOM这章节,突然记起平常在使用DOM时,碰到了好多的这个dom里面的各种宽度,高度,特意在此写一写,写的 ...
- POJ 1330 Nearest Common Ancestors(LCA模板)
给定一棵树求任意两个节点的公共祖先 tarjan离线求LCA思想是,先把所有的查询保存起来,然后dfs一遍树的时候在判断.如果当前节点是要求的两个节点当中的一个,那么再判断另外一个是否已经访问过,如果 ...