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

 

你可能感兴趣的:(linux)