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 = 0;

//申请内容
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 >= 2) {
        old_pid = (pid_t)readPid();
        //停止备份程序
        if (strcmp(argv[1], "stop") == 0) {
            kill(old_pid, SIGINT);
            return 0;
        }
        else if (strcmp(argv[1], "restart") == 0) {
            kill(old_pid, SIGINT);
            sleep(5);
        }
    }
    old_pid = (pid_t)readPid();
    //检测程序是否已经在运行
    if (old_pid > 0) {
        fprintf(stderr, "Progress is running.\n");
        return -1;
    }

    //记录程序运行的pid信息
    prs = recordPid((int)getpid());
    if (prs == -1) {
        fprintf(stderr, "Open pid.db file error.\n");
        return -1;
    }

    readDbFile();

    //注册信号处理
    act.sa_handler = signHandler;
    sigemptyset(&act.sa_mask);
    act.sa_flags = 0;
    sigaction(SIGALRM, &act, 0);
    sigaction(SIGINT, &act, 0);

    while (1) {
        time(&t);
        tm_ptr = localtime(&t);

        for (i = 0; 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+1900, tm_ptr->tm_mon+1, 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(0);

}

void malloc_dblist()
{
    int i = 0;
    for (i = 0; i < NUM; i++) {
        db_list[i] = malloc(LEN);
        memset(db_list[i], ‘\0‘, LEN);
    }
}
void free_dblist()
{
    int i;
    for (i = 0; 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 = 0;
        while (fscanf(fp, "%127[^\r\n]\n", db_list[read_num]) == 1) {
            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 = 1;
            break;
        default:
            fprintf(stdout, "uncatched signal comming:%d.\n", sig);
    }
}

int recordPid(int pid)
{
    FILE *fp = NULL;

    if (!(fp = fopen(PID_FILE, "w")))
        return -1;

    pid = getpid();
    fprintf(fp, "%d", (int)pid);
    fclose(fp);

    return 0;
}

int readPid(void)
{
    FILE *fp = NULL;

    if (!(fp = fopen(PID_FILE, "r")))
        return -1;

    int pid;
    if (fscanf(fp, "%d", &pid) != 1) {
        fclose(fp);
        return -2;
    }

    fclose(fp);

    return pid;
}

void delPid(void)
{
    unlink(PID_FILE);
}

main.c

mkbl
ck_book
时间: 2024-09-30 21:03:00

linux c数据库备份第三版的相关文章

linux c数据库备份第五版

linux下c实现的数据库备份程序终于迎来第五版啦,这样改程序就暂告一段落啦,有点小激动呢...接下来的一周(可能两周)时间里,我会用一个小型的网络游戏(比拼99乘法)作为我学习linux c的毕业之作...后面接着就是选条路走了“linux网络大数据开发”或者“基于linux的微型系统”了...欢迎各位linux c爱好者私信交流... 在发布上个版本的时候说在这个版会加入开启自动和自动后台运行的,后面有网友提出建议和自己考虑之后就觉得没有必要做这个两件事情啦... 该版本和上一个版本的的功能

linux c数据库备份第二版

#想知道更多请查看第一版"linux c数据库备份第一版" 1 #include<sys/types.h> 2 #include<sys/wait.h> 3 #include<ctype.h> 4 #include<unistd.h> 5 #include<string.h> 6 #include<stdlib.h> 7 #include<stdio.h> 8 9 //待备份的数据表文件(一个数据库一行

linux c数据库备份第一版

使用linuxC实现的mysql数据库备份目标:通过alarm信号定时备份数据库备注:目前是第一个版,本身不能定时备份可以结合linux自动化实现定时备份.运行平台:Linux或类unix测试平台:ubuntu server 14.04 x64文件信息:main.c:数据库备份程序db_list:待备份的数据库信息,一行一个文件.不足:文件的读取方式感觉还不到位,使用的是fgetc一个个字符读取然后过滤和组合来读取相关的数据库信息:开始使用的是fgets函数处理的时候,遇到了很多的麻烦,比如读取

SQL SERVER 数据库备份的三种策略及语句

1.全量数据备份    备份整个数据库,恢复时恢复所有.优点是简单,缺点是数据量太大,非常耗时 全数据库备份因为容易实施,被许多系统优先采用.在一天或一周中预定的时间进行全数据库备份使你不用动什么脑筋.使用这种类型的备份带来的问题是非常缺乏灵活性,而且当数据库被冲掉后,你面临丢失大量数据的潜在威胁.例如,假设你每天在午夜备份数据库. 如果服务器在晚上11点崩溃了,你将丢失前面23个小时对数据所做的全部修改.对大多数系统来说,这是无法接受的.对此规则,为数不多的例外如下: 1.系统中所存的数据可以

linux下c实现的数据库备份(第四版)

该版本算是比较成熟的啦,欢迎大伙拿来试用!!!1.新增数据库连接和备份时间配置文件conf2.新增日志文件,程序运行的一些异常会记录在log文件下 后续的工作:1.将代码切割为多个文件,分类存放代码2.加入自动后台运行的支持3.加入开机自动运行的支持完成上面3个之后,我的linux c数据库备份程序就暂时靠一段落了. 使用提醒:编译:gcc -o main main.c后台启动:./main &停止程序:./main stop #include<sys/types.h> #includ

Linux下mysql备份 恢复

转载自http://blog.chinaunix.net/uid-20577907-id-161611.html 比如我们要备份mysql中已经存在的名为linux的数据库,要用到命令mysqldump 命令格式如下: [[email protected] root]# mysqldump -u root -p linux > /root/linux.sql Enter password:在这里输入数据库的密码 通过上面的命令,我们要明白两件事,首先备份数据库是要以数据库管理员的身份备份:其次:

Linux VPS主机备份数据库的4个方法

从虚拟主机过度到VPS之后,一般的站长可能会感觉到运维时间成本还是比较大的.比如在VPS维护.备份数据方面,在没有使用定期自动备份功能的软件时基本都是用手工备份的.对于网页文件,我们可以通过压缩打包FTP下载的方式搞定,但是MYSQL数据库的备份需要格外的小心,一旦备份失误缺失,然后真需要还原恢复的时候可能会造成很大的损失. 下面给大家整理一些比较常用的Linux VPS主机备份MySQL数据库的方式: 第一.PHPMYADMIN导出方法 不论我们使用的是WEB面板,还是使用一键包,应该都会有安

Linux下Mysql数据库备份和恢复全攻略

很多用户都有过丢失宝贵数据的经历,随着大量的数据被存入到MySQL数据库中,再加上错误地使用DROP DATABASE命令.系统崩溃或对表结构进行编辑等操作,都可能酿成灾难性的损失.所以对MySQL数据库进行备份,以备在出现意外时及时进行恢复是非常必要的. 一. 使用mysql相关命令进行简单的本地备份     1 mysqlldump命令 mysqldump 是采用SQL级别的备份机制,它将数据表导成 SQL 脚本文件,在不同的 MySQL 版本之间升级时相对比较合适,这也是最常用的备份方法.

第三章 数据库备份和还原

一.数据库恢复模式 1.完整:能够让数据库恢复到出现故障的时间点和指定时间点(主要是日志文件完 整备份) 2.大容量日志:数据库日志不记录对数据修改的时间(即指定的时间点)效率高只 能通过日志恢复到故障点 3.简单:对事务日志不活跃的逻辑日志文件覆盖重复利用(日志写满后覆盖完成的 提交的事务日志)不能利用日志还原数据库,只能利用完整数据库文件恢 复 1)简单恢复模式 数据库备份和还原策略 数据小 数据变化不大 数据库不能恢复到出现故障的时间点(重复擦写日志文件) 完整数据库备份  完整的数据库备