• linux c数据库备份第一版


    使用linuxC实现的mysql数据库备份
    目标:通过alarm信号定时备份数据库
    备注:目前是第一个版,本身不能定时备份可以结合linux自动化实现定时备份。
    运行平台:Linux或类unix
    测试平台:ubuntu server 14.04 x64
    文件信息:
    main.c:数据库备份程序
    db_list:待备份的数据库信息,一行一个文件。
    不足:
    文件的读取方式感觉还不到位,使用的是fgetc一个个字符读取然后过滤和组合来读取相关的数据库信息;开始使用的是fgets函数处理的时候,遇到了很多的麻烦,比如读取到回车字符\r,读取到换行字符\n,读取到不可见字符等,后面信心大受伤所以改用了fgetc实现了。目前测试还是挺良好的,也欢迎大家提出更好的解决方案。(注:昨晚已经使用fscanf函数解决了这个问题,晚点会更新上来

    编译和运行:
    首先把要备份的数据库名写进db_list文件里面一行一个数据库,如
    admin
    book
    然后编译和运行
    $gcc -o mian main.c
    $./main

    下面是main.c文件内容:

    #include<sys/types.h>
    #include<sys/wait.h>
    #include<ctype.h>
    #include<unistd.h>
    #include<string.h>
    #include<stdlib.h>
    #include<stdio.h>
    
    //待备份的数据表文件(一个数据库一行)
    #define DB_FILE "./db_list"
    //最多可以备份的数据库数量
    #define NUM 20
    //一个数据库名字的最长字符数
    #define LEN 128
    //保存从DB_FILE中读取到的数据库
    char *db_list[NUM];
    //从DB_FILE文件中读取到的数据库数量
    int read_num;
    //请求内存函数
    void malloc_dblist();
    //释放内存函数
    void free_dblist();
    //读取数据库文件
    void readDbFile();
    
    int main(int argc, char *argv[]) {
    	pid_t pid;
    	int i;
    	char buf[LEN];
    
    	//从文件读取数据库信息
    	readDbFile();
    	
    	pid = fork();
    
    	if (pid < 0) {
    		fprintf(stderr, "fork error\n");
    		exit(1);
    	}
    	
    	switch (pid) {
    		case -1:
    			fprintf(stderr, "fork failed\n");
    			exit(1);
    		case 0:
    			//子进程进行数据库的备份
    			for (i = 0; i < read_num; i++) {
    				memset(buf, '\0', LEN);
    				sprintf(buf, "%s%s%s%s%s", "mysqldump -uroot ", db_list[i], " > ", db_list[i], ".sql");
    				system(buf);
    				printf("%d,%s\n", i, buf);
    			}
    			break;
    	}
    	//等待子进程的结束
    	if (pid > 0) {
    		int stat_val;
    		pid_t child_pid;
    		
    		child_pid = wait(&stat_val);
    		
    		if (!WIFEXITED(stat_val)) {
    			fprintf(stdout, "Child terminated abnormaly\n");
    		}
    		exit(1);
    		
    	}
    	
    	free_dblist();
    	
    	exit(0);
    	
    }
    
    void malloc_dblist()
    {
    	int i = 0;
    	//malloc for db_list
    	for (i = 0; i < NUM; i++) {
    		db_list[i] = malloc(LEN);
    		memset(db_list[i], '\0', LEN);
    	}
    }
    void free_dblist()
    {
    	int i;
    	//free db_list's memory
    	for (i = 0; i < NUM; i++) {
    		free(db_list[i]);
    	}
    }
    
    void readDbFile()
    {
    	FILE *fp;
    	int i, j, c, isnewline;
    	char *rs;
    	char tmpbuf[LEN];
    	
    	fp = fopen(DB_FILE, "r");
    	if (!fp) {
    		fprintf(stderr, "%s not found\n", DB_FILE);
    	}
    	else {
    		malloc_dblist();
    	
    		read_num = 1;
    		j = 0;
    		isnewline = 0;
    		while (!feof(fp)) {
    			c = fgetc(fp);
    			//空字符或者字符串结束字符
    			if (c == ' ' || c == '\0') {
    				continue;
    			}
    			//回车字符
    			if (c == '\r') {
    				continue;
    			}
    			//换行字符
    			if (c == '\n') {
    				j = 0;
    				isnewline = 1;
    				continue;
    			}
    			//不可打印字符
    			if (!isprint(c)) {
    				continue;
    			}
    			if (isnewline) {
    				read_num++;
    				isnewline = 0;
    			}
    			db_list[read_num-1][j] = c;
    			j++;
    		}
    		
    		fclose(fp);	
    	}
    	
    }
    

      

    下面是数据库信息文件db_list:

    admin
    book
  • 相关阅读:
    lua 10 迭代器
    lua 9 parttern 字符极其简要的介绍
    lua 7 运算符
    lua 6 函数
    lua 5 流程控制 if
    线程池的设计问题/线程数量计算
    一个父子进程管道通信的复习
    redis 网络库文件 重构
    带标准IO带缓存区和非标准IO 遇到fork是的情况分析
    libevent 同性恋 讲解
  • 原文地址:https://www.cnblogs.com/qizexi/p/4656208.html
Copyright © 2020-2023  润新知